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