• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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