Add MSIM support for Call Forwarding.

+ Set subcription info dynamically on intents to open
GsmUmtsCallForwardOptions and GsmUmtsAdditionalCallOptions.

+ Allow phone to be set on initialization for the preferences
used in those settings.

Bug: 18114923
Bug: 18233808
Bug: 18233614
Change-Id: I79a708872ea57ff9ba7a52a61835204caf156733
diff --git a/src/com/android/phone/CLIRListPreference.java b/src/com/android/phone/CLIRListPreference.java
index 198bdb0..939caf0 100644
--- a/src/com/android/phone/CLIRListPreference.java
+++ b/src/com/android/phone/CLIRListPreference.java
@@ -23,15 +23,13 @@
     private final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
 
     private final MyHandler mHandler = new MyHandler();
-    private final Phone mPhone;
+    private Phone mPhone;
     private TimeConsumingPreferenceListener mTcpListener;
 
     int clirArray[];
 
     public CLIRListPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
-
-        mPhone = PhoneGlobals.getPhone();
     }
 
     public CLIRListPreference(Context context) {
@@ -49,7 +47,9 @@
         }
     }
 
-    /* package */ void init(TimeConsumingPreferenceListener listener, boolean skipReading) {
+    /* package */ void init(
+            TimeConsumingPreferenceListener listener, boolean skipReading, Phone phone) {
+        mPhone = phone;
         mTcpListener = listener;
         if (!skipReading) {
             mPhone.getOutgoingCallerIdDisplay(mHandler.obtainMessage(MyHandler.MESSAGE_GET_CLIR,
diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index 65ca3e5..c99e432 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -163,6 +163,8 @@
 
     private static final String BUTTON_GSM_UMTS_OPTIONS = "button_gsm_more_expand_key";
     private static final String BUTTON_CDMA_OPTIONS = "button_cdma_more_expand_key";
+    private static final String CALL_FORWARDING_KEY = "call_forwarding_key";
+    private static final String ADDITIONAL_GSM_SETTINGS_KEY = "additional_gsm_call_settings_key";
 
     private static final String DEFAULT_OUTGOING_ACCOUNT_KEY = "default_outgoing_account";
     private static final String PHONE_ACCOUNT_SETTINGS_KEY =
@@ -1316,14 +1318,12 @@
         }
 
         if (!getResources().getBoolean(R.bool.world_phone)) {
-            Preference options = prefSet.findPreference(BUTTON_CDMA_OPTIONS);
-            if (options != null) {
-                prefSet.removePreference(options);
-            }
-            options = prefSet.findPreference(BUTTON_GSM_UMTS_OPTIONS);
-            if (options != null) {
-                prefSet.removePreference(options);
-            }
+            Preference cdmaOptions = prefSet.findPreference(BUTTON_CDMA_OPTIONS);
+            prefSet.removePreference(cdmaOptions);
+
+            // TODO: Support MSIM for this preference option.
+            Preference gsmOptions = prefSet.findPreference(BUTTON_GSM_UMTS_OPTIONS);
+            prefSet.removePreference(gsmOptions);
 
             int phoneType = mPhone.getPhoneType();
             Preference fdnButton = prefSet.findPreference(BUTTON_FDN_KEY);
@@ -1338,6 +1338,15 @@
 
                 if (getResources().getBoolean(R.bool.config_additional_call_setting)) {
                     addPreferencesFromResource(R.xml.gsm_umts_call_options);
+
+                    Preference callForwardingPref = prefSet.findPreference(CALL_FORWARDING_KEY);
+                    callForwardingPref.setIntent(mSubscriptionInfoHelper.getIntent(
+                            this, GsmUmtsCallForwardOptions.class));
+
+                    Preference additionalGsmSettingsPref =
+                            prefSet.findPreference(ADDITIONAL_GSM_SETTINGS_KEY);
+                    additionalGsmSettingsPref.setIntent(mSubscriptionInfoHelper.getIntent(
+                            this, GsmUmtsAdditionalCallOptions.class));
                 }
             } else {
                 throw new IllegalStateException("Unexpected phone type: " + phoneType);
diff --git a/src/com/android/phone/CallForwardEditPreference.java b/src/com/android/phone/CallForwardEditPreference.java
index f925022..b176c27 100644
--- a/src/com/android/phone/CallForwardEditPreference.java
+++ b/src/com/android/phone/CallForwardEditPreference.java
@@ -36,14 +36,13 @@
     private int mServiceClass;
     private MyHandler mHandler = new MyHandler();
     int reason;
-    Phone phone;
+    private Phone mPhone;
     CallForwardInfo callForwardInfo;
-    TimeConsumingPreferenceListener tcpListener;
+    private TimeConsumingPreferenceListener mTcpListener;
 
     public CallForwardEditPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
 
-        phone = PhoneGlobals.getPhone();
         mSummaryOnTemplate = this.getSummaryOn();
 
         TypedArray a = context.obtainStyledAttributes(attrs,
@@ -61,16 +60,18 @@
         this(context, null);
     }
 
-    void init(TimeConsumingPreferenceListener listener, boolean skipReading) {
-        tcpListener = listener;
+    void init(TimeConsumingPreferenceListener listener, boolean skipReading, Phone phone) {
+        mPhone = phone;
+        mTcpListener = listener;
+
         if (!skipReading) {
-            phone.getCallForwardingOption(reason,
+            mPhone.getCallForwardingOption(reason,
                     mHandler.obtainMessage(MyHandler.MESSAGE_GET_CF,
                             // unused in this case
                             CommandsInterface.CF_ACTION_DISABLE,
                             MyHandler.MESSAGE_GET_CF, null));
-            if (tcpListener != null) {
-                tcpListener.onStarted(this, true);
+            if (mTcpListener != null) {
+                mTcpListener.onStarted(this, true);
             }
         }
     }
@@ -122,7 +123,7 @@
 
                 // the interface of Phone.setCallForwardingOption has error:
                 // should be action, reason...
-                phone.setCallForwardingOption(action,
+                mPhone.setCallForwardingOption(action,
                         reason,
                         number,
                         time,
@@ -130,8 +131,8 @@
                                 action,
                                 MyHandler.MESSAGE_SET_CF));
 
-                if (tcpListener != null) {
-                    tcpListener.onStarted(this, false);
+                if (mTcpListener != null) {
+                    mTcpListener.onStarted(this, false);
                 }
             }
         }
@@ -183,28 +184,24 @@
         private void handleGetCFResponse(Message msg) {
             if (DBG) Log.d(LOG_TAG, "handleGetCFResponse: done");
 
-            if (msg.arg2 == MESSAGE_SET_CF) {
-                tcpListener.onFinished(CallForwardEditPreference.this, false);
-            } else {
-                tcpListener.onFinished(CallForwardEditPreference.this, true);
-            }
+            mTcpListener.onFinished(CallForwardEditPreference.this, msg.arg2 != MESSAGE_SET_CF);
 
             AsyncResult ar = (AsyncResult) msg.obj;
 
             callForwardInfo = null;
             if (ar.exception != null) {
                 if (DBG) Log.d(LOG_TAG, "handleGetCFResponse: ar.exception=" + ar.exception);
-                tcpListener.onException(CallForwardEditPreference.this,
+                mTcpListener.onException(CallForwardEditPreference.this,
                         (CommandException) ar.exception);
             } else {
                 if (ar.userObj instanceof Throwable) {
-                    tcpListener.onError(CallForwardEditPreference.this, RESPONSE_ERROR);
+                    mTcpListener.onError(CallForwardEditPreference.this, RESPONSE_ERROR);
                 }
                 CallForwardInfo cfInfoArray[] = (CallForwardInfo[]) ar.result;
                 if (cfInfoArray.length == 0) {
                     if (DBG) Log.d(LOG_TAG, "handleGetCFResponse: cfInfoArray.length==0");
                     setEnabled(false);
-                    tcpListener.onError(CallForwardEditPreference.this, RESPONSE_ERROR);
+                    mTcpListener.onError(CallForwardEditPreference.this, RESPONSE_ERROR);
                 } else {
                     for (int i = 0, length = cfInfoArray.length; i < length; i++) {
                         if (DBG) Log.d(LOG_TAG, "handleGetCFResponse, cfInfoArray[" + i + "]="
@@ -258,7 +255,7 @@
                 // setEnabled(false);
             }
             if (DBG) Log.d(LOG_TAG, "handleSetCFResponse: re get");
-            phone.getCallForwardingOption(reason,
+            mPhone.getCallForwardingOption(reason,
                     obtainMessage(MESSAGE_GET_CF, msg.arg1, MESSAGE_SET_CF, ar.exception));
         }
     }
diff --git a/src/com/android/phone/CallWaitingCheckBoxPreference.java b/src/com/android/phone/CallWaitingCheckBoxPreference.java
index a2f5c70..ce2a420 100644
--- a/src/com/android/phone/CallWaitingCheckBoxPreference.java
+++ b/src/com/android/phone/CallWaitingCheckBoxPreference.java
@@ -20,13 +20,11 @@
     private final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
 
     private final MyHandler mHandler = new MyHandler();
-    private final Phone mPhone;
+    private Phone mPhone;
     private TimeConsumingPreferenceListener mTcpListener;
 
     public CallWaitingCheckBoxPreference(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
-
-        mPhone = PhoneGlobals.getPhone();
     }
 
     public CallWaitingCheckBoxPreference(Context context, AttributeSet attrs) {
@@ -37,7 +35,9 @@
         this(context, null);
     }
 
-    /* package */ void init(TimeConsumingPreferenceListener listener, boolean skipReading) {
+    /* package */ void init(
+            TimeConsumingPreferenceListener listener, boolean skipReading, Phone phone) {
+        mPhone = phone;
         mTcpListener = listener;
 
         if (!skipReading) {
diff --git a/src/com/android/phone/GsmUmtsAdditionalCallOptions.java b/src/com/android/phone/GsmUmtsAdditionalCallOptions.java
index cd400f9..0540547 100644
--- a/src/com/android/phone/GsmUmtsAdditionalCallOptions.java
+++ b/src/com/android/phone/GsmUmtsAdditionalCallOptions.java
@@ -8,10 +8,11 @@
 import android.util.Log;
 import android.view.MenuItem;
 
+import com.android.internal.telephony.Phone;
+
 import java.util.ArrayList;
 
-public class GsmUmtsAdditionalCallOptions extends
-        TimeConsumingPreferenceActivity {
+public class GsmUmtsAdditionalCallOptions extends TimeConsumingPreferenceActivity {
     private static final String LOG_TAG = "GsmUmtsAdditionalCallOptions";
     private final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
 
@@ -22,7 +23,8 @@
     private CallWaitingCheckBoxPreference mCWButton;
 
     private final ArrayList<Preference> mPreferences = new ArrayList<Preference>();
-    private int mInitIndex= 0;
+    private int mInitIndex = 0;
+    private Phone mPhone;
 
     @Override
     protected void onCreate(Bundle icicle) {
@@ -30,6 +32,11 @@
 
         addPreferencesFromResource(R.xml.gsm_umts_additional_options);
 
+        SubscriptionInfoHelper subscriptionInfoHelper = new SubscriptionInfoHelper(getIntent());
+        subscriptionInfoHelper.setActionBarTitle(
+                getActionBar(), getResources(), R.string.additional_gsm_call_settings_with_label);
+        mPhone = subscriptionInfoHelper.getPhone();
+
         PreferenceScreen prefSet = getPreferenceScreen();
         mCLIRButton = (CLIRListPreference) prefSet.findPreference(BUTTON_CLIR_KEY);
         mCWButton = (CallWaitingCheckBoxPreference) prefSet.findPreference(BUTTON_CW_KEY);
@@ -39,19 +46,19 @@
 
         if (icicle == null) {
             if (DBG) Log.d(LOG_TAG, "start to init ");
-            mCLIRButton.init(this, false);
+            mCLIRButton.init(this, false, mPhone);
         } else {
             if (DBG) Log.d(LOG_TAG, "restore stored states");
             mInitIndex = mPreferences.size();
-            mCLIRButton.init(this, true);
-            mCWButton.init(this, true);
+            mCLIRButton.init(this, true, mPhone);
+            mCWButton.init(this, true, mPhone);
             int[] clirArray = icicle.getIntArray(mCLIRButton.getKey());
             if (clirArray != null) {
                 if (DBG) Log.d(LOG_TAG, "onCreate:  clirArray[0]="
                         + clirArray[0] + ", clirArray[1]=" + clirArray[1]);
                 mCLIRButton.handleGetCLIRResult(clirArray);
             } else {
-                mCLIRButton.init(this, false);
+                mCLIRButton.init(this, false, mPhone);
             }
         }
 
@@ -77,7 +84,7 @@
             mInitIndex++;
             Preference pref = mPreferences.get(mInitIndex);
             if (pref instanceof CallWaitingCheckBoxPreference) {
-                ((CallWaitingCheckBoxPreference) pref).init(this, false);
+                ((CallWaitingCheckBoxPreference) pref).init(this, false, mPhone);
             }
         }
         super.onFinished(preference, reading);
diff --git a/src/com/android/phone/GsmUmtsCallForwardOptions.java b/src/com/android/phone/GsmUmtsCallForwardOptions.java
index 8ecb1bf..3c4bebe 100644
--- a/src/com/android/phone/GsmUmtsCallForwardOptions.java
+++ b/src/com/android/phone/GsmUmtsCallForwardOptions.java
@@ -2,6 +2,7 @@
 
 import com.android.internal.telephony.CallForwardInfo;
 import com.android.internal.telephony.CommandsInterface;
+import com.android.internal.telephony.Phone;
 
 import android.app.ActionBar;
 import android.content.Intent;
@@ -9,7 +10,6 @@
 import android.os.Bundle;
 import android.preference.Preference;
 import android.preference.PreferenceScreen;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.util.Log;
 import android.view.MenuItem;
 
@@ -20,7 +20,9 @@
     private static final String LOG_TAG = "GsmUmtsCallForwardOptions";
     private final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
 
-    private static final String NUM_PROJECTION[] = {Phone.NUMBER};
+    private static final String NUM_PROJECTION[] = {
+        android.provider.ContactsContract.CommonDataKinds.Phone.NUMBER
+    };
 
     private static final String BUTTON_CFU_KEY   = "button_cfu_key";
     private static final String BUTTON_CFB_KEY   = "button_cfb_key";
@@ -42,6 +44,7 @@
 
     private boolean mFirstResume;
     private Bundle mIcicle;
+    private Phone mPhone;
 
     @Override
     protected void onCreate(Bundle icicle) {
@@ -49,9 +52,14 @@
 
         addPreferencesFromResource(R.xml.callforward_options);
 
+        SubscriptionInfoHelper subscriptionInfoHelper = new SubscriptionInfoHelper(getIntent());
+        subscriptionInfoHelper.setActionBarTitle(
+                getActionBar(), getResources(), R.string.call_forwarding_settings_with_label);
+        mPhone = subscriptionInfoHelper.getPhone();
+
         PreferenceScreen prefSet = getPreferenceScreen();
-        mButtonCFU   = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFU_KEY);
-        mButtonCFB   = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFB_KEY);
+        mButtonCFU = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFU_KEY);
+        mButtonCFB = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFB_KEY);
         mButtonCFNRy = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFNRY_KEY);
         mButtonCFNRc = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFNRC_KEY);
 
@@ -86,7 +94,7 @@
         if (mFirstResume) {
             if (mIcicle == null) {
                 if (DBG) Log.d(LOG_TAG, "start to init ");
-                mPreferences.get(mInitIndex).init(this, false);
+                mPreferences.get(mInitIndex).init(this, false, mPhone);
             } else {
                 mInitIndex = mPreferences.size();
 
@@ -97,11 +105,11 @@
                     cf.number = bundle.getString(KEY_NUMBER);
                     cf.status = bundle.getInt(KEY_STATUS);
                     pref.handleCallForwardResult(cf);
-                    pref.init(this, true);
+                    pref.init(this, true, mPhone);
                 }
             }
             mFirstResume = false;
-            mIcicle=null;
+            mIcicle = null;
         }
     }
 
@@ -124,7 +132,7 @@
     public void onFinished(Preference preference, boolean reading) {
         if (mInitIndex < mPreferences.size()-1 && !isFinishing()) {
             mInitIndex++;
-            mPreferences.get(mInitIndex).init(this, false);
+            mPreferences.get(mInitIndex).init(this, false, mPhone);
         }
 
         super.onFinished(preference, reading);