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