diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 6f4f59877814d77eaf19625fecff31be2573b3ed..d8a910233bcc367dd2b3b103729127e324548bc3 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -4222,6 +4222,13 @@ public final class Settings { public static final String LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED = "lock_pattern_tactile_feedback_enabled"; + /** + * Whether to scramble a pin unlock layout + * @hide + */ + public static final String LOCKSCREEN_PIN_SCRAMBLE_LAYOUT = + "lockscreen_scramble_pin_layout"; + /** * A formatted string of the next alarm that is set, or the empty string * if there is no alarm set. diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java index 1efda7edee2f846011c904c8980f6eca0bd89886..09d78c63aa06b18eafba9f49f51eae6e2642af66 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java @@ -34,6 +34,13 @@ import com.android.settingslib.animation.DisappearAnimationUtils; import com.android.systemui.R; import com.android.systemui.statusbar.policy.DevicePostureController.DevicePostureInt; +import android.provider.Settings; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + /** * Displays a PIN pad for unlocking. */ @@ -46,6 +53,9 @@ public class KeyguardPINView extends KeyguardPinBasedInputView { private int mDisappearYTranslation; private View[][] mViews; @DevicePostureInt private int mLastDevicePosture = DEVICE_POSTURE_UNKNOWN; + private boolean mScramblePin; + + private List<Integer> mNumbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 0); public KeyguardPINView(Context context) { this(context, null); @@ -159,6 +169,31 @@ public class KeyguardPINView extends KeyguardPinBasedInputView { new View[]{ null, mEcaView, null }}; + + mScramblePin = Settings.System.getInt(getContext().getContentResolver(), + Settings.System.LOCKSCREEN_PIN_SCRAMBLE_LAYOUT, 0) == 1; + if (mScramblePin) { + Collections.shuffle(mNumbers); + // get all children who are NumPadKeys + List<NumPadKey> views = new ArrayList<>(); + + // mView contains all Views that make up the PIN pad; row0 = the entry test field, then + // rows 1-4 contain the buttons. Iterate over all views that make up the buttons in the + // pad + for (int row = 1; row < 5; row++) { + for (int column = 0; column < 3; column++) { + View key = mViews[row][column]; + if (key instanceof NumPadKey) { + views.add((NumPadKey) key); + } + } + } + // reset the digits in the views + for (int i = 0; i < mNumbers.size(); i++) { + NumPadKey view = views.get(i); + view.setDigit(mNumbers.get(i)); + } + } } @Override @@ -210,6 +245,14 @@ public class KeyguardPINView extends KeyguardPinBasedInputView { setClipChildren(enable); } + @Override + protected int getNumberIndex(int number) { + if (mScramblePin) { + return (mNumbers.indexOf(number) + 1) % mNumbers.size(); + } + return super.getNumberIndex(number); + } + @Override public boolean hasOverlappingRendering() { return false; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java index 0b8868f6d3c48ecddf129d6ceb0045887f2aa90e..883f680d84d2f67e5119d31bb76b80937200c9d9 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java @@ -120,9 +120,13 @@ public abstract class KeyguardPinBasedInputView extends KeyguardAbsKeyInputView } } + protected int getNumberIndex(int number) { + return number; + } + private void performNumberClick(int number) { if (number >= 0 && number <= 9) { - mButtons[number].performClick(); + mButtons[getNumberIndex(number)].performClick(); } } diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java index e79ea9a44843e313ceabba47b53b1df1eb714c11..c3a0381438bbccb28f2b02840a6d8c761252748a 100644 --- a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java +++ b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java @@ -37,6 +37,8 @@ import com.android.internal.widget.LockPatternUtils; import com.android.settingslib.Utils; import com.android.systemui.R; +import android.provider.Settings; + public class NumPadKey extends ViewGroup { // list of "ABC", etc per digit, starting with '0' static String sKlondike[]; @@ -114,30 +116,41 @@ public class NumPadKey extends ViewGroup { mDigitText.setText(Integer.toString(mDigit)); mKlondikeText = (TextView) findViewById(R.id.klondike_text); + updateText(); + setContentDescription(mDigitText.getText().toString()); + + Drawable background = getBackground(); + if (background instanceof RippleDrawable) { + mAnimator = new NumPadAnimator(context, (RippleDrawable) background, + R.style.NumPadKey); + } else { + mAnimator = null; + } + } + + public void setDigit(int digit) { + mDigit = digit; + updateText(); + } + + private void updateText() { + boolean scramblePin = (Settings.System.getInt(getContext().getContentResolver(), + Settings.System.LOCKSCREEN_PIN_SCRAMBLE_LAYOUT, 0) == 1); if (mDigit >= 0) { + mDigitText.setText(Integer.toString(mDigit)); if (sKlondike == null) { sKlondike = getResources().getStringArray(R.array.lockscreen_num_pad_klondike); } if (sKlondike != null && sKlondike.length > mDigit) { String klondike = sKlondike[mDigit]; final int len = klondike.length(); - if (len > 0) { + if (len > 0 || scramblePin) { mKlondikeText.setText(klondike); } else if (mKlondikeText.getVisibility() != View.GONE) { mKlondikeText.setVisibility(View.INVISIBLE); } } } - - setContentDescription(mDigitText.getText().toString()); - - Drawable background = getBackground(); - if (background instanceof RippleDrawable) { - mAnimator = new NumPadAnimator(context, (RippleDrawable) background, - R.style.NumPadKey); - } else { - mAnimator = null; - } } @Override