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; 30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceActivity; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen; 32c38866843e966622346dc8f7b028749cac9c2198Wink Savilleimport android.widget.Toast; 33c38866843e966622346dc8f7b028749cac9c2198Wink Saville 34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.internal.telephony.Phone; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.internal.telephony.PhoneFactory; 36113ae0258d8a0aac363e397ad025cb65df237328Jim Millerimport com.android.internal.telephony.TelephonyIntents; 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 39c38866843e966622346dc8f7b028749cac9c2198Wink Saville * Implements the preference screen to enable/disable ICC lock and 40c38866843e966622346dc8f7b028749cac9c2198Wink Saville * also the dialogs to change the ICC PIN. In the former case, enabling/disabling 41c38866843e966622346dc8f7b028749cac9c2198Wink Saville * the ICC lock will prompt the user for the current PIN. 42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * In the Change PIN case, it prompts the user for old pin, new pin and new pin 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * again before attempting to change it. Calls the SimCard interface to execute 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * these operations. 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 47113ae0258d8a0aac363e397ad025cb65df237328Jim Millerpublic class IccLockSettings extends PreferenceActivity 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project implements EditPinPreference.OnPinEnteredListener { 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OFF_MODE = 0; 51c38866843e966622346dc8f7b028749cac9c2198Wink Saville // State when enabling/disabling ICC lock 52c38866843e966622346dc8f7b028749cac9c2198Wink Saville private static final int ICC_LOCK_MODE = 1; 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // State when entering the old pin 54c38866843e966622346dc8f7b028749cac9c2198Wink Saville private static final int ICC_OLD_MODE = 2; 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // State when entering the new pin - first time 56c38866843e966622346dc8f7b028749cac9c2198Wink Saville private static final int ICC_NEW_MODE = 3; 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // State when entering the new pin - second time 58c38866843e966622346dc8f7b028749cac9c2198Wink Saville private static final int ICC_REENTER_MODE = 4; 59113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Keys in xml file 61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String PIN_DIALOG = "sim_pin"; 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String PIN_TOGGLE = "sim_toggle"; 63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Keys in icicle 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String DIALOG_STATE = "dialogState"; 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String DIALOG_PIN = "dialogPin"; 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String DIALOG_ERROR = "dialogError"; 67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String ENABLE_TO_STATE = "enableState"; 6822135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 6922135ea7739433802fa55a37790c2a931b698f30Yongwei Cai // Save and restore inputted PIN code when configuration changed 7022135ea7739433802fa55a37790c2a931b698f30Yongwei Cai // (ex. portrait<-->landscape) during change PIN code 7122135ea7739433802fa55a37790c2a931b698f30Yongwei Cai private static final String OLD_PINCODE = "oldPinCode"; 7222135ea7739433802fa55a37790c2a931b698f30Yongwei Cai private static final String NEW_PINCODE = "newPinCode"; 73113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int MIN_PIN_LENGTH = 4; 75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int MAX_PIN_LENGTH = 8; 76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Which dialog to show next when popped up 77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private int mDialogState = OFF_MODE; 78113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String mPin; 80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String mOldPin; 81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String mNewPin; 82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String mError; 83c38866843e966622346dc8f7b028749cac9c2198Wink Saville // Are we trying to enable or disable ICC lock? 84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private boolean mToState; 85113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Phone mPhone; 87113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private EditPinPreference mPinDialog; 89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CheckBoxPreference mPinToggle; 90113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Resources mRes; 92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // For async handler to identify request type 94113ae0258d8a0aac363e397ad025cb65df237328Jim Miller private static final int MSG_ENABLE_ICC_PIN_COMPLETE = 100; 95113ae0258d8a0aac363e397ad025cb65df237328Jim Miller private static final int MSG_CHANGE_ICC_PIN_COMPLETE = 101; 96113ae0258d8a0aac363e397ad025cb65df237328Jim Miller private static final int MSG_SIM_STATE_CHANGED = 102; 97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 98c38866843e966622346dc8f7b028749cac9c2198Wink Saville // For replies from IccCard interface 99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Handler mHandler = new Handler() { 100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void handleMessage(Message msg) { 101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project AsyncResult ar = (AsyncResult) msg.obj; 102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (msg.what) { 103113ae0258d8a0aac363e397ad025cb65df237328Jim Miller case MSG_ENABLE_ICC_PIN_COMPLETE: 104c38866843e966622346dc8f7b028749cac9c2198Wink Saville iccLockChanged(ar.exception == null); 105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 106113ae0258d8a0aac363e397ad025cb65df237328Jim Miller case MSG_CHANGE_ICC_PIN_COMPLETE: 107c38866843e966622346dc8f7b028749cac9c2198Wink Saville iccPinChanged(ar.exception == null); 108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 109113ae0258d8a0aac363e397ad025cb65df237328Jim Miller case MSG_SIM_STATE_CHANGED: 110113ae0258d8a0aac363e397ad025cb65df237328Jim Miller updatePreferences(); 111113ae0258d8a0aac363e397ad025cb65df237328Jim Miller break; 112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return; 115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 117113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 118113ae0258d8a0aac363e397ad025cb65df237328Jim Miller private final BroadcastReceiver mSimStateReceiver = new BroadcastReceiver() { 119113ae0258d8a0aac363e397ad025cb65df237328Jim Miller public void onReceive(Context context, Intent intent) { 120113ae0258d8a0aac363e397ad025cb65df237328Jim Miller final String action = intent.getAction(); 121113ae0258d8a0aac363e397ad025cb65df237328Jim Miller if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(action)) { 122113ae0258d8a0aac363e397ad025cb65df237328Jim Miller mHandler.sendMessage(mHandler.obtainMessage(MSG_SIM_STATE_CHANGED)); 123113ae0258d8a0aac363e397ad025cb65df237328Jim Miller } 124113ae0258d8a0aac363e397ad025cb65df237328Jim Miller } 125113ae0258d8a0aac363e397ad025cb65df237328Jim Miller }; 126113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // For top-level settings screen to query 128c38866843e966622346dc8f7b028749cac9c2198Wink Saville static boolean isIccLockEnabled() { 129c38866843e966622346dc8f7b028749cac9c2198Wink Saville return PhoneFactory.getDefaultPhone().getIccCard().getIccLockEnabled(); 130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 131113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project static String getSummary(Context context) { 133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Resources res = context.getResources(); 134113ae0258d8a0aac363e397ad025cb65df237328Jim Miller String summary = isIccLockEnabled() 135c38866843e966622346dc8f7b028749cac9c2198Wink Saville ? res.getString(R.string.sim_lock_on) 136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project : res.getString(R.string.sim_lock_off); 137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return summary; 138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 139c38866843e966622346dc8f7b028749cac9c2198Wink Saville 140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project protected void onCreate(Bundle savedInstanceState) { 142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(savedInstanceState); 143c38866843e966622346dc8f7b028749cac9c2198Wink Saville 1442e180ef88050bfa243dfccaab72fb6ab235e21afAmith Yamasani if (Utils.isMonkeyRunning()) { 1452e180ef88050bfa243dfccaab72fb6ab235e21afAmith Yamasani finish(); 1462e180ef88050bfa243dfccaab72fb6ab235e21afAmith Yamasani return; 1472e180ef88050bfa243dfccaab72fb6ab235e21afAmith Yamasani } 1482e180ef88050bfa243dfccaab72fb6ab235e21afAmith Yamasani 149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project addPreferencesFromResource(R.xml.sim_lock_settings); 150c38866843e966622346dc8f7b028749cac9c2198Wink Saville 151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog = (EditPinPreference) findPreference(PIN_DIALOG); 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinToggle = (CheckBoxPreference) findPreference(PIN_TOGGLE); 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (savedInstanceState != null && savedInstanceState.containsKey(DIALOG_STATE)) { 154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDialogState = savedInstanceState.getInt(DIALOG_STATE); 155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPin = savedInstanceState.getString(DIALOG_PIN); 156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = savedInstanceState.getString(DIALOG_ERROR); 157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mToState = savedInstanceState.getBoolean(ENABLE_TO_STATE); 15822135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 15922135ea7739433802fa55a37790c2a931b698f30Yongwei Cai // Restore inputted PIN code 16022135ea7739433802fa55a37790c2a931b698f30Yongwei Cai switch (mDialogState) { 16122135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_NEW_MODE: 16222135ea7739433802fa55a37790c2a931b698f30Yongwei Cai mOldPin = savedInstanceState.getString(OLD_PINCODE); 16322135ea7739433802fa55a37790c2a931b698f30Yongwei Cai break; 16422135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 16522135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_REENTER_MODE: 16622135ea7739433802fa55a37790c2a931b698f30Yongwei Cai mOldPin = savedInstanceState.getString(OLD_PINCODE); 16722135ea7739433802fa55a37790c2a931b698f30Yongwei Cai mNewPin = savedInstanceState.getString(NEW_PINCODE); 16822135ea7739433802fa55a37790c2a931b698f30Yongwei Cai break; 16922135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 17022135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_LOCK_MODE: 17122135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_OLD_MODE: 17222135ea7739433802fa55a37790c2a931b698f30Yongwei Cai default: 17322135ea7739433802fa55a37790c2a931b698f30Yongwei Cai break; 17422135ea7739433802fa55a37790c2a931b698f30Yongwei Cai } 175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.setOnPinEnteredListener(this); 178113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Don't need any changes to be remembered 180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project getPreferenceScreen().setPersistent(false); 181113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPhone = PhoneFactory.getDefaultPhone(); 183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mRes = getResources(); 184113ae0258d8a0aac363e397ad025cb65df237328Jim Miller updatePreferences(); 185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 186113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 187113ae0258d8a0aac363e397ad025cb65df237328Jim Miller private void updatePreferences() { 188113ae0258d8a0aac363e397ad025cb65df237328Jim Miller mPinToggle.setChecked(mPhone.getIccCard().getIccLockEnabled()); 189113ae0258d8a0aac363e397ad025cb65df237328Jim Miller } 190113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project protected void onResume() { 193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onResume(); 194113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 195113ae0258d8a0aac363e397ad025cb65df237328Jim Miller // ACTION_SIM_STATE_CHANGED is sticky, so we'll receive current state after this call, 196113ae0258d8a0aac363e397ad025cb65df237328Jim Miller // which will call updatePreferences(). 197113ae0258d8a0aac363e397ad025cb65df237328Jim Miller final IntentFilter filter = new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED); 198113ae0258d8a0aac363e397ad025cb65df237328Jim Miller registerReceiver(mSimStateReceiver, filter); 199113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mDialogState != OFF_MODE) { 201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPinDialog(); 202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Prep for standard click on "Change PIN" 204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project resetDialogState(); 205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 207113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 208113ae0258d8a0aac363e397ad025cb65df237328Jim Miller @Override 209113ae0258d8a0aac363e397ad025cb65df237328Jim Miller protected void onPause() { 210113ae0258d8a0aac363e397ad025cb65df237328Jim Miller super.onPause(); 211113ae0258d8a0aac363e397ad025cb65df237328Jim Miller unregisterReceiver(mSimStateReceiver); 212113ae0258d8a0aac363e397ad025cb65df237328Jim Miller } 213113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project protected void onSaveInstanceState(Bundle out) { 216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Need to store this state for slider open/close 217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // There is one case where the dialog is popped up by the preference 218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // framework. In that case, let the preference framework store the 219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // dialog state. In other cases, where this activity manually launches 220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // the dialog, store the state of the dialog. 221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mPinDialog.isDialogOpen()) { 222afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project out.putInt(DIALOG_STATE, mDialogState); 223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project out.putString(DIALOG_PIN, mPinDialog.getEditText().getText().toString()); 224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project out.putString(DIALOG_ERROR, mError); 225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project out.putBoolean(ENABLE_TO_STATE, mToState); 22622135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 22722135ea7739433802fa55a37790c2a931b698f30Yongwei Cai // Save inputted PIN code 22822135ea7739433802fa55a37790c2a931b698f30Yongwei Cai switch (mDialogState) { 22922135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_NEW_MODE: 23022135ea7739433802fa55a37790c2a931b698f30Yongwei Cai out.putString(OLD_PINCODE, mOldPin); 23122135ea7739433802fa55a37790c2a931b698f30Yongwei Cai break; 23222135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 23322135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_REENTER_MODE: 23422135ea7739433802fa55a37790c2a931b698f30Yongwei Cai out.putString(OLD_PINCODE, mOldPin); 23522135ea7739433802fa55a37790c2a931b698f30Yongwei Cai out.putString(NEW_PINCODE, mNewPin); 23622135ea7739433802fa55a37790c2a931b698f30Yongwei Cai break; 23722135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 23822135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_LOCK_MODE: 23922135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_OLD_MODE: 24022135ea7739433802fa55a37790c2a931b698f30Yongwei Cai default: 24122135ea7739433802fa55a37790c2a931b698f30Yongwei Cai break; 24222135ea7739433802fa55a37790c2a931b698f30Yongwei Cai } 243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onSaveInstanceState(out); 245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void showPinDialog() { 249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mDialogState == OFF_MODE) { 250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return; 251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setDialogValues(); 253113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.showPinDialog(); 255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 256113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 257afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setDialogValues() { 258afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.setText(mPin); 259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String message = ""; 260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (mDialogState) { 261c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_LOCK_MODE: 262afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project message = mRes.getString(R.string.sim_enter_pin); 263113ae0258d8a0aac363e397ad025cb65df237328Jim Miller mPinDialog.setDialogTitle(mToState 264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project ? mRes.getString(R.string.sim_enable_sim_lock) 265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project : mRes.getString(R.string.sim_disable_sim_lock)); 266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 267c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_OLD_MODE: 268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project message = mRes.getString(R.string.sim_enter_old); 269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.setDialogTitle(mRes.getString(R.string.sim_change_pin)); 270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 271c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_NEW_MODE: 272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project message = mRes.getString(R.string.sim_enter_new); 273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.setDialogTitle(mRes.getString(R.string.sim_change_pin)); 274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 275c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_REENTER_MODE: 276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project message = mRes.getString(R.string.sim_reenter_new); 277afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.setDialogTitle(mRes.getString(R.string.sim_change_pin)); 278afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 279afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mError != null) { 281afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project message = mError + "\n" + message; 282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = null; 283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.setDialogMessage(message); 285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onPinEntered(EditPinPreference preference, boolean positiveResult) { 288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (!positiveResult) { 289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project resetDialogState(); 290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return; 291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 292113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPin = preference.getText(); 294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (!reasonablePin(mPin)) { 295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // inject error message and display dialog again 296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = mRes.getString(R.string.sim_bad_pin); 297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPinDialog(); 298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return; 299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (mDialogState) { 301c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_LOCK_MODE: 302c38866843e966622346dc8f7b028749cac9c2198Wink Saville tryChangeIccLockState(); 303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 304c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_OLD_MODE: 305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mOldPin = mPin; 306c38866843e966622346dc8f7b028749cac9c2198Wink Saville mDialogState = ICC_NEW_MODE; 307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = null; 308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPin = null; 309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPinDialog(); 310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 311c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_NEW_MODE: 312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mNewPin = mPin; 313c38866843e966622346dc8f7b028749cac9c2198Wink Saville mDialogState = ICC_REENTER_MODE; 314afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPin = null; 315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPinDialog(); 316afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 317c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_REENTER_MODE: 318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (!mPin.equals(mNewPin)) { 319afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = mRes.getString(R.string.sim_pins_dont_match); 320c38866843e966622346dc8f7b028749cac9c2198Wink Saville mDialogState = ICC_NEW_MODE; 321afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPin = null; 322afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPinDialog(); 323afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = null; 325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project tryChangePin(); 326afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 327afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 328afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 329afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 330113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 331afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 332afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (preference == mPinToggle) { 333afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Get the new, preferred state 334afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mToState = mPinToggle.isChecked(); 335113ae0258d8a0aac363e397ad025cb65df237328Jim Miller // Flip it back and pop up pin dialog 336113ae0258d8a0aac363e397ad025cb65df237328Jim Miller mPinToggle.setChecked(!mToState); 337c38866843e966622346dc8f7b028749cac9c2198Wink Saville mDialogState = ICC_LOCK_MODE; 338afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPinDialog(); 33911cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani } else if (preference == mPinDialog) { 34011cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani mDialogState = ICC_OLD_MODE; 34111cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani return false; 342afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 343afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 344afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 34511cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani 346c38866843e966622346dc8f7b028749cac9c2198Wink Saville private void tryChangeIccLockState() { 347113ae0258d8a0aac363e397ad025cb65df237328Jim Miller // Try to change icc lock. If it succeeds, toggle the lock state and 348afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // reset dialog state. Else inject error message and show dialog again. 349113ae0258d8a0aac363e397ad025cb65df237328Jim Miller Message callback = Message.obtain(mHandler, MSG_ENABLE_ICC_PIN_COMPLETE); 350c38866843e966622346dc8f7b028749cac9c2198Wink Saville mPhone.getIccCard().setIccLockEnabled(mToState, mPin, callback); 351afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 352afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 353113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 354c38866843e966622346dc8f7b028749cac9c2198Wink Saville private void iccLockChanged(boolean success) { 355afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (success) { 356afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinToggle.setChecked(mToState); 357afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 358afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Toast.makeText(this, mRes.getString(R.string.sim_lock_failed), Toast.LENGTH_SHORT) 359afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .show(); 360afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 361afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project resetDialogState(); 362afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 363afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 364c38866843e966622346dc8f7b028749cac9c2198Wink Saville private void iccPinChanged(boolean success) { 365afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (!success) { 366c38866843e966622346dc8f7b028749cac9c2198Wink Saville Toast.makeText(this, mRes.getString(R.string.sim_change_failed), 367afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Toast.LENGTH_SHORT) 368afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .show(); 369afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 370c38866843e966622346dc8f7b028749cac9c2198Wink Saville Toast.makeText(this, mRes.getString(R.string.sim_change_succeeded), 371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Toast.LENGTH_SHORT) 372afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .show(); 373afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 374afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 375afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project resetDialogState(); 376afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 377afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 378afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void tryChangePin() { 379113ae0258d8a0aac363e397ad025cb65df237328Jim Miller Message callback = Message.obtain(mHandler, MSG_CHANGE_ICC_PIN_COMPLETE); 380c38866843e966622346dc8f7b028749cac9c2198Wink Saville mPhone.getIccCard().changeIccLockPassword(mOldPin, 381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mNewPin, callback); 382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 38311cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani 384afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private boolean reasonablePin(String pin) { 385afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (pin == null || pin.length() < MIN_PIN_LENGTH || pin.length() > MAX_PIN_LENGTH) { 386afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return false; 387afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 388afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 389afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 390afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 39111cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani 392afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void resetDialogState() { 393afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = null; 394c38866843e966622346dc8f7b028749cac9c2198Wink Saville mDialogState = ICC_OLD_MODE; // Default for when Change PIN is clicked 395afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPin = ""; 396afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setDialogValues(); 39711cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani mDialogState = OFF_MODE; 398afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 399afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 400