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