1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/* 2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License. 6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at 7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and 14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License. 15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings; 18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 19113ae0258d8a0aac363e397ad025cb65df237328Jim Millerimport android.content.BroadcastReceiver; 20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 21113ae0258d8a0aac363e397ad025cb65df237328Jim Millerimport android.content.Intent; 22113ae0258d8a0aac363e397ad025cb65df237328Jim Millerimport android.content.IntentFilter; 23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.res.Resources; 24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.AsyncResult; 25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler; 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message; 28c38866843e966622346dc8f7b028749cac9c2198Wink Savilleimport android.preference.CheckBoxPreference; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference; 303065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglioimport android.preference.PreferenceActivity; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen; 328246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Savilleimport android.util.Log; 33c38866843e966622346dc8f7b028749cac9c2198Wink Savilleimport android.widget.Toast; 34c38866843e966622346dc8f7b028749cac9c2198Wink Saville 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.internal.telephony.Phone; 36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.internal.telephony.PhoneFactory; 37113ae0258d8a0aac363e397ad025cb65df237328Jim Millerimport com.android.internal.telephony.TelephonyIntents; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 40c38866843e966622346dc8f7b028749cac9c2198Wink Saville * Implements the preference screen to enable/disable ICC lock and 41c38866843e966622346dc8f7b028749cac9c2198Wink Saville * also the dialogs to change the ICC PIN. In the former case, enabling/disabling 42c38866843e966622346dc8f7b028749cac9c2198Wink Saville * the ICC lock will prompt the user for the current PIN. 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * In the Change PIN case, it prompts the user for old pin, new pin and new pin 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * again before attempting to change it. Calls the SimCard interface to execute 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * these operations. 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 483065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Megliopublic class IccLockSettings extends PreferenceActivity 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project implements EditPinPreference.OnPinEnteredListener { 508246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville private static final String TAG = "IccLockSettings"; 518246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville private static final boolean DBG = true; 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OFF_MODE = 0; 54c38866843e966622346dc8f7b028749cac9c2198Wink Saville // State when enabling/disabling ICC lock 55c38866843e966622346dc8f7b028749cac9c2198Wink Saville private static final int ICC_LOCK_MODE = 1; 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // State when entering the old pin 57c38866843e966622346dc8f7b028749cac9c2198Wink Saville private static final int ICC_OLD_MODE = 2; 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // State when entering the new pin - first time 59c38866843e966622346dc8f7b028749cac9c2198Wink Saville private static final int ICC_NEW_MODE = 3; 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // State when entering the new pin - second time 61c38866843e966622346dc8f7b028749cac9c2198Wink Saville private static final int ICC_REENTER_MODE = 4; 62113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Keys in xml file 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String PIN_DIALOG = "sim_pin"; 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String PIN_TOGGLE = "sim_toggle"; 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Keys in icicle 67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String DIALOG_STATE = "dialogState"; 68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String DIALOG_PIN = "dialogPin"; 69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String DIALOG_ERROR = "dialogError"; 70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String ENABLE_TO_STATE = "enableState"; 7122135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 7222135ea7739433802fa55a37790c2a931b698f30Yongwei Cai // Save and restore inputted PIN code when configuration changed 7322135ea7739433802fa55a37790c2a931b698f30Yongwei Cai // (ex. portrait<-->landscape) during change PIN code 7422135ea7739433802fa55a37790c2a931b698f30Yongwei Cai private static final String OLD_PINCODE = "oldPinCode"; 7522135ea7739433802fa55a37790c2a931b698f30Yongwei Cai private static final String NEW_PINCODE = "newPinCode"; 76113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int MIN_PIN_LENGTH = 4; 78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int MAX_PIN_LENGTH = 8; 79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Which dialog to show next when popped up 80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private int mDialogState = OFF_MODE; 81113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String mPin; 83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String mOldPin; 84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String mNewPin; 85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String mError; 86c38866843e966622346dc8f7b028749cac9c2198Wink Saville // Are we trying to enable or disable ICC lock? 87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private boolean mToState; 88113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Phone mPhone; 90113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private EditPinPreference mPinDialog; 92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CheckBoxPreference mPinToggle; 93113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Resources mRes; 95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // For async handler to identify request type 97113ae0258d8a0aac363e397ad025cb65df237328Jim Miller private static final int MSG_ENABLE_ICC_PIN_COMPLETE = 100; 98113ae0258d8a0aac363e397ad025cb65df237328Jim Miller private static final int MSG_CHANGE_ICC_PIN_COMPLETE = 101; 99113ae0258d8a0aac363e397ad025cb65df237328Jim Miller private static final int MSG_SIM_STATE_CHANGED = 102; 100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 101c38866843e966622346dc8f7b028749cac9c2198Wink Saville // For replies from IccCard interface 102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Handler mHandler = new Handler() { 103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void handleMessage(Message msg) { 104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project AsyncResult ar = (AsyncResult) msg.obj; 105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (msg.what) { 106113ae0258d8a0aac363e397ad025cb65df237328Jim Miller case MSG_ENABLE_ICC_PIN_COMPLETE: 1078246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville iccLockChanged(ar.exception == null, msg.arg1); 108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 109113ae0258d8a0aac363e397ad025cb65df237328Jim Miller case MSG_CHANGE_ICC_PIN_COMPLETE: 1108246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville iccPinChanged(ar.exception == null, msg.arg1); 111afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 112113ae0258d8a0aac363e397ad025cb65df237328Jim Miller case MSG_SIM_STATE_CHANGED: 113113ae0258d8a0aac363e397ad025cb65df237328Jim Miller updatePreferences(); 114113ae0258d8a0aac363e397ad025cb65df237328Jim Miller break; 115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return; 118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 120113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 121113ae0258d8a0aac363e397ad025cb65df237328Jim Miller private final BroadcastReceiver mSimStateReceiver = new BroadcastReceiver() { 122113ae0258d8a0aac363e397ad025cb65df237328Jim Miller public void onReceive(Context context, Intent intent) { 123113ae0258d8a0aac363e397ad025cb65df237328Jim Miller final String action = intent.getAction(); 124113ae0258d8a0aac363e397ad025cb65df237328Jim Miller if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(action)) { 125113ae0258d8a0aac363e397ad025cb65df237328Jim Miller mHandler.sendMessage(mHandler.obtainMessage(MSG_SIM_STATE_CHANGED)); 126113ae0258d8a0aac363e397ad025cb65df237328Jim Miller } 127113ae0258d8a0aac363e397ad025cb65df237328Jim Miller } 128113ae0258d8a0aac363e397ad025cb65df237328Jim Miller }; 129113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // For top-level settings screen to query 1313065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio static boolean isIccLockEnabled() { 1323065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio return PhoneFactory.getDefaultPhone().getIccCard().getIccLockEnabled(); 133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 134113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 1353065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio static String getSummary(Context context) { 136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Resources res = context.getResources(); 137113ae0258d8a0aac363e397ad025cb65df237328Jim Miller String summary = isIccLockEnabled() 138c38866843e966622346dc8f7b028749cac9c2198Wink Saville ? res.getString(R.string.sim_lock_on) 139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project : res.getString(R.string.sim_lock_off); 140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return summary; 141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 142c38866843e966622346dc8f7b028749cac9c2198Wink Saville 143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 1443065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio protected void onCreate(Bundle savedInstanceState) { 145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(savedInstanceState); 146c38866843e966622346dc8f7b028749cac9c2198Wink Saville 1472e180ef88050bfa243dfccaab72fb6ab235e21afAmith Yamasani if (Utils.isMonkeyRunning()) { 1482e180ef88050bfa243dfccaab72fb6ab235e21afAmith Yamasani finish(); 1492e180ef88050bfa243dfccaab72fb6ab235e21afAmith Yamasani return; 1502e180ef88050bfa243dfccaab72fb6ab235e21afAmith Yamasani } 1512e180ef88050bfa243dfccaab72fb6ab235e21afAmith Yamasani 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project addPreferencesFromResource(R.xml.sim_lock_settings); 153c38866843e966622346dc8f7b028749cac9c2198Wink Saville 154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog = (EditPinPreference) findPreference(PIN_DIALOG); 155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinToggle = (CheckBoxPreference) findPreference(PIN_TOGGLE); 156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (savedInstanceState != null && savedInstanceState.containsKey(DIALOG_STATE)) { 157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDialogState = savedInstanceState.getInt(DIALOG_STATE); 158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPin = savedInstanceState.getString(DIALOG_PIN); 159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = savedInstanceState.getString(DIALOG_ERROR); 160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mToState = savedInstanceState.getBoolean(ENABLE_TO_STATE); 16122135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 16222135ea7739433802fa55a37790c2a931b698f30Yongwei Cai // Restore inputted PIN code 16322135ea7739433802fa55a37790c2a931b698f30Yongwei Cai switch (mDialogState) { 16422135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_NEW_MODE: 16522135ea7739433802fa55a37790c2a931b698f30Yongwei Cai mOldPin = savedInstanceState.getString(OLD_PINCODE); 16622135ea7739433802fa55a37790c2a931b698f30Yongwei Cai break; 16722135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 16822135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_REENTER_MODE: 16922135ea7739433802fa55a37790c2a931b698f30Yongwei Cai mOldPin = savedInstanceState.getString(OLD_PINCODE); 17022135ea7739433802fa55a37790c2a931b698f30Yongwei Cai mNewPin = savedInstanceState.getString(NEW_PINCODE); 17122135ea7739433802fa55a37790c2a931b698f30Yongwei Cai break; 17222135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 17322135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_LOCK_MODE: 17422135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_OLD_MODE: 17522135ea7739433802fa55a37790c2a931b698f30Yongwei Cai default: 17622135ea7739433802fa55a37790c2a931b698f30Yongwei Cai break; 17722135ea7739433802fa55a37790c2a931b698f30Yongwei Cai } 178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.setOnPinEnteredListener(this); 181113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Don't need any changes to be remembered 183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project getPreferenceScreen().setPersistent(false); 184113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPhone = PhoneFactory.getDefaultPhone(); 186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mRes = getResources(); 187113ae0258d8a0aac363e397ad025cb65df237328Jim Miller updatePreferences(); 188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 189113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 190113ae0258d8a0aac363e397ad025cb65df237328Jim Miller private void updatePreferences() { 191113ae0258d8a0aac363e397ad025cb65df237328Jim Miller mPinToggle.setChecked(mPhone.getIccCard().getIccLockEnabled()); 192113ae0258d8a0aac363e397ad025cb65df237328Jim Miller } 193113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 1953065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio protected void onResume() { 196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onResume(); 197113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 198113ae0258d8a0aac363e397ad025cb65df237328Jim Miller // ACTION_SIM_STATE_CHANGED is sticky, so we'll receive current state after this call, 199113ae0258d8a0aac363e397ad025cb65df237328Jim Miller // which will call updatePreferences(). 200113ae0258d8a0aac363e397ad025cb65df237328Jim Miller final IntentFilter filter = new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED); 2013065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio registerReceiver(mSimStateReceiver, filter); 202113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mDialogState != OFF_MODE) { 204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPinDialog(); 205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Prep for standard click on "Change PIN" 207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project resetDialogState(); 208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 210113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 211113ae0258d8a0aac363e397ad025cb65df237328Jim Miller @Override 2123065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio protected void onPause() { 213113ae0258d8a0aac363e397ad025cb65df237328Jim Miller super.onPause(); 2143065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio unregisterReceiver(mSimStateReceiver); 215113ae0258d8a0aac363e397ad025cb65df237328Jim Miller } 216113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 2183065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio protected void onSaveInstanceState(Bundle out) { 219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Need to store this state for slider open/close 220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // There is one case where the dialog is popped up by the preference 221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // framework. In that case, let the preference framework store the 222afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // dialog state. In other cases, where this activity manually launches 223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // the dialog, store the state of the dialog. 224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mPinDialog.isDialogOpen()) { 225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project out.putInt(DIALOG_STATE, mDialogState); 226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project out.putString(DIALOG_PIN, mPinDialog.getEditText().getText().toString()); 227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project out.putString(DIALOG_ERROR, mError); 228afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project out.putBoolean(ENABLE_TO_STATE, mToState); 22922135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 23022135ea7739433802fa55a37790c2a931b698f30Yongwei Cai // Save inputted PIN code 23122135ea7739433802fa55a37790c2a931b698f30Yongwei Cai switch (mDialogState) { 23222135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_NEW_MODE: 23322135ea7739433802fa55a37790c2a931b698f30Yongwei Cai out.putString(OLD_PINCODE, mOldPin); 23422135ea7739433802fa55a37790c2a931b698f30Yongwei Cai break; 23522135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 23622135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_REENTER_MODE: 23722135ea7739433802fa55a37790c2a931b698f30Yongwei Cai out.putString(OLD_PINCODE, mOldPin); 23822135ea7739433802fa55a37790c2a931b698f30Yongwei Cai out.putString(NEW_PINCODE, mNewPin); 23922135ea7739433802fa55a37790c2a931b698f30Yongwei Cai break; 24022135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 24122135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_LOCK_MODE: 24222135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_OLD_MODE: 24322135ea7739433802fa55a37790c2a931b698f30Yongwei Cai default: 24422135ea7739433802fa55a37790c2a931b698f30Yongwei Cai break; 24522135ea7739433802fa55a37790c2a931b698f30Yongwei Cai } 246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onSaveInstanceState(out); 248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void showPinDialog() { 252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mDialogState == OFF_MODE) { 253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return; 254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setDialogValues(); 256113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 257afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.showPinDialog(); 258afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 259113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setDialogValues() { 261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.setText(mPin); 262afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String message = ""; 263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (mDialogState) { 264c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_LOCK_MODE: 265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project message = mRes.getString(R.string.sim_enter_pin); 266113ae0258d8a0aac363e397ad025cb65df237328Jim Miller mPinDialog.setDialogTitle(mToState 267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project ? mRes.getString(R.string.sim_enable_sim_lock) 268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project : mRes.getString(R.string.sim_disable_sim_lock)); 269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 270c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_OLD_MODE: 271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project message = mRes.getString(R.string.sim_enter_old); 272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.setDialogTitle(mRes.getString(R.string.sim_change_pin)); 273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 274c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_NEW_MODE: 275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project message = mRes.getString(R.string.sim_enter_new); 276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.setDialogTitle(mRes.getString(R.string.sim_change_pin)); 277afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 278c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_REENTER_MODE: 279afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project message = mRes.getString(R.string.sim_reenter_new); 280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.setDialogTitle(mRes.getString(R.string.sim_change_pin)); 281afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mError != null) { 284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project message = mError + "\n" + message; 285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = null; 286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.setDialogMessage(message); 288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onPinEntered(EditPinPreference preference, boolean positiveResult) { 291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (!positiveResult) { 292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project resetDialogState(); 293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return; 294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 295113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPin = preference.getText(); 297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (!reasonablePin(mPin)) { 298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // inject error message and display dialog again 299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = mRes.getString(R.string.sim_bad_pin); 300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPinDialog(); 301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return; 302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (mDialogState) { 304c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_LOCK_MODE: 305c38866843e966622346dc8f7b028749cac9c2198Wink Saville tryChangeIccLockState(); 306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 307c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_OLD_MODE: 308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mOldPin = mPin; 309c38866843e966622346dc8f7b028749cac9c2198Wink Saville mDialogState = ICC_NEW_MODE; 310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = null; 311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPin = null; 312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPinDialog(); 313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 314c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_NEW_MODE: 315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mNewPin = mPin; 316c38866843e966622346dc8f7b028749cac9c2198Wink Saville mDialogState = ICC_REENTER_MODE; 317afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPin = null; 318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPinDialog(); 319afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 320c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_REENTER_MODE: 321afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (!mPin.equals(mNewPin)) { 322afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = mRes.getString(R.string.sim_pins_dont_match); 323c38866843e966622346dc8f7b028749cac9c2198Wink Saville mDialogState = ICC_NEW_MODE; 324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPin = null; 325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPinDialog(); 326afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 327afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = null; 328afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project tryChangePin(); 329afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 330afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 331afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 332afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 333113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 334afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (preference == mPinToggle) { 336afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Get the new, preferred state 337afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mToState = mPinToggle.isChecked(); 338113ae0258d8a0aac363e397ad025cb65df237328Jim Miller // Flip it back and pop up pin dialog 339113ae0258d8a0aac363e397ad025cb65df237328Jim Miller mPinToggle.setChecked(!mToState); 340c38866843e966622346dc8f7b028749cac9c2198Wink Saville mDialogState = ICC_LOCK_MODE; 341afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPinDialog(); 34211cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani } else if (preference == mPinDialog) { 34311cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani mDialogState = ICC_OLD_MODE; 34411cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani return false; 345afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 346afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 347afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 34811cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani 349c38866843e966622346dc8f7b028749cac9c2198Wink Saville private void tryChangeIccLockState() { 350113ae0258d8a0aac363e397ad025cb65df237328Jim Miller // Try to change icc lock. If it succeeds, toggle the lock state and 351afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // reset dialog state. Else inject error message and show dialog again. 352113ae0258d8a0aac363e397ad025cb65df237328Jim Miller Message callback = Message.obtain(mHandler, MSG_ENABLE_ICC_PIN_COMPLETE); 353c38866843e966622346dc8f7b028749cac9c2198Wink Saville mPhone.getIccCard().setIccLockEnabled(mToState, mPin, callback); 35448c03831253d2749cb6842b4e2fc9fb5255dab44Jeevaka Badrappan // Disable the setting till the response is received. 35548c03831253d2749cb6842b4e2fc9fb5255dab44Jeevaka Badrappan mPinToggle.setEnabled(false); 356afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 357113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 3588246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville private void iccLockChanged(boolean success, int attemptsRemaining) { 359afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (success) { 360afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinToggle.setChecked(mToState); 361afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 3623065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio Toast.makeText(this, getPinPasswordErrorMessage(attemptsRemaining), Toast.LENGTH_LONG) 3633065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio .show(); 364afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 36548c03831253d2749cb6842b4e2fc9fb5255dab44Jeevaka Badrappan mPinToggle.setEnabled(true); 366afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project resetDialogState(); 367afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 368afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 3698246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville private void iccPinChanged(boolean success, int attemptsRemaining) { 370afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (!success) { 3713065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio Toast.makeText(this, getPinPasswordErrorMessage(attemptsRemaining), 3728246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville Toast.LENGTH_LONG) 373afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .show(); 374afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 3753065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio Toast.makeText(this, mRes.getString(R.string.sim_change_succeeded), 376afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Toast.LENGTH_SHORT) 377afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .show(); 378afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 380afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project resetDialogState(); 381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 383afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void tryChangePin() { 384113ae0258d8a0aac363e397ad025cb65df237328Jim Miller Message callback = Message.obtain(mHandler, MSG_CHANGE_ICC_PIN_COMPLETE); 385c38866843e966622346dc8f7b028749cac9c2198Wink Saville mPhone.getIccCard().changeIccLockPassword(mOldPin, 386afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mNewPin, callback); 387afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 38811cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani 3898246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville private String getPinPasswordErrorMessage(int attemptsRemaining) { 3908246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville String displayMessage; 3918246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville 3928246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville if (attemptsRemaining == 0) { 3938246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville displayMessage = mRes.getString(R.string.wrong_pin_code_pukked); 3948246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville } else if (attemptsRemaining > 0) { 3958246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville displayMessage = mRes 3968246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville .getQuantityString(R.plurals.wrong_pin_code, attemptsRemaining, 3978246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville attemptsRemaining); 3988246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville } else { 3998246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville displayMessage = mRes.getString(R.string.pin_failed); 4008246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville } 4018246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville if (DBG) Log.d(TAG, "getPinPasswordErrorMessage:" 4028246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); 4038246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville return displayMessage; 4048246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville } 4058246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville 406afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private boolean reasonablePin(String pin) { 407afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (pin == null || pin.length() < MIN_PIN_LENGTH || pin.length() > MAX_PIN_LENGTH) { 408afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return false; 409afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 411afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 412afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 41311cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani 414afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void resetDialogState() { 415afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = null; 416c38866843e966622346dc8f7b028749cac9c2198Wink Saville mDialogState = ICC_OLD_MODE; // Default for when Change PIN is clicked 417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPin = ""; 418afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setDialogValues(); 41911cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani mDialogState = OFF_MODE; 420afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 421afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 422