17d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpackage com.android.phone;
27d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
37d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.CallForwardInfo;
47d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.CommandException;
57d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.CommandsInterface;
67d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.Phone;
77d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
87d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.AlertDialog;
97d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Context;
107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.DialogInterface;
117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.res.TypedArray;
127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.AsyncResult;
137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Handler;
147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Message;
157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.text.TextUtils;
167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.AttributeSet;
177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.Log;
187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.View;
197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport static com.android.phone.TimeConsumingPreferenceActivity.RESPONSE_ERROR;
217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpublic class CallForwardEditPreference extends EditPhoneNumberPreference {
237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final String LOG_TAG = "CallForwardEditPreference";
247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final String SRC_TAGS[]       = {"{0}"};
277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private CharSequence mSummaryOnTemplate;
287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    /**
297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon     * Remembers which button was clicked by a user. If no button is clicked yet, this should have
307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon     * {@link DialogInterface#BUTTON_NEGATIVE}, meaning "cancel".
317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon     *
327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon     * TODO: consider removing this variable and having getButtonClicked() in
337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon     * EditPhoneNumberPreference instead.
347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon     */
357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private int mButtonClicked;
367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private int mServiceClass;
377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private MyHandler mHandler = new MyHandler();
387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    int reason;
397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    Phone phone;
407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    CallForwardInfo callForwardInfo;
417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    TimeConsumingPreferenceListener tcpListener;
427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    public CallForwardEditPreference(Context context, AttributeSet attrs) {
447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        super(context, attrs);
457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        phone = PhoneGlobals.getPhone();
477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSummaryOnTemplate = this.getSummaryOn();
487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        TypedArray a = context.obtainStyledAttributes(attrs,
507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                R.styleable.CallForwardEditPreference, 0, R.style.EditPhoneNumberPreference);
517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mServiceClass = a.getInt(R.styleable.CallForwardEditPreference_serviceClass,
527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                CommandsInterface.SERVICE_CLASS_VOICE);
537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        reason = a.getInt(R.styleable.CallForwardEditPreference_reason,
547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                CommandsInterface.CF_REASON_UNCONDITIONAL);
557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        a.recycle();
567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (DBG) Log.d(LOG_TAG, "mServiceClass=" + mServiceClass + ", reason=" + reason);
587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    public CallForwardEditPreference(Context context) {
617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        this(context, null);
627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    void init(TimeConsumingPreferenceListener listener, boolean skipReading) {
657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        tcpListener = listener;
667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (!skipReading) {
677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            phone.getCallForwardingOption(reason,
687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    mHandler.obtainMessage(MyHandler.MESSAGE_GET_CF,
697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            // unused in this case
707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            CommandsInterface.CF_ACTION_DISABLE,
717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            MyHandler.MESSAGE_GET_CF, null));
727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (tcpListener != null) {
737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                tcpListener.onStarted(this, true);
747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected void onBindDialogView(View view) {
807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        // default the button clicked to be the cancel button.
817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mButtonClicked = DialogInterface.BUTTON_NEGATIVE;
827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        super.onBindDialogView(view);
837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    public void onClick(DialogInterface dialog, int which) {
877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        super.onClick(dialog, which);
887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mButtonClicked = which;
897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected void onDialogClosed(boolean positiveResult) {
937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        super.onDialogClosed(positiveResult);
947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (DBG) Log.d(LOG_TAG, "mButtonClicked=" + mButtonClicked
967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                + ", positiveResult=" + positiveResult);
977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        // Ignore this event if the user clicked the cancel button, or if the dialog is dismissed
987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        // without any button being pressed (back button press or click event outside the dialog).
997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (this.mButtonClicked != DialogInterface.BUTTON_NEGATIVE) {
1007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            int action = (isToggled() || (mButtonClicked == DialogInterface.BUTTON_POSITIVE)) ?
1017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    CommandsInterface.CF_ACTION_REGISTRATION :
1027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    CommandsInterface.CF_ACTION_DISABLE;
1037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            int time = (reason != CommandsInterface.CF_REASON_NO_REPLY) ? 0 : 20;
1047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            final String number = getPhoneNumber();
1057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (DBG) Log.d(LOG_TAG, "callForwardInfo=" + callForwardInfo);
1077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (action == CommandsInterface.CF_ACTION_REGISTRATION
1097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    && callForwardInfo != null
1107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    && callForwardInfo.status == 1
1117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    && number.equals(callForwardInfo.number)) {
1127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                // no change, do nothing
1137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                if (DBG) Log.d(LOG_TAG, "no change, do nothing");
1147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            } else {
1157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                // set to network
1167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                if (DBG) Log.d(LOG_TAG, "reason=" + reason + ", action=" + action
1177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        + ", number=" + number);
1187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                // Display no forwarding number while we're waiting for
1207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                // confirmation
1217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                setSummaryOn("");
1227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                // the interface of Phone.setCallForwardingOption has error:
1247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                // should be action, reason...
1257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                phone.setCallForwardingOption(action,
1267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        reason,
1277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        number,
1287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        time,
1297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        mHandler.obtainMessage(MyHandler.MESSAGE_SET_CF,
1307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                action,
1317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                MyHandler.MESSAGE_SET_CF));
1327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                if (tcpListener != null) {
1347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    tcpListener.onStarted(this, false);
1357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                }
1367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
1377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    void handleCallForwardResult(CallForwardInfo cf) {
1417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        callForwardInfo = cf;
1427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (DBG) Log.d(LOG_TAG, "handleGetCFResponse done, callForwardInfo=" + callForwardInfo);
1437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        setToggled(callForwardInfo.status == 1);
1457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        setPhoneNumber(callForwardInfo.number);
1467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void updateSummaryText() {
1497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (isToggled()) {
1507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            CharSequence summaryOn;
1517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            final String number = getRawPhoneNumber();
1527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (number != null && number.length() > 0) {
1537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                String values[] = { number };
1547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                summaryOn = TextUtils.replace(mSummaryOnTemplate, SRC_TAGS, values);
1557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            } else {
1567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                summaryOn = getContext().getString(R.string.sum_cfu_enabled_no_number);
1577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
1587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            setSummaryOn(summaryOn);
1597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    // Message protocol:
1647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    // what: get vs. set
1657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    // arg1: action -- register vs. disable
1667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    // arg2: get vs. set for the preceding request
1677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private class MyHandler extends Handler {
1687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        static final int MESSAGE_GET_CF = 0;
1697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        static final int MESSAGE_SET_CF = 1;
1707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        @Override
1727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        public void handleMessage(Message msg) {
1737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            switch (msg.what) {
1747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                case MESSAGE_GET_CF:
1757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    handleGetCFResponse(msg);
1767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    break;
1777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                case MESSAGE_SET_CF:
1787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    handleSetCFResponse(msg);
1797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    break;
1807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
1817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        private void handleGetCFResponse(Message msg) {
1847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (DBG) Log.d(LOG_TAG, "handleGetCFResponse: done");
1857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (msg.arg2 == MESSAGE_SET_CF) {
1877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                tcpListener.onFinished(CallForwardEditPreference.this, false);
1887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            } else {
1897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                tcpListener.onFinished(CallForwardEditPreference.this, true);
1907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
1917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            AsyncResult ar = (AsyncResult) msg.obj;
1937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            callForwardInfo = null;
1957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (ar.exception != null) {
1967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                if (DBG) Log.d(LOG_TAG, "handleGetCFResponse: ar.exception=" + ar.exception);
1977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                tcpListener.onException(CallForwardEditPreference.this,
1987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        (CommandException) ar.exception);
1997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            } else {
2007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                if (ar.userObj instanceof Throwable) {
2017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    tcpListener.onError(CallForwardEditPreference.this, RESPONSE_ERROR);
2027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                }
2037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                CallForwardInfo cfInfoArray[] = (CallForwardInfo[]) ar.result;
2047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                if (cfInfoArray.length == 0) {
2057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    if (DBG) Log.d(LOG_TAG, "handleGetCFResponse: cfInfoArray.length==0");
2067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    setEnabled(false);
2077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    tcpListener.onError(CallForwardEditPreference.this, RESPONSE_ERROR);
2087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                } else {
2097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    for (int i = 0, length = cfInfoArray.length; i < length; i++) {
2107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        if (DBG) Log.d(LOG_TAG, "handleGetCFResponse, cfInfoArray[" + i + "]="
2117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                + cfInfoArray[i]);
2127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        if ((mServiceClass & cfInfoArray[i].serviceClass) != 0) {
2137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            // corresponding class
2147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            CallForwardInfo info = cfInfoArray[i];
2157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            handleCallForwardResult(info);
2167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            // Show an alert if we got a success response but
2187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            // with unexpected values.
2197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            // Currently only handle the fail-to-disable case
2207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            // since we haven't observed fail-to-enable.
2217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            if (msg.arg2 == MESSAGE_SET_CF &&
2227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                    msg.arg1 == CommandsInterface.CF_ACTION_DISABLE &&
2237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                    info.status == 1) {
2247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                CharSequence s;
2257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                switch (reason) {
2267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                    case CommandsInterface.CF_REASON_BUSY:
2277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                        s = getContext().getText(R.string.disable_cfb_forbidden);
2287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                        break;
2297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                    case CommandsInterface.CF_REASON_NO_REPLY:
2307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                        s = getContext().getText(R.string.disable_cfnry_forbidden);
2317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                        break;
2327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                    default: // not reachable
2337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                        s = getContext().getText(R.string.disable_cfnrc_forbidden);
2347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                }
2357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
2367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                builder.setNeutralButton(R.string.close_dialog, null);
2377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                builder.setTitle(getContext().getText(R.string.error_updating_title));
2387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                builder.setMessage(s);
2397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                builder.setCancelable(true);
2407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                builder.create().show();
2417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            }
2427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        }
2437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    }
2447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                }
2457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
2467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            // Now whether or not we got a new number, reset our enabled
2487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            // summary text since it may have been replaced by an empty
2497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            // placeholder.
2507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            updateSummaryText();
2517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
2527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        private void handleSetCFResponse(Message msg) {
2547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            AsyncResult ar = (AsyncResult) msg.obj;
2557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (ar.exception != null) {
2577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                if (DBG) Log.d(LOG_TAG, "handleSetCFResponse: ar.exception=" + ar.exception);
2587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                // setEnabled(false);
2597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
2607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (DBG) Log.d(LOG_TAG, "handleSetCFResponse: re get");
2617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            phone.getCallForwardingOption(reason,
2627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    obtainMessage(MESSAGE_GET_CF, msg.arg1, MESSAGE_SET_CF, ar.exception));
2637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
2647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
2657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon}
266