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