Cherry Pick: Adding SubscriptionManagerFacade and MSIM support.

Adding SubscriptionManagerFacade for MSIM Functionality.
Adding Minor MSIM updates to TelecomManagerFacade.

Link to Android Partner Code Review:
https://partner-android-review.googlesource.com/#/c/185204/

Change-Id: I9e576c9f7f170fed0500f4e4fbc46bf8dc3532df
diff --git a/Common/src/com/googlecode/android_scripting/facade/tele/SubscriptionManagerFacade.java b/Common/src/com/googlecode/android_scripting/facade/tele/SubscriptionManagerFacade.java
new file mode 100644
index 0000000..11ca8a9
--- /dev/null
+++ b/Common/src/com/googlecode/android_scripting/facade/tele/SubscriptionManagerFacade.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2014 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.googlecode.android_scripting.facade.tele;
+
+import android.app.Service;
+import android.content.Context;
+import android.telephony.SubscriptionManager;
+import android.telephony.SubInfoRecord;
+
+import com.googlecode.android_scripting.Log;
+import com.googlecode.android_scripting.facade.FacadeManager;
+import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
+import com.googlecode.android_scripting.rpc.Rpc;
+import com.googlecode.android_scripting.rpc.RpcParameter;
+
+import java.util.List;
+
+/**
+ * Exposes SubscriptionManager functionality.
+ */
+public class SubscriptionManagerFacade extends RpcReceiver {
+
+    private final Service mService;
+    private final Context mContext;
+
+    public SubscriptionManagerFacade(FacadeManager manager) {
+        super(manager);
+        mService = manager.getService();
+        mContext = mService.getBaseContext();
+    }
+
+    @Rpc(description = "Return the default subscription ID")
+    public Long subscriptionGetDefaultSubId() {
+        return SubscriptionManager.getDefaultSubId();
+    }
+
+    @Rpc(description = "Return the default data subscription ID")
+    public Long subscriptionGetDefaultDataSubId() {
+        return SubscriptionManager.getDefaultDataSubId();
+    }
+
+    @Rpc(description = "Set the default data subscription ID")
+    public void subscriptionSetDefaultDataSubId(
+            @RpcParameter(name = "subId")
+            Long subId) {
+        SubscriptionManager.setDefaultDataSubId(subId);
+    }
+
+    @Rpc(description = "Return the default voice subscription ID")
+    public Long subscriptionGetDefaultVoiceSubId() {
+        return SubscriptionManager.getDefaultVoiceSubId();
+    }
+
+    @Rpc(description = "Set the default voice subscription ID")
+    public void subscriptionSetDefaultVoiceSubId(
+            @RpcParameter(name = "subId")
+            Long subId) {
+        SubscriptionManager.setDefaultVoiceSubId(subId);
+    }
+
+    @Rpc(description = "Return a List of all Subscription Info Records")
+    public List<SubInfoRecord> subscriptionGetAllSubInfoList() {
+        return SubscriptionManager.getAllSubInfoList();
+    }
+
+    @Rpc(description = "Return a List of all Active Subscription Info Records")
+    public List<SubInfoRecord> subscriptionGetActiveSubInfoList() {
+        return SubscriptionManager.getActiveSubInfoList();
+    }
+
+    @Rpc(description = "Return the Subscription Info for a Particular Subscription ID")
+    public SubInfoRecord subscriptionGetSubInfoForSubscriber(
+            @RpcParameter(name = "subId")
+            Long subId) {
+        return SubscriptionManager.getSubInfoForSubscriber(subId);
+    }
+
+    @Rpc(description = "Set Data Roaming Enabled or Disabled for a particular Subscription ID")
+    public Integer subscriptionSetDataRoaming(Integer roaming, Long subId) {
+        if (roaming != SubscriptionManager.DATA_ROAMING_DISABLE) {
+            return SubscriptionManager.setDataRoaming(
+                    SubscriptionManager.DATA_ROAMING_ENABLE, subId);
+        } else {
+            return SubscriptionManager.setDataRoaming(
+                    SubscriptionManager.DATA_ROAMING_DISABLE, subId);
+        }
+    }
+
+    @Override
+    public void shutdown() {
+
+    }
+}
diff --git a/Common/src/com/googlecode/android_scripting/facade/tele/TelecomManagerFacade.java b/Common/src/com/googlecode/android_scripting/facade/tele/TelecomManagerFacade.java
index 596c1ee..3dadb81 100644
--- a/Common/src/com/googlecode/android_scripting/facade/tele/TelecomManagerFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/tele/TelecomManagerFacade.java
@@ -81,31 +81,39 @@
     }
 
     @Rpc(description = "Disconnect call by callId.")
-    public void telecomCallDisconnect(@RpcParameter(name = "callId") String callId) {
+    public void telecomCallDisconnect(
+            @RpcParameter(name = "callId")
+            String callId) {
         Call call = InCallServiceImpl.mCalls.get(callId);
         call.disconnect();
     }
 
     @Rpc(description = "Hold call by callId")
-    public void telecomCallHold(@RpcParameter(name = "callId") String callId) {
+    public void telecomCallHold(@RpcParameter(name = "callId")
+    String callId) {
         Call call = InCallServiceImpl.mCalls.get(callId);
         call.hold();
     }
 
     @Rpc(description = "Merge call to conference by callId")
-    public void telecomCallMergeToConf(@RpcParameter(name = "callId") String callId) {
+    public void telecomCallMergeToConf(
+            @RpcParameter(name = "callId")
+            String callId) {
         Call call = InCallServiceImpl.mCalls.get(callId);
         call.mergeConference();
     }
 
     @Rpc(description = "Split call from conference by callId.")
-    public void telecomCallSplitFromConf(@RpcParameter(name = "callId") String callId) {
+    public void telecomCallSplitFromConf(
+            @RpcParameter(name = "callId")
+            String callId) {
         Call call = InCallServiceImpl.mCalls.get(callId);
         call.splitFromConference();
     }
 
     @Rpc(description = "Unhold call by callId")
-    public void telecomCallUnhold(@RpcParameter(name = "callId") String callId) {
+    public void telecomCallUnhold(@RpcParameter(name = "callId")
+    String callId) {
         Call call = InCallServiceImpl.mCalls.get(callId);
         call.unhold();
     }
@@ -166,6 +174,29 @@
         return mEnabledAccountHandles;
     }
 
+    @Rpc(description = "Set the user-chosen default PhoneAccount for making outgoing phone calls.")
+    public void telecomSetUserSelectedOutgoingPhoneAccount(
+            @RpcParameter(name = "phoneAccountHandleId")
+            String phoneAccountHandleId) throws Exception {
+
+        List<PhoneAccountHandle> accountHandles = mTelecomManager
+                .getAllPhoneAccountHandles();
+        for (PhoneAccountHandle handle : accountHandles) {
+            if (handle.getId().equals(phoneAccountHandleId)) {
+                mTelecomManager.setUserSelectedOutgoingPhoneAccount(handle);
+                Log.d(String.format("Set default Outgoing Phone Account(%s)",
+                        phoneAccountHandleId));
+                return;
+            }
+        }
+        Log.d(String.format(
+                "Failed to find a matching phoneAccountHandleId(%s).",
+                phoneAccountHandleId));
+        throw new Exception(String.format(
+                "Failed to find a matching phoneAccountHandleId(%s).",
+                phoneAccountHandleId));
+    }
+
     @Rpc(description = "Get the user-chosen default PhoneAccount for making outgoing phone calls.")
     public PhoneAccountHandle telecomGetUserSelectedOutgoingPhoneAccount() {
         return mTelecomManager.getUserSelectedOutgoingPhoneAccount();
@@ -182,8 +213,11 @@
     }
 
     @Rpc(description = "Joins two calls into a conference call. Calls are identified by their IDs listed by telecomPhoneGetCallIds")
-    public void telecomJoinCallsInConf(@RpcParameter(name = "callIdOne") String callIdOne,
-            @RpcParameter(name = "callIdTwo") String callIdTwo) {
+    public void telecomJoinCallsInConf(
+            @RpcParameter(name = "callIdOne")
+            String callIdOne,
+            @RpcParameter(name = "callIdTwo")
+            String callIdTwo) {
         Call callOne = InCallServiceImpl.mCalls.get(callIdOne);
         Call callTwo = InCallServiceImpl.mCalls.get(callIdTwo);
         callOne.conference(callTwo);
@@ -200,7 +234,9 @@
     }
 
     @Rpc(description = "Sets the audio route (SPEAKER, BLUETOOTH, etc...).")
-    public void telecomPhoneSetAudioRoute(@RpcParameter(name = "route") String route) {
+    public void telecomPhoneSetAudioRoute(
+            @RpcParameter(name = "route")
+            String route) {
         int r = 0;
         if (route == "BLUETOOTH") {
             r = AudioState.ROUTE_BLUETOOTH;
@@ -220,7 +256,8 @@
 
     @Rpc(description = "Turns the proximity sensor off. If screenOnImmediately is true, the screen will be turned on immediately")
     public void telecomPhoneSetProximitySensorOff(
-            @RpcParameter(name = "screenOnImmediately") Boolean screenOnImmediately) {
+            @RpcParameter(name = "screenOnImmediately")
+            Boolean screenOnImmediately) {
         InCallServiceImpl.mPhone.setProximitySensorOff(screenOnImmediately);
     }
 
diff --git a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java b/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java
index 7846173..cadbf01 100644
--- a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java
+++ b/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java
@@ -19,6 +19,7 @@
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -56,7 +57,9 @@
 import android.telephony.CellLocation;
 import android.telephony.NeighboringCellInfo;
 import android.telephony.SmsMessage;
+import android.telephony.SubscriptionManager;
 import android.telephony.gsm.GsmCellLocation;
+import android.telephony.SubInfoRecord;
 import android.util.DisplayMetrics;
 import android.util.SparseArray;
 
@@ -183,6 +186,9 @@
         if (data instanceof PhoneAccountHandle) {
             return buildPhoneAccountHandle((PhoneAccountHandle) data);
         }
+        if (data instanceof SubInfoRecord) {
+            return buildSubscriptionInfoRecord((SubInfoRecord) data);
+        }
         if (data instanceof DisplayMetrics) {
             return buildDisplayMetrics((DisplayMetrics) data);
         }
@@ -207,6 +213,7 @@
         if (data instanceof Object[]) {
             return buildJSONArray((Object[]) data);
         }
+
         return data.toString();
         // throw new JSONException("Failed to build JSON result. " + data.getClass().getName());
     }
@@ -555,6 +562,23 @@
         return msg;
     }
 
+    private static Object buildSubscriptionInfoRecord(SubInfoRecord data) throws JSONException {
+        JSONObject msg = new JSONObject();
+        msg.put("subId", data.subId);
+        msg.put("iccId", data.iccId);
+        msg.put("slotId", data.slotId);
+        msg.put("displayName", data.displayName);
+        msg.put("nameSource", data.nameSource);
+        msg.put("color", data.color);
+        msg.put("number", data.number);
+        msg.put("displayNumberFormat", data.displayNumberFormat);
+        msg.put("dataRoaming", data.dataRoaming);
+        msg.put("simIconRes", Arrays.toString(data.simIconRes));
+        msg.put("mcc", data.mcc);
+        msg.put("mnc", data.mnc);
+        return msg;
+    }
+
     private static Object buildPoint(Point data) throws JSONException {
         JSONObject point = new JSONObject();
         point.put("x", data.x);
diff --git a/ScriptingLayer/src/com/googlecode/android_scripting/facade/FacadeConfiguration.java b/ScriptingLayer/src/com/googlecode/android_scripting/facade/FacadeConfiguration.java
index fff9940..488112d 100644
--- a/ScriptingLayer/src/com/googlecode/android_scripting/facade/FacadeConfiguration.java
+++ b/ScriptingLayer/src/com/googlecode/android_scripting/facade/FacadeConfiguration.java
@@ -47,6 +47,7 @@
 import com.googlecode.android_scripting.facade.tele.ImsManagerFacade;
 import com.googlecode.android_scripting.facade.tele.PhoneFacade;
 import com.googlecode.android_scripting.facade.tele.TelecomManagerFacade;
+import com.googlecode.android_scripting.facade.tele.SubscriptionManagerFacade;
 import com.googlecode.android_scripting.facade.ui.UiFacade;
 import com.googlecode.android_scripting.facade.wifi.HttpFacade;
 import com.googlecode.android_scripting.facade.wifi.WifiManagerFacade;
@@ -140,6 +141,7 @@
             sFacadeClassList.add(TelecomManagerFacade.class);
             sFacadeClassList.add(WifiRttManagerFacade.class);
             sFacadeClassList.add(WifiScannerFacade.class);
+            sFacadeClassList.add(SubscriptionManagerFacade.class);
         }
 
         for (Class<? extends RpcReceiver> recieverClass : sFacadeClassList) {