Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 23d7a6e6 authored by Daniel Sandler's avatar Daniel Sandler
Browse files

PUK support.

Bug: 7413109
Change-Id: I7ccfe79a17fd9b1273bc0ac821ac0e2884ae7ab2
Proto-Id: Ie49c04cf3d373e57ef0bbfd0c59589fe905c8aae
parent 261b18aa
Loading
Loading
Loading
Loading
+177 −77
Original line number Diff line number Diff line
@@ -20,89 +20,189 @@
    carrier-provided PUK code and entering a new SIM PIN for it. -->
<com.android.internal.policy.impl.keyguard.KeyguardSimPukView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:androidprv="http://schemas.android.com/apk/res/android"
    android:id="@+id/keyguard_sim_puk_view"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="vertical">

        <LinearLayout
            android:layout_height="0dip"
            android:layout_width="match_parent"
            android:layout_weight="1"
            android:orientation="vertical"
            android:gravity="center">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_lockscreen_sim"/>

            <include layout="@layout/keyguard_message_area_large"
    <include layout="@layout/keyguard_message_area"
        android:layout_width="match_parent"
                android:layout_height="wrap_content" />

         </LinearLayout>

        <!-- Password entry field -->
        <!-- Note: the entire container is styled to look like the edit field,
             since the backspace/IME switcher looks better inside -->
        android:layout_height="wrap_content"
        />
    <LinearLayout
        android:layout_width="match_parent"
            android:layout_height="wrap_content"
        android:layout_height="0dp"
        android:orientation="horizontal"
            android:layout_marginEnd="4dip"
            android:layout_marginStart="4dip"
            android:gravity="center_vertical"
            android:background="#70000000">

            <!-- displays dots as user enters pin -->
            <EditText android:id="@+id/sim_pin_entry"
        android:layout_weight="1"
        >
        <TextView android:id="@+id/pinEntry"
            android:editable="true"
            android:layout_width="0dip"
                android:layout_height="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
                android:maxLines="1"
                android:singleLine="true"
                android:gravity="center_horizontal"
                android:layout_gravity="center_vertical"
            android:gravity="center"
            android:layout_marginStart="@*android:dimen/keyguard_lockscreen_pin_margin_left"
                android:textStyle="normal"
                android:inputType="textPassword"
                android:textSize="36sp"
            android:singleLine="true"
            android:cursorVisible="false"
            android:background="@null"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:textColor="#ffffffff"
            android:textAppearance="@style/TextAppearance.NumPadKey"
            android:imeOptions="flagForceAscii|actionDone"
            />

        <ImageButton android:id="@+id/delete_button"
            android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:src="@android:drawable/ic_input_delete"
            android:layout_height="match_parent"
            android:gravity="center_vertical"
            android:src="@*android:drawable/ic_input_delete"
            android:clickable="true"
                android:padding="8dip"
            android:paddingTop="8dip"
            android:paddingBottom="8dip"
            android:paddingLeft="24dp"
            android:paddingRight="24dp"
            android:background="?android:attr/selectableItemBackground"
            />
    </LinearLayout>

        <!-- Numeric keyboard -->
        <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard"
    <View
        android:layout_width="wrap_content"
        android:layout_height="1dp"
        android:background="#55FFFFFF"
        />
    <LinearLayout
        android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="4dip"
            android:layout_marginEnd="4dip"
            android:paddingTop="4dip"
            android:paddingBottom="4dip"
            android:background="#40000000"
            android:keyBackground="@*android:drawable/btn_keyboard_key_ics"
            android:clickable="true"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        >
        <view class="com.android.internal.policy.impl.keyguard.NumPadKey"
            android:id="@+id/key1"
            style="@style/Widget.Button.NumPadKey"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1"
            androidprv:textView="@+id/pinEntry"
            androidprv:digit="1"
            />
        <view class="com.android.internal.policy.impl.keyguard.NumPadKey"
            android:id="@+id/key2"
            style="@style/Widget.Button.NumPadKey"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1"
            androidprv:textView="@+id/pinEntry"
            androidprv:digit="2"
            />
        <view class="com.android.internal.policy.impl.keyguard.NumPadKey"
            android:id="@+id/key3"
            style="@style/Widget.Button.NumPadKey"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1"
            androidprv:textView="@+id/pinEntry"
            androidprv:digit="3"
            />
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        >
        <view class="com.android.internal.policy.impl.keyguard.NumPadKey"
            android:id="@+id/key4"
            style="@style/Widget.Button.NumPadKey"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1"
            androidprv:textView="@+id/pinEntry"
            androidprv:digit="4"
            />
        <view class="com.android.internal.policy.impl.keyguard.NumPadKey"
            android:id="@+id/key5"
            style="@style/Widget.Button.NumPadKey"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1"
            androidprv:textView="@+id/pinEntry"
            androidprv:digit="5"
            />
        <view class="com.android.internal.policy.impl.keyguard.NumPadKey"
            android:id="@+id/key6"
            style="@style/Widget.Button.NumPadKey"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1"
            androidprv:textView="@+id/pinEntry"
            androidprv:digit="6"
            />
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="horizontal"
        android:layout_weight="1"
        >
        <view class="com.android.internal.policy.impl.keyguard.NumPadKey"
            android:id="@+id/key7"
            style="@style/Widget.Button.NumPadKey"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1"
            androidprv:textView="@+id/pinEntry"
            androidprv:digit="7"
            />
        <view class="com.android.internal.policy.impl.keyguard.NumPadKey"
            android:id="@+id/key8"
            style="@style/Widget.Button.NumPadKey"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1"
            androidprv:textView="@+id/pinEntry"
            androidprv:digit="8"
            />
        <view class="com.android.internal.policy.impl.keyguard.NumPadKey"
            android:id="@+id/key9"
            style="@style/Widget.Button.NumPadKey"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1"
            androidprv:textView="@+id/pinEntry"
            androidprv:digit="9"
            />
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        >
        <Space
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1"
            />
        <view class="com.android.internal.policy.impl.keyguard.NumPadKey"
            android:id="@+id/key0"
            style="@style/Widget.Button.NumPadKey"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1"
            androidprv:textView="@+id/pinEntry"
            androidprv:digit="0"
            />
        <ImageButton
            android:id="@+id/key_enter"
            style="@style/Widget.Button.NumPadKey"
            android:gravity="center"
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:src="@drawable/sym_keyboard_return_holo"
            />
    </LinearLayout>

+0 −2
Original line number Diff line number Diff line
@@ -1326,9 +1326,7 @@
  <java-symbol type="id" name="lockPatternView" />
  <java-symbol type="id" name="forgot_password_button" />
  <java-symbol type="id" name="glow_pad_view" />
  <java-symbol type="id" name="sim_pin_entry" />
  <java-symbol type="id" name="delete_button" />
  <java-symbol type="id" name="sim_pin_entry" />
  <java-symbol type="id" name="keyguard_user_avatar" />
  <java-symbol type="id" name="keyguard_user_name" />
  <java-symbol type="id" name="keyguard_transport_control" />
+68 −126
Original line number Diff line number Diff line
@@ -19,49 +19,30 @@ import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Rect;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher;
import android.text.method.DigitsKeyListener;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;

import com.android.internal.telephony.ITelephony;
import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.PasswordEntryKeyboardHelper;
import com.android.internal.widget.PasswordEntryKeyboardView;
import com.android.internal.R;

public class KeyguardSimPukView extends LinearLayout implements View.OnClickListener,
    KeyguardSecurityView, OnEditorActionListener, TextWatcher {
import com.android.internal.R;

    private View mDeleteButton;
/**
 * Displays a PIN pad for entering a PUK (Pin Unlock Kode) provided by a carrier.
 */
public class KeyguardSimPukView extends KeyguardAbsKeyInputView
        implements KeyguardSecurityView, OnEditorActionListener, TextWatcher {

    private ProgressDialog mSimUnlockProgressDialog = null;
    private KeyguardSecurityCallback mCallback;

    private SecurityMessageDisplay mSecurityMessageDisplay;

    private PasswordEntryKeyboardView mKeyboardView;

    private PasswordEntryKeyboardHelper mKeyboardHelper;

    private LockPatternUtils mLockPatternUtils;

    private volatile boolean mCheckInProgress;

    private TextView mSimPinEntry;

    private String mPukText;

    private String mPinText;
    private StateMachine mStateMachine = new StateMachine();

@@ -95,10 +76,11 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList
                        com.android.internal.R.string.lockscreen_sim_unlock_progress_dialog_message;
                    updateSim();
                } else {
                    state = ENTER_PIN; // try again?
                    msg = R.string.kg_invalid_confirm_pin_hint;
                }
            }
            mSimPinEntry.setText(null);
            mPasswordEntry.setText(null);
            if (msg != 0) {
                mSecurityMessageDisplay.setMessage(msg, true);
            }
@@ -109,7 +91,7 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList
            mPukText="";
            state = ENTER_PUK;
            mSecurityMessageDisplay.setMessage(R.string.kg_puk_enter_puk_hint, true);
            mSimPinEntry.requestFocus();
            mPasswordEntry.requestFocus();
        }
    }

@@ -119,62 +101,71 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList

    public KeyguardSimPukView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mLockPatternUtils = new LockPatternUtils(getContext());
    }

    public void setKeyguardCallback(KeyguardSecurityCallback callback) {
        mCallback = callback;
        mLockPatternUtils = new LockPatternUtils(getContext());
    public void resetState() {
        mStateMachine.reset();
        mPasswordEntry.setEnabled(true);
    }

    @Override
    protected int getPasswordTextViewId() {
        return R.id.pinEntry;
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        mSimPinEntry = (TextView) findViewById(R.id.sim_pin_entry);
        mSimPinEntry.setOnEditorActionListener(this);
        mSimPinEntry.addTextChangedListener(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[] {
                R.xml.kg_password_kbd_numeric,
                com.android.internal.R.xml.password_kbd_qwerty,
                com.android.internal.R.xml.password_kbd_qwerty_shifted,
                com.android.internal.R.xml.password_kbd_symbols,
                com.android.internal.R.xml.password_kbd_symbols_shift
                });
        mKeyboardHelper.setKeyboardMode(PasswordEntryKeyboardHelper.KEYBOARD_MODE_NUMERIC);
        mKeyboardHelper.setEnableHaptics(mLockPatternUtils.isTactileFeedbackEnabled());

        mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this);
        mSecurityMessageDisplay.setTimeout(0); // don't show ownerinfo/charging status by default
        reset();
    }

        final View ok = findViewById(R.id.key_enter);
        if (ok != null) {
            ok.setOnClickListener(new View.OnClickListener() {
                @Override
    protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) {
        return mSimPinEntry.requestFocus(direction, previouslyFocusedRect);
                public void onClick(View v) {
                    doHapticKeyClick();
                    verifyPasswordAndUnlock();
                }
            });
        }

    public boolean needsInput() {
        return false; // This view provides its own keypad
        // The delete button is of the PIN keyboard itself in some (e.g. tablet) layouts,
        // not a separate view
        View pinDelete = findViewById(R.id.delete_button);
        if (pinDelete != null) {
            pinDelete.setVisibility(View.VISIBLE);
            pinDelete.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    CharSequence str = mPasswordEntry.getText();
                    if (str.length() > 0) {
                        mPasswordEntry.setText(str.subSequence(0, str.length()-1));
                    }
                    doHapticKeyClick();
                }
            });
            pinDelete.setOnLongClickListener(new View.OnLongClickListener() {
                public boolean onLongClick(View v) {
                    mPasswordEntry.setText("");
                    doHapticKeyClick();
                    return true;
                }
            });
        }

    public void onPause() {
        mPasswordEntry.setKeyListener(DigitsKeyListener.getInstance());
        mPasswordEntry.setInputType(InputType.TYPE_CLASS_NUMBER
                | InputType.TYPE_NUMBER_VARIATION_PASSWORD);

    }
        mPasswordEntry.requestFocus();

    public void onResume() {
        reset();
        mSecurityMessageDisplay.setTimeout(0); // don't show ownerinfo/charging status by default
    }

    @Override
    public void showUsabilityHint() {
    }

    /** {@inheritDoc} */
    public void cleanUp() {
    @Override
    public void onPause() {
        // dismiss the dialog.
        if (mSimUnlockProgressDialog != null) {
            mSimUnlockProgressDialog.dismiss();
@@ -218,23 +209,11 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList
        }
    }

    public void onClick(View v) {
        if (v == mDeleteButton) {
            mSimPinEntry.requestFocus();
            final Editable digits = mSimPinEntry.getEditableText();
            final int len = digits.length();
            if (len > 0) {
                digits.delete(len-1, len);
            }
        }
        mCallback.userActivity(KeyguardViewManager.DIGIT_PRESS_WAKE_MILLIS);
    }

    private Dialog getSimUnlockProgressDialog() {
        if (mSimUnlockProgressDialog == null) {
            mSimUnlockProgressDialog = new ProgressDialog(mContext);
            mSimUnlockProgressDialog.setMessage(mContext.getString(
                    R.string.kg_sim_unlock_progress_dialog_message));
            mSimUnlockProgressDialog.setMessage(
                    mContext.getString(R.string.kg_sim_unlock_progress_dialog_message));
            mSimUnlockProgressDialog.setIndeterminate(true);
            mSimUnlockProgressDialog.setCancelable(false);
            if (!(mContext instanceof Activity)) {
@@ -247,8 +226,8 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList

    private boolean checkPuk() {
        // make sure the puk is at least 8 digits long.
        if (mSimPinEntry.getText().length() >= 8) {
            mPukText = mSimPinEntry.getText().toString();
        if (mPasswordEntry.getText().length() >= 8) {
            mPukText = mPasswordEntry.getText().toString();
            return true;
        }
        return false;
@@ -256,16 +235,16 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList

    private boolean checkPin() {
        // make sure the PIN is between 4 and 8 digits
        int length = mSimPinEntry.getText().length();
        int length = mPasswordEntry.getText().length();
        if (length >= 4 && length <= 8) {
            mPinText = mSimPinEntry.getText().toString();
            mPinText = mPasswordEntry.getText().toString();
            return true;
        }
        return false;
    }

    public boolean confirmPin() {
        return mPinText.equals(mSimPinEntry.getText().toString());
        return mPinText.equals(mPasswordEntry.getText().toString());
    }

    private void updateSim() {
@@ -295,46 +274,9 @@ public class KeyguardSimPukView extends LinearLayout implements View.OnClickList
    }

    @Override
    public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
        // Check if this was the result of hitting the enter key
        mCallback.userActivity(KeyguardViewManager.DIGIT_PRESS_WAKE_MILLIS);
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            if (actionId == EditorInfo.IME_NULL || actionId == EditorInfo.IME_ACTION_DONE
                || actionId == EditorInfo.IME_ACTION_NEXT) {
    protected void verifyPasswordAndUnlock() {
        mStateMachine.next();
                return true;
    }
}
        return false;
    }

    @Override
    public void setLockPatternUtils(LockPatternUtils utils) {
        mLockPatternUtils = utils;
    }
    @Override
    public void reset() {
        mStateMachine.reset();
    }

    @Override
    public KeyguardSecurityCallback getCallback() {
        return mCallback;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        if (mCallback != null) {
            mCallback.userActivity(KeyguardViewManager.DIGIT_PRESS_WAKE_MILLIS);
        }
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }

    @Override
    public void afterTextChanged(Editable s) {
    }
}