Merge "Hide KeyguardMessageArea if empty" into mnc-dev

This commit is contained in:
Adrian Roos
2015-05-29 21:33:08 +00:00
committed by Android (Google) Code Review
7 changed files with 62 additions and 154 deletions

View File

@@ -26,8 +26,7 @@
android:orientation="vertical"
android:gravity="center"
android:layout_gravity="center_horizontal"
android:layout_alignParentBottom="true"
android:clickable="true">
android:layout_alignParentBottom="true">
<com.android.keyguard.CarrierText
android:id="@+id/carrier_text"

View File

@@ -29,5 +29,5 @@
android:textAppearance="?android:attr/textAppearance"
android:textSize="@dimen/kg_status_line_font_size"
android:textColor="?android:attr/textColorSecondary"
android:clickable="true" />
android:focusable="true" />

View File

@@ -65,6 +65,8 @@
android:layout_gravity="center_horizontal"
android:gravity="center"
android:contentDescription="@string/keyguard_accessibility_pattern_area"
android:focusable="true"
android:focusableInTouchMode="true"
android:clipChildren="false"
android:clipToPadding="false" />

View File

@@ -86,7 +86,7 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout
@Override
protected void onFinishInflate() {
mLockPatternUtils = new LockPatternUtils(mContext);
mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this);
mSecurityMessageDisplay = KeyguardMessageArea.findSecurityMessageDisplay(this);
mEcaView = findViewById(R.id.keyguard_selector_fade_container);
EmergencyButton button = (EmergencyButton) findViewById(R.id.emergency_call_button);

View File

@@ -16,27 +16,21 @@
package com.android.keyguard;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.os.SystemClock;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.MutableInt;
import android.view.View;
import android.widget.TextView;
import java.lang.ref.WeakReference;
import com.android.internal.widget.LockPatternUtils;
/***
* Manages a number of views inside of the given layout. See below for a list of widgets.
*/
class KeyguardMessageArea extends TextView {
class KeyguardMessageArea extends TextView implements SecurityMessageDisplay {
/** Handler token posted with accessibility announcement runnables. */
private static final Object ANNOUNCE_TOKEN = new Object();
@@ -46,96 +40,23 @@ class KeyguardMessageArea extends TextView {
*/
private static final long ANNOUNCEMENT_DELAY = 250;
static final int SECURITY_MESSAGE_DURATION = 5000;
protected static final int FADE_DURATION = 750;
private static final int SECURITY_MESSAGE_DURATION = 5000;
private static final String TAG = "KeyguardMessageArea";
// is the bouncer up?
boolean mShowingBouncer = false;
KeyguardUpdateMonitor mUpdateMonitor;
private final KeyguardUpdateMonitor mUpdateMonitor;
private final Handler mHandler;
// Timeout before we reset the message to show charging/owner info
long mTimeout = SECURITY_MESSAGE_DURATION;
private Handler mHandler;
CharSequence mMessage;
boolean mShowingMessage;
private CharSequence mSeparator;
private LockPatternUtils mLockPatternUtils;
Runnable mClearMessageRunnable = new Runnable() {
private final Runnable mClearMessageRunnable = new Runnable() {
@Override
public void run() {
mMessage = null;
mShowingMessage = false;
if (mShowingBouncer) {
hideMessage(FADE_DURATION, true);
} else {
update();
}
update();
}
};
public static class Helper implements SecurityMessageDisplay {
KeyguardMessageArea mMessageArea;
Helper(View v) {
mMessageArea = (KeyguardMessageArea) v.findViewById(R.id.keyguard_message_area);
if (mMessageArea == null) {
throw new RuntimeException("Can't find keyguard_message_area in " + v.getClass());
}
}
@Override
public void setMessage(CharSequence msg, boolean important) {
if (!TextUtils.isEmpty(msg) && important) {
mMessageArea.mMessage = msg;
mMessageArea.securityMessageChanged();
} else {
mMessageArea.clearMessage();
}
}
@Override
public void setMessage(int resId, boolean important) {
if (resId != 0 && important) {
mMessageArea.mMessage = mMessageArea.getContext().getResources().getText(resId);
mMessageArea.securityMessageChanged();
} else {
mMessageArea.clearMessage();
}
}
@Override
public void setMessage(int resId, boolean important, Object... formatArgs) {
if (resId != 0 && important) {
mMessageArea.mMessage = mMessageArea.getContext().getString(resId, formatArgs);
mMessageArea.securityMessageChanged();
} else {
mMessageArea.clearMessage();
}
}
@Override
public void showBouncer(int duration) {
mMessageArea.hideMessage(duration, false);
mMessageArea.mShowingBouncer = true;
}
@Override
public void hideBouncer(int duration) {
mMessageArea.showMessage(duration);
mMessageArea.mShowingBouncer = false;
}
@Override
public void setTimeout(int timeoutMs) {
mMessageArea.mTimeout = timeoutMs;
}
}
private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
public void onScreenTurnedOff(int why) {
setSelected(false);
@@ -153,28 +74,64 @@ class KeyguardMessageArea extends TextView {
super(context, attrs);
setLayerType(LAYER_TYPE_HARDWARE, null); // work around nested unclipped SaveLayer bug
mLockPatternUtils = new LockPatternUtils(context);
// Registering this callback immediately updates the battery state, among other things.
mUpdateMonitor = KeyguardUpdateMonitor.getInstance(getContext());
mUpdateMonitor.registerCallback(mInfoCallback);
mHandler = new Handler(Looper.myLooper());
mSeparator = getResources().getString(
com.android.internal.R.string.kg_text_message_separator);
update();
}
@Override
public void setMessage(CharSequence msg, boolean important) {
if (!TextUtils.isEmpty(msg) && important) {
securityMessageChanged(msg);
} else {
clearMessage();
}
}
@Override
public void setMessage(int resId, boolean important) {
if (resId != 0 && important) {
CharSequence message = getContext().getResources().getText(resId);
securityMessageChanged(message);
} else {
clearMessage();
}
}
@Override
public void setMessage(int resId, boolean important, Object... formatArgs) {
if (resId != 0 && important) {
String message = getContext().getString(resId, formatArgs);
securityMessageChanged(message);
} else {
clearMessage();
}
}
@Override
public void setTimeout(int timeoutMs) {
mTimeout = timeoutMs;
}
public static SecurityMessageDisplay findSecurityMessageDisplay(View v) {
KeyguardMessageArea messageArea = (KeyguardMessageArea) v.findViewById(
R.id.keyguard_message_area);
if (messageArea == null) {
throw new RuntimeException("Can't find keyguard_message_area in " + v.getClass());
}
return messageArea;
}
@Override
protected void onFinishInflate() {
final boolean screenOn = KeyguardUpdateMonitor.getInstance(mContext).isScreenOn();
setSelected(screenOn); // This is required to ensure marquee works
}
public void securityMessageChanged() {
setAlpha(1f);
mShowingMessage = true;
private void securityMessageChanged(CharSequence message) {
mMessage = message;
update();
mHandler.removeCallbacks(mClearMessageRunnable);
if (mTimeout > 0) {
@@ -185,61 +142,18 @@ class KeyguardMessageArea extends TextView {
(SystemClock.uptimeMillis() + ANNOUNCEMENT_DELAY));
}
public void clearMessage() {
private void clearMessage() {
mHandler.removeCallbacks(mClearMessageRunnable);
mHandler.post(mClearMessageRunnable);
}
/**
* Update the status lines based on these rules:
* AlarmStatus: Alarm state always gets it's own line.
* Status1 is shared between help, battery status and generic unlock instructions,
* prioritized in that order.
* @param showStatusLines status lines are shown if true
*/
void update() {
MutableInt icon = new MutableInt(0);
CharSequence status = getCurrentMessage();
setCompoundDrawablesWithIntrinsicBounds(icon.value, 0, 0, 0);
private void update() {
CharSequence status = mMessage;
setVisibility(TextUtils.isEmpty(status) ? INVISIBLE : VISIBLE);
setText(status);
}
CharSequence getCurrentMessage() {
return mShowingMessage ? mMessage : null;
}
private void hideMessage(int duration, boolean thenUpdate) {
if (duration > 0) {
Animator anim = ObjectAnimator.ofFloat(this, "alpha", 0f);
anim.setDuration(duration);
if (thenUpdate) {
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
update();
}
});
}
anim.start();
} else {
setAlpha(0f);
if (thenUpdate) {
update();
}
}
}
private void showMessage(int duration) {
if (duration > 0) {
Animator anim = ObjectAnimator.ofFloat(this, "alpha", 1f);
anim.setDuration(duration);
anim.start();
} else {
setAlpha(1f);
}
}
/**
* Runnable used to delay accessibility announcements.
*/
@@ -247,7 +161,7 @@ class KeyguardMessageArea extends TextView {
private final WeakReference<View> mHost;
private final CharSequence mTextToAnnounce;
public AnnounceRunnable(View host, CharSequence textToAnnounce) {
AnnounceRunnable(View host, CharSequence textToAnnounce) {
mHost = new WeakReference<View>(host);
mTextToAnnounce = textToAnnounce;
}

View File

@@ -129,7 +129,6 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit
mLockPatternView = (LockPatternView) findViewById(R.id.lockPatternView);
mLockPatternView.setSaveEnabled(false);
mLockPatternView.setFocusable(false);
mLockPatternView.setOnPatternListener(new UnlockPatternListener());
// stealth mode will be the same for the life of this screen
@@ -139,9 +138,7 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit
// vibrate mode will be the same for the life of this screen
mLockPatternView.setTactileFeedbackEnabled(mLockPatternUtils.isTactileFeedbackEnabled());
setFocusableInTouchMode(true);
mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this);
mSecurityMessageDisplay = KeyguardMessageArea.findSecurityMessageDisplay(this);
mEcaView = findViewById(R.id.keyguard_selector_fade_container);
mContainer = (ViewGroup) findViewById(R.id.container);
mHelpMessage = (KeyguardMessageArea) findViewById(R.id.keyguard_message_area);

View File

@@ -24,8 +24,4 @@ public interface SecurityMessageDisplay {
public void setMessage(int resId, boolean important, Object... formatArgs);
public void setTimeout(int timeout_ms);
public void showBouncer(int animationDuration);
public void hideBouncer(int animationDuration);
}