1package com.android.phone;
2
3import com.android.internal.telephony.CallForwardInfo;
4import com.android.internal.telephony.CommandsInterface;
5import com.android.internal.telephony.Phone;
6
7import android.app.ActionBar;
8import android.content.Intent;
9import android.database.Cursor;
10import android.os.Bundle;
11import android.preference.Preference;
12import android.preference.PreferenceScreen;
13import android.telephony.CarrierConfigManager;
14import android.util.Log;
15import android.view.MenuItem;
16
17import java.util.ArrayList;
18
19
20public 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
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
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
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
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
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
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