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; 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference; 293065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglioimport android.preference.PreferenceActivity; 30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen; 31ac5c081adc408953f4937e3743ef2a4c5328ece7PauloftheWestimport android.preference.SwitchPreference; 321d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWestimport android.telephony.SubscriptionInfo; 331d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWestimport android.telephony.SubscriptionManager; 341d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWestimport android.telephony.TelephonyManager; 358246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Savilleimport android.util.Log; 361d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWestimport android.view.View; 371d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWestimport android.widget.ListView; 381d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWestimport android.widget.TabHost; 391d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWestimport android.widget.TabHost.OnTabChangeListener; 401d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWestimport android.widget.TabHost.TabContentFactory; 411d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWestimport android.widget.TabHost.TabSpec; 421d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWestimport android.widget.TabWidget; 43c38866843e966622346dc8f7b028749cac9c2198Wink Savilleimport android.widget.Toast; 44c38866843e966622346dc8f7b028749cac9c2198Wink Saville 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.internal.telephony.Phone; 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.internal.telephony.PhoneFactory; 47113ae0258d8a0aac363e397ad025cb65df237328Jim Millerimport com.android.internal.telephony.TelephonyIntents; 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 491d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWestimport java.util.ArrayList; 501d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWestimport java.util.List; 511d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 53c38866843e966622346dc8f7b028749cac9c2198Wink Saville * Implements the preference screen to enable/disable ICC lock and 54c38866843e966622346dc8f7b028749cac9c2198Wink Saville * also the dialogs to change the ICC PIN. In the former case, enabling/disabling 55c38866843e966622346dc8f7b028749cac9c2198Wink Saville * the ICC lock will prompt the user for the current PIN. 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * In the Change PIN case, it prompts the user for old pin, new pin and new pin 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * again before attempting to change it. Calls the SimCard interface to execute 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * these operations. 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 613065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Megliopublic class IccLockSettings extends PreferenceActivity 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project implements EditPinPreference.OnPinEnteredListener { 638246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville private static final String TAG = "IccLockSettings"; 648246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville private static final boolean DBG = true; 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OFF_MODE = 0; 67c38866843e966622346dc8f7b028749cac9c2198Wink Saville // State when enabling/disabling ICC lock 68c38866843e966622346dc8f7b028749cac9c2198Wink Saville private static final int ICC_LOCK_MODE = 1; 69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // State when entering the old pin 70c38866843e966622346dc8f7b028749cac9c2198Wink Saville private static final int ICC_OLD_MODE = 2; 71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // State when entering the new pin - first time 72c38866843e966622346dc8f7b028749cac9c2198Wink Saville private static final int ICC_NEW_MODE = 3; 73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // State when entering the new pin - second time 74c38866843e966622346dc8f7b028749cac9c2198Wink Saville private static final int ICC_REENTER_MODE = 4; 75113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Keys in xml file 77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String PIN_DIALOG = "sim_pin"; 78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String PIN_TOGGLE = "sim_toggle"; 79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Keys in icicle 80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String DIALOG_STATE = "dialogState"; 81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String DIALOG_PIN = "dialogPin"; 82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String DIALOG_ERROR = "dialogError"; 83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String ENABLE_TO_STATE = "enableState"; 8422135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 8522135ea7739433802fa55a37790c2a931b698f30Yongwei Cai // Save and restore inputted PIN code when configuration changed 8622135ea7739433802fa55a37790c2a931b698f30Yongwei Cai // (ex. portrait<-->landscape) during change PIN code 8722135ea7739433802fa55a37790c2a931b698f30Yongwei Cai private static final String OLD_PINCODE = "oldPinCode"; 8822135ea7739433802fa55a37790c2a931b698f30Yongwei Cai private static final String NEW_PINCODE = "newPinCode"; 89113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int MIN_PIN_LENGTH = 4; 91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int MAX_PIN_LENGTH = 8; 92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Which dialog to show next when popped up 93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private int mDialogState = OFF_MODE; 94113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String mPin; 96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String mOldPin; 97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String mNewPin; 98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String mError; 99c38866843e966622346dc8f7b028749cac9c2198Wink Saville // Are we trying to enable or disable ICC lock? 100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private boolean mToState; 101113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 1021d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest private TabHost mTabHost; 1031d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest private TabWidget mTabWidget; 1041d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest private ListView mListView; 1051d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest 106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Phone mPhone; 107113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private EditPinPreference mPinDialog; 109ac5c081adc408953f4937e3743ef2a4c5328ece7PauloftheWest private SwitchPreference mPinToggle; 110113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 111afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Resources mRes; 112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // For async handler to identify request type 114113ae0258d8a0aac363e397ad025cb65df237328Jim Miller private static final int MSG_ENABLE_ICC_PIN_COMPLETE = 100; 115113ae0258d8a0aac363e397ad025cb65df237328Jim Miller private static final int MSG_CHANGE_ICC_PIN_COMPLETE = 101; 116113ae0258d8a0aac363e397ad025cb65df237328Jim Miller private static final int MSG_SIM_STATE_CHANGED = 102; 117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 118c38866843e966622346dc8f7b028749cac9c2198Wink Saville // For replies from IccCard interface 119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Handler mHandler = new Handler() { 120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void handleMessage(Message msg) { 121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project AsyncResult ar = (AsyncResult) msg.obj; 122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (msg.what) { 123113ae0258d8a0aac363e397ad025cb65df237328Jim Miller case MSG_ENABLE_ICC_PIN_COMPLETE: 1248246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville iccLockChanged(ar.exception == null, msg.arg1); 125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 126113ae0258d8a0aac363e397ad025cb65df237328Jim Miller case MSG_CHANGE_ICC_PIN_COMPLETE: 1278246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville iccPinChanged(ar.exception == null, msg.arg1); 128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 129113ae0258d8a0aac363e397ad025cb65df237328Jim Miller case MSG_SIM_STATE_CHANGED: 130113ae0258d8a0aac363e397ad025cb65df237328Jim Miller updatePreferences(); 131113ae0258d8a0aac363e397ad025cb65df237328Jim Miller break; 132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return; 135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 137113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 138113ae0258d8a0aac363e397ad025cb65df237328Jim Miller private final BroadcastReceiver mSimStateReceiver = new BroadcastReceiver() { 139113ae0258d8a0aac363e397ad025cb65df237328Jim Miller public void onReceive(Context context, Intent intent) { 140113ae0258d8a0aac363e397ad025cb65df237328Jim Miller final String action = intent.getAction(); 141113ae0258d8a0aac363e397ad025cb65df237328Jim Miller if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(action)) { 142113ae0258d8a0aac363e397ad025cb65df237328Jim Miller mHandler.sendMessage(mHandler.obtainMessage(MSG_SIM_STATE_CHANGED)); 143113ae0258d8a0aac363e397ad025cb65df237328Jim Miller } 144113ae0258d8a0aac363e397ad025cb65df237328Jim Miller } 145113ae0258d8a0aac363e397ad025cb65df237328Jim Miller }; 146113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // For top-level settings screen to query 1483065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio static boolean isIccLockEnabled() { 1493065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio return PhoneFactory.getDefaultPhone().getIccCard().getIccLockEnabled(); 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 151113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 1523065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio static String getSummary(Context context) { 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Resources res = context.getResources(); 154113ae0258d8a0aac363e397ad025cb65df237328Jim Miller String summary = isIccLockEnabled() 155c38866843e966622346dc8f7b028749cac9c2198Wink Saville ? res.getString(R.string.sim_lock_on) 156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project : res.getString(R.string.sim_lock_off); 157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return summary; 158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 159c38866843e966622346dc8f7b028749cac9c2198Wink Saville 160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 1613065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio protected void onCreate(Bundle savedInstanceState) { 162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(savedInstanceState); 1631d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest final Context context = getApplicationContext(); 1641d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest final TelephonyManager tm = 1651d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 1661d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest final int numSims = tm.getSimCount(); 167c38866843e966622346dc8f7b028749cac9c2198Wink Saville 1682e180ef88050bfa243dfccaab72fb6ab235e21afAmith Yamasani if (Utils.isMonkeyRunning()) { 1692e180ef88050bfa243dfccaab72fb6ab235e21afAmith Yamasani finish(); 1702e180ef88050bfa243dfccaab72fb6ab235e21afAmith Yamasani return; 1712e180ef88050bfa243dfccaab72fb6ab235e21afAmith Yamasani } 1722e180ef88050bfa243dfccaab72fb6ab235e21afAmith Yamasani 173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project addPreferencesFromResource(R.xml.sim_lock_settings); 174c38866843e966622346dc8f7b028749cac9c2198Wink Saville 175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog = (EditPinPreference) findPreference(PIN_DIALOG); 176ac5c081adc408953f4937e3743ef2a4c5328ece7PauloftheWest mPinToggle = (SwitchPreference) findPreference(PIN_TOGGLE); 177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (savedInstanceState != null && savedInstanceState.containsKey(DIALOG_STATE)) { 178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDialogState = savedInstanceState.getInt(DIALOG_STATE); 179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPin = savedInstanceState.getString(DIALOG_PIN); 180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = savedInstanceState.getString(DIALOG_ERROR); 181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mToState = savedInstanceState.getBoolean(ENABLE_TO_STATE); 18222135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 18322135ea7739433802fa55a37790c2a931b698f30Yongwei Cai // Restore inputted PIN code 18422135ea7739433802fa55a37790c2a931b698f30Yongwei Cai switch (mDialogState) { 18522135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_NEW_MODE: 18622135ea7739433802fa55a37790c2a931b698f30Yongwei Cai mOldPin = savedInstanceState.getString(OLD_PINCODE); 18722135ea7739433802fa55a37790c2a931b698f30Yongwei Cai break; 18822135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 18922135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_REENTER_MODE: 19022135ea7739433802fa55a37790c2a931b698f30Yongwei Cai mOldPin = savedInstanceState.getString(OLD_PINCODE); 19122135ea7739433802fa55a37790c2a931b698f30Yongwei Cai mNewPin = savedInstanceState.getString(NEW_PINCODE); 19222135ea7739433802fa55a37790c2a931b698f30Yongwei Cai break; 19322135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 19422135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_LOCK_MODE: 19522135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_OLD_MODE: 19622135ea7739433802fa55a37790c2a931b698f30Yongwei Cai default: 19722135ea7739433802fa55a37790c2a931b698f30Yongwei Cai break; 19822135ea7739433802fa55a37790c2a931b698f30Yongwei Cai } 199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.setOnPinEnteredListener(this); 202113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Don't need any changes to be remembered 204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project getPreferenceScreen().setPersistent(false); 205113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 2061d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest if (numSims > 1) { 2071d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest setContentView(R.layout.icc_lock_tabs); 2081d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest 2091d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest mTabHost = (TabHost) findViewById(android.R.id.tabhost); 2101d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest mTabWidget = (TabWidget) findViewById(android.R.id.tabs); 2111d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest mListView = (ListView) findViewById(android.R.id.list); 2121d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest 2131d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest mTabHost.setup(); 2141d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest mTabHost.setOnTabChangedListener(mTabListener); 2151d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest mTabHost.clearAllTabs(); 2161d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest 2171d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest for (int i = 0; i < numSims; ++i) { 2180183fb5394f105d544472a52b2b4ba628e01da92Wink Saville final SubscriptionInfo subInfo = Utils.findRecordBySlotId(this, i); 2191d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest mTabHost.addTab(buildTabSpec(String.valueOf(i), 2201d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest String.valueOf(subInfo == null 2211d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest ? context.getString(R.string.sim_editor_title, i + 1) 2221d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest : subInfo.getDisplayName()))); 2231d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest } 2240b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest final SubscriptionInfo sir = Utils.findRecordBySlotId(getBaseContext(), 0); 2251d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest 2260b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest mPhone = (sir == null) ? null 2270b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest : PhoneFactory.getPhone(SubscriptionManager.getPhoneId(sir.getSubscriptionId())); 2280b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest } else { 2290b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest mPhone = PhoneFactory.getDefaultPhone(); 2300b8788aae47932db56bf71869c5d58e0338420a4PauloftheWest } 231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mRes = getResources(); 232113ae0258d8a0aac363e397ad025cb65df237328Jim Miller updatePreferences(); 233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 234113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 235113ae0258d8a0aac363e397ad025cb65df237328Jim Miller private void updatePreferences() { 2361d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest mPinDialog.setEnabled(mPhone != null); 2371d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest mPinToggle.setEnabled(mPhone != null); 2381d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest 2391d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest if (mPhone != null) { 2401d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest mPinToggle.setChecked(mPhone.getIccCard().getIccLockEnabled()); 2411d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest } 242113ae0258d8a0aac363e397ad025cb65df237328Jim Miller } 243113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 2453065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio protected void onResume() { 246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onResume(); 247113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 248113ae0258d8a0aac363e397ad025cb65df237328Jim Miller // ACTION_SIM_STATE_CHANGED is sticky, so we'll receive current state after this call, 249113ae0258d8a0aac363e397ad025cb65df237328Jim Miller // which will call updatePreferences(). 250113ae0258d8a0aac363e397ad025cb65df237328Jim Miller final IntentFilter filter = new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED); 2513065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio registerReceiver(mSimStateReceiver, filter); 252113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mDialogState != OFF_MODE) { 254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPinDialog(); 255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Prep for standard click on "Change PIN" 257afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project resetDialogState(); 258afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 260113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 261113ae0258d8a0aac363e397ad025cb65df237328Jim Miller @Override 2623065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio protected void onPause() { 263113ae0258d8a0aac363e397ad025cb65df237328Jim Miller super.onPause(); 2643065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio unregisterReceiver(mSimStateReceiver); 265113ae0258d8a0aac363e397ad025cb65df237328Jim Miller } 266113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 2683065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio protected void onSaveInstanceState(Bundle out) { 269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Need to store this state for slider open/close 270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // There is one case where the dialog is popped up by the preference 271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // framework. In that case, let the preference framework store the 272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // dialog state. In other cases, where this activity manually launches 273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // the dialog, store the state of the dialog. 274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mPinDialog.isDialogOpen()) { 275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project out.putInt(DIALOG_STATE, mDialogState); 276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project out.putString(DIALOG_PIN, mPinDialog.getEditText().getText().toString()); 277afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project out.putString(DIALOG_ERROR, mError); 278afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project out.putBoolean(ENABLE_TO_STATE, mToState); 27922135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 28022135ea7739433802fa55a37790c2a931b698f30Yongwei Cai // Save inputted PIN code 28122135ea7739433802fa55a37790c2a931b698f30Yongwei Cai switch (mDialogState) { 28222135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_NEW_MODE: 28322135ea7739433802fa55a37790c2a931b698f30Yongwei Cai out.putString(OLD_PINCODE, mOldPin); 28422135ea7739433802fa55a37790c2a931b698f30Yongwei Cai break; 28522135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 28622135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_REENTER_MODE: 28722135ea7739433802fa55a37790c2a931b698f30Yongwei Cai out.putString(OLD_PINCODE, mOldPin); 28822135ea7739433802fa55a37790c2a931b698f30Yongwei Cai out.putString(NEW_PINCODE, mNewPin); 28922135ea7739433802fa55a37790c2a931b698f30Yongwei Cai break; 29022135ea7739433802fa55a37790c2a931b698f30Yongwei Cai 29122135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_LOCK_MODE: 29222135ea7739433802fa55a37790c2a931b698f30Yongwei Cai case ICC_OLD_MODE: 29322135ea7739433802fa55a37790c2a931b698f30Yongwei Cai default: 29422135ea7739433802fa55a37790c2a931b698f30Yongwei Cai break; 29522135ea7739433802fa55a37790c2a931b698f30Yongwei Cai } 296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onSaveInstanceState(out); 298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void showPinDialog() { 302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mDialogState == OFF_MODE) { 303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return; 304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setDialogValues(); 306113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.showPinDialog(); 308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 309113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setDialogValues() { 311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.setText(mPin); 312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String message = ""; 313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (mDialogState) { 314c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_LOCK_MODE: 315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project message = mRes.getString(R.string.sim_enter_pin); 316113ae0258d8a0aac363e397ad025cb65df237328Jim Miller mPinDialog.setDialogTitle(mToState 317afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project ? mRes.getString(R.string.sim_enable_sim_lock) 318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project : mRes.getString(R.string.sim_disable_sim_lock)); 319afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 320c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_OLD_MODE: 321afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project message = mRes.getString(R.string.sim_enter_old); 322afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.setDialogTitle(mRes.getString(R.string.sim_change_pin)); 323afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 324c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_NEW_MODE: 325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project message = mRes.getString(R.string.sim_enter_new); 326afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.setDialogTitle(mRes.getString(R.string.sim_change_pin)); 327afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 328c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_REENTER_MODE: 329afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project message = mRes.getString(R.string.sim_reenter_new); 330afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.setDialogTitle(mRes.getString(R.string.sim_change_pin)); 331afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 332afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 333afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mError != null) { 334afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project message = mError + "\n" + message; 335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = null; 336afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 337afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinDialog.setDialogMessage(message); 338afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 339afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 340afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onPinEntered(EditPinPreference preference, boolean positiveResult) { 341afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (!positiveResult) { 342afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project resetDialogState(); 343afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return; 344afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 345113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 346afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPin = preference.getText(); 347afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (!reasonablePin(mPin)) { 348afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // inject error message and display dialog again 349afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = mRes.getString(R.string.sim_bad_pin); 350afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPinDialog(); 351afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return; 352afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 353afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (mDialogState) { 354c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_LOCK_MODE: 355c38866843e966622346dc8f7b028749cac9c2198Wink Saville tryChangeIccLockState(); 356afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 357c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_OLD_MODE: 358afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mOldPin = mPin; 359c38866843e966622346dc8f7b028749cac9c2198Wink Saville mDialogState = ICC_NEW_MODE; 360afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = null; 361afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPin = null; 362afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPinDialog(); 363afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 364c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_NEW_MODE: 365afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mNewPin = mPin; 366c38866843e966622346dc8f7b028749cac9c2198Wink Saville mDialogState = ICC_REENTER_MODE; 367afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPin = null; 368afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPinDialog(); 369afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 370c38866843e966622346dc8f7b028749cac9c2198Wink Saville case ICC_REENTER_MODE: 371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (!mPin.equals(mNewPin)) { 372afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = mRes.getString(R.string.sim_pins_dont_match); 373c38866843e966622346dc8f7b028749cac9c2198Wink Saville mDialogState = ICC_NEW_MODE; 374afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPin = null; 375afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPinDialog(); 376afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 377afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = null; 378afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project tryChangePin(); 379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 380afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 383113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 384afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 385afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (preference == mPinToggle) { 386afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Get the new, preferred state 387afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mToState = mPinToggle.isChecked(); 388113ae0258d8a0aac363e397ad025cb65df237328Jim Miller // Flip it back and pop up pin dialog 389113ae0258d8a0aac363e397ad025cb65df237328Jim Miller mPinToggle.setChecked(!mToState); 390c38866843e966622346dc8f7b028749cac9c2198Wink Saville mDialogState = ICC_LOCK_MODE; 391afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showPinDialog(); 39211cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani } else if (preference == mPinDialog) { 39311cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani mDialogState = ICC_OLD_MODE; 39411cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani return false; 395afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 396afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 397afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 39811cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani 399c38866843e966622346dc8f7b028749cac9c2198Wink Saville private void tryChangeIccLockState() { 400113ae0258d8a0aac363e397ad025cb65df237328Jim Miller // Try to change icc lock. If it succeeds, toggle the lock state and 401afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // reset dialog state. Else inject error message and show dialog again. 402113ae0258d8a0aac363e397ad025cb65df237328Jim Miller Message callback = Message.obtain(mHandler, MSG_ENABLE_ICC_PIN_COMPLETE); 403c38866843e966622346dc8f7b028749cac9c2198Wink Saville mPhone.getIccCard().setIccLockEnabled(mToState, mPin, callback); 40448c03831253d2749cb6842b4e2fc9fb5255dab44Jeevaka Badrappan // Disable the setting till the response is received. 40548c03831253d2749cb6842b4e2fc9fb5255dab44Jeevaka Badrappan mPinToggle.setEnabled(false); 406afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 407113ae0258d8a0aac363e397ad025cb65df237328Jim Miller 4088246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville private void iccLockChanged(boolean success, int attemptsRemaining) { 409afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (success) { 410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPinToggle.setChecked(mToState); 411afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 4123065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio Toast.makeText(this, getPinPasswordErrorMessage(attemptsRemaining), Toast.LENGTH_LONG) 4133065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio .show(); 414afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 41548c03831253d2749cb6842b4e2fc9fb5255dab44Jeevaka Badrappan mPinToggle.setEnabled(true); 416afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project resetDialogState(); 417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 418afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 4198246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville private void iccPinChanged(boolean success, int attemptsRemaining) { 420afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (!success) { 4213065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio Toast.makeText(this, getPinPasswordErrorMessage(attemptsRemaining), 4228246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville Toast.LENGTH_LONG) 423afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .show(); 424afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 4253065f75e164d71c9c45b26666e37f5acb68ab3f1Fabrice Di Meglio Toast.makeText(this, mRes.getString(R.string.sim_change_succeeded), 426afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Toast.LENGTH_SHORT) 427afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .show(); 428afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 429afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 430afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project resetDialogState(); 431afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 432afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 433afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void tryChangePin() { 434113ae0258d8a0aac363e397ad025cb65df237328Jim Miller Message callback = Message.obtain(mHandler, MSG_CHANGE_ICC_PIN_COMPLETE); 435c38866843e966622346dc8f7b028749cac9c2198Wink Saville mPhone.getIccCard().changeIccLockPassword(mOldPin, 436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mNewPin, callback); 437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 43811cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani 4398246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville private String getPinPasswordErrorMessage(int attemptsRemaining) { 4408246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville String displayMessage; 4418246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville 4428246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville if (attemptsRemaining == 0) { 4438246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville displayMessage = mRes.getString(R.string.wrong_pin_code_pukked); 4448246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville } else if (attemptsRemaining > 0) { 4458246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville displayMessage = mRes 4468246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville .getQuantityString(R.plurals.wrong_pin_code, attemptsRemaining, 4478246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville attemptsRemaining); 4488246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville } else { 4498246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville displayMessage = mRes.getString(R.string.pin_failed); 4508246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville } 4518246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville if (DBG) Log.d(TAG, "getPinPasswordErrorMessage:" 4528246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); 4538246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville return displayMessage; 4548246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville } 4558246579fa14a1021fb02b2762f7d79390ff7c4e0Wink Saville 456afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private boolean reasonablePin(String pin) { 457afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (pin == null || pin.length() < MIN_PIN_LENGTH || pin.length() > MAX_PIN_LENGTH) { 458afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return false; 459afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 460afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 461afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 462afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 46311cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani 464afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void resetDialogState() { 465afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mError = null; 466c38866843e966622346dc8f7b028749cac9c2198Wink Saville mDialogState = ICC_OLD_MODE; // Default for when Change PIN is clicked 467afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPin = ""; 468afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setDialogValues(); 46911cd8c5ac95334c9363a82fd81d05d85623f9d17Amith Yamasani mDialogState = OFF_MODE; 470afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 4711d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest 4721d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest private OnTabChangeListener mTabListener = new OnTabChangeListener() { 4731d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest @Override 4741d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest public void onTabChanged(String tabId) { 4751d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest final int slotId = Integer.parseInt(tabId); 4760183fb5394f105d544472a52b2b4ba628e01da92Wink Saville final SubscriptionInfo sir = Utils.findRecordBySlotId(getBaseContext(), slotId); 4771d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest 4781d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest mPhone = (sir == null) ? null 4791d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest : PhoneFactory.getPhone(SubscriptionManager.getPhoneId(sir.getSubscriptionId())); 4801d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest 4811d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest // The User has changed tab; update the body. 4821d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest updatePreferences(); 4831d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest } 4841d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest }; 4851d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest 4861d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest private TabContentFactory mEmptyTabContent = new TabContentFactory() { 4871d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest @Override 4881d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest public View createTabContent(String tag) { 4891d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest return new View(mTabHost.getContext()); 4901d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest } 4911d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest }; 4921d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest 4931d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest private TabSpec buildTabSpec(String tag, String title) { 4941d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest return mTabHost.newTabSpec(tag).setIndicator(title).setContent( 4951d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest mEmptyTabContent); 4961d891b4caa1e657627fbdd5f2f658899f3e93239PauloftheWest } 497afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 498