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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
/**
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user