Fix 6028595: Fix reboot loop in AccountUnlock due to null callback

This fixes a bug where the device would get into a reboot loop due to having
a null callback.  The problem was that a recent change caused the callback
to be used indirectly by the constructor before being set.

The solution is to pass the callback to the KeyguardViewBase constructor
which ensures it's ready by the time we call getCallback().

Change-Id: I2598fc5338be99977980e4dea41a096fb2a7ef7e
This commit is contained in:
Jim Miller
2012-03-01 16:15:27 -08:00
parent 62f24df57a
commit fbc46dc3c2
6 changed files with 20 additions and 22 deletions

View File

@@ -72,8 +72,9 @@ public abstract class KeyguardViewBase extends FrameLayout {
}
};
public KeyguardViewBase(Context context) {
public KeyguardViewBase(Context context, KeyguardViewCallback callback) {
super(context);
mCallback = callback;
resetBackground();
}
@@ -81,11 +82,6 @@ public abstract class KeyguardViewBase extends FrameLayout {
setBackgroundDrawable(mBackgroundDrawable);
}
// used to inject callback
void setCallback(KeyguardViewCallback callback) {
mCallback = callback;
}
public KeyguardViewCallback getCallback() {
return mCallback;
}

View File

@@ -158,9 +158,9 @@ public class KeyguardViewManager implements KeyguardWindowController {
if (mKeyguardView == null) {
if (DEBUG) Log.d(TAG, "keyguard view is null, creating it...");
mKeyguardView = mKeyguardViewProperties.createKeyguardView(mContext, mUpdateMonitor, this);
mKeyguardView = mKeyguardViewProperties.createKeyguardView(mContext, mCallback,
mUpdateMonitor, this);
mKeyguardView.setId(R.id.lock_screen);
mKeyguardView.setCallback(mCallback);
final ViewGroup.LayoutParams lp = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,

View File

@@ -24,16 +24,17 @@ import android.content.Context;
* of whether the keyguard instance is around or not.
*/
public interface KeyguardViewProperties {
/**
* Create a keyguard view.
* @param context the context to use when creating the view.
* @param callback keyguard callback object for pokewakelock(), etc.
* @param updateMonitor configuration may be based on this.
* @param controller for talking back with the containing window.
* @return the view.
*/
KeyguardViewBase createKeyguardView(Context context,
KeyguardUpdateMonitor updateMonitor,
KeyguardViewCallback mCallback, KeyguardUpdateMonitor updateMonitor,
KeyguardWindowController controller);
/**

View File

@@ -291,17 +291,16 @@ public class LockPatternKeyguardView extends KeyguardViewBase implements Handler
/**
* @param context Used to inflate, and create views.
* @param callback Keyguard callback object for pokewakelock(), etc.
* @param updateMonitor Knows the state of the world, and passed along to each
* screen so they can use the knowledge, and also register for callbacks
* on dynamic information.
* @param lockPatternUtils Used to look up state of lock pattern.
*/
public LockPatternKeyguardView(
Context context,
KeyguardUpdateMonitor updateMonitor,
LockPatternUtils lockPatternUtils,
KeyguardWindowController controller) {
super(context);
Context context, KeyguardViewCallback callback, KeyguardUpdateMonitor updateMonitor,
LockPatternUtils lockPatternUtils, KeyguardWindowController controller) {
super(context, callback);
mHandler = new Handler(this);
mConfiguration = context.getResources().getConfiguration();

View File

@@ -43,9 +43,10 @@ public class LockPatternKeyguardViewProperties implements KeyguardViewProperties
}
public KeyguardViewBase createKeyguardView(Context context,
KeyguardViewCallback callback,
KeyguardUpdateMonitor updateMonitor,
KeyguardWindowController controller) {
return new LockPatternKeyguardView(context, updateMonitor,
return new LockPatternKeyguardView(context, callback, updateMonitor,
mLockPatternUtils, controller);
}

View File

@@ -17,6 +17,7 @@
package com.android.internal.policy.impl;
import android.content.Context;
import com.android.internal.policy.impl.KeyguardViewCallback;
import com.android.internal.telephony.IccCard;
import android.content.res.Configuration;
import android.test.AndroidTestCase;
@@ -133,9 +134,10 @@ public class LockPatternKeyguardViewTest extends AndroidTestCase {
private TestableLockPatternKeyguardView(Context context, KeyguardUpdateMonitor updateMonitor,
private TestableLockPatternKeyguardView(Context context, KeyguardViewCallback callback,
KeyguardUpdateMonitor updateMonitor,
LockPatternUtils lockPatternUtils, KeyguardWindowController controller) {
super(context, updateMonitor, lockPatternUtils, controller);
super(context, callback, updateMonitor, lockPatternUtils, controller);
}
@Override
@@ -198,14 +200,13 @@ public class LockPatternKeyguardViewTest extends AndroidTestCase {
super.setUp();
mUpdateMonitor = new MockUpdateMonitor(getContext());
mLockPatternUtils = new MockLockPatternUtils(getContext());
mKeyguardViewCallback = new MockKeyguardCallback();
mLPKV = new TestableLockPatternKeyguardView(getContext(), mUpdateMonitor,
mLockPatternUtils, new KeyguardWindowController() {
mLPKV = new TestableLockPatternKeyguardView(getContext(), mKeyguardViewCallback,
mUpdateMonitor, mLockPatternUtils, new KeyguardWindowController() {
public void setNeedsInput(boolean needsInput) {
}
});
mKeyguardViewCallback = new MockKeyguardCallback();
mLPKV.setCallback(mKeyguardViewCallback);
}
public void testStateAfterCreatedWhileScreenOff() {