17d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/*
27d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Copyright (C) 2006 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
177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpackage com.android.phone;
187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.Activity;
207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.AlertDialog;
217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Intent;
227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.res.Resources;
237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.AsyncResult;
247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Bundle;
257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Handler;
267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Message;
277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.text.method.DigitsKeyListener;
287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.Log;
297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.View;
307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.Button;
317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.EditText;
327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.LinearLayout;
337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.ScrollView;
347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.TextView;
357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.widget.Toast;
367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.CommandException;
387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.IccCard;
397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.Phone;
407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/**
427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * "Change ICC PIN" UI for the Phone app.
437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */
447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpublic class ChangeIccPinScreen extends Activity {
457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final String LOG_TAG = PhoneGlobals.LOG_TAG;
467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final boolean DBG = false;
477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final int EVENT_PIN_CHANGED = 100;
497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private enum EntryState {
517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        ES_PIN,
527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        ES_PUK
537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private EntryState mState;
567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final int NO_ERROR = 0;
587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final int PIN_MISMATCH = 1;
597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final int PIN_INVALID_LENGTH = 2;
607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final int MIN_PIN_LENGTH = 4;
627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final int MAX_PIN_LENGTH = 8;
637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private Phone mPhone;
657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private boolean mChangePin2;
667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private TextView mBadPinError;
677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private TextView mMismatchError;
687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private EditText mOldPin;
697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private EditText mNewPin1;
707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private EditText mNewPin2;
717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private EditText mPUKCode;
727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private Button mButton;
737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private Button mPUKSubmit;
747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private ScrollView mScrollView;
757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private LinearLayout mIccPUKPanel;
777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private Handler mHandler = new Handler() {
797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        public void handleMessage(Message msg) {
807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            switch (msg.what) {
817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                case EVENT_PIN_CHANGED:
827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    AsyncResult ar = (AsyncResult) msg.obj;
837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    handleResult(ar);
847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    break;
857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            return;
887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    };
907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    public void onCreate(Bundle icicle) {
927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        super.onCreate(icicle);
937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mPhone = PhoneGlobals.getPhone();
957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        resolveIntent();
977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        setContentView(R.layout.change_sim_pin_screen);
997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mOldPin = (EditText) findViewById(R.id.old_pin);
1017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mOldPin.setKeyListener(DigitsKeyListener.getInstance());
1027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mOldPin.setMovementMethod(null);
1037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mOldPin.setOnClickListener(mClicked);
1047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mNewPin1 = (EditText) findViewById(R.id.new_pin1);
1067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mNewPin1.setKeyListener(DigitsKeyListener.getInstance());
1077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mNewPin1.setMovementMethod(null);
1087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mNewPin1.setOnClickListener(mClicked);
1097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mNewPin2 = (EditText) findViewById(R.id.new_pin2);
1117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mNewPin2.setKeyListener(DigitsKeyListener.getInstance());
1127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mNewPin2.setMovementMethod(null);
1137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mNewPin2.setOnClickListener(mClicked);
1147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mBadPinError = (TextView) findViewById(R.id.bad_pin);
1167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mMismatchError = (TextView) findViewById(R.id.mismatch);
1177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mButton = (Button) findViewById(R.id.button);
1197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mButton.setOnClickListener(mClicked);
1207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mScrollView = (ScrollView) findViewById(R.id.scroll);
1227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mPUKCode = (EditText) findViewById(R.id.puk_code);
1247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mPUKCode.setKeyListener(DigitsKeyListener.getInstance());
1257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mPUKCode.setMovementMethod(null);
1267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mPUKCode.setOnClickListener(mClicked);
1277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mPUKSubmit = (Button) findViewById(R.id.puk_submit);
1297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mPUKSubmit.setOnClickListener(mClicked);
1307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mIccPUKPanel = (LinearLayout) findViewById(R.id.puk_panel);
1327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        int id = mChangePin2 ? R.string.change_pin2 : R.string.change_pin;
1347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        setTitle(getResources().getText(id));
1357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mState = EntryState.ES_PIN;
1377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void resolveIntent() {
1407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        Intent intent = getIntent();
1417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mChangePin2 = intent.getBooleanExtra("pin2", mChangePin2);
1427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void reset() {
1457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mScrollView.scrollTo(0, 0);
1467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mBadPinError.setVisibility(View.GONE);
1477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mMismatchError.setVisibility(View.GONE);
1487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private int validateNewPin(String p1, String p2) {
1517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (p1 == null) {
1527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            return PIN_INVALID_LENGTH;
1537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (!p1.equals(p2)) {
1567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            return PIN_MISMATCH;
1577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        int len1 = p1.length();
1607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (len1 < MIN_PIN_LENGTH || len1 > MAX_PIN_LENGTH) {
1627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            return PIN_INVALID_LENGTH;
1637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return NO_ERROR;
1667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private View.OnClickListener mClicked = new View.OnClickListener() {
1697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        public void onClick(View v) {
1707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (v == mOldPin) {
1717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                mNewPin1.requestFocus();
1727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            } else if (v == mNewPin1) {
1737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                mNewPin2.requestFocus();
1747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            } else if (v == mNewPin2) {
1757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                mButton.requestFocus();
1767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            } else if (v == mButton) {
1777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                IccCard iccCardInterface = mPhone.getIccCard();
1787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                if (iccCardInterface != null) {
1797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    String oldPin = mOldPin.getText().toString();
1807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    String newPin1 = mNewPin1.getText().toString();
1817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    String newPin2 = mNewPin2.getText().toString();
1827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    int error = validateNewPin(newPin1, newPin2);
1847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    switch (error) {
1867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        case PIN_INVALID_LENGTH:
1877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        case PIN_MISMATCH:
1887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            mNewPin1.getText().clear();
1897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            mNewPin2.getText().clear();
1907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            mMismatchError.setVisibility(View.VISIBLE);
1917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            Resources r = getResources();
1937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            CharSequence text;
1947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            if (error == PIN_MISMATCH) {
1967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                text = r.getString(R.string.mismatchPin);
1977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            } else {
1987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                text = r.getString(R.string.invalidPin);
1997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            }
2007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            mMismatchError.setText(text);
2027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            break;
2037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        default:
2057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            Message callBack = Message.obtain(mHandler,
2067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                    EVENT_PIN_CHANGED);
2077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            if (DBG) log("change pin attempt: old=" + oldPin +
2097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                    ", newPin=" + newPin1);
2107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            reset();
2127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            if (mChangePin2) {
2147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                iccCardInterface.changeIccFdnPassword(oldPin,
2157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                        newPin1, callBack);
2167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            } else {
2177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                iccCardInterface.changeIccLockPassword(oldPin,
2187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                        newPin1, callBack);
2197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            }
2207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            // TODO: show progress panel
2227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    }
2237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                }
2247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            } else if (v == mPUKCode) {
2257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                mPUKSubmit.requestFocus();
2267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            } else if (v == mPUKSubmit) {
2277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                mPhone.getIccCard().supplyPuk2(mPUKCode.getText().toString(),
2287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        mNewPin1.getText().toString(),
2297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        Message.obtain(mHandler, EVENT_PIN_CHANGED));
2307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
2317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
2327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    };
2337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void handleResult(AsyncResult ar) {
2357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (ar.exception == null) {
2367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (DBG) log("handleResult: success!");
2377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (mState == EntryState.ES_PUK) {
2397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                mScrollView.setVisibility(View.VISIBLE);
2407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                mIccPUKPanel.setVisibility(View.GONE);
2417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
2427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            // TODO: show success feedback
2437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            showConfirmation();
2447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mHandler.postDelayed(new Runnable() {
2467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                public void run() {
2477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    finish();
2487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                }
2497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }, 3000);
2507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        } else if (ar.exception instanceof CommandException
2527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon           /*  && ((CommandException)ar.exception).getCommandError() ==
2537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon           CommandException.Error.PASSWORD_INCORRECT */ ) {
2547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (mState == EntryState.ES_PIN) {
2557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                if (DBG) log("handleResult: pin failed!");
2567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                mOldPin.getText().clear();
2577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                mBadPinError.setVisibility(View.VISIBLE);
2587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                CommandException ce = (CommandException) ar.exception;
2597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                if (ce.getCommandError() == CommandException.Error.SIM_PUK2) {
2607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    if (DBG) log("handleResult: puk requested!");
2617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    mState = EntryState.ES_PUK;
2627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    displayPUKAlert();
2637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    mScrollView.setVisibility(View.GONE);
2647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    mIccPUKPanel.setVisibility(View.VISIBLE);
2657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    mPUKCode.requestFocus();
2667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                }
2677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            } else if (mState == EntryState.ES_PUK) {
2687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                //should really check to see if the error is CommandException.PASSWORD_INCORRECT...
2697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                if (DBG) log("handleResult: puk2 failed!");
2707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                displayPUKAlert();
2717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                mPUKCode.getText().clear();
2727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                mPUKCode.requestFocus();
2737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
2747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
2757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
2767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private AlertDialog mPUKAlert;
2787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void displayPUKAlert () {
2797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (mPUKAlert == null) {
2807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mPUKAlert = new AlertDialog.Builder(this)
2817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            .setMessage (R.string.puk_requested)
2827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            .setCancelable(false)
2837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            .show();
2847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        } else {
2857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mPUKAlert.show();
2867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
2877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        //TODO: The 3 second delay here is somewhat arbitrary, reflecting the values
2887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        //used elsewhere for similar code.  This should get revisited with the framework
2897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        //crew to see if there is some standard we should adhere to.
2907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mHandler.postDelayed(new Runnable() {
2917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public void run() {
2927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                mPUKAlert.dismiss();
2937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
2947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }, 3000);
2957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
2967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void showConfirmation() {
2987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        int id = mChangePin2 ? R.string.pin2_changed : R.string.pin_changed;
2997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        Toast.makeText(this, id, Toast.LENGTH_SHORT).show();
3007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
3017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
3027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void log(String msg) {
3037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        String prefix = mChangePin2 ? "[ChgPin2]" : "[ChgPin]";
3047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        Log.d(LOG_TAG, prefix + msg);
3057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
3067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon}
307