1 package com.android.phone; 2 3 import android.app.ActionBar; 4 import android.content.Intent; 5 import android.database.Cursor; 6 import android.os.Bundle; 7 import android.os.PersistableBundle; 8 import android.preference.Preference; 9 import android.preference.PreferenceScreen; 10 import android.telephony.CarrierConfigManager; 11 import android.util.Log; 12 import android.view.MenuItem; 13 14 import com.android.internal.telephony.CallForwardInfo; 15 import com.android.internal.telephony.CommandsInterface; 16 import com.android.internal.telephony.Phone; 17 18 import java.util.ArrayList; 19 20 public class GsmUmtsCallForwardOptions extends TimeConsumingPreferenceActivity { 21 private static final String LOG_TAG = "GsmUmtsCallForwardOptions"; 22 23 private static final String NUM_PROJECTION[] = { 24 android.provider.ContactsContract.CommonDataKinds.Phone.NUMBER 25 }; 26 27 private static final String BUTTON_CFU_KEY = "button_cfu_key"; 28 private static final String BUTTON_CFB_KEY = "button_cfb_key"; 29 private static final String BUTTON_CFNRY_KEY = "button_cfnry_key"; 30 private static final String BUTTON_CFNRC_KEY = "button_cfnrc_key"; 31 32 private static final String KEY_TOGGLE = "toggle"; 33 private static final String KEY_STATUS = "status"; 34 private static final String KEY_NUMBER = "number"; 35 private static final String KEY_ENABLE = "enable"; 36 37 private CallForwardEditPreference mButtonCFU; 38 private CallForwardEditPreference mButtonCFB; 39 private CallForwardEditPreference mButtonCFNRy; 40 private CallForwardEditPreference mButtonCFNRc; 41 42 private final ArrayList<CallForwardEditPreference> mPreferences = 43 new ArrayList<CallForwardEditPreference> (); 44 private int mInitIndex= 0; 45 46 private boolean mFirstResume; 47 private Bundle mIcicle; 48 private Phone mPhone; 49 private SubscriptionInfoHelper mSubscriptionInfoHelper; 50 private boolean mReplaceInvalidCFNumbers; 51 private boolean mCallForwardByUssd; 52 53 @Override onCreate(Bundle icicle)54 protected void onCreate(Bundle icicle) { 55 super.onCreate(icicle); 56 57 addPreferencesFromResource(R.xml.callforward_options); 58 59 mSubscriptionInfoHelper = new SubscriptionInfoHelper(this, getIntent()); 60 mSubscriptionInfoHelper.setActionBarTitle( 61 getActionBar(), getResources(), R.string.call_forwarding_settings_with_label); 62 mPhone = mSubscriptionInfoHelper.getPhone(); 63 64 PersistableBundle b = null; 65 if (mSubscriptionInfoHelper.hasSubId()) { 66 b = PhoneGlobals.getInstance().getCarrierConfigForSubId( 67 mSubscriptionInfoHelper.getSubId()); 68 } else { 69 b = PhoneGlobals.getInstance().getCarrierConfig(); 70 } 71 if (b != null) { 72 mReplaceInvalidCFNumbers = b.getBoolean( 73 CarrierConfigManager.KEY_CALL_FORWARDING_MAP_NON_NUMBER_TO_VOICEMAIL_BOOL); 74 mCallForwardByUssd = b.getBoolean( 75 CarrierConfigManager.KEY_USE_CALL_FORWARDING_USSD_BOOL); 76 } 77 78 PreferenceScreen prefSet = getPreferenceScreen(); 79 mButtonCFU = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFU_KEY); 80 mButtonCFB = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFB_KEY); 81 mButtonCFNRy = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFNRY_KEY); 82 mButtonCFNRc = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFNRC_KEY); 83 84 mButtonCFU.setParentActivity(this, mButtonCFU.reason); 85 mButtonCFB.setParentActivity(this, mButtonCFB.reason); 86 mButtonCFNRy.setParentActivity(this, mButtonCFNRy.reason); 87 mButtonCFNRc.setParentActivity(this, mButtonCFNRc.reason); 88 89 mPreferences.add(mButtonCFU); 90 mPreferences.add(mButtonCFB); 91 mPreferences.add(mButtonCFNRy); 92 mPreferences.add(mButtonCFNRc); 93 94 if (mCallForwardByUssd) { 95 //the call forwarding ussd command's behavior is similar to the call forwarding when 96 //unanswered,so only display the call forwarding when unanswered item. 97 prefSet.removePreference(mButtonCFU); 98 prefSet.removePreference(mButtonCFB); 99 prefSet.removePreference(mButtonCFNRc); 100 mPreferences.remove(mButtonCFU); 101 mPreferences.remove(mButtonCFB); 102 mPreferences.remove(mButtonCFNRc); 103 mButtonCFNRy.setDependency(null); 104 } 105 106 // we wait to do the initialization until onResume so that the 107 // TimeConsumingPreferenceActivity dialog can display as it 108 // relies on onResume / onPause to maintain its foreground state. 109 110 mFirstResume = true; 111 mIcicle = icicle; 112 113 ActionBar actionBar = getActionBar(); 114 if (actionBar != null) { 115 // android.R.id.home will be triggered in onOptionsItemSelected() 116 actionBar.setDisplayHomeAsUpEnabled(true); 117 } 118 } 119 120 @Override onResume()121 public void onResume() { 122 super.onResume(); 123 124 if (mFirstResume) { 125 if (mIcicle == null) { 126 Log.d(LOG_TAG, "start to init "); 127 CallForwardEditPreference pref = mPreferences.get(mInitIndex); 128 pref.init(this, mPhone, mReplaceInvalidCFNumbers, mCallForwardByUssd); 129 pref.startCallForwardOptionsQuery(); 130 131 } else { 132 mInitIndex = mPreferences.size(); 133 134 for (CallForwardEditPreference pref : mPreferences) { 135 Bundle bundle = mIcicle.getParcelable(pref.getKey()); 136 pref.setToggled(bundle.getBoolean(KEY_TOGGLE)); 137 pref.setEnabled(bundle.getBoolean(KEY_ENABLE)); 138 CallForwardInfo cf = new CallForwardInfo(); 139 cf.number = bundle.getString(KEY_NUMBER); 140 cf.status = bundle.getInt(KEY_STATUS); 141 pref.init(this, mPhone, mReplaceInvalidCFNumbers, mCallForwardByUssd); 142 pref.restoreCallForwardInfo(cf); 143 } 144 } 145 mFirstResume = false; 146 mIcicle = null; 147 } 148 } 149 150 @Override onSaveInstanceState(Bundle outState)151 protected void onSaveInstanceState(Bundle outState) { 152 super.onSaveInstanceState(outState); 153 154 for (CallForwardEditPreference pref : mPreferences) { 155 Bundle bundle = new Bundle(); 156 bundle.putBoolean(KEY_TOGGLE, pref.isToggled()); 157 bundle.putBoolean(KEY_ENABLE, pref.isEnabled()); 158 if (pref.callForwardInfo != null) { 159 bundle.putString(KEY_NUMBER, pref.callForwardInfo.number); 160 bundle.putInt(KEY_STATUS, pref.callForwardInfo.status); 161 } 162 outState.putParcelable(pref.getKey(), bundle); 163 } 164 } 165 166 @Override onFinished(Preference preference, boolean reading)167 public void onFinished(Preference preference, boolean reading) { 168 if (mInitIndex < mPreferences.size()-1 && !isFinishing()) { 169 mInitIndex++; 170 CallForwardEditPreference pref = mPreferences.get(mInitIndex); 171 pref.init(this, mPhone, mReplaceInvalidCFNumbers, mCallForwardByUssd); 172 pref.startCallForwardOptionsQuery(); 173 } 174 175 super.onFinished(preference, reading); 176 } 177 178 @Override onActivityResult(int requestCode, int resultCode, Intent data)179 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 180 Log.d(LOG_TAG, "onActivityResult: done"); 181 if (resultCode != RESULT_OK) { 182 Log.d(LOG_TAG, "onActivityResult: contact picker result not OK."); 183 return; 184 } 185 Cursor cursor = null; 186 try { 187 cursor = getContentResolver().query(data.getData(), 188 NUM_PROJECTION, null, null, null); 189 if ((cursor == null) || (!cursor.moveToFirst())) { 190 Log.d(LOG_TAG, "onActivityResult: bad contact data, no results found."); 191 return; 192 } 193 194 switch (requestCode) { 195 case CommandsInterface.CF_REASON_UNCONDITIONAL: 196 mButtonCFU.onPickActivityResult(cursor.getString(0)); 197 break; 198 case CommandsInterface.CF_REASON_BUSY: 199 mButtonCFB.onPickActivityResult(cursor.getString(0)); 200 break; 201 case CommandsInterface.CF_REASON_NO_REPLY: 202 mButtonCFNRy.onPickActivityResult(cursor.getString(0)); 203 break; 204 case CommandsInterface.CF_REASON_NOT_REACHABLE: 205 mButtonCFNRc.onPickActivityResult(cursor.getString(0)); 206 break; 207 default: 208 // TODO: may need exception here. 209 } 210 } finally { 211 if (cursor != null) { 212 cursor.close(); 213 } 214 } 215 } 216 217 @Override onOptionsItemSelected(MenuItem item)218 public boolean onOptionsItemSelected(MenuItem item) { 219 final int itemId = item.getItemId(); 220 if (itemId == android.R.id.home) { // See ActionBar#setDisplayHomeAsUpEnabled() 221 CallFeaturesSetting.goUpToTopLevelSetting(this, mSubscriptionInfoHelper); 222 return true; 223 } 224 return super.onOptionsItemSelected(item); 225 } 226 } 227