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