Fix SetupWizard black screen issue for EDU devices

This fixes a problem where EDU devices show a black screen if
the device is rebooted after setting a pin/pattern/password but
before completing SetupWizard.

The issue is that the system doesn't expect to see a state
where the device is not provisioned but has a pin/pattern/password
because it wasn't possible before. With the addition of the ability
for EDU devices to add a pin/pattern/password, we can now get
into this unforseen state.

The fix ignores provisioning if a password is set so that the
user can reach the security screen to unlock the device and
continue with SetupWizard.

Fixes bug 18022051

Change-Id: Ie88a75530d964c02458c25866f0629877214edf4
This commit is contained in:
Jim Miller
2014-10-31 17:27:13 -07:00
parent bd6fabe2ae
commit b256e4e209

View File

@@ -364,7 +364,7 @@ public class KeyguardViewMediator extends SystemUI {
// only force lock screen in case of missing sim if user hasn't
// gone through setup wizard
synchronized (this) {
if (!mUpdateMonitor.isDeviceProvisioned()) {
if (shouldWaitForProvisioning()) {
if (!isShowing()) {
if (DEBUG) Log.d(TAG, "ICC_ABSENT isn't showing,"
+ " we need to show the keyguard since the "
@@ -493,8 +493,7 @@ public class KeyguardViewMediator extends SystemUI {
mLockPatternUtils.setCurrentUser(ActivityManager.getCurrentUser());
// Assume keyguard is showing (unless it's disabled) until we know for sure...
mShowing = (mUpdateMonitor.isDeviceProvisioned() || mLockPatternUtils.isSecure())
&& !mLockPatternUtils.isLockScreenDisabled();
mShowing = !shouldWaitForProvisioning() && !mLockPatternUtils.isLockScreenDisabled();
mStatusBarKeyguardViewManager = new StatusBarKeyguardViewManager(mContext,
mViewMediatorCallback, mLockPatternUtils);
@@ -783,7 +782,7 @@ public class KeyguardViewMediator extends SystemUI {
public void verifyUnlock(IKeyguardExitCallback callback) {
synchronized (this) {
if (DEBUG) Log.d(TAG, "verifyUnlock");
if (!mUpdateMonitor.isDeviceProvisioned()) {
if (shouldWaitForProvisioning()) {
// don't allow this api when the device isn't provisioned
if (DEBUG) Log.d(TAG, "ignoring because device isn't provisioned");
try {
@@ -873,7 +872,7 @@ public class KeyguardViewMediator extends SystemUI {
* was suppressed by an app that disabled the keyguard or we haven't been provisioned yet.
*/
public boolean isInputRestricted() {
return mShowing || mNeedToReshowWhenReenabled || !mUpdateMonitor.isDeviceProvisioned();
return mShowing || mNeedToReshowWhenReenabled || shouldWaitForProvisioning();
}
/**
@@ -905,14 +904,13 @@ public class KeyguardViewMediator extends SystemUI {
// if the setup wizard hasn't run yet, don't show
final boolean requireSim = !SystemProperties.getBoolean("keyguard.no_require_sim",
false);
final boolean provisioned = mUpdateMonitor.isDeviceProvisioned();
final IccCardConstants.State state = mUpdateMonitor.getSimState();
final boolean lockedOrMissing = state.isPinLocked()
|| ((state == IccCardConstants.State.ABSENT
|| state == IccCardConstants.State.PERM_DISABLED)
&& requireSim);
if (!lockedOrMissing && !provisioned) {
if (!lockedOrMissing && shouldWaitForProvisioning()) {
if (DEBUG) Log.d(TAG, "doKeyguard: not showing because device isn't provisioned"
+ " and the sim is not locked or missing");
return;
@@ -935,6 +933,10 @@ public class KeyguardViewMediator extends SystemUI {
showLocked(options);
}
private boolean shouldWaitForProvisioning() {
return !mUpdateMonitor.isDeviceProvisioned() && !isSecure();
}
/**
* Dismiss the keyguard through the security layers.
*/