1b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project/*
2b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
3b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project *
4b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * you may not use this file except in compliance with the License.
6b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * You may obtain a copy of the License at
7b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project *
8b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project *
10b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * See the License for the specific language governing permissions and
14b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project * limitations under the License.
15b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */
16b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
17b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectpackage com.android.phone;
18b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
19b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.app.Activity;
20b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.app.AlertDialog;
21b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.content.Intent;
22b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.content.res.Resources;
23b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.AsyncResult;
24b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.Bundle;
25b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.Handler;
26b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.os.Message;
27b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.text.method.DigitsKeyListener;
28b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.util.Log;
29b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.view.View;
30b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.widget.Button;
31b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.widget.EditText;
32b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.widget.LinearLayout;
33b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.widget.ScrollView;
34b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.widget.TextView;
35b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Projectimport android.widget.Toast;
36b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
37c51f5ac3de9db72a11dfbb1cefd8cc72f7a0fc7cWink Savilleimport com.android.internal.telephony.CommandException;
38c51f5ac3de9db72a11dfbb1cefd8cc72f7a0fc7cWink Savilleimport com.android.internal.telephony.IccCard;
39c51f5ac3de9db72a11dfbb1cefd8cc72f7a0fc7cWink Savilleimport com.android.internal.telephony.Phone;
40c51f5ac3de9db72a11dfbb1cefd8cc72f7a0fc7cWink Saville
41b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project/**
42c51f5ac3de9db72a11dfbb1cefd8cc72f7a0fc7cWink Saville * "Change ICC PIN" UI for the Phone app.
43b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project */
44c51f5ac3de9db72a11dfbb1cefd8cc72f7a0fc7cWink Savillepublic class ChangeIccPinScreen extends Activity {
45a1a9601840e50e18ff8ca4be9b888e592287577bDianne Hackborn    private static final String LOG_TAG = PhoneGlobals.LOG_TAG;
46b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final boolean DBG = false;
47b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
48b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int EVENT_PIN_CHANGED = 100;
49b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
50b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private enum EntryState {
51b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        ES_PIN,
52b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        ES_PUK
53b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
54b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
55b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private EntryState mState;
56b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
57b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int NO_ERROR = 0;
58b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int PIN_MISMATCH = 1;
59b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int PIN_INVALID_LENGTH = 2;
60b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
61b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int MIN_PIN_LENGTH = 4;
62b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private static final int MAX_PIN_LENGTH = 8;
63b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
64b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private Phone mPhone;
65b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private boolean mChangePin2;
66b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private TextView mBadPinError;
67b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private TextView mMismatchError;
68b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private EditText mOldPin;
69b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private EditText mNewPin1;
70b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private EditText mNewPin2;
71b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private EditText mPUKCode;
72b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private Button mButton;
73b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private Button mPUKSubmit;
74b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private ScrollView mScrollView;
75c51f5ac3de9db72a11dfbb1cefd8cc72f7a0fc7cWink Saville
76c51f5ac3de9db72a11dfbb1cefd8cc72f7a0fc7cWink Saville    private LinearLayout mIccPUKPanel;
77b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
78b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private Handler mHandler = new Handler() {
79b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        public void handleMessage(Message msg) {
80b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            switch (msg.what) {
81b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                case EVENT_PIN_CHANGED:
82b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    AsyncResult ar = (AsyncResult) msg.obj;
83b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    handleResult(ar);
84b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    break;
85b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
86b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
87b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return;
88b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
89b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    };
90b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
91b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    public void onCreate(Bundle icicle) {
92b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        super.onCreate(icicle);
93b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
94a1a9601840e50e18ff8ca4be9b888e592287577bDianne Hackborn        mPhone = PhoneGlobals.getPhone();
95b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
96b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        resolveIntent();
97b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
98b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        setContentView(R.layout.change_sim_pin_screen);
99b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
100b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mOldPin = (EditText) findViewById(R.id.old_pin);
101b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mOldPin.setKeyListener(DigitsKeyListener.getInstance());
102b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mOldPin.setMovementMethod(null);
103b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mOldPin.setOnClickListener(mClicked);
104b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
105b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mNewPin1 = (EditText) findViewById(R.id.new_pin1);
106b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mNewPin1.setKeyListener(DigitsKeyListener.getInstance());
107b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mNewPin1.setMovementMethod(null);
108b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mNewPin1.setOnClickListener(mClicked);
109b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
110b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mNewPin2 = (EditText) findViewById(R.id.new_pin2);
111b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mNewPin2.setKeyListener(DigitsKeyListener.getInstance());
112b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mNewPin2.setMovementMethod(null);
113b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mNewPin2.setOnClickListener(mClicked);
114b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
115b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mBadPinError = (TextView) findViewById(R.id.bad_pin);
116b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mMismatchError = (TextView) findViewById(R.id.mismatch);
117b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
118b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mButton = (Button) findViewById(R.id.button);
119b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mButton.setOnClickListener(mClicked);
120b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
121b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mScrollView = (ScrollView) findViewById(R.id.scroll);
122b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
123b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mPUKCode = (EditText) findViewById(R.id.puk_code);
124b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mPUKCode.setKeyListener(DigitsKeyListener.getInstance());
125b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mPUKCode.setMovementMethod(null);
126b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mPUKCode.setOnClickListener(mClicked);
127b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
128b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mPUKSubmit = (Button) findViewById(R.id.puk_submit);
129b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mPUKSubmit.setOnClickListener(mClicked);
130b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
131c51f5ac3de9db72a11dfbb1cefd8cc72f7a0fc7cWink Saville        mIccPUKPanel = (LinearLayout) findViewById(R.id.puk_panel);
132b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
133b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        int id = mChangePin2 ? R.string.change_pin2 : R.string.change_pin;
134b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        setTitle(getResources().getText(id));
135b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
136b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mState = EntryState.ES_PIN;
137b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
138b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
139b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private void resolveIntent() {
140b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        Intent intent = getIntent();
141b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mChangePin2 = intent.getBooleanExtra("pin2", mChangePin2);
142b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
143b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
144b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private void reset() {
145b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mScrollView.scrollTo(0, 0);
146b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mBadPinError.setVisibility(View.GONE);
147b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mMismatchError.setVisibility(View.GONE);
148b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
149b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
150b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private int validateNewPin(String p1, String p2) {
151b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (p1 == null) {
152b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return PIN_INVALID_LENGTH;
153b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
154b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
155b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (!p1.equals(p2)) {
156b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return PIN_MISMATCH;
157b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
158b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
159b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        int len1 = p1.length();
160b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
161b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (len1 < MIN_PIN_LENGTH || len1 > MAX_PIN_LENGTH) {
162b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            return PIN_INVALID_LENGTH;
163b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
164b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
165b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        return NO_ERROR;
166b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
167b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
168b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private View.OnClickListener mClicked = new View.OnClickListener() {
169b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        public void onClick(View v) {
170b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (v == mOldPin) {
171b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mNewPin1.requestFocus();
172b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            } else if (v == mNewPin1) {
173b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mNewPin2.requestFocus();
174b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            } else if (v == mNewPin2) {
175b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mButton.requestFocus();
176b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            } else if (v == mButton) {
177c51f5ac3de9db72a11dfbb1cefd8cc72f7a0fc7cWink Saville                IccCard iccCardInterface = mPhone.getIccCard();
178c51f5ac3de9db72a11dfbb1cefd8cc72f7a0fc7cWink Saville                if (iccCardInterface != null) {
179b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    String oldPin = mOldPin.getText().toString();
180b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    String newPin1 = mNewPin1.getText().toString();
181b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    String newPin2 = mNewPin2.getText().toString();
182b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
183b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    int error = validateNewPin(newPin1, newPin2);
184b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
185b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    switch (error) {
186b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                        case PIN_INVALID_LENGTH:
187b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                        case PIN_MISMATCH:
188b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                            mNewPin1.getText().clear();
189b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                            mNewPin2.getText().clear();
190b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                            mMismatchError.setVisibility(View.VISIBLE);
191b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
192b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                            Resources r = getResources();
193b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                            CharSequence text;
194b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
195b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                            if (error == PIN_MISMATCH) {
196b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                                text = r.getString(R.string.mismatchPin);
197b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                            } else {
198b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                                text = r.getString(R.string.invalidPin);
199b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                            }
200b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
201b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                            mMismatchError.setText(text);
202b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                            break;
203b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
204b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                        default:
205b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                            Message callBack = Message.obtain(mHandler,
206b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                                    EVENT_PIN_CHANGED);
207b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
208b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                            if (DBG) log("change pin attempt: old=" + oldPin +
209b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                                    ", newPin=" + newPin1);
210b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
211b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                            reset();
212b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
213b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                            if (mChangePin2) {
214c51f5ac3de9db72a11dfbb1cefd8cc72f7a0fc7cWink Saville                                iccCardInterface.changeIccFdnPassword(oldPin,
215b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                                        newPin1, callBack);
216b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                            } else {
217c51f5ac3de9db72a11dfbb1cefd8cc72f7a0fc7cWink Saville                                iccCardInterface.changeIccLockPassword(oldPin,
218b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                                        newPin1, callBack);
219b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                            }
220b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
221b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                            // TODO: show progress panel
222b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    }
223b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                }
224b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            } else if (v == mPUKCode) {
225b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mPUKSubmit.requestFocus();
226b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            } else if (v == mPUKSubmit) {
227c51f5ac3de9db72a11dfbb1cefd8cc72f7a0fc7cWink Saville                mPhone.getIccCard().supplyPuk2(mPUKCode.getText().toString(),
228b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                        mNewPin1.getText().toString(),
229b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                        Message.obtain(mHandler, EVENT_PIN_CHANGED));
230b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
231b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
232b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    };
233b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
234b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private void handleResult(AsyncResult ar) {
235b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (ar.exception == null) {
236b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (DBG) log("handleResult: success!");
237b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
238b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (mState == EntryState.ES_PUK) {
239b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mScrollView.setVisibility(View.VISIBLE);
240c51f5ac3de9db72a11dfbb1cefd8cc72f7a0fc7cWink Saville                mIccPUKPanel.setVisibility(View.GONE);
241b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
242b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            // TODO: show success feedback
243b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            showConfirmation();
244b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
245b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            mHandler.postDelayed(new Runnable() {
246b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                public void run() {
247b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    finish();
248b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                }
249b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }, 3000);
250b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
251b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        } else if (ar.exception instanceof CommandException
252b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project           /*  && ((CommandException)ar.exception).getCommandError() ==
253b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project           CommandException.Error.PASSWORD_INCORRECT */ ) {
254b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            if (mState == EntryState.ES_PIN) {
255b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                if (DBG) log("handleResult: pin failed!");
256b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mOldPin.getText().clear();
257b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mBadPinError.setVisibility(View.VISIBLE);
258b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                CommandException ce = (CommandException) ar.exception;
259b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                if (ce.getCommandError() == CommandException.Error.SIM_PUK2) {
260b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    if (DBG) log("handleResult: puk requested!");
261b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    mState = EntryState.ES_PUK;
262b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    displayPUKAlert();
263b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    mScrollView.setVisibility(View.GONE);
264c51f5ac3de9db72a11dfbb1cefd8cc72f7a0fc7cWink Saville                    mIccPUKPanel.setVisibility(View.VISIBLE);
265b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                    mPUKCode.requestFocus();
266b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                }
267b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            } else if (mState == EntryState.ES_PUK) {
268b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                //should really check to see if the error is CommandException.PASSWORD_INCORRECT...
269b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                if (DBG) log("handleResult: puk2 failed!");
270b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                displayPUKAlert();
271b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mPUKCode.getText().clear();
272b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mPUKCode.requestFocus();
273b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
274b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
275b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
276b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
277b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private AlertDialog mPUKAlert;
278b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private void displayPUKAlert () {
279b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        if (mPUKAlert == null) {
280b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            mPUKAlert = new AlertDialog.Builder(this)
281b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            .setMessage (R.string.puk_requested)
282b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            .setCancelable(false)
283b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            .show();
284b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        } else {
285b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            mPUKAlert.show();
286b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }
287b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        //TODO: The 3 second delay here is somewhat arbitrary, reflecting the values
288b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        //used elsewhere for similar code.  This should get revisited with the framework
289b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        //crew to see if there is some standard we should adhere to.
290b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        mHandler.postDelayed(new Runnable() {
291b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            public void run() {
292b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project                mPUKAlert.dismiss();
293b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project            }
294b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        }, 3000);
295b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
296b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
297b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private void showConfirmation() {
298b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        int id = mChangePin2 ? R.string.pin2_changed : R.string.pin_changed;
299b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        Toast.makeText(this, id, Toast.LENGTH_SHORT).show();
300b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
301b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project
302b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    private void log(String msg) {
303b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        String prefix = mChangePin2 ? "[ChgPin2]" : "[ChgPin]";
304b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project        Log.d(LOG_TAG, prefix + msg);
305b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project    }
306b16363f5fc191b769e88c364243e34b92eb22688The Android Open Source Project}
307