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