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