• KeyguardSimPinView


      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.keyguard;
     18 
     19 import com.android.internal.telephony.ITelephony;
     20 import com.android.internal.telephony.IccCardConstants;
     21 import com.android.internal.telephony.IccCardConstants.State;
     22 import com.android.internal.telephony.PhoneConstants;
     23 
     24 import android.content.Context;
     25 import android.content.res.ColorStateList;
     26 import android.content.res.Configuration;
     27 import android.content.res.Resources;
     28 import android.app.AlertDialog;
     29 import android.app.AlertDialog.Builder;
     30 import android.app.Dialog;
     31 import android.app.ProgressDialog;
     32 import android.graphics.Color;
     33 import android.os.RemoteException;
     34 import android.os.ServiceManager;
     35 import android.telephony.SubscriptionInfo;
     36 import android.telephony.SubscriptionManager;
     37 import android.telephony.TelephonyManager;
     38 import android.telephony.euicc.EuiccManager;
     39 import android.util.AttributeSet;
     40 import android.util.Log;
     41 import android.view.View;
     42 import android.view.WindowManager;
     43 import android.widget.ImageView;
     44 
     45 /**
     46  * Displays a PIN pad for unlocking.
     47  */
     48 public class KeyguardSimPinView extends KeyguardPinBasedInputView {
     49     private static final String LOG_TAG = "KeyguardSimPinView";
     50     private static final boolean DEBUG = KeyguardConstants.DEBUG_SIM_STATES;
     51     public static final String TAG = "KeyguardSimPinView";
     52 
     53     private ProgressDialog mSimUnlockProgressDialog = null;
     54     private CheckSimPin mCheckSimPinThread;
     55 
     56     // Below flag is set to true during power-up or when a new SIM card inserted on device.
     57     // When this is true and when SIM card is PIN locked state, on PIN lock screen, message would
     58     // be displayed to inform user about the number of remaining PIN attempts left.
     59     private boolean mShowDefaultMessage = true;
     60     private int mRemainingAttempts = -1;
     61     private AlertDialog mRemainingAttemptsDialog;
     62     private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
     63     private ImageView mSimImageView;
     64 
     65     KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() {
     66         @Override
     67         public void onSimStateChanged(int subId, int slotId, State simState) {
     68             if (DEBUG) Log.v(TAG, "onSimStateChanged(subId=" + subId + ",state=" + simState + ")");
     69             switch(simState) {
     70                 // If the SIM is removed, then we must remove the keyguard. It will be put up
     71                 // again when the PUK locked SIM is re-entered.
     72                 case ABSENT: {
     73                     KeyguardUpdateMonitor.getInstance(getContext()).reportSimUnlocked(mSubId);
     74                     // onSimStateChanged callback can fire when the SIM PIN lock is not currently
     75                     // active and mCallback is null.
     76                     if (mCallback != null) {
     77                         mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser());
     78                     }
     79                     break;
     80                 }
     81                 case READY: {
     82                     mRemainingAttempts = -1;
     83                     resetState();
     84                     break;
     85                 }
     86                 default:
     87                     resetState();
     88             }
     89         }
     90     };
     91 
     92     public KeyguardSimPinView(Context context) {
     93         this(context, null);
     94     }
     95 
     96     public KeyguardSimPinView(Context context, AttributeSet attrs) {
     97         super(context, attrs);
     98     }
     99 
    100     @Override
    101     public void resetState() {
    102         super.resetState();
    103         if (DEBUG) Log.v(TAG, "Resetting state");
    104         handleSubInfoChangeIfNeeded();
    105         if (mShowDefaultMessage) {
    106             showDefaultMessage();
    107         }
    108         boolean isEsimLocked = KeyguardEsimArea.isEsimLocked(mContext, mSubId);
    109 
    110         KeyguardEsimArea esimButton = findViewById(R.id.keyguard_esim_area);
    111         esimButton.setVisibility(isEsimLocked ? View.VISIBLE : View.GONE);
    112     }
    113 
    114     private void showDefaultMessage() {
    115         if (mRemainingAttempts >= 0) {
    116             mSecurityMessageDisplay.setMessage(getPinPasswordErrorMessage(
    117                     mRemainingAttempts, true));
    118             return;
    119         }
    120 
    121         boolean isEsimLocked = KeyguardEsimArea.isEsimLocked(mContext, mSubId);
    122         int count = TelephonyManager.getDefault().getSimCount();
    123         Resources rez = getResources();
    124         String msg;
    125         int color = Color.WHITE;
    126         if (count < 2) {
    127             msg = rez.getString(R.string.kg_sim_pin_instructions);
    128         } else {
    129             SubscriptionInfo info = KeyguardUpdateMonitor.getInstance(mContext).
    130                     getSubscriptionInfoForSubId(mSubId);
    131             CharSequence displayName = info != null ? info.getDisplayName() : ""; // don't crash
    132             msg = rez.getString(R.string.kg_sim_pin_instructions_multi, displayName);
    133             if (info != null) {
    134                 color = info.getIconTint();
    135             }
    136         }
    137 
    138         if (isEsimLocked) {
    139             msg = rez.getString(R.string.kg_sim_lock_esim_instructions, msg);
    140         }
    141 
    142         mSecurityMessageDisplay.setMessage(msg);
    143         mSimImageView.setImageTintList(ColorStateList.valueOf(color));
    144 
    145         // Sending empty PIN here to query the number of remaining PIN attempts
    146         new CheckSimPin("", mSubId) {
    147             void onSimCheckResponse(final int result, final int attemptsRemaining) {
    148                 Log.d(LOG_TAG, "onSimCheckResponse " + " dummy One result" + result +
    149                         " attemptsRemaining=" + attemptsRemaining);
    150                 if (attemptsRemaining >= 0) {
    151                     mRemainingAttempts = attemptsRemaining;
    152                     mSecurityMessageDisplay.setMessage(
    153                             getPinPasswordErrorMessage(attemptsRemaining, true));
    154                 }
    155             }
    156         }.start();
    157     }
    158 
    159     private void handleSubInfoChangeIfNeeded() {
    160         KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext);
    161         int subId = monitor.getNextSubIdForState(IccCardConstants.State.PIN_REQUIRED);
    162         if (subId != mSubId && SubscriptionManager.isValidSubscriptionId(subId)) {
    163             mSubId = subId;
    164             mShowDefaultMessage = true;
    165             mRemainingAttempts = -1;
    166         }
    167     }
    168 
    169     @Override
    170     protected void onConfigurationChanged(Configuration newConfig) {
    171         super.onConfigurationChanged(newConfig);
    172         resetState();
    173     }
    174 
    175     @Override
    176     protected int getPromptReasonStringRes(int reason) {
    177         // No message on SIM Pin
    178         return 0;
    179     }
    180 
    181     private String getPinPasswordErrorMessage(int attemptsRemaining, boolean isDefault) {
    182         String displayMessage;
    183         int msgId;
    184         if (attemptsRemaining == 0) {
    185             displayMessage = getContext().getString(R.string.kg_password_wrong_pin_code_pukked);
    186         } else if (attemptsRemaining > 0) {
    187             msgId = isDefault ? R.plurals.kg_password_default_pin_message :
    188                      R.plurals.kg_password_wrong_pin_code;
    189             displayMessage = getContext().getResources()
    190                     .getQuantityString(msgId, attemptsRemaining, attemptsRemaining);
    191         } else {
    192             msgId = isDefault ? R.string.kg_sim_pin_instructions : R.string.kg_password_pin_failed;
    193             displayMessage = getContext().getString(msgId);
    194         }
    195         if (KeyguardEsimArea.isEsimLocked(mContext, mSubId)) {
    196             displayMessage = getResources()
    197                     .getString(R.string.kg_sim_lock_esim_instructions, displayMessage);
    198         }
    199         if (DEBUG) Log.d(LOG_TAG, "getPinPasswordErrorMessage:"
    200                 + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage);
    201         return displayMessage;
    202     }
    203 
    204     @Override
    205     protected boolean shouldLockout(long deadline) {
    206         // SIM PIN doesn't have a timed lockout
    207         return false;
    208     }
    209 
    210     @Override
    211     protected int getPasswordTextViewId() {
    212         return R.id.simPinEntry;
    213     }
    214 
    215     @Override
    216     protected void onFinishInflate() {
    217         super.onFinishInflate();
    218 
    219         if (mEcaView instanceof EmergencyCarrierArea) {
    220             ((EmergencyCarrierArea) mEcaView).setCarrierTextVisible(true);
    221         }
    222         mSimImageView = findViewById(R.id.keyguard_sim);
    223     }
    224 
    225     @Override
    226     protected void onAttachedToWindow() {
    227         super.onAttachedToWindow();
    228         KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback);
    229     }
    230 
    231     @Override
    232     protected void onDetachedFromWindow() {
    233         super.onDetachedFromWindow();
    234         KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallback);
    235     }
    236 
    237     @Override
    238     public void showUsabilityHint() {
    239     }
    240 
    241     @Override
    242     public void onPause() {
    243         // dismiss the dialog.
    244         if (mSimUnlockProgressDialog != null) {
    245             mSimUnlockProgressDialog.dismiss();
    246             mSimUnlockProgressDialog = null;
    247         }
    248     }
    249 
    250     /**
    251      * Since the IPC can block, we want to run the request in a separate thread
    252      * with a callback.
    253      */
    254     private abstract class CheckSimPin extends Thread {
    255         private final String mPin;
    256         private int mSubId;
    257 
    258         protected CheckSimPin(String pin, int subId) {
    259             mPin = pin;
    260             mSubId = subId;
    261         }
    262 
    263         abstract void onSimCheckResponse(final int result, final int attemptsRemaining);
    264 
    265         @Override
    266         public void run() {
    267             try {
    268                 if (DEBUG) {
    269                     Log.v(TAG, "call supplyPinReportResultForSubscriber(subid=" + mSubId + ")");
    270                 }
    271                 final int[] result = ITelephony.Stub.asInterface(ServiceManager
    272                         .checkService("phone")).supplyPinReportResultForSubscriber(mSubId, mPin);
    273                 if (DEBUG) {
    274                     Log.v(TAG, "supplyPinReportResult returned: " + result[0] + " " + result[1]);
    275                 }
    276                 post(new Runnable() {
    277                     @Override
    278                     public void run() {
    279                         onSimCheckResponse(result[0], result[1]);
    280                     }
    281                 });
    282             } catch (RemoteException e) {
    283                 Log.e(TAG, "RemoteException for supplyPinReportResult:", e);
    284                 post(new Runnable() {
    285                     @Override
    286                     public void run() {
    287                         onSimCheckResponse(PhoneConstants.PIN_GENERAL_FAILURE, -1);
    288                     }
    289                 });
    290             }
    291         }
    292     }
    293 
    294     private Dialog getSimUnlockProgressDialog() {
    295         if (mSimUnlockProgressDialog == null) {
    296             mSimUnlockProgressDialog = new ProgressDialog(mContext);
    297             mSimUnlockProgressDialog.setMessage(
    298                     mContext.getString(R.string.kg_sim_unlock_progress_dialog_message));
    299             mSimUnlockProgressDialog.setIndeterminate(true);
    300             mSimUnlockProgressDialog.setCancelable(false);
    301             mSimUnlockProgressDialog.getWindow().setType(
    302                     WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
    303         }
    304         return mSimUnlockProgressDialog;
    305     }
    306 
    307     private Dialog getSimRemainingAttemptsDialog(int remaining) {
    308         String msg = getPinPasswordErrorMessage(remaining, false);
    309         if (mRemainingAttemptsDialog == null) {
    310             Builder builder = new AlertDialog.Builder(mContext);
    311             builder.setMessage(msg);
    312             builder.setCancelable(false);
    313             builder.setNeutralButton(R.string.ok, null);
    314             mRemainingAttemptsDialog = builder.create();
    315             mRemainingAttemptsDialog.getWindow().setType(
    316                     WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
    317         } else {
    318             mRemainingAttemptsDialog.setMessage(msg);
    319         }
    320         return mRemainingAttemptsDialog;
    321     }
    322 
    323     @Override
    324     protected void verifyPasswordAndUnlock() {
    325         String entry = mPasswordEntry.getText();
    326 
    327         if (entry.length() < 4) {
    328             // otherwise, display a message to the user, and don't submit.
    329             mSecurityMessageDisplay.setMessage(R.string.kg_invalid_sim_pin_hint);
    330             resetPasswordText(true /* animate */, true /* announce */);
    331             mCallback.userActivity();
    332             return;
    333         }
    334 
    335         getSimUnlockProgressDialog().show();
    336 
    337         if (mCheckSimPinThread == null) {
    338             mCheckSimPinThread = new CheckSimPin(mPasswordEntry.getText(), mSubId) {
    339                 @Override
    340                 void onSimCheckResponse(final int result, final int attemptsRemaining) {
    341                     post(new Runnable() {
    342                         @Override
    343                         public void run() {
    344                             mRemainingAttempts = attemptsRemaining;
    345                             if (mSimUnlockProgressDialog != null) {
    346                                 mSimUnlockProgressDialog.hide();
    347                             }
    348                             resetPasswordText(true /* animate */,
    349                                     result != PhoneConstants.PIN_RESULT_SUCCESS /* announce */);
    350                             if (result == PhoneConstants.PIN_RESULT_SUCCESS) {
    351                                 KeyguardUpdateMonitor.getInstance(getContext())
    352                                         .reportSimUnlocked(mSubId);
    353                                 mRemainingAttempts = -1;
    354                                 mShowDefaultMessage = true;
    355                                 if (mCallback != null) {
    356                                     mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser());
    357                                 }
    358                             } else {
    359                                 mShowDefaultMessage = false;
    360                                 if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) {
    361                                     if (attemptsRemaining <= 2) {
    362                                         // this is getting critical - show dialog
    363                                         getSimRemainingAttemptsDialog(attemptsRemaining).show();
    364                                     } else {
    365                                         // show message
    366                                         mSecurityMessageDisplay.setMessage(
    367                                                 getPinPasswordErrorMessage(attemptsRemaining, false));
    368                                     }
    369                                 } else {
    370                                     // "PIN operation failed!" - no idea what this was and no way to
    371                                     // find out. :/
    372                                     mSecurityMessageDisplay.setMessage(getContext().getString(
    373                                             R.string.kg_password_pin_failed));
    374                                 }
    375                                 if (DEBUG) Log.d(LOG_TAG, "verifyPasswordAndUnlock "
    376                                         + " CheckSimPin.onSimCheckResponse: " + result
    377                                         + " attemptsRemaining=" + attemptsRemaining);
    378                             }
    379                             mCallback.userActivity();
    380                             mCheckSimPinThread = null;
    381                         }
    382                     });
    383                 }
    384             };
    385             mCheckSimPinThread.start();
    386         }
    387     }
    388 
    389     @Override
    390     public void startAppearAnimation() {
    391         // noop.
    392     }
    393 
    394     @Override
    395     public boolean startDisappearAnimation(Runnable finishRunnable) {
    396         return false;
    397     }
    398 
    399     @Override
    400     public CharSequence getTitle() {
    401         return getContext().getString(
    402                 com.android.internal.R.string.keyguard_accessibility_sim_pin_unlock);
    403     }
    404 }
    /*
    * Copyright (C) 2012 The Android Open Source Project
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    * http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */

    package com.android.keyguard;

    import com.android.internal.telephony.ITelephony;
    import com.android.internal.telephony.IccCardConstants;
    import com.android.internal.telephony.IccCardConstants.State;
    import com.android.internal.telephony.PhoneConstants;

    import android.content.Context;
    import android.content.res.ColorStateList;
    import android.content.res.Configuration;
    import android.content.res.Resources;
    import android.app.AlertDialog;
    import android.app.AlertDialog.Builder;
    import android.app.Dialog;
    import android.app.ProgressDialog;
    import android.graphics.Color;
    import android.os.RemoteException;
    import android.os.ServiceManager;
    import android.telephony.SubscriptionInfo;
    import android.telephony.SubscriptionManager;
    import android.telephony.TelephonyManager;
    import android.telephony.euicc.EuiccManager;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.View;
    import android.view.WindowManager;
    import android.widget.ImageView;

    /**
    * Displays a PIN pad for unlocking.
    */
    public class KeyguardSimPinView extends KeyguardPinBasedInputView {
    private static final String LOG_TAG = "KeyguardSimPinView";
    private static final boolean DEBUG = KeyguardConstants.DEBUG_SIM_STATES;
    public static final String TAG = "KeyguardSimPinView";

    private ProgressDialog mSimUnlockProgressDialog = null;
    private CheckSimPin mCheckSimPinThread;

    // Below flag is set to true during power-up or when a new SIM card inserted on device.
    // When this is true and when SIM card is PIN locked state, on PIN lock screen, message would
    // be displayed to inform user about the number of remaining PIN attempts left.
    private boolean mShowDefaultMessage = true;
    private int mRemainingAttempts = -1;
    private AlertDialog mRemainingAttemptsDialog;
    private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
    private ImageView mSimImageView;

    KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() {
    @Override
    public void onSimStateChanged(int subId, int slotId, State simState) {
    if (DEBUG) Log.v(TAG, "onSimStateChanged(subId=" + subId + ",state=" + simState + ")");
    switch(simState) {
    // If the SIM is removed, then we must remove the keyguard. It will be put up
    // again when the PUK locked SIM is re-entered.
    case ABSENT: {
    KeyguardUpdateMonitor.getInstance(getContext()).reportSimUnlocked(mSubId);
    // onSimStateChanged callback can fire when the SIM PIN lock is not currently
    // active and mCallback is null.
    if (mCallback != null) {
    mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser());
    }
    break;
    }
    case READY: {
    mRemainingAttempts = -1;
    resetState();
    break;
    }
    default:
    resetState();
    }
    }
    };

    public KeyguardSimPinView(Context context) {
    this(context, null);
    }

    public KeyguardSimPinView(Context context, AttributeSet attrs) {
    super(context, attrs);
    }

    @Override
    public void resetState() {
    super.resetState();
    if (DEBUG) Log.v(TAG, "Resetting state");
    handleSubInfoChangeIfNeeded();
    if (mShowDefaultMessage) {
    showDefaultMessage();
    }
    boolean isEsimLocked = KeyguardEsimArea.isEsimLocked(mContext, mSubId);

    KeyguardEsimArea esimButton = findViewById(R.id.keyguard_esim_area);
    esimButton.setVisibility(isEsimLocked ? View.VISIBLE : View.GONE);
    }

    private void showDefaultMessage() {
    if (mRemainingAttempts >= 0) {
    mSecurityMessageDisplay.setMessage(getPinPasswordErrorMessage(
    mRemainingAttempts, true));
    return;
    }

    boolean isEsimLocked = KeyguardEsimArea.isEsimLocked(mContext, mSubId);
    int count = TelephonyManager.getDefault().getSimCount();
    Resources rez = getResources();
    String msg;
    int color = Color.WHITE;
    if (count < 2) {
    msg = rez.getString(R.string.kg_sim_pin_instructions);
    } else {
    SubscriptionInfo info = KeyguardUpdateMonitor.getInstance(mContext).
    getSubscriptionInfoForSubId(mSubId);
    CharSequence displayName = info != null ? info.getDisplayName() : ""; // don't crash
    msg = rez.getString(R.string.kg_sim_pin_instructions_multi, displayName);
    if (info != null) {
    color = info.getIconTint();
    }
    }

    if (isEsimLocked) {
    msg = rez.getString(R.string.kg_sim_lock_esim_instructions, msg);
    }

    mSecurityMessageDisplay.setMessage(msg);
    mSimImageView.setImageTintList(ColorStateList.valueOf(color));

    // Sending empty PIN here to query the number of remaining PIN attempts
    new CheckSimPin("", mSubId) {
    void onSimCheckResponse(final int result, final int attemptsRemaining) {
    Log.d(LOG_TAG, "onSimCheckResponse " + " dummy One result" + result +
    " attemptsRemaining=" + attemptsRemaining);
    if (attemptsRemaining >= 0) {
    mRemainingAttempts = attemptsRemaining;
    mSecurityMessageDisplay.setMessage(
    getPinPasswordErrorMessage(attemptsRemaining, true));
    }
    }
    }.start();
    }

    private void handleSubInfoChangeIfNeeded() {
    KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext);
    int subId = monitor.getNextSubIdForState(IccCardConstants.State.PIN_REQUIRED);
    if (subId != mSubId && SubscriptionManager.isValidSubscriptionId(subId)) {
    mSubId = subId;
    mShowDefaultMessage = true;
    mRemainingAttempts = -1;
    }
    }

    @Override
    protected void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    resetState();
    }

    @Override
    protected int getPromptReasonStringRes(int reason) {
    // No message on SIM Pin
    return 0;
    }

    private String getPinPasswordErrorMessage(int attemptsRemaining, boolean isDefault) {
    String displayMessage;
    int msgId;
    if (attemptsRemaining == 0) {
    displayMessage = getContext().getString(R.string.kg_password_wrong_pin_code_pukked);
    } else if (attemptsRemaining > 0) {
    msgId = isDefault ? R.plurals.kg_password_default_pin_message :
    R.plurals.kg_password_wrong_pin_code;
    displayMessage = getContext().getResources()
    .getQuantityString(msgId, attemptsRemaining, attemptsRemaining);
    } else {
    msgId = isDefault ? R.string.kg_sim_pin_instructions : R.string.kg_password_pin_failed;
    displayMessage = getContext().getString(msgId);
    }
    if (KeyguardEsimArea.isEsimLocked(mContext, mSubId)) {
    displayMessage = getResources()
    .getString(R.string.kg_sim_lock_esim_instructions, displayMessage);
    }
    if (DEBUG) Log.d(LOG_TAG, "getPinPasswordErrorMessage:"
    + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage);
    return displayMessage;
    }

    @Override
    protected boolean shouldLockout(long deadline) {
    // SIM PIN doesn't have a timed lockout
    return false;
    }

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

    @Override
    protected void onFinishInflate() {
    super.onFinishInflate();

    if (mEcaView instanceof EmergencyCarrierArea) {
    ((EmergencyCarrierArea) mEcaView).setCarrierTextVisible(true);
    }
    mSimImageView = findViewById(R.id.keyguard_sim);
    }

    @Override
    protected void onAttachedToWindow() {
    super.onAttachedToWindow();
    KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback);
    }

    @Override
    protected void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallback);
    }

    @Override
    public void showUsabilityHint() {
    }

    @Override
    public void onPause() {
    // dismiss the dialog.
    if (mSimUnlockProgressDialog != null) {
    mSimUnlockProgressDialog.dismiss();
    mSimUnlockProgressDialog = null;
    }
    }

    /**
    * Since the IPC can block, we want to run the request in a separate thread
    * with a callback.
    */
    private abstract class CheckSimPin extends Thread {
    private final String mPin;
    private int mSubId;

    protected CheckSimPin(String pin, int subId) {
    mPin = pin;
    mSubId = subId;
    }

    abstract void onSimCheckResponse(final int result, final int attemptsRemaining);

    @Override
    public void run() {
    try {
    if (DEBUG) {
    Log.v(TAG, "call supplyPinReportResultForSubscriber(subid=" + mSubId + ")");
    }
    final int[] result = ITelephony.Stub.asInterface(ServiceManager
    .checkService("phone")).supplyPinReportResultForSubscriber(mSubId, mPin);
    if (DEBUG) {
    Log.v(TAG, "supplyPinReportResult returned: " + result[0] + " " + result[1]);
    }
    post(new Runnable() {
    @Override
    public void run() {
    onSimCheckResponse(result[0], result[1]);
    }
    });
    } catch (RemoteException e) {
    Log.e(TAG, "RemoteException for supplyPinReportResult:", e);
    post(new Runnable() {
    @Override
    public void run() {
    onSimCheckResponse(PhoneConstants.PIN_GENERAL_FAILURE, -1);
    }
    });
    }
    }
    }

    private Dialog getSimUnlockProgressDialog() {
    if (mSimUnlockProgressDialog == null) {
    mSimUnlockProgressDialog = new ProgressDialog(mContext);
    mSimUnlockProgressDialog.setMessage(
    mContext.getString(R.string.kg_sim_unlock_progress_dialog_message));
    mSimUnlockProgressDialog.setIndeterminate(true);
    mSimUnlockProgressDialog.setCancelable(false);
    mSimUnlockProgressDialog.getWindow().setType(
    WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
    }
    return mSimUnlockProgressDialog;
    }

    private Dialog getSimRemainingAttemptsDialog(int remaining) {
    String msg = getPinPasswordErrorMessage(remaining, false);
    if (mRemainingAttemptsDialog == null) {
    Builder builder = new AlertDialog.Builder(mContext);
    builder.setMessage(msg);
    builder.setCancelable(false);
    builder.setNeutralButton(R.string.ok, null);
    mRemainingAttemptsDialog = builder.create();
    mRemainingAttemptsDialog.getWindow().setType(
    WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
    } else {
    mRemainingAttemptsDialog.setMessage(msg);
    }
    return mRemainingAttemptsDialog;
    }

    @Override
    protected void verifyPasswordAndUnlock() {
    String entry = mPasswordEntry.getText();

    if (entry.length() < 4) {
    // otherwise, display a message to the user, and don't submit.
    mSecurityMessageDisplay.setMessage(R.string.kg_invalid_sim_pin_hint);
    resetPasswordText(true /* animate */, true /* announce */);
    mCallback.userActivity();
    return;
    }

    getSimUnlockProgressDialog().show();

    if (mCheckSimPinThread == null) {
    mCheckSimPinThread = new CheckSimPin(mPasswordEntry.getText(), mSubId) {
    @Override
    void onSimCheckResponse(final int result, final int attemptsRemaining) {
    post(new Runnable() {
    @Override
    public void run() {
    mRemainingAttempts = attemptsRemaining;
    if (mSimUnlockProgressDialog != null) {
    mSimUnlockProgressDialog.hide();
    }
    resetPasswordText(true /* animate */,
    result != PhoneConstants.PIN_RESULT_SUCCESS /* announce */);
    if (result == PhoneConstants.PIN_RESULT_SUCCESS) {
    KeyguardUpdateMonitor.getInstance(getContext())
    .reportSimUnlocked(mSubId);
    mRemainingAttempts = -1;
    mShowDefaultMessage = true;
    if (mCallback != null) {
    mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser());
    }
    } else {
    mShowDefaultMessage = false;
    if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) {
    if (attemptsRemaining <= 2) {
    // this is getting critical - show dialog
    getSimRemainingAttemptsDialog(attemptsRemaining).show();
    } else {
    // show message
    mSecurityMessageDisplay.setMessage(
    getPinPasswordErrorMessage(attemptsRemaining, false));
    }
    } else {
    // "PIN operation failed!" - no idea what this was and no way to
    // find out. :/
    mSecurityMessageDisplay.setMessage(getContext().getString(
    R.string.kg_password_pin_failed));
    }
    if (DEBUG) Log.d(LOG_TAG, "verifyPasswordAndUnlock "
    + " CheckSimPin.onSimCheckResponse: " + result
    + " attemptsRemaining=" + attemptsRemaining);
    }
    mCallback.userActivity();
    mCheckSimPinThread = null;
    }
    });
    }
    };
    mCheckSimPinThread.start();
    }
    }

    @Override
    public void startAppearAnimation() {
    // noop.
    }

    @Override
    public boolean startDisappearAnimation(Runnable finishRunnable) {
    return false;
    }

    @Override
    public CharSequence getTitle() {
    return getContext().getString(
    com.android.internal.R.string.keyguard_accessibility_sim_pin_unlock);
    }
    }

  • 相关阅读:
    vue 封装数据字典项翻译方法
    vue 判断是否为移动端
    elementUI 日期控件
    Laravel 数据库backup 导入/导出
    yarn 安装出现 git 443 网络错误解决思路
    nvm简介
    nrm简介
    npm简介
    python 时间序列学习笔记
    java常见面试题——java常见笔试题
  • 原文地址:https://www.cnblogs.com/chaosDemo/p/10051663.html
Copyright © 2020-2023  润新知