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