• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.android.phone;
2 
3 import com.android.internal.telephony.CallForwardInfo;
4 import com.android.internal.telephony.CommandsInterface;
5 import com.android.internal.telephony.Phone;
6 
7 import android.app.ActionBar;
8 import android.content.Intent;
9 import android.database.Cursor;
10 import android.os.Bundle;
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 java.util.ArrayList;
18 
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 
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
onCreate(Bundle icicle)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
onResume()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
onSaveInstanceState(Bundle outState)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
onFinished(Preference preference, boolean reading)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
onActivityResult(int requestCode, int resultCode, Intent data)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
onOptionsItemSelected(MenuItem item)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