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