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