10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2006 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony.cdma; 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Context; 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CommandException; 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.MmiCode; 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.AsyncResult; 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Handler; 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message; 270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Log; 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.regex.Pattern; 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.regex.Matcher; 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * This class can handle Puk code Mmi 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide} 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic final class CdmaMmiCode extends Handler implements MmiCode { 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final String LOG_TAG = "CDMA_MMI"; 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Constants 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // From TS 22.030 6.5.2 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final String ACTION_REGISTER = "**"; 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Supp Service codes from TS 22.030 Annex B 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final String SC_PUK = "05"; 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Event Constant 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int EVENT_SET_COMPLETE = 1; 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Instance Variables 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CDMAPhone phone; 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Context context; 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String action; // ACTION_REGISTER 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String sc; // Service Code 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String sia, sib, sic; // Service Info a,b,c 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String poundString; // Entire MMI string up to and including # 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String dialingNumber; 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String pwd; // For password registration 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville State state = State.PENDING; 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CharSequence message; 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Class Variables 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static Pattern sPatternSuppService = Pattern.compile( 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "((\\*|#|\\*#|\\*\\*|##)(\\d{2,3})(\\*([^*#]*)(\\*([^*#]*)(\\*([^*#]*)(\\*([^*#]*))?)?)?)?#)(.*)"); 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 1 2 3 4 5 6 7 8 9 10 11 12 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1 = Full string up to and including # 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2 = action 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3 = service code 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5 = SIA 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7 = SIB 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9 = SIC 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10 = dialing number 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville*/ 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int MATCH_GROUP_POUND_STRING = 1; 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int MATCH_GROUP_ACTION = 2; 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int MATCH_GROUP_SERVICE_CODE = 3; 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int MATCH_GROUP_SIA = 5; 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int MATCH_GROUP_SIB = 7; 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int MATCH_GROUP_SIC = 9; 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int MATCH_GROUP_PWD_CONFIRM = 11; 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int MATCH_GROUP_DIALING_NUMBER = 12; 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Public Class methods 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Check if provided string contains Mmi code in it and create corresponding 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Mmi if it does 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static CdmaMmiCode 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville newFromDialString(String dialString, CDMAPhone phone) { 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Matcher m; 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CdmaMmiCode ret = null; 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville m = sPatternSuppService.matcher(dialString); 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Is this formatted like a standard supplementary service code? 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (m.matches()) { 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret = new CdmaMmiCode(phone); 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret.poundString = makeEmptyNull(m.group(MATCH_GROUP_POUND_STRING)); 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret.action = makeEmptyNull(m.group(MATCH_GROUP_ACTION)); 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret.sc = makeEmptyNull(m.group(MATCH_GROUP_SERVICE_CODE)); 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret.sia = makeEmptyNull(m.group(MATCH_GROUP_SIA)); 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret.sib = makeEmptyNull(m.group(MATCH_GROUP_SIB)); 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret.sic = makeEmptyNull(m.group(MATCH_GROUP_SIC)); 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret.pwd = makeEmptyNull(m.group(MATCH_GROUP_PWD_CONFIRM)); 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret.dialingNumber = makeEmptyNull(m.group(MATCH_GROUP_DIALING_NUMBER)); 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return ret; 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Private Class methods 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** make empty strings be null. 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Regexp returns empty strings for empty groups 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static String 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville makeEmptyNull (String s) { 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (s != null && s.length() == 0) return null; 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return s; 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Constructor 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CdmaMmiCode (CDMAPhone phone) { 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super(phone.getHandler().getLooper()); 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.phone = phone; 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.context = phone.getContext(); 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // MmiCode implementation 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public State 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getState() { 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return state; 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public CharSequence 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getMessage() { 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return message; 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // inherited javadoc suffices 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cancel() { 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Complete or failed cannot be cancelled 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (state == State.COMPLETE || state == State.FAILED) { 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville state = State.CANCELLED; 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.onMMIDone (this); 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean isCancelable() { 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Instance Methods 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the Service Code is PIN/PIN2/PUK/PUK2-related 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean isPukCommand() { 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return sc != null && sc.equals(SC_PUK); 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean isRegister() { 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return action != null && action.equals(ACTION_REGISTER); 1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean isUssdRequest() { 1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Log.w(LOG_TAG, "isUssdRequest is not implemented in CdmaMmiCode"); 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** Process a MMI PUK code */ 1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville processCode () { 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (isPukCommand()) { 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // sia = old PUK 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // sib = new PIN 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // sic = new PIN 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String oldPinOrPuk = sia; 1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String newPin = sib; 2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int pinLen = newPin.length(); 2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (isRegister()) { 2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!newPin.equals(sic)) { 2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // password mismatch; return error 2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville handlePasswordError(com.android.internal.R.string.mismatchPin); 2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (pinLen < 4 || pinLen > 8 ) { 2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // invalid length 2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville handlePasswordError(com.android.internal.R.string.invalidPin); 2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.mCM.supplyIccPuk(oldPinOrPuk, newPin, 2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville obtainMessage(EVENT_SET_COMPLETE, this)); 2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new RuntimeException ("Invalid or Unsupported MMI Code"); 2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new RuntimeException ("Invalid or Unsupported MMI Code"); 2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (RuntimeException exc) { 2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville state = State.FAILED; 2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville message = context.getText(com.android.internal.R.string.mmiError); 2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.onMMIDone(this); 2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void handlePasswordError(int res) { 2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville state = State.FAILED; 2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville StringBuilder sb = new StringBuilder(getScString()); 2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sb.append("\n"); 2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sb.append(context.getText(res)); 2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville message = sb; 2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.onMMIDone(this); 2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void 2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville handleMessage (Message msg) { 2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AsyncResult ar; 2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (msg.what == EVENT_SET_COMPLETE) { 2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ar = (AsyncResult) (msg.obj); 2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville onSetComplete(ar); 2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Log.e(LOG_TAG, "Unexpected reply"); 2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Private instance methods 2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private CharSequence getScString() { 2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (sc != null) { 2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (isPukCommand()) { 2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return context.getText(com.android.internal.R.string.PinMmi); 2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return ""; 2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void 2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville onSetComplete(AsyncResult ar){ 2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville StringBuilder sb = new StringBuilder(getScString()); 2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sb.append("\n"); 2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ar.exception != null) { 2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville state = State.FAILED; 2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ar.exception instanceof CommandException) { 2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CommandException.Error err = ((CommandException)(ar.exception)).getCommandError(); 2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (err == CommandException.Error.PASSWORD_INCORRECT) { 2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (isPukCommand()) { 2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sb.append(context.getText( 2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville com.android.internal.R.string.badPuk)); 2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sb.append(context.getText( 2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville com.android.internal.R.string.passwordIncorrect)); 2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sb.append(context.getText( 2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville com.android.internal.R.string.mmiError)); 2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sb.append(context.getText( 2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville com.android.internal.R.string.mmiError)); 2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (isRegister()) { 2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville state = State.COMPLETE; 2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sb.append(context.getText( 2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville com.android.internal.R.string.serviceRegistered)); 2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville state = State.FAILED; 2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sb.append(context.getText( 2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville com.android.internal.R.string.mmiError)); 2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville message = sb; 2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville phone.onMMIDone(this); 2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 297