17d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/* 27d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Copyright (C) 2008 The Android Open Source Project 37d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 47d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Licensed under the Apache License, Version 2.0 (the "License"); 57d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * you may not use this file except in compliance with the License. 67d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * You may obtain a copy of the License at 77d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 87d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * http://www.apache.org/licenses/LICENSE-2.0 97d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Unless required by applicable law or agreed to in writing, software 117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * distributed under the License is distributed on an "AS IS" BASIS, 127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * See the License for the specific language governing permissions and 147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * limitations under the License. 157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1783383e4c2f748514124eaa0482091490c4c8a311Andrew Leepackage com.android.phone.settings.fdn; 187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.ActionBar; 207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.AlertDialog; 217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.DialogInterface; 227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.AsyncResult; 237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Bundle; 247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Handler; 257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Message; 267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.Log; 277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.PreferenceActivity; 287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.PreferenceScreen; 297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.MenuItem; 307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.WindowManager; 317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.Toast; 327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.CommandException; 347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.Phone; 3583383e4c2f748514124eaa0482091490c4c8a311Andrew Leeimport com.android.phone.CallFeaturesSetting; 3683383e4c2f748514124eaa0482091490c4c8a311Andrew Leeimport com.android.phone.PhoneGlobals; 3783383e4c2f748514124eaa0482091490c4c8a311Andrew Leeimport com.android.phone.R; 385ed870cca68496757c2335d37d3818e9aa0006b6Andrew Leeimport com.android.phone.SubscriptionInfoHelper; 397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/** 417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * FDN settings UI for the Phone app. 427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Rewritten to look and behave closer to the other preferences. 437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpublic class FdnSetting extends PreferenceActivity 457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon implements EditPinPreference.OnPinEnteredListener, DialogInterface.OnCancelListener { 467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String LOG_TAG = PhoneGlobals.LOG_TAG; 487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final boolean DBG = false; 497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 505ed870cca68496757c2335d37d3818e9aa0006b6Andrew Lee private SubscriptionInfoHelper mSubscriptionInfoHelper; 517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private Phone mPhone; 527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Events we handle. 557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * The first is used for toggling FDN enable, the second for the PIN change. 567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int EVENT_PIN2_ENTRY_COMPLETE = 100; 587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int EVENT_PIN2_CHANGE_COMPLETE = 200; 597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // String keys for preference lookup 617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String BUTTON_FDN_ENABLE_KEY = "button_fdn_enable_key"; 627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String BUTTON_CHANGE_PIN2_KEY = "button_change_pin2_key"; 635ed870cca68496757c2335d37d3818e9aa0006b6Andrew Lee private static final String FDN_LIST_PREF_SCREEN_KEY = "fdn_list_pref_screen_key"; 647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private EditPinPreference mButtonEnableFDN; 667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private EditPinPreference mButtonChangePin2; 677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // State variables 697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private String mOldPin; 707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private String mNewPin; 717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private String mPuk2; 727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int PIN_CHANGE_OLD = 0; 737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int PIN_CHANGE_NEW = 1; 747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int PIN_CHANGE_REENTER = 2; 757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int PIN_CHANGE_PUK = 3; 767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int PIN_CHANGE_NEW_PIN_FOR_PUK = 4; 777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int PIN_CHANGE_REENTER_PIN_FOR_PUK = 5; 787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private int mPinChangeState; 797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private boolean mIsPuk2Locked; // Indicates we know that we are PUK2 blocked. 807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String SKIP_OLD_PIN_KEY = "skip_old_pin_key"; 827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String PIN_CHANGE_STATE_KEY = "pin_change_state_key"; 837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String OLD_PIN_KEY = "old_pin_key"; 847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String NEW_PIN_KEY = "new_pin_key"; 857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String DIALOG_MESSAGE_KEY = "dialog_message_key"; 867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String DIALOG_PIN_ENTRY_KEY = "dialog_pin_entry_key"; 877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // size limits for the pin. 897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int MIN_PIN_LENGTH = 4; 907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int MAX_PIN_LENGTH = 8; 917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Delegate to the respective handlers. 947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onPinEntered(EditPinPreference preference, boolean positiveResult) { 977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (preference == mButtonEnableFDN) { 987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon toggleFDNEnable(positiveResult); 997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else if (preference == mButtonChangePin2){ 1007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon updatePINChangeState(positiveResult); 1017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 1057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Attempt to toggle FDN activation. 1067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 1077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void toggleFDNEnable(boolean positiveResult) { 1087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!positiveResult) { 1097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 1107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // validate the pin first, before submitting it to the RIL for FDN enable. 1137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String password = mButtonEnableFDN.getText(); 1147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (validatePin (password, false)) { 1157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // get the relevant data for the icc call 1167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon boolean isEnabled = mPhone.getIccCard().getIccFdnEnabled(); 1177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Message onComplete = mFDNHandler.obtainMessage(EVENT_PIN2_ENTRY_COMPLETE); 1187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // make fdn request 1207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPhone.getIccCard().setIccFdnEnabled(!isEnabled, password, onComplete); 1217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // throw up error if the pin is invalid. 1237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayMessage(R.string.invalidPin2); 1247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonEnableFDN.setText(""); 1277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 1307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Attempt to change the pin. 1317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 1327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void updatePINChangeState(boolean positiveResult) { 1337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("updatePINChangeState positive=" + positiveResult 1347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + " mPinChangeState=" + mPinChangeState 1357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + " mSkipOldPin=" + mIsPuk2Locked); 1367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!positiveResult) { 1387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // reset the state on cancel, either to expect PUK2 or PIN2 1397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!mIsPuk2Locked) { 1407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon resetPinChangeState(); 1417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon resetPinChangeStateForPUK2(); 1437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 1457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Progress through the dialog states, generally in this order: 1487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 1. Enter old pin 1497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 2. Enter new pin 1507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 3. Re-Enter new pin 1517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // While handling any error conditions that may show up in between. 1527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Also handle the PUK2 entry, if it is requested. 1537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // 1547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // In general, if any invalid entries are made, the dialog re- 1557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // appears with text to indicate what the issue is. 1567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (mPinChangeState) { 1577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case PIN_CHANGE_OLD: 1587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOldPin = mButtonChangePin2.getText(); 1597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonChangePin2.setText(""); 1607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // if the pin is not valid, display a message and reset the state. 1617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (validatePin (mOldPin, false)) { 1627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPinChangeState = PIN_CHANGE_NEW; 1637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayPinChangeDialog(); 1647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayPinChangeDialog(R.string.invalidPin2, true); 1667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 1687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case PIN_CHANGE_NEW: 1697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mNewPin = mButtonChangePin2.getText(); 1707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonChangePin2.setText(""); 1717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // if the new pin is not valid, display a message and reset the state. 1727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (validatePin (mNewPin, false)) { 1737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPinChangeState = PIN_CHANGE_REENTER; 1747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayPinChangeDialog(); 1757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayPinChangeDialog(R.string.invalidPin2, true); 1777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 1797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case PIN_CHANGE_REENTER: 1807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // if the re-entered pin is not valid, display a message and reset the state. 1817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!mNewPin.equals(mButtonChangePin2.getText())) { 1827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPinChangeState = PIN_CHANGE_NEW; 1837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonChangePin2.setText(""); 1847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayPinChangeDialog(R.string.mismatchPin2, true); 1857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // If the PIN is valid, then we submit the change PIN request. 1877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonChangePin2.setText(""); 1887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Message onComplete = mFDNHandler.obtainMessage( 1897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon EVENT_PIN2_CHANGE_COMPLETE); 1907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPhone.getIccCard().changeIccFdnPassword( 1917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOldPin, mNewPin, onComplete); 1927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 1947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case PIN_CHANGE_PUK: { 1957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Doh! too many incorrect requests, PUK requested. 1967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPuk2 = mButtonChangePin2.getText(); 1977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonChangePin2.setText(""); 1987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // if the puk is not valid, display 1997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // a message and reset the state. 2007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (validatePin (mPuk2, true)) { 2017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPinChangeState = PIN_CHANGE_NEW_PIN_FOR_PUK; 2027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayPinChangeDialog(); 2037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 2047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayPinChangeDialog(R.string.invalidPuk2, true); 2057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 2087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case PIN_CHANGE_NEW_PIN_FOR_PUK: 2097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mNewPin = mButtonChangePin2.getText(); 2107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonChangePin2.setText(""); 2117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // if the new pin is not valid, display 2127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // a message and reset the state. 2137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (validatePin (mNewPin, false)) { 2147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPinChangeState = PIN_CHANGE_REENTER_PIN_FOR_PUK; 2157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayPinChangeDialog(); 2167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 2177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayPinChangeDialog(R.string.invalidPin2, true); 2187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 2207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case PIN_CHANGE_REENTER_PIN_FOR_PUK: 2217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // if the re-entered pin is not valid, display 2227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // a message and reset the state. 2237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!mNewPin.equals(mButtonChangePin2.getText())) { 2247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPinChangeState = PIN_CHANGE_NEW_PIN_FOR_PUK; 2257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonChangePin2.setText(""); 2267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayPinChangeDialog(R.string.mismatchPin2, true); 2277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 2287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Both puk2 and new pin2 are ready to submit 2297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonChangePin2.setText(""); 2307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Message onComplete = mFDNHandler.obtainMessage( 2317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon EVENT_PIN2_CHANGE_COMPLETE); 2327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPhone.getIccCard().supplyPuk2(mPuk2, mNewPin, onComplete); 2337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 2357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 2397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Handler for asynchronous replies from the sim. 2407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 2417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private final Handler mFDNHandler = new Handler() { 2427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void handleMessage(Message msg) { 2447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (msg.what) { 2457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // when we are enabling FDN, either we are unsuccessful and display 2477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // a toast, or just update the UI. 2487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case EVENT_PIN2_ENTRY_COMPLETE: { 2497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon AsyncResult ar = (AsyncResult) msg.obj; 250af390fa5422459ee018d69169272db92133c5636Andrew Lee if (ar.exception != null) { 251af390fa5422459ee018d69169272db92133c5636Andrew Lee if (ar.exception instanceof CommandException) { 252af390fa5422459ee018d69169272db92133c5636Andrew Lee int attemptsRemaining = msg.arg1; 253af390fa5422459ee018d69169272db92133c5636Andrew Lee // see if PUK2 is requested and alert the user accordingly. 254af390fa5422459ee018d69169272db92133c5636Andrew Lee CommandException.Error e = 255af390fa5422459ee018d69169272db92133c5636Andrew Lee ((CommandException) ar.exception).getCommandError(); 256af390fa5422459ee018d69169272db92133c5636Andrew Lee switch (e) { 257af390fa5422459ee018d69169272db92133c5636Andrew Lee case SIM_PUK2: 258af390fa5422459ee018d69169272db92133c5636Andrew Lee // make sure we set the PUK2 state so that we can skip 259af390fa5422459ee018d69169272db92133c5636Andrew Lee // some redundant behaviour. 260af390fa5422459ee018d69169272db92133c5636Andrew Lee displayMessage(R.string.fdn_enable_puk2_requested, 261af390fa5422459ee018d69169272db92133c5636Andrew Lee attemptsRemaining); 262af390fa5422459ee018d69169272db92133c5636Andrew Lee resetPinChangeStateForPUK2(); 263af390fa5422459ee018d69169272db92133c5636Andrew Lee break; 264af390fa5422459ee018d69169272db92133c5636Andrew Lee case PASSWORD_INCORRECT: 265af390fa5422459ee018d69169272db92133c5636Andrew Lee displayMessage(R.string.pin2_invalid, attemptsRemaining); 266af390fa5422459ee018d69169272db92133c5636Andrew Lee break; 267af390fa5422459ee018d69169272db92133c5636Andrew Lee default: 268af390fa5422459ee018d69169272db92133c5636Andrew Lee displayMessage(R.string.fdn_failed, attemptsRemaining); 269af390fa5422459ee018d69169272db92133c5636Andrew Lee break; 270af390fa5422459ee018d69169272db92133c5636Andrew Lee } 271af390fa5422459ee018d69169272db92133c5636Andrew Lee } else { 272af390fa5422459ee018d69169272db92133c5636Andrew Lee displayMessage(R.string.pin2_error_exception); 2737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon updateEnableFDN(); 2767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 2787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // when changing the pin we need to pay attention to whether or not 2807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // the error requests a PUK (usually after too many incorrect tries) 2817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Set the state accordingly. 2827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case EVENT_PIN2_CHANGE_COMPLETE: { 2837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) 2847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("Handle EVENT_PIN2_CHANGE_COMPLETE"); 2857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon AsyncResult ar = (AsyncResult) msg.obj; 2867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (ar.exception != null) { 287af390fa5422459ee018d69169272db92133c5636Andrew Lee if (ar.exception instanceof CommandException) { 288af390fa5422459ee018d69169272db92133c5636Andrew Lee int attemptsRemaining = msg.arg1; 289af390fa5422459ee018d69169272db92133c5636Andrew Lee log("Handle EVENT_PIN2_CHANGE_COMPLETE attemptsRemaining=" 290af390fa5422459ee018d69169272db92133c5636Andrew Lee + attemptsRemaining); 291af390fa5422459ee018d69169272db92133c5636Andrew Lee CommandException ce = (CommandException) ar.exception; 292af390fa5422459ee018d69169272db92133c5636Andrew Lee if (ce.getCommandError() == CommandException.Error.SIM_PUK2) { 293af390fa5422459ee018d69169272db92133c5636Andrew Lee // throw an alert dialog on the screen, displaying the 294af390fa5422459ee018d69169272db92133c5636Andrew Lee // request for a PUK2. set the cancel listener to 295af390fa5422459ee018d69169272db92133c5636Andrew Lee // FdnSetting.onCancel(). 296af390fa5422459ee018d69169272db92133c5636Andrew Lee AlertDialog a = new AlertDialog.Builder(FdnSetting.this) 297af390fa5422459ee018d69169272db92133c5636Andrew Lee .setMessage(R.string.puk2_requested) 298af390fa5422459ee018d69169272db92133c5636Andrew Lee .setCancelable(true) 299af390fa5422459ee018d69169272db92133c5636Andrew Lee .setOnCancelListener(FdnSetting.this) 30071f4cac40011739d0e9df1c085344be2ee2349cfChaitanya Saggurthi .setNeutralButton(android.R.string.ok, 30171f4cac40011739d0e9df1c085344be2ee2349cfChaitanya Saggurthi new DialogInterface.OnClickListener() { 30271f4cac40011739d0e9df1c085344be2ee2349cfChaitanya Saggurthi @Override 30371f4cac40011739d0e9df1c085344be2ee2349cfChaitanya Saggurthi public void onClick(DialogInterface dialog, 30471f4cac40011739d0e9df1c085344be2ee2349cfChaitanya Saggurthi int which) { 30571f4cac40011739d0e9df1c085344be2ee2349cfChaitanya Saggurthi resetPinChangeStateForPUK2(); 30671f4cac40011739d0e9df1c085344be2ee2349cfChaitanya Saggurthi displayPinChangeDialog(0,true); 30771f4cac40011739d0e9df1c085344be2ee2349cfChaitanya Saggurthi } 30871f4cac40011739d0e9df1c085344be2ee2349cfChaitanya Saggurthi }) 309af390fa5422459ee018d69169272db92133c5636Andrew Lee .create(); 310af390fa5422459ee018d69169272db92133c5636Andrew Lee a.getWindow().addFlags( 311af390fa5422459ee018d69169272db92133c5636Andrew Lee WindowManager.LayoutParams.FLAG_DIM_BEHIND); 312af390fa5422459ee018d69169272db92133c5636Andrew Lee a.show(); 3137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 314af390fa5422459ee018d69169272db92133c5636Andrew Lee // set the correct error message depending upon the state. 315af390fa5422459ee018d69169272db92133c5636Andrew Lee // Reset the state depending upon or knowledge of the PUK state. 316af390fa5422459ee018d69169272db92133c5636Andrew Lee if (!mIsPuk2Locked) { 317af390fa5422459ee018d69169272db92133c5636Andrew Lee displayMessage(R.string.badPin2, attemptsRemaining); 318af390fa5422459ee018d69169272db92133c5636Andrew Lee resetPinChangeState(); 319af390fa5422459ee018d69169272db92133c5636Andrew Lee } else { 320af390fa5422459ee018d69169272db92133c5636Andrew Lee displayMessage(R.string.badPuk2, attemptsRemaining); 321af390fa5422459ee018d69169272db92133c5636Andrew Lee resetPinChangeStateForPUK2(); 322af390fa5422459ee018d69169272db92133c5636Andrew Lee } 3237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 324af390fa5422459ee018d69169272db92133c5636Andrew Lee } else { 325af390fa5422459ee018d69169272db92133c5636Andrew Lee displayMessage(R.string.pin2_error_exception); 3267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 3289de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville if (mPinChangeState == PIN_CHANGE_PUK) { 3299de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville displayMessage(R.string.pin2_unblocked); 3309de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville } else { 3319de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville displayMessage(R.string.pin2_changed); 3329de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville } 3339de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville 3347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // reset to normal behaviour on successful change. 3357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon resetPinChangeState(); 3367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 3397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }; 3427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 3447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Cancel listener for the PUK2 request alert dialog. 3457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 3467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 3477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onCancel(DialogInterface dialog) { 3487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // set the state of the preference and then display the dialog. 3497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon resetPinChangeStateForPUK2(); 3507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayPinChangeDialog(0, true); 3517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 3547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Display a toast for message, like the rest of the settings. 3557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 3569de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville private final void displayMessage(int strId, int attemptsRemaining) { 3579de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville String s = getString(strId); 3589de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville if ((strId == R.string.badPin2) || (strId == R.string.badPuk2) || 3599de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville (strId == R.string.pin2_invalid)) { 3609de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville if (attemptsRemaining >= 0) { 3619de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville s = getString(strId) + getString(R.string.pin2_attempts, attemptsRemaining); 3629de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville } else { 3639de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville s = getString(strId); 3649de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville } 3659de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville } 3669de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville log("displayMessage: attemptsRemaining=" + attemptsRemaining + " s=" + s); 3679de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville Toast.makeText(this, s, Toast.LENGTH_SHORT).show(); 3689de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville } 3699de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville 3707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private final void displayMessage(int strId) { 3719de0f754068c82ed1d1019afb414bc1fcd9298cfWink Saville displayMessage(strId, -1); 3727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 3757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * The next two functions are for updating the message field on the dialog. 3767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 3777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private final void displayPinChangeDialog() { 3787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayPinChangeDialog(0, true); 3797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private final void displayPinChangeDialog(int strId, boolean shouldDisplay) { 3827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int msgId; 3837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (mPinChangeState) { 3847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case PIN_CHANGE_OLD: 3857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon msgId = R.string.oldPin2Label; 3867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 3877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case PIN_CHANGE_NEW: 3887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case PIN_CHANGE_NEW_PIN_FOR_PUK: 3897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon msgId = R.string.newPin2Label; 3907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 3917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case PIN_CHANGE_REENTER: 3927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case PIN_CHANGE_REENTER_PIN_FOR_PUK: 3937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon msgId = R.string.confirmPin2Label; 3947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 3957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case PIN_CHANGE_PUK: 3967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon default: 3977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon msgId = R.string.label_puk2_code; 3987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 3997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // append the note / additional message, if needed. 4027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (strId != 0) { 4037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonChangePin2.setDialogMessage(getText(msgId) + "\n" + getText(strId)); 4047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 4057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonChangePin2.setDialogMessage(msgId); 4067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // only display if requested. 4097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (shouldDisplay) { 4107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonChangePin2.showPinDialog(); 4117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 4157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Reset the state of the pin change dialog. 4167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 4177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private final void resetPinChangeState() { 4187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("resetPinChangeState"); 4197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPinChangeState = PIN_CHANGE_OLD; 4207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayPinChangeDialog(0, false); 4217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOldPin = mNewPin = ""; 4227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mIsPuk2Locked = false; 4237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 4267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Reset the state of the pin change dialog solely for PUK2 use. 4277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 4287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private final void resetPinChangeStateForPUK2() { 4297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("resetPinChangeStateForPUK2"); 4307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPinChangeState = PIN_CHANGE_PUK; 4317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon displayPinChangeDialog(0, false); 4327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOldPin = mNewPin = mPuk2 = ""; 4337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mIsPuk2Locked = true; 4347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 4377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Validate the pin entry. 4387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 4397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @param pin This is the pin to validate 4407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * @param isPuk Boolean indicating whether we are to treat 4417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * the pin input as a puk. 4427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 4437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private boolean validatePin(String pin, boolean isPuk) { 4447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // for pin, we have 4-8 numbers, or puk, we use only 8. 4467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int pinMinimum = isPuk ? MAX_PIN_LENGTH : MIN_PIN_LENGTH; 4477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // check validity 4497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (pin == null || pin.length() < pinMinimum || pin.length() > MAX_PIN_LENGTH) { 4507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return false; 4517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 4527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 4537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 4577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Reflect the updated FDN state in the UI. 4587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 4597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void updateEnableFDN() { 4607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mPhone.getIccCard().getIccFdnEnabled()) { 4617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonEnableFDN.setTitle(R.string.enable_fdn_ok); 4627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonEnableFDN.setSummary(R.string.fdn_enabled); 4637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonEnableFDN.setDialogTitle(R.string.disable_fdn); 4647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 4657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonEnableFDN.setTitle(R.string.disable_fdn_ok); 4667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonEnableFDN.setSummary(R.string.fdn_disabled); 4677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonEnableFDN.setDialogTitle(R.string.enable_fdn); 4687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 471e17d0ad5a3bb5a6d10d22c7369efc6d8ae2fdb4cChaitanya Saggurthi /** 472e17d0ad5a3bb5a6d10d22c7369efc6d8ae2fdb4cChaitanya Saggurthi * Reflect the updated change PIN2 state in the UI. 473e17d0ad5a3bb5a6d10d22c7369efc6d8ae2fdb4cChaitanya Saggurthi */ 474e17d0ad5a3bb5a6d10d22c7369efc6d8ae2fdb4cChaitanya Saggurthi private void updateChangePIN2() { 475e17d0ad5a3bb5a6d10d22c7369efc6d8ae2fdb4cChaitanya Saggurthi if (mPhone.getIccCard().getIccPin2Blocked()) { 476e17d0ad5a3bb5a6d10d22c7369efc6d8ae2fdb4cChaitanya Saggurthi // If the pin2 is blocked, the state of the change pin2 dialog 477e17d0ad5a3bb5a6d10d22c7369efc6d8ae2fdb4cChaitanya Saggurthi // should be set for puk2 use (that is, the user should be prompted 478e17d0ad5a3bb5a6d10d22c7369efc6d8ae2fdb4cChaitanya Saggurthi // to enter puk2 code instead of old pin2). 479e17d0ad5a3bb5a6d10d22c7369efc6d8ae2fdb4cChaitanya Saggurthi resetPinChangeStateForPUK2(); 480e17d0ad5a3bb5a6d10d22c7369efc6d8ae2fdb4cChaitanya Saggurthi } else { 481e17d0ad5a3bb5a6d10d22c7369efc6d8ae2fdb4cChaitanya Saggurthi resetPinChangeState(); 482e17d0ad5a3bb5a6d10d22c7369efc6d8ae2fdb4cChaitanya Saggurthi } 483e17d0ad5a3bb5a6d10d22c7369efc6d8ae2fdb4cChaitanya Saggurthi } 484e17d0ad5a3bb5a6d10d22c7369efc6d8ae2fdb4cChaitanya Saggurthi 4857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 4867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected void onCreate(Bundle icicle) { 4877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onCreate(icicle); 4887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 489dd4f6df7bf726284b0747405307de54e0c0acabbAndrew Lee mSubscriptionInfoHelper = new SubscriptionInfoHelper(this, getIntent()); 4905ed870cca68496757c2335d37d3818e9aa0006b6Andrew Lee mPhone = mSubscriptionInfoHelper.getPhone(); 4917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4925ed870cca68496757c2335d37d3818e9aa0006b6Andrew Lee addPreferencesFromResource(R.xml.fdn_setting); 4937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon //get UI object references 4957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon PreferenceScreen prefSet = getPreferenceScreen(); 4967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonEnableFDN = (EditPinPreference) prefSet.findPreference(BUTTON_FDN_ENABLE_KEY); 4977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonChangePin2 = (EditPinPreference) prefSet.findPreference(BUTTON_CHANGE_PIN2_KEY); 4987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon //assign click listener and update state 5007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonEnableFDN.setOnPinEnteredListener(this); 5017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon updateEnableFDN(); 5027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonChangePin2.setOnPinEnteredListener(this); 5047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5055ed870cca68496757c2335d37d3818e9aa0006b6Andrew Lee PreferenceScreen fdnListPref = 5065ed870cca68496757c2335d37d3818e9aa0006b6Andrew Lee (PreferenceScreen) prefSet.findPreference(FDN_LIST_PREF_SCREEN_KEY); 507dd4f6df7bf726284b0747405307de54e0c0acabbAndrew Lee fdnListPref.setIntent(mSubscriptionInfoHelper.getIntent(FdnList.class)); 5085ed870cca68496757c2335d37d3818e9aa0006b6Andrew Lee 5097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Only reset the pin change dialog if we're not in the middle of changing it. 5107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (icicle == null) { 5117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon resetPinChangeState(); 5127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 5137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mIsPuk2Locked = icicle.getBoolean(SKIP_OLD_PIN_KEY); 5147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPinChangeState = icicle.getInt(PIN_CHANGE_STATE_KEY); 5157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mOldPin = icicle.getString(OLD_PIN_KEY); 5167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mNewPin = icicle.getString(NEW_PIN_KEY); 5177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonChangePin2.setDialogMessage(icicle.getString(DIALOG_MESSAGE_KEY)); 5187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonChangePin2.setText(icicle.getString(DIALOG_PIN_ENTRY_KEY)); 5197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ActionBar actionBar = getActionBar(); 5227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (actionBar != null) { 5237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // android.R.id.home will be triggered in onOptionsItemSelected() 5247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon actionBar.setDisplayHomeAsUpEnabled(true); 5255ed870cca68496757c2335d37d3818e9aa0006b6Andrew Lee mSubscriptionInfoHelper.setActionBarTitle( 5265ed870cca68496757c2335d37d3818e9aa0006b6Andrew Lee actionBar, getResources(), R.string.fdn_with_label); 5277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 5317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected void onResume() { 5327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onResume(); 5335ed870cca68496757c2335d37d3818e9aa0006b6Andrew Lee mPhone = mSubscriptionInfoHelper.getPhone(); 5347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon updateEnableFDN(); 535e17d0ad5a3bb5a6d10d22c7369efc6d8ae2fdb4cChaitanya Saggurthi updateChangePIN2(); 5367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 5397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Save the state of the pin change. 5407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 5417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 5427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected void onSaveInstanceState(Bundle out) { 5437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onSaveInstanceState(out); 5447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon out.putBoolean(SKIP_OLD_PIN_KEY, mIsPuk2Locked); 5457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon out.putInt(PIN_CHANGE_STATE_KEY, mPinChangeState); 5467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon out.putString(OLD_PIN_KEY, mOldPin); 5477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon out.putString(NEW_PIN_KEY, mNewPin); 5487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon out.putString(DIALOG_MESSAGE_KEY, mButtonChangePin2.getDialogMessage().toString()); 5497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon out.putString(DIALOG_PIN_ENTRY_KEY, mButtonChangePin2.getText()); 5507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 5537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onOptionsItemSelected(MenuItem item) { 5547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final int itemId = item.getItemId(); 5557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (itemId == android.R.id.home) { // See ActionBar#setDisplayHomeAsUpEnabled() 5565efb112905b222d1a5b2e1052a94b7a7dfbe66d2Andrew Lee CallFeaturesSetting.goUpToTopLevelSetting(this, mSubscriptionInfoHelper); 5577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 5587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return super.onOptionsItemSelected(item); 5607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 5627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void log(String msg) { 5637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.d(LOG_TAG, "FdnSetting: " + msg); 5647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon} 5667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 567