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 68a4d282304a4..51dc0d210e83f 100755
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -3833,10 +3833,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
@@ -3844,11 +3846,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
@@ -3864,7 +3866,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 28abc98fab51c..160495c6188d5 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1275,10 +1275,7 @@
-
-
-
@@ -1409,6 +1406,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 {