Merge "Fix 5044158: Reduce overall memory footprint of lockscreen"

This commit is contained in:
Jim Miller
2011-08-29 16:04:10 -07:00
committed by Android (Google) Code Review

View File

@@ -17,6 +17,7 @@
package com.android.internal.policy.impl; package com.android.internal.policy.impl;
import com.android.internal.R; import com.android.internal.R;
import com.android.internal.policy.impl.LockPatternKeyguardView.UnlockMode;
import com.android.internal.telephony.IccCard; import com.android.internal.telephony.IccCard;
import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockPatternUtils;
@@ -31,6 +32,7 @@ import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.ColorFilter; import android.graphics.ColorFilter;
@@ -84,6 +86,8 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
private boolean mScreenOn = false; private boolean mScreenOn = false;
private boolean mEnableFallback = false; // assume no fallback UI until we know better private boolean mEnableFallback = false; // assume no fallback UI until we know better
private boolean mShowLockBeforeUnlock = false;
/** /**
* The current {@link KeyguardScreen} will use this to communicate back to us. * The current {@link KeyguardScreen} will use this to communicate back to us.
*/ */
@@ -148,7 +152,7 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
* Keeps track of what mode the current unlock screen is (cached from most recent computation in * Keeps track of what mode the current unlock screen is (cached from most recent computation in
* {@link #getUnlockMode}). * {@link #getUnlockMode}).
*/ */
private UnlockMode mUnlockScreenMode; private UnlockMode mUnlockScreenMode = UnlockMode.Unknown;
private boolean mForgotPattern; private boolean mForgotPattern;
@@ -164,8 +168,6 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
*/ */
private final LockPatternUtils mLockPatternUtils; private final LockPatternUtils mLockPatternUtils;
private UnlockMode mCurrentUnlockMode = UnlockMode.Unknown;
/** /**
* The current configuration. * The current configuration.
*/ */
@@ -173,7 +175,7 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
private Runnable mRecreateRunnable = new Runnable() { private Runnable mRecreateRunnable = new Runnable() {
public void run() { public void run() {
recreateScreens(); updateScreen(mMode, false);
} }
}; };
@@ -204,16 +206,11 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
mConfiguration = context.getResources().getConfiguration(); mConfiguration = context.getResources().getConfiguration();
mEnableFallback = false; mEnableFallback = false;
mRequiresSim = TextUtils.isEmpty(SystemProperties.get("keyguard.no_require_sim"));
mRequiresSim =
TextUtils.isEmpty(SystemProperties.get("keyguard.no_require_sim"));
mUpdateMonitor = updateMonitor; mUpdateMonitor = updateMonitor;
mLockPatternUtils = lockPatternUtils; mLockPatternUtils = lockPatternUtils;
mWindowController = controller; mWindowController = controller;
mMode = getInitialMode();
mKeyguardScreenCallback = new KeyguardScreenCallback() { mKeyguardScreenCallback = new KeyguardScreenCallback() {
public void goToLockScreen() { public void goToLockScreen() {
@@ -224,7 +221,7 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
mIsVerifyUnlockOnly = false; mIsVerifyUnlockOnly = false;
getCallback().keyguardDone(false); getCallback().keyguardDone(false);
} else { } else {
updateScreen(Mode.LockScreen); updateScreen(Mode.LockScreen, false);
} }
} }
@@ -240,14 +237,14 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
if (!isSecure()) { if (!isSecure()) {
getCallback().keyguardDone(true); getCallback().keyguardDone(true);
} else { } else {
updateScreen(Mode.UnlockScreen); updateScreen(Mode.UnlockScreen, false);
} }
} }
public void forgotPattern(boolean isForgotten) { public void forgotPattern(boolean isForgotten) {
if (mEnableFallback) { if (mEnableFallback) {
mForgotPattern = isForgotten; mForgotPattern = isForgotten;
updateScreen(Mode.UnlockScreen); updateScreen(Mode.UnlockScreen, false);
} }
} }
@@ -260,7 +257,6 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
} }
public void recreateMe(Configuration config) { public void recreateMe(Configuration config) {
mConfiguration = config;
removeCallbacks(mRecreateRunnable); removeCallbacks(mRecreateRunnable);
post(mRecreateRunnable); post(mRecreateRunnable);
} }
@@ -330,7 +326,7 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
showAlmostAtAccountLoginDialog(); showAlmostAtAccountLoginDialog();
} else if (failedAttempts >= LockPatternUtils.FAILED_ATTEMPTS_BEFORE_RESET) { } else if (failedAttempts >= LockPatternUtils.FAILED_ATTEMPTS_BEFORE_RESET) {
mLockPatternUtils.setPermanentlyLocked(true); mLockPatternUtils.setPermanentlyLocked(true);
updateScreen(mMode); updateScreen(mMode, false);
} }
} else { } else {
final boolean showTimeout = final boolean showTimeout =
@@ -358,21 +354,8 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
setFocusableInTouchMode(true); setFocusableInTouchMode(true);
setDescendantFocusability(FOCUS_AFTER_DESCENDANTS); setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
// create both the lock and unlock screen so they are quickly available updateScreen(getInitialMode(), false);
// when the screen turns on
mLockScreen = createLockScreen();
addView(mLockScreen);
final UnlockMode unlockMode = getUnlockMode();
if (DEBUG) Log.d(TAG,
"LockPatternKeyguardView ctor: about to createUnlockScreenFor; mEnableFallback="
+ mEnableFallback);
mUnlockScreen = createUnlockScreenFor(unlockMode);
mUnlockScreenMode = unlockMode;
maybeEnableFallback(context); maybeEnableFallback(context);
addView(mUnlockScreen);
updateScreen(mMode);
} }
private class AccountAnalyzer implements AccountManagerCallback<Bundle> { private class AccountAnalyzer implements AccountManagerCallback<Bundle> {
@@ -449,7 +432,7 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
public void reset() { public void reset() {
mIsVerifyUnlockOnly = false; mIsVerifyUnlockOnly = false;
mForgotPattern = false; mForgotPattern = false;
updateScreen(getInitialMode()); updateScreen(getInitialMode(), false);
} }
@Override @Override
@@ -457,7 +440,7 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
mScreenOn = false; mScreenOn = false;
mForgotPattern = false; mForgotPattern = false;
if (mMode == Mode.LockScreen) { if (mMode == Mode.LockScreen) {
((KeyguardScreen) mLockScreen).onPause(); ((KeyguardScreen) mLockScreen).onPause();
} else { } else {
((KeyguardScreen) mUnlockScreen).onPause(); ((KeyguardScreen) mUnlockScreen).onPause();
} }
@@ -467,44 +450,40 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
public void onScreenTurnedOn() { public void onScreenTurnedOn() {
mScreenOn = true; mScreenOn = true;
if (mMode == Mode.LockScreen) { if (mMode == Mode.LockScreen) {
((KeyguardScreen) mLockScreen).onResume(); ((KeyguardScreen) mLockScreen).onResume();
} else { } else {
((KeyguardScreen) mUnlockScreen).onResume(); ((KeyguardScreen) mUnlockScreen).onResume();
} }
} }
private void recreateLockScreen() { private void recreateLockScreen() {
if (mLockScreen.getVisibility() == View.VISIBLE) { if (mLockScreen != null) {
((KeyguardScreen) mLockScreen).onPause(); if (mLockScreen.getVisibility() == View.VISIBLE) {
((KeyguardScreen) mLockScreen).onPause();
}
((KeyguardScreen) mLockScreen).cleanUp();
removeView(mLockScreen);
} }
((KeyguardScreen) mLockScreen).cleanUp();
removeView(mLockScreen);
mLockScreen = createLockScreen(); mLockScreen = createLockScreen();
mLockScreen.setVisibility(View.INVISIBLE); mLockScreen.setVisibility(View.INVISIBLE);
addView(mLockScreen); addView(mLockScreen);
} }
private void recreateUnlockScreen() { private void recreateUnlockScreen(UnlockMode unlockMode) {
if (mUnlockScreen.getVisibility() == View.VISIBLE) { if (mUnlockScreen != null) {
((KeyguardScreen) mUnlockScreen).onPause(); if (mUnlockScreen.getVisibility() == View.VISIBLE) {
((KeyguardScreen) mUnlockScreen).onPause();
}
((KeyguardScreen) mUnlockScreen).cleanUp();
removeView(mUnlockScreen);
} }
((KeyguardScreen) mUnlockScreen).cleanUp();
removeView(mUnlockScreen);
final UnlockMode unlockMode = getUnlockMode();
mUnlockScreen = createUnlockScreenFor(unlockMode); mUnlockScreen = createUnlockScreenFor(unlockMode);
mUnlockScreen.setVisibility(View.INVISIBLE); mUnlockScreen.setVisibility(View.INVISIBLE);
mUnlockScreenMode = unlockMode;
addView(mUnlockScreen); addView(mUnlockScreen);
} }
private void recreateScreens() {
recreateLockScreen();
recreateUnlockScreen();
updateScreen(mMode);
}
@Override @Override
protected void onDetachedFromWindow() { protected void onDetachedFromWindow() {
removeCallbacks(mRecreateRunnable); removeCallbacks(mRecreateRunnable);
@@ -523,13 +502,21 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
return super.dispatchHoverEvent(event); return super.dispatchHoverEvent(event);
} }
protected void onConfigurationChanged(Configuration newConfig) {
Resources resources = getResources();
mShowLockBeforeUnlock = resources.getBoolean(R.bool.config_enableLockBeforeUnlockScreen);
mConfiguration = newConfig;
if (DEBUG_CONFIGURATION) Log.v(TAG, "**** re-creating lock screen since config changed");
updateScreen(mMode, true /* force */);
}
@Override @Override
public void wakeWhenReadyTq(int keyCode) { public void wakeWhenReadyTq(int keyCode) {
if (DEBUG) Log.d(TAG, "onWakeKey"); if (DEBUG) Log.d(TAG, "onWakeKey");
if (keyCode == KeyEvent.KEYCODE_MENU && isSecure() && (mMode == Mode.LockScreen) if (keyCode == KeyEvent.KEYCODE_MENU && isSecure() && (mMode == Mode.LockScreen)
&& (mUpdateMonitor.getSimState() != IccCard.State.PUK_REQUIRED)) { && (mUpdateMonitor.getSimState() != IccCard.State.PUK_REQUIRED)) {
if (DEBUG) Log.d(TAG, "switching screens to unlock screen because wake key was MENU"); if (DEBUG) Log.d(TAG, "switching screens to unlock screen because wake key was MENU");
updateScreen(Mode.UnlockScreen); updateScreen(Mode.UnlockScreen, false);
getCallback().pokeWakelock(); getCallback().pokeWakelock();
} else { } else {
if (DEBUG) Log.d(TAG, "poking wake lock immediately"); if (DEBUG) Log.d(TAG, "poking wake lock immediately");
@@ -542,24 +529,31 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
if (!isSecure()) { if (!isSecure()) {
// non-secure keyguard screens are successfull by default // non-secure keyguard screens are successfull by default
getCallback().keyguardDone(true); getCallback().keyguardDone(true);
} else if (mUnlockScreenMode != UnlockMode.Pattern) { } else if (mUnlockScreenMode != UnlockMode.Pattern
// can only verify unlock when in pattern mode && mUnlockScreenMode != UnlockMode.Password) {
// can only verify unlock when in pattern/password mode
getCallback().keyguardDone(false); getCallback().keyguardDone(false);
} else { } else {
// otherwise, go to the unlock screen, see if they can verify it // otherwise, go to the unlock screen, see if they can verify it
mIsVerifyUnlockOnly = true; mIsVerifyUnlockOnly = true;
updateScreen(Mode.UnlockScreen); updateScreen(Mode.UnlockScreen, false);
} }
} }
@Override @Override
public void cleanUp() { public void cleanUp() {
((KeyguardScreen) mLockScreen).onPause(); if (mLockScreen != null) {
((KeyguardScreen) mLockScreen).cleanUp(); ((KeyguardScreen) mLockScreen).onPause();
this.removeView(mLockScreen); ((KeyguardScreen) mLockScreen).cleanUp();
((KeyguardScreen) mUnlockScreen).onPause(); this.removeView(mLockScreen);
((KeyguardScreen) mUnlockScreen).cleanUp(); mLockScreen = null;
this.removeView(mUnlockScreen); }
if (mUnlockScreen != null) {
((KeyguardScreen) mUnlockScreen).onPause();
((KeyguardScreen) mUnlockScreen).cleanUp();
this.removeView(mUnlockScreen);
mUnlockScreen = null;
}
} }
private boolean isSecure() { private boolean isSecure() {
@@ -587,19 +581,30 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
return secure; return secure;
} }
private void updateScreen(final Mode mode) { private void updateScreen(Mode mode, boolean force) {
if (DEBUG_CONFIGURATION) Log.v(TAG, "**** UPDATE SCREEN: mode=" + mode if (DEBUG_CONFIGURATION) Log.v(TAG, "**** UPDATE SCREEN: mode=" + mode
+ " last mode=" + mMode, new RuntimeException()); + " last mode=" + mMode, new RuntimeException());
mMode = mode; mMode = mode;
// Re-create the unlock screen if necessary. This is primarily required to properly handle // Re-create the lock screen if necessary
// SIM state changes. This typically happens when this method is called by reset() if (mode == Mode.LockScreen || mShowLockBeforeUnlock) {
if (mode == Mode.UnlockScreen && mCurrentUnlockMode != getUnlockMode()) { if (force || mLockScreen == null) {
recreateUnlockScreen(); recreateLockScreen();
}
} }
// Re-create the unlock screen if necessary. This is primarily required to properly handle
// SIM state changes. This typically happens when this method is called by reset()
if (mode == Mode.UnlockScreen) {
final UnlockMode unlockMode = getUnlockMode();
if (force || mUnlockScreen == null || unlockMode != mUnlockScreenMode) {
recreateUnlockScreen(unlockMode);
}
}
// visibleScreen should never be null
final View goneScreen = (mode == Mode.LockScreen) ? mUnlockScreen : mLockScreen; final View goneScreen = (mode == Mode.LockScreen) ? mUnlockScreen : mLockScreen;
final View visibleScreen = (mode == Mode.LockScreen) ? mLockScreen : mUnlockScreen; final View visibleScreen = (mode == Mode.LockScreen) ? mLockScreen : mUnlockScreen;
@@ -613,7 +618,7 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
} }
if (mScreenOn) { if (mScreenOn) {
if (goneScreen.getVisibility() == View.VISIBLE) { if (goneScreen != null && goneScreen.getVisibility() == View.VISIBLE) {
((KeyguardScreen) goneScreen).onPause(); ((KeyguardScreen) goneScreen).onPause();
} }
if (visibleScreen.getVisibility() != View.VISIBLE) { if (visibleScreen.getVisibility() != View.VISIBLE) {
@@ -621,7 +626,9 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
} }
} }
goneScreen.setVisibility(View.GONE); if (goneScreen != null) {
goneScreen.setVisibility(View.GONE);
}
visibleScreen.setVisibility(View.VISIBLE); visibleScreen.setVisibility(View.VISIBLE);
requestLayout(); requestLayout();
@@ -691,7 +698,7 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
// regular pattern unlock UI, regardless of the value of // regular pattern unlock UI, regardless of the value of
// mUnlockScreenMode or whether or not we're in the // mUnlockScreenMode or whether or not we're in the
// "permanently locked" state.) // "permanently locked" state.)
unlockView = createUnlockScreenFor(UnlockMode.Pattern); return createUnlockScreenFor(UnlockMode.Pattern);
} }
} else if (unlockMode == UnlockMode.Password) { } else if (unlockMode == UnlockMode.Password) {
unlockView = new PasswordUnlockScreen( unlockView = new PasswordUnlockScreen(
@@ -703,7 +710,7 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
} else { } else {
throw new IllegalArgumentException("unknown unlock mode " + unlockMode); throw new IllegalArgumentException("unknown unlock mode " + unlockMode);
} }
mCurrentUnlockMode = unlockMode; mUnlockScreenMode = unlockMode;
return unlockView; return unlockView;
} }
@@ -718,16 +725,10 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
!mLockPatternUtils.isPukUnlockScreenEnable())) { !mLockPatternUtils.isPukUnlockScreenEnable())) {
return Mode.LockScreen; return Mode.LockScreen;
} else { } else {
// Show LockScreen first for any screen other than Pattern unlock. if (!isSecure() || mShowLockBeforeUnlock) {
final boolean usingLockPattern = mLockPatternUtils.getKeyguardStoredPasswordQuality()
== DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
boolean showLockBeforeUnlock = getResources()
.getBoolean(R.bool.config_enableLockBeforeUnlockScreen);
if (isSecure() && (usingLockPattern || !showLockBeforeUnlock)) {
return Mode.UnlockScreen;
} else {
return Mode.LockScreen; return Mode.LockScreen;
} else {
return Mode.UnlockScreen;
} }
} }
} }