1e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla/* 2e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * Copyright (C) 2006 The Android Open Source Project 3e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * 4e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * Licensed under the Apache License, Version 2.0 (the "License"); 5e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * you may not use this file except in compliance with the License. 6e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * You may obtain a copy of the License at 7e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * 8e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * http://www.apache.org/licenses/LICENSE-2.0 9e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * 10e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * Unless required by applicable law or agreed to in writing, software 11e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * distributed under the License is distributed on an "AS IS" BASIS, 12e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * See the License for the specific language governing permissions and 14e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * limitations under the License. 15e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla */ 16e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 17e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kallapackage com.android.internal.telephony.cdma; 18e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 19e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kallaimport android.content.Context; 20e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 21e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kallaimport com.android.internal.telephony.CommandException; 22e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kallaimport com.android.internal.telephony.MmiCode; 23e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 24e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kallaimport android.os.AsyncResult; 25e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kallaimport android.os.Handler; 26e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kallaimport android.os.Message; 27e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kallaimport android.util.Log; 28e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 29e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kallaimport java.util.regex.Pattern; 30e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kallaimport java.util.regex.Matcher; 31e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 32e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla/** 33e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * This class can handle Puk code Mmi 34e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * 35e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * {@hide} 36e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * 37e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla */ 38e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kallapublic final class CdmaMmiCode extends Handler implements MmiCode { 39e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla static final String LOG_TAG = "CDMA_MMI"; 40e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 41e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // Constants 42e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 43e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // From TS 22.030 6.5.2 44e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla static final String ACTION_REGISTER = "**"; 45e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 46e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // Supp Service codes from TS 22.030 Annex B 47e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla static final String SC_PUK = "05"; 48e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 49e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // Event Constant 50e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 51e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla static final int EVENT_SET_COMPLETE = 1; 52e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 53e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // Instance Variables 54e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 55e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla CDMAPhone phone; 56e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla Context context; 57e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 58e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla String action; // ACTION_REGISTER 59e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla String sc; // Service Code 60e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla String sia, sib, sic; // Service Info a,b,c 61e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla String poundString; // Entire MMI string up to and including # 62e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla String dialingNumber; 63e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla String pwd; // For password registration 64e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 65e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla State state = State.PENDING; 66e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla CharSequence message; 67e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 68e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // Class Variables 69e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 70e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla static Pattern sPatternSuppService = Pattern.compile( 71e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla "((\\*|#|\\*#|\\*\\*|##)(\\d{2,3})(\\*([^*#]*)(\\*([^*#]*)(\\*([^*#]*)(\\*([^*#]*))?)?)?)?#)(.*)"); 72e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla/* 1 2 3 4 5 6 7 8 9 10 11 12 73e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 74e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 1 = Full string up to and including # 75e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 2 = action 76e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 3 = service code 77e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 5 = SIA 78e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 7 = SIB 79e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 9 = SIC 80e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 10 = dialing number 81e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla*/ 82e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 83e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla static final int MATCH_GROUP_POUND_STRING = 1; 84e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla static final int MATCH_GROUP_ACTION = 2; 85e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla static final int MATCH_GROUP_SERVICE_CODE = 3; 86e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla static final int MATCH_GROUP_SIA = 5; 87e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla static final int MATCH_GROUP_SIB = 7; 88e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla static final int MATCH_GROUP_SIC = 9; 89e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla static final int MATCH_GROUP_PWD_CONFIRM = 11; 90e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla static final int MATCH_GROUP_DIALING_NUMBER = 12; 91e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 92e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 93e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // Public Class methods 94e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 95e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla /** 96e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * Check if provided string contains Mmi code in it and create corresponding 97e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * Mmi if it does 98e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla */ 99e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 100e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla public static CdmaMmiCode 101e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla newFromDialString(String dialString, CDMAPhone phone) { 102e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla Matcher m; 103e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla CdmaMmiCode ret = null; 104e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 105e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla m = sPatternSuppService.matcher(dialString); 106e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 107e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // Is this formatted like a standard supplementary service code? 108e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla if (m.matches()) { 109e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla ret = new CdmaMmiCode(phone); 110e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla ret.poundString = makeEmptyNull(m.group(MATCH_GROUP_POUND_STRING)); 111e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla ret.action = makeEmptyNull(m.group(MATCH_GROUP_ACTION)); 112e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla ret.sc = makeEmptyNull(m.group(MATCH_GROUP_SERVICE_CODE)); 113e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla ret.sia = makeEmptyNull(m.group(MATCH_GROUP_SIA)); 114e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla ret.sib = makeEmptyNull(m.group(MATCH_GROUP_SIB)); 115e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla ret.sic = makeEmptyNull(m.group(MATCH_GROUP_SIC)); 116e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla ret.pwd = makeEmptyNull(m.group(MATCH_GROUP_PWD_CONFIRM)); 117e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla ret.dialingNumber = makeEmptyNull(m.group(MATCH_GROUP_DIALING_NUMBER)); 118e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 119e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 120e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 121e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla return ret; 122e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 123e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 124e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // Private Class methods 125e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 126e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla /** make empty strings be null. 127e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * Regexp returns empty strings for empty groups 128e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla */ 129e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla private static String 130e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla makeEmptyNull (String s) { 131e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla if (s != null && s.length() == 0) return null; 132e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 133e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla return s; 134e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 135e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 136e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // Constructor 137e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 138e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla CdmaMmiCode (CDMAPhone phone) { 139e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla super(phone.getHandler().getLooper()); 140e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla this.phone = phone; 141e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla this.context = phone.getContext(); 142e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 143e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 144e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // MmiCode implementation 145e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 146e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla public State 147e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla getState() { 148e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla return state; 149e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 150e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 151e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla public CharSequence 152e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla getMessage() { 153e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla return message; 154e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 155e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 156e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // inherited javadoc suffices 157e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla public void 158e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla cancel() { 159e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // Complete or failed cannot be cancelled 160e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla if (state == State.COMPLETE || state == State.FAILED) { 161e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla return; 162e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 163e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 164e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla state = State.CANCELLED; 165e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla phone.onMMIDone (this); 166e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 167e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 168e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla public boolean isCancelable() { 169e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla return false; 170e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 171e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 172e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // Instance Methods 173e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 174e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla /** 175e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla * @return true if the Service Code is PIN/PIN2/PUK/PUK2-related 176e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla */ 177e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla boolean isPukCommand() { 178e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla return sc != null && sc.equals(SC_PUK); 179e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 180e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 181e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla boolean isRegister() { 182e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla return action != null && action.equals(ACTION_REGISTER); 183e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 184e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 185e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla public boolean isUssdRequest() { 186e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla Log.w(LOG_TAG, "isUssdRequest is not implemented in CdmaMmiCode"); 187e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla return false; 188e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 189e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 190e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla /** Process a MMI PUK code */ 191e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla void 192e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla processCode () { 193e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla try { 194e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla if (isPukCommand()) { 195e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // sia = old PUK 196e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // sib = new PIN 197e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // sic = new PIN 198e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla String oldPinOrPuk = sia; 199e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla String newPin = sib; 200e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla int pinLen = newPin.length(); 201e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla if (isRegister()) { 202e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla if (!newPin.equals(sic)) { 203e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // password mismatch; return error 204e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla handlePasswordError(com.android.internal.R.string.mismatchPin); 205e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } else if (pinLen < 4 || pinLen > 8 ) { 206e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // invalid length 207e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla handlePasswordError(com.android.internal.R.string.invalidPin); 208e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } else { 209e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla phone.mCM.supplyIccPuk(oldPinOrPuk, newPin, 210e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla obtainMessage(EVENT_SET_COMPLETE, this)); 211e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 212e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } else { 213e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla throw new RuntimeException ("Invalid or Unsupported MMI Code"); 214e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 215e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } else { 216e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla throw new RuntimeException ("Invalid or Unsupported MMI Code"); 217e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 218e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } catch (RuntimeException exc) { 219e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla state = State.FAILED; 220e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla message = context.getText(com.android.internal.R.string.mmiError); 221e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla phone.onMMIDone(this); 222e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 223e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 224e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 225e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla private void handlePasswordError(int res) { 226e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla state = State.FAILED; 227e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla StringBuilder sb = new StringBuilder(getScString()); 228e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla sb.append("\n"); 229e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla sb.append(context.getText(res)); 230e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla message = sb; 231e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla phone.onMMIDone(this); 232e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 233e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 234e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla public void 235e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla handleMessage (Message msg) { 236e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla AsyncResult ar; 237e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 238e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla if (msg.what == EVENT_SET_COMPLETE) { 239e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla ar = (AsyncResult) (msg.obj); 240e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla onSetComplete(ar); 241e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } else { 242e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla Log.e(LOG_TAG, "Unexpected reply"); 243e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 244e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 245e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla // Private instance methods 246e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 247e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla private CharSequence getScString() { 248e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla if (sc != null) { 249e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla if (isPukCommand()) { 250e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla return context.getText(com.android.internal.R.string.PinMmi); 251e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 252e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 253e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 254e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla return ""; 255e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 256e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 257e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla private void 258e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla onSetComplete(AsyncResult ar){ 259e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla StringBuilder sb = new StringBuilder(getScString()); 260e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla sb.append("\n"); 261e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 262e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla if (ar.exception != null) { 263e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla state = State.FAILED; 264e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla if (ar.exception instanceof CommandException) { 265e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla CommandException.Error err = ((CommandException)(ar.exception)).getCommandError(); 266e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla if (err == CommandException.Error.PASSWORD_INCORRECT) { 267e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla if (isPukCommand()) { 268e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla sb.append(context.getText( 269e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla com.android.internal.R.string.badPuk)); 270e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } else { 271e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla sb.append(context.getText( 272e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla com.android.internal.R.string.passwordIncorrect)); 273e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 274e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } else { 275e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla sb.append(context.getText( 276e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla com.android.internal.R.string.mmiError)); 277e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 278e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } else { 279e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla sb.append(context.getText( 280e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla com.android.internal.R.string.mmiError)); 281e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 282e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } else if (isRegister()) { 283e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla state = State.COMPLETE; 284e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla sb.append(context.getText( 285e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla com.android.internal.R.string.serviceRegistered)); 286e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } else { 287e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla state = State.FAILED; 288e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla sb.append(context.getText( 289e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla com.android.internal.R.string.mmiError)); 290e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 291e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 292e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla message = sb; 293e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla phone.onMMIDone(this); 294e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla } 295e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla 296e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla} 297