From 3efe106264262924a9218268d3c7d19d272fb7a2 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Fri, 28 Sep 2012 16:59:31 -0700 Subject: [PATCH] Clean up SIM PIN and PUK screens in keyguard. - new flow for PUK screen - clean up SIM and PUK screen to match UX designs - simplified logic for showing emergency call button Change-Id: I66fcd312f3c52dd212d9836dc020735dbc88d5ee --- core/res/res/layout/keyguard_navigation.xml | 2 +- .../res/res/layout/keyguard_password_view.xml | 2 +- core/res/res/layout/keyguard_sim_pin_view.xml | 21 ++- core/res/res/layout/keyguard_sim_puk_view.xml | 145 ++++++--------- core/res/res/values/strings.xml | 18 +- core/res/res/values/symbols.xml | 5 +- .../policy/impl/keyguard/EmergencyButton.java | 18 +- .../impl/keyguard/KeyguardSimPukView.java | 174 +++++++++--------- .../keyguard/KeyguardStatusViewManager.java | 2 +- 9 files changed, 189 insertions(+), 198 deletions(-) diff --git a/core/res/res/layout/keyguard_navigation.xml b/core/res/res/layout/keyguard_navigation.xml index d52bcb449b4d0..c29dc707d3685 100644 --- a/core/res/res/layout/keyguard_navigation.xml +++ b/core/res/res/layout/keyguard_navigation.xml @@ -1,7 +1,7 @@ diff --git a/core/res/res/layout/keyguard_sim_puk_view.xml b/core/res/res/layout/keyguard_sim_puk_view.xml index 8bb76c131213c..0c41a346d72c6 100644 --- a/core/res/res/layout/keyguard_sim_puk_view.xml +++ b/core/res/res/layout/keyguard_sim_puk_view.xml @@ -16,6 +16,8 @@ ** limitations under the License. */ --> + - - - + android:layout_width="match_parent" + android:layout_weight="1" + android:orientation="vertical" + android:gravity="center"> - + + + + + + + + + android:orientation="horizontal" + android:layout_marginEnd="4dip" + android:layout_marginStart="4dip" + android:gravity="center_vertical" + android:background="#70000000"> - - - - - - - - - - - - - - - - - - - - - - - - - + + + @@ -125,9 +91,14 @@ android:layout_marginEnd="4dip" android:paddingTop="4dip" android:paddingBottom="4dip" - android:background="#80ffffff" + android:background="#40000000" android:keyBackground="@*android:drawable/btn_keyboard_key_ics" android:clickable="true" /> + + diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 1b56c29264615..e127427c61d65 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -3830,10 +3830,12 @@ Enter PIN Enter Password - - PUK code + + SIM is now disabled. Enter PUK code to continue. Contact carrier for details. - New PIN code + Enter desired PIN code + + Confirm desired PIN code Unlocking SIM card\u2026 @@ -3841,11 +3843,11 @@ Type a PIN that is 4 to 8 numbers. - Type a PUK that is 8 numbers or longer. - - Type PUK and new PIN code + PUK code should be 8 numbers or more. - The PUK you typed isn\'t correct. + Re-enter the correct PUK code. Repeated attempts will permanently disable the SIM. + + PIN codes does not match Too many pattern attempts @@ -3861,7 +3863,7 @@ Forgot your username or password\?\nVisit google.com/accounts/recovery. - Checking\u2026 + Unlocking SIM\u2026 You have incorrectly typed your PIN %d times. diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index e16dd33c55c7d..3ed301fa2859c 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1274,10 +1274,7 @@ - - - @@ -1408,6 +1405,8 @@ + + diff --git a/policy/src/com/android/internal/policy/impl/keyguard/EmergencyButton.java b/policy/src/com/android/internal/policy/impl/keyguard/EmergencyButton.java index 1828ea57e8b40..203ba3c6a0712 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/EmergencyButton.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/EmergencyButton.java @@ -98,11 +98,19 @@ public class EmergencyButton extends Button { } private void updateEmergencyCallButton(State simState, int phoneState) { - boolean enabled = mLockPatternUtils.isEmergencyCallCapable() - || (phoneState == TelephonyManager.CALL_STATE_OFFHOOK); // voice call in progress - if (enabled && KeyguardUpdateMonitor.isSimLocked(simState)) { - // Some countries can't handle emergency calls while SIM is locked. - enabled = mLockPatternUtils.isEmergencyCallEnabledWhileSimLocked(); + boolean enabled = false; + if (phoneState == TelephonyManager.CALL_STATE_OFFHOOK) { + enabled = true; // always show "return to call" if phone is off-hook + } else if (mLockPatternUtils.isEmergencyCallCapable()) { + boolean simLocked = KeyguardUpdateMonitor.getInstance(mContext).isSimLocked(); + if (simLocked) { + // Some countries can't handle emergency calls while SIM is locked. + enabled = mLockPatternUtils.isEmergencyCallEnabledWhileSimLocked(); + } else { + // True if we need to show a secure screen (pin/pattern/SIM pin/SIM puk); + // hides emergency button on "Slide" screen if device is not secure. + enabled = mLockPatternUtils.isSecure(); + } } mLockPatternUtils.updateEmergencyCallButtonState(this, phoneState, enabled, KeyguardViewManager.USE_UPPER_CASE, false); diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSimPukView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSimPukView.java index d4bed2552f224..2015826877b50 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSimPukView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardSimPukView.java @@ -19,13 +19,11 @@ import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Context; -import android.content.res.Configuration; import android.graphics.Rect; import android.os.RemoteException; import android.os.ServiceManager; import android.text.Editable; import android.util.AttributeSet; -import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; @@ -42,16 +40,11 @@ import com.android.internal.widget.PasswordEntryKeyboardView; import com.android.internal.R; public class KeyguardSimPukView extends LinearLayout implements View.OnClickListener, - View.OnFocusChangeListener, KeyguardSecurityView, OnEditorActionListener { + KeyguardSecurityView, OnEditorActionListener { private static final int DIGIT_PRESS_WAKE_MILLIS = 5000; - private TextView mPukText; - private TextView mPinText; - private TextView mFocusedEntry; - - private View mDelPukButton; - private View mDelPinButton; + private View mDeleteButton; private ProgressDialog mSimUnlockProgressDialog = null; private KeyguardSecurityCallback mCallback; @@ -66,6 +59,60 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList private volatile boolean mCheckInProgress; + private TextView mSimPinEntry; + + private String mPukText; + + private String mPinText; + private StateMachine mStateMachine = new StateMachine(); + + private class StateMachine { + final int ENTER_PUK = 0; + final int ENTER_PIN = 1; + final int CONFIRM_PIN = 2; + final int DONE = 3; + private int state = ENTER_PUK; + + public void next() { + int msg = 0; + if (state == ENTER_PUK) { + if (checkPuk()) { + state = ENTER_PIN; + msg = R.string.kg_puk_enter_pin_hint; + } else { + msg = R.string.kg_invalid_sim_puk_hint; + } + } else if (state == ENTER_PIN) { + if (checkPin()) { + state = CONFIRM_PIN; + msg = R.string.kg_enter_confirm_pin_hint; + } else { + msg = R.string.kg_invalid_sim_pin_hint; + } + } else if (state == CONFIRM_PIN) { + if (confirmPin()) { + state = DONE; + msg = R.string.kg_login_checking_password; + updateSim(); + } else { + msg = R.string.kg_invalid_confirm_pin_hint; + } + } + mSimPinEntry.setText(null); + if (msg != 0) { + mNavigationManager.setMessage(msg); + } + } + + void reset() { + mPinText=""; + mPukText=""; + state = ENTER_PUK; + mNavigationManager.setMessage(R.string.kg_puk_enter_puk_hint); + mSimPinEntry.requestFocus(); + } + } + public KeyguardSimPukView(Context context) { this(context, null); } @@ -86,15 +133,10 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList mNavigationManager = new KeyguardNavigationManager(this); - mPukText = (TextView) findViewById(R.id.sim_puk_entry); - mPukText.setOnEditorActionListener(this); - mPinText = (TextView) findViewById(R.id.sim_pin_entry); - mPinText.setOnEditorActionListener(this); - mDelPukButton = findViewById(R.id.puk_delete_button); - mDelPukButton.setOnClickListener(this); - mDelPinButton = findViewById(R.id.pin_delete_button); - mDelPinButton.setOnClickListener(this); - + mSimPinEntry = (TextView) findViewById(R.id.sim_pin_entry); + mSimPinEntry.setOnEditorActionListener(this); + mDeleteButton = findViewById(R.id.delete_button); + mDeleteButton.setOnClickListener(this); mKeyboardView = (PasswordEntryKeyboardView) findViewById(R.id.keyboard); mKeyboardHelper = new PasswordEntryKeyboardHelper(mContext, mKeyboardView, this, false, new int[] { @@ -106,22 +148,12 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList }); mKeyboardHelper.setKeyboardMode(PasswordEntryKeyboardHelper.KEYBOARD_MODE_NUMERIC); mKeyboardHelper.setEnableHaptics(mLockPatternUtils.isTactileFeedbackEnabled()); - - mNavigationManager.setMessage(R.string.kg_sim_puk_recovery_hint); - - mPinText.setFocusableInTouchMode(true); - mPinText.setOnFocusChangeListener(this); - mPukText.setFocusableInTouchMode(true); - mPukText.setOnFocusChangeListener(this); - - setFocusableInTouchMode(true); - reset(); } @Override protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) { - return mPukText.requestFocus(direction, previouslyFocusedRect); + return mSimPinEntry.requestFocus(direction, previouslyFocusedRect); } public boolean needsInput() { @@ -182,18 +214,9 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList } public void onClick(View v) { - if (v == mDelPukButton) { - if (mFocusedEntry != mPukText) - mPukText.requestFocus(); - final Editable digits = mPukText.getEditableText(); - final int len = digits.length(); - if (len > 0) { - digits.delete(len-1, len); - } - } else if (v == mDelPinButton) { - if (mFocusedEntry != mPinText) - mPinText.requestFocus(); - final Editable digits = mPinText.getEditableText(); + if (v == mDeleteButton) { + mSimPinEntry.requestFocus(); + final Editable digits = mSimPinEntry.getEditableText(); final int len = digits.length(); if (len > 0) { digits.delete(len-1, len); @@ -202,12 +225,6 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList mCallback.userActivity(DIGIT_PRESS_WAKE_MILLIS); } - @Override - public void onFocusChange(View view, boolean hasFocus) { - if (hasFocus) - mFocusedEntry = (TextView) view; - } - private Dialog getSimUnlockProgressDialog() { if (mSimUnlockProgressDialog == null) { mSimUnlockProgressDialog = new ProgressDialog(mContext); @@ -223,32 +240,37 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList return mSimUnlockProgressDialog; } - private void checkPuk() { + private boolean checkPuk() { // make sure the puk is at least 8 digits long. - if (mPukText.getText().length() < 8) { - // otherwise, display a message to the user, and don't submit. - mNavigationManager.setMessage(R.string.kg_invalid_sim_puk_hint); - mPukText.setText(""); - return; + if (mSimPinEntry.getText().length() >= 8) { + mPukText = mSimPinEntry.getText().toString(); + return true; } + return false; + } + private boolean checkPin() { // make sure the PIN is between 4 and 8 digits - if (mPinText.getText().length() < 4 - || mPinText.getText().length() > 8) { - // otherwise, display a message to the user, and don't submit. - mNavigationManager.setMessage(R.string.kg_invalid_sim_pin_hint); - mPinText.setText(""); - return; + int length = mSimPinEntry.getText().length(); + if (length >= 4 && length <= 8) { + mPinText = mSimPinEntry.getText().toString(); + return true; } + return false; + } + public boolean confirmPin() { + return mPinText.equals(mSimPinEntry.getText().toString()); + } + + private void updateSim() { getSimUnlockProgressDialog().show(); if (!mCheckInProgress) { mCheckInProgress = true; - new CheckSimPuk(mPukText.getText().toString(), - mPinText.getText().toString()) { + new CheckSimPuk(mPukText, mPinText) { void onSimLockChangedResponse(final boolean success) { - mPinText.post(new Runnable() { + post(new Runnable() { public void run() { if (mSimUnlockProgressDialog != null) { mSimUnlockProgressDialog.hide(); @@ -256,9 +278,8 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList if (success) { mCallback.dismiss(true); } else { + mStateMachine.reset(); mNavigationManager.setMessage(R.string.kg_invalid_puk); - mPukText.setText(""); - mPinText.setText(""); } mCheckInProgress = false; } @@ -273,24 +294,10 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList // Check if this was the result of hitting the enter key mCallback.userActivity(DIGIT_PRESS_WAKE_MILLIS); if (event.getAction() == MotionEvent.ACTION_DOWN) { - if (actionId == EditorInfo.IME_NULL - || actionId == EditorInfo.IME_ACTION_DONE + if (actionId == EditorInfo.IME_NULL || actionId == EditorInfo.IME_ACTION_DONE || actionId == EditorInfo.IME_ACTION_NEXT) { - if (view == mPukText && mPukText.getText().length() < 8) { - mNavigationManager.setMessage(R.string.kg_invalid_sim_puk_hint); - mPukText.setText(""); - mPukText.requestFocus(); - return true; - } else if (view == mPinText) { - if (mPinText.getText().length() < 4 || mPinText.getText().length() > 8) { - mNavigationManager.setMessage(R.string.kg_invalid_sim_pin_hint); - mPinText.setText(""); - mPinText.requestFocus(); - } else { - checkPuk(); - } - return true; - } + mStateMachine.next(); + return true; } } return false; @@ -303,10 +310,7 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList @Override public void reset() { - mNavigationManager.setMessage(R.string.kg_sim_puk_recovery_hint); - mPinText.setText(""); - mPukText.setText(""); - mPukText.requestFocus(); + mStateMachine.reset(); } @Override diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java index 701017d9b6ca5..866194c8da318 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardStatusViewManager.java @@ -184,8 +184,8 @@ class KeyguardStatusViewManager { Settings.Secure.LOCK_SCREEN_OWNER_INFO_ENABLED, 1, UserHandle.USER_CURRENT) != 0; String text = Settings.Secure.getStringForUser(res, Settings.Secure.LOCK_SCREEN_OWNER_INFO, UserHandle.USER_CURRENT); - text = text != null ? text.trim() : null; // Remove trailing newlines if (ownerInfoEnabled && !TextUtils.isEmpty(text)) { + text = text.trim(); // Remove trailing newlines maybeSetUpperCaseText(mOwnerInfoView, text); mOwnerInfoView.setVisibility(View.VISIBLE); } else {