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