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) {