1 package com.android.phone; 2 3 import android.content.Intent; 4 import android.database.Cursor; 5 import android.os.Bundle; 6 import android.preference.Preference; 7 import android.preference.PreferenceScreen; 8 import android.provider.ContactsContract.CommonDataKinds.Phone; 9 import android.util.Log; 10 11 import com.android.internal.telephony.CallForwardInfo; 12 import com.android.internal.telephony.CommandsInterface; 13 14 import java.util.ArrayList; 15 16 17 public class GsmUmtsCallForwardOptions extends TimeConsumingPreferenceActivity { 18 private static final String LOG_TAG = "GsmUmtsCallForwardOptions"; 19 private final boolean DBG = (PhoneApp.DBG_LEVEL >= 2); 20 21 private static final String NUM_PROJECTION[] = {Phone.NUMBER}; 22 23 private static final String BUTTON_CFU_KEY = "button_cfu_key"; 24 private static final String BUTTON_CFB_KEY = "button_cfb_key"; 25 private static final String BUTTON_CFNRY_KEY = "button_cfnry_key"; 26 private static final String BUTTON_CFNRC_KEY = "button_cfnrc_key"; 27 28 private static final String KEY_TOGGLE = "toggle"; 29 private static final String KEY_STATUS = "status"; 30 private static final String KEY_NUMBER = "number"; 31 32 private CallForwardEditPreference mButtonCFU; 33 private CallForwardEditPreference mButtonCFB; 34 private CallForwardEditPreference mButtonCFNRy; 35 private CallForwardEditPreference mButtonCFNRc; 36 37 private final ArrayList<CallForwardEditPreference> mPreferences = 38 new ArrayList<CallForwardEditPreference> (); 39 private int mInitIndex= 0; 40 41 private boolean mFirstResume; 42 private Bundle mIcicle; 43 44 @Override onCreate(Bundle icicle)45 protected void onCreate(Bundle icicle) { 46 super.onCreate(icicle); 47 48 addPreferencesFromResource(R.xml.callforward_options); 49 50 PreferenceScreen prefSet = getPreferenceScreen(); 51 mButtonCFU = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFU_KEY); 52 mButtonCFB = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFB_KEY); 53 mButtonCFNRy = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFNRY_KEY); 54 mButtonCFNRc = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFNRC_KEY); 55 56 mButtonCFU.setParentActivity(this, mButtonCFU.reason); 57 mButtonCFB.setParentActivity(this, mButtonCFB.reason); 58 mButtonCFNRy.setParentActivity(this, mButtonCFNRy.reason); 59 mButtonCFNRc.setParentActivity(this, mButtonCFNRc.reason); 60 61 mPreferences.add(mButtonCFU); 62 mPreferences.add(mButtonCFB); 63 mPreferences.add(mButtonCFNRy); 64 mPreferences.add(mButtonCFNRc); 65 66 // we wait to do the initialization until onResume so that the 67 // TimeConsumingPreferenceActivity dialog can display as it 68 // relies on onResume / onPause to maintain its foreground state. 69 70 mFirstResume = true; 71 mIcicle = icicle; 72 } 73 74 @Override onResume()75 public void onResume() { 76 super.onResume(); 77 78 if (mFirstResume) { 79 if (mIcicle == null) { 80 if (DBG) Log.d(LOG_TAG, "start to init "); 81 mPreferences.get(mInitIndex).init(this, false); 82 } else { 83 mInitIndex = mPreferences.size(); 84 85 for (CallForwardEditPreference pref : mPreferences) { 86 Bundle bundle = mIcicle.getParcelable(pref.getKey()); 87 pref.setToggled(bundle.getBoolean(KEY_TOGGLE)); 88 CallForwardInfo cf = new CallForwardInfo(); 89 cf.number = bundle.getString(KEY_NUMBER); 90 cf.status = bundle.getInt(KEY_STATUS); 91 pref.handleCallForwardResult(cf); 92 pref.init(this, true); 93 } 94 } 95 mFirstResume = false; 96 mIcicle=null; 97 } 98 } 99 100 @Override onSaveInstanceState(Bundle outState)101 protected void onSaveInstanceState(Bundle outState) { 102 super.onSaveInstanceState(outState); 103 104 for (CallForwardEditPreference pref : mPreferences) { 105 Bundle bundle = new Bundle(); 106 bundle.putBoolean(KEY_TOGGLE, pref.isToggled()); 107 if (pref.callForwardInfo != null) { 108 bundle.putString(KEY_NUMBER, pref.callForwardInfo.number); 109 bundle.putInt(KEY_STATUS, pref.callForwardInfo.status); 110 } 111 outState.putParcelable(pref.getKey(), bundle); 112 } 113 } 114 115 @Override onFinished(Preference preference, boolean reading)116 public void onFinished(Preference preference, boolean reading) { 117 if (mInitIndex < mPreferences.size()-1 && !isFinishing()) { 118 mInitIndex++; 119 mPreferences.get(mInitIndex).init(this, false); 120 } 121 122 super.onFinished(preference, reading); 123 } 124 125 @Override onActivityResult(int requestCode, int resultCode, Intent data)126 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 127 if (DBG) Log.d(LOG_TAG, "onActivityResult: done"); 128 if (resultCode != RESULT_OK) { 129 if (DBG) Log.d(LOG_TAG, "onActivityResult: contact picker result not OK."); 130 return; 131 } 132 Cursor cursor = getContentResolver().query(data.getData(), 133 NUM_PROJECTION, null, null, null); 134 if ((cursor == null) || (!cursor.moveToFirst())) { 135 if (DBG) Log.d(LOG_TAG, "onActivityResult: bad contact data, no results found."); 136 return; 137 } 138 139 switch (requestCode) { 140 case CommandsInterface.CF_REASON_UNCONDITIONAL: 141 mButtonCFU.onPickActivityResult(cursor.getString(0)); 142 break; 143 case CommandsInterface.CF_REASON_BUSY: 144 mButtonCFB.onPickActivityResult(cursor.getString(0)); 145 break; 146 case CommandsInterface.CF_REASON_NO_REPLY: 147 mButtonCFNRy.onPickActivityResult(cursor.getString(0)); 148 break; 149 case CommandsInterface.CF_REASON_NOT_REACHABLE: 150 mButtonCFNRc.onPickActivityResult(cursor.getString(0)); 151 break; 152 default: 153 // TODO: may need exception here. 154 } 155 } 156 } 157