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; 15aca784f06323ef075b3c63765385d861b02fddbbHall Liuimport android.telephony.PhoneNumberUtils; 16491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebingerimport android.telephony.TelephonyManager; 170e98b3c66e31e6b5e5b1dc7fed33ee8102616eb3Andrew Leeimport android.text.BidiFormatter; 18aca784f06323ef075b3c63765385d861b02fddbbHall Liuimport android.text.SpannableString; 190e98b3c66e31e6b5e5b1dc7fed33ee8102616eb3Andrew Leeimport android.text.TextDirectionHeuristics; 207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.text.TextUtils; 217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.AttributeSet; 227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.Log; 237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.View; 247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport static com.android.phone.TimeConsumingPreferenceActivity.RESPONSE_ERROR; 26d4abfd4fd3b41ee8b2724a89b751c96544821baeAnthony Leeimport static com.android.phone.TimeConsumingPreferenceActivity.EXCEPTION_ERROR; 277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpublic class CallForwardEditPreference extends EditPhoneNumberPreference { 297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String LOG_TAG = "CallForwardEditPreference"; 307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String SRC_TAGS[] = {"{0}"}; 327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private CharSequence mSummaryOnTemplate; 337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Remembers which button was clicked by a user. If no button is clicked yet, this should have 357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * {@link DialogInterface#BUTTON_NEGATIVE}, meaning "cancel". 367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * TODO: consider removing this variable and having getButtonClicked() in 387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * EditPhoneNumberPreference instead. 397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private int mButtonClicked; 417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private int mServiceClass; 427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private MyHandler mHandler = new MyHandler(); 437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int reason; 442b36ba2d3b68fce3e44078c1bdedf9af00b7fc5bAndrew Lee private Phone mPhone; 457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CallForwardInfo callForwardInfo; 462b36ba2d3b68fce3e44078c1bdedf9af00b7fc5bAndrew Lee private TimeConsumingPreferenceListener mTcpListener; 47491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger // Should we replace CF queries containing an invalid number with "Voicemail" 48491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger private boolean mReplaceInvalidCFNumber = false; 497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public CallForwardEditPreference(Context context, AttributeSet attrs) { 517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super(context, attrs); 527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSummaryOnTemplate = this.getSummaryOn(); 547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon TypedArray a = context.obtainStyledAttributes(attrs, 567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.styleable.CallForwardEditPreference, 0, R.style.EditPhoneNumberPreference); 577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mServiceClass = a.getInt(R.styleable.CallForwardEditPreference_serviceClass, 587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CommandsInterface.SERVICE_CLASS_VOICE); 597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon reason = a.getInt(R.styleable.CallForwardEditPreference_reason, 607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CommandsInterface.CF_REASON_UNCONDITIONAL); 617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon a.recycle(); 627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 6359b6e78da15af6bf8706f22ed7176b14f7ca59f7Tyler Gunn Log.d(LOG_TAG, "mServiceClass=" + mServiceClass + ", reason=" + reason); 647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public CallForwardEditPreference(Context context) { 677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon this(context, null); 687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 70491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger void init(TimeConsumingPreferenceListener listener, boolean skipReading, Phone phone, 71491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger boolean replaceInvalidCFNumber) { 722b36ba2d3b68fce3e44078c1bdedf9af00b7fc5bAndrew Lee mPhone = phone; 732b36ba2d3b68fce3e44078c1bdedf9af00b7fc5bAndrew Lee mTcpListener = listener; 74491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger mReplaceInvalidCFNumber = replaceInvalidCFNumber; 752b36ba2d3b68fce3e44078c1bdedf9af00b7fc5bAndrew Lee 767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!skipReading) { 772b36ba2d3b68fce3e44078c1bdedf9af00b7fc5bAndrew Lee mPhone.getCallForwardingOption(reason, 787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mHandler.obtainMessage(MyHandler.MESSAGE_GET_CF, 797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // unused in this case 807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CommandsInterface.CF_ACTION_DISABLE, 817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon MyHandler.MESSAGE_GET_CF, null)); 822b36ba2d3b68fce3e44078c1bdedf9af00b7fc5bAndrew Lee if (mTcpListener != null) { 832b36ba2d3b68fce3e44078c1bdedf9af00b7fc5bAndrew Lee mTcpListener.onStarted(this, true); 847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected void onBindDialogView(View view) { 907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // default the button clicked to be the cancel button. 917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonClicked = DialogInterface.BUTTON_NEGATIVE; 927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onBindDialogView(view); 937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onClick(DialogInterface dialog, int which) { 977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onClick(dialog, which); 987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonClicked = which; 997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 1027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected void onDialogClosed(boolean positiveResult) { 1037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onDialogClosed(positiveResult); 1047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 10559b6e78da15af6bf8706f22ed7176b14f7ca59f7Tyler Gunn Log.d(LOG_TAG, "mButtonClicked=" + mButtonClicked + ", positiveResult=" + positiveResult); 1067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Ignore this event if the user clicked the cancel button, or if the dialog is dismissed 1077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // without any button being pressed (back button press or click event outside the dialog). 1087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (this.mButtonClicked != DialogInterface.BUTTON_NEGATIVE) { 1097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int action = (isToggled() || (mButtonClicked == DialogInterface.BUTTON_POSITIVE)) ? 1107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CommandsInterface.CF_ACTION_REGISTRATION : 1117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CommandsInterface.CF_ACTION_DISABLE; 1127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int time = (reason != CommandsInterface.CF_REASON_NO_REPLY) ? 0 : 20; 1137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final String number = getPhoneNumber(); 1147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 11559b6e78da15af6bf8706f22ed7176b14f7ca59f7Tyler Gunn Log.d(LOG_TAG, "callForwardInfo=" + callForwardInfo); 1167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (action == CommandsInterface.CF_ACTION_REGISTRATION 1187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon && callForwardInfo != null 1197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon && callForwardInfo.status == 1 1207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon && number.equals(callForwardInfo.number)) { 1217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // no change, do nothing 12259b6e78da15af6bf8706f22ed7176b14f7ca59f7Tyler Gunn Log.d(LOG_TAG, "no change, do nothing"); 1237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // set to network 12559b6e78da15af6bf8706f22ed7176b14f7ca59f7Tyler Gunn Log.d(LOG_TAG, "reason=" + reason + ", action=" + action 1267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + ", number=" + number); 1277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Display no forwarding number while we're waiting for 1297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // confirmation 1307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon setSummaryOn(""); 1317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // the interface of Phone.setCallForwardingOption has error: 1337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // should be action, reason... 1342b36ba2d3b68fce3e44078c1bdedf9af00b7fc5bAndrew Lee mPhone.setCallForwardingOption(action, 1357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon reason, 1367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon number, 1377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon time, 1387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mHandler.obtainMessage(MyHandler.MESSAGE_SET_CF, 1397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon action, 1407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon MyHandler.MESSAGE_SET_CF)); 1417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1422b36ba2d3b68fce3e44078c1bdedf9af00b7fc5bAndrew Lee if (mTcpListener != null) { 1432b36ba2d3b68fce3e44078c1bdedf9af00b7fc5bAndrew Lee mTcpListener.onStarted(this, false); 1447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon void handleCallForwardResult(CallForwardInfo cf) { 1507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon callForwardInfo = cf; 15159b6e78da15af6bf8706f22ed7176b14f7ca59f7Tyler Gunn Log.d(LOG_TAG, "handleGetCFResponse done, callForwardInfo=" + callForwardInfo); 152491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger // In some cases, the network can send call forwarding URIs for voicemail that violate the 153491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger // 3gpp spec. This can cause us to receive "numbers" that are sequences of letters. In this 154491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger // case, we must detect these series of characters and replace them with "Voicemail". 155491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger // PhoneNumberUtils#formatNumber returns null if the number is not valid. 156491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger if (mReplaceInvalidCFNumber && (PhoneNumberUtils.formatNumber(callForwardInfo.number, 157491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger getCurrentCountryIso()) == null)) { 158491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger callForwardInfo.number = getContext().getString(R.string.voicemail); 159491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger Log.i(LOG_TAG, "handleGetCFResponse: Overridding CF number"); 160491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger } 1617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon setToggled(callForwardInfo.status == 1); 1637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon setPhoneNumber(callForwardInfo.number); 1647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void updateSummaryText() { 1677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (isToggled()) { 1687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final String number = getRawPhoneNumber(); 1697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (number != null && number.length() > 0) { 1700e98b3c66e31e6b5e5b1dc7fed33ee8102616eb3Andrew Lee // Wrap the number to preserve presentation in RTL languages. 1710e98b3c66e31e6b5e5b1dc7fed33ee8102616eb3Andrew Lee String wrappedNumber = BidiFormatter.getInstance().unicodeWrap( 1720e98b3c66e31e6b5e5b1dc7fed33ee8102616eb3Andrew Lee number, TextDirectionHeuristics.LTR); 1730e98b3c66e31e6b5e5b1dc7fed33ee8102616eb3Andrew Lee String values[] = { wrappedNumber }; 174aca784f06323ef075b3c63765385d861b02fddbbHall Liu String summaryOn = String.valueOf( 175aca784f06323ef075b3c63765385d861b02fddbbHall Liu TextUtils.replace(mSummaryOnTemplate, SRC_TAGS, values)); 176aca784f06323ef075b3c63765385d861b02fddbbHall Liu int start = summaryOn.indexOf(wrappedNumber); 177aca784f06323ef075b3c63765385d861b02fddbbHall Liu 178aca784f06323ef075b3c63765385d861b02fddbbHall Liu SpannableString spannableSummaryOn = new SpannableString(summaryOn); 179aca784f06323ef075b3c63765385d861b02fddbbHall Liu PhoneNumberUtils.addTtsSpan(spannableSummaryOn, 180aca784f06323ef075b3c63765385d861b02fddbbHall Liu start, start + wrappedNumber.length()); 181aca784f06323ef075b3c63765385d861b02fddbbHall Liu setSummaryOn(spannableSummaryOn); 1827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 183aca784f06323ef075b3c63765385d861b02fddbbHall Liu setSummaryOn(getContext().getString(R.string.sum_cfu_enabled_no_number)); 1847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 189491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger /** 190491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger * @return The ISO 3166-1 two letters country code of the country the user is in based on the 191491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger * network location. 192491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger */ 193491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger private String getCurrentCountryIso() { 194491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger final TelephonyManager telephonyManager = 195491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger (TelephonyManager) getContext().getSystemService(Context.TELEPHONY_SERVICE); 196491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger if (telephonyManager == null) { 197491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger return ""; 198491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger } 199491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger return telephonyManager.getNetworkCountryIso().toUpperCase(); 200491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger } 201491fd4e3ce586271d4c1b1c1ead5863cd16bbca3Brad Ebinger 2027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Message protocol: 2037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // what: get vs. set 2047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // arg1: action -- register vs. disable 2057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // arg2: get vs. set for the preceding request 2067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private class MyHandler extends Handler { 2077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon static final int MESSAGE_GET_CF = 0; 2087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon static final int MESSAGE_SET_CF = 1; 2097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void handleMessage(Message msg) { 2127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (msg.what) { 2137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case MESSAGE_GET_CF: 2147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon handleGetCFResponse(msg); 2157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 2167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case MESSAGE_SET_CF: 2177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon handleSetCFResponse(msg); 2187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 2197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void handleGetCFResponse(Message msg) { 22359b6e78da15af6bf8706f22ed7176b14f7ca59f7Tyler Gunn Log.d(LOG_TAG, "handleGetCFResponse: done"); 2247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2252b36ba2d3b68fce3e44078c1bdedf9af00b7fc5bAndrew Lee mTcpListener.onFinished(CallForwardEditPreference.this, msg.arg2 != MESSAGE_SET_CF); 2267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon AsyncResult ar = (AsyncResult) msg.obj; 2287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon callForwardInfo = null; 2307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (ar.exception != null) { 23159b6e78da15af6bf8706f22ed7176b14f7ca59f7Tyler Gunn Log.d(LOG_TAG, "handleGetCFResponse: ar.exception=" + ar.exception); 232d4abfd4fd3b41ee8b2724a89b751c96544821baeAnthony Lee if (ar.exception instanceof CommandException) { 233d4abfd4fd3b41ee8b2724a89b751c96544821baeAnthony Lee mTcpListener.onException(CallForwardEditPreference.this, 234d4abfd4fd3b41ee8b2724a89b751c96544821baeAnthony Lee (CommandException) ar.exception); 235d4abfd4fd3b41ee8b2724a89b751c96544821baeAnthony Lee } else { 236d4abfd4fd3b41ee8b2724a89b751c96544821baeAnthony Lee // Most likely an ImsException and we can't handle it the same way as 237d4abfd4fd3b41ee8b2724a89b751c96544821baeAnthony Lee // a CommandException. The best we can do is to handle the exception 238d4abfd4fd3b41ee8b2724a89b751c96544821baeAnthony Lee // the same way as mTcpListener.onException() does when it is not of type 239d4abfd4fd3b41ee8b2724a89b751c96544821baeAnthony Lee // FDN_CHECK_FAILURE. 240d4abfd4fd3b41ee8b2724a89b751c96544821baeAnthony Lee mTcpListener.onError(CallForwardEditPreference.this, EXCEPTION_ERROR); 241d4abfd4fd3b41ee8b2724a89b751c96544821baeAnthony Lee } 2427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 2437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (ar.userObj instanceof Throwable) { 2442b36ba2d3b68fce3e44078c1bdedf9af00b7fc5bAndrew Lee mTcpListener.onError(CallForwardEditPreference.this, RESPONSE_ERROR); 2457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CallForwardInfo cfInfoArray[] = (CallForwardInfo[]) ar.result; 2477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (cfInfoArray.length == 0) { 24859b6e78da15af6bf8706f22ed7176b14f7ca59f7Tyler Gunn Log.d(LOG_TAG, "handleGetCFResponse: cfInfoArray.length==0"); 2497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon setEnabled(false); 2502b36ba2d3b68fce3e44078c1bdedf9af00b7fc5bAndrew Lee mTcpListener.onError(CallForwardEditPreference.this, RESPONSE_ERROR); 2517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 2527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon for (int i = 0, length = cfInfoArray.length; i < length; i++) { 25359b6e78da15af6bf8706f22ed7176b14f7ca59f7Tyler Gunn Log.d(LOG_TAG, "handleGetCFResponse, cfInfoArray[" + i + "]=" 2547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + cfInfoArray[i]); 2557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if ((mServiceClass & cfInfoArray[i].serviceClass) != 0) { 2567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // corresponding class 2577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CallForwardInfo info = cfInfoArray[i]; 2587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon handleCallForwardResult(info); 2597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Show an alert if we got a success response but 2617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // with unexpected values. 2627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Currently only handle the fail-to-disable case 2637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // since we haven't observed fail-to-enable. 2647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (msg.arg2 == MESSAGE_SET_CF && 2657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon msg.arg1 == CommandsInterface.CF_ACTION_DISABLE && 2667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon info.status == 1) { 2677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CharSequence s; 2687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (reason) { 2697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case CommandsInterface.CF_REASON_BUSY: 2707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon s = getContext().getText(R.string.disable_cfb_forbidden); 2717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 2727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case CommandsInterface.CF_REASON_NO_REPLY: 2737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon s = getContext().getText(R.string.disable_cfnry_forbidden); 2747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 2757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon default: // not reachable 2767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon s = getContext().getText(R.string.disable_cfnrc_forbidden); 2777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); 2797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.setNeutralButton(R.string.close_dialog, null); 2807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.setTitle(getContext().getText(R.string.error_updating_title)); 2817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.setMessage(s); 2827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.setCancelable(true); 2837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon builder.create().show(); 2847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // Now whether or not we got a new number, reset our enabled 2917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // summary text since it may have been replaced by an empty 2927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // placeholder. 2937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon updateSummaryText(); 2947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void handleSetCFResponse(Message msg) { 2977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon AsyncResult ar = (AsyncResult) msg.obj; 2987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (ar.exception != null) { 30059b6e78da15af6bf8706f22ed7176b14f7ca59f7Tyler Gunn Log.d(LOG_TAG, "handleSetCFResponse: ar.exception=" + ar.exception); 3017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // setEnabled(false); 3027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 30359b6e78da15af6bf8706f22ed7176b14f7ca59f7Tyler Gunn Log.d(LOG_TAG, "handleSetCFResponse: re get"); 3042b36ba2d3b68fce3e44078c1bdedf9af00b7fc5bAndrew Lee mPhone.getCallForwardingOption(reason, 3057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon obtainMessage(MESSAGE_GET_CF, msg.arg1, MESSAGE_SET_CF, ar.exception)); 3067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon} 309