Add mock modem service operations in Telephony

Bug: 205101043
Bug: 203241555
Test: manual
Change-Id: Idd34e908ca625a6bf1ba9bd9a115b15315560936
Merged-In: Idd34e908ca625a6bf1ba9bd9a115b15315560936
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 4cd0a4d..2aedd59 100755
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -11088,4 +11088,37 @@
             Binder.restoreCallingIdentity(identity);
         }
     }
+
+    /**
+     * Sets the modem service class Name that Telephony will bind to.
+     *
+     * @param serviceName The class name of the modem service.
+     * @return true if the operation is succeed, otherwise false.
+     */
+    public boolean setModemService(String serviceName) {
+        Log.d(LOG_TAG, "setModemService - " + serviceName);
+        TelephonyPermissions.enforceShellOnly(Binder.getCallingUid(), "setModemService");
+        TelephonyPermissions.enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(mApp,
+                        SubscriptionManager.INVALID_SUBSCRIPTION_ID,
+                        "setModemService");
+        return mPhoneConfigurationManager.setModemService(serviceName);
+    }
+
+    /**
+     * Return the class name of the currently bounded modem service.
+     *
+     * @return the class name of the modem service.
+     */
+    public String getModemService() {
+        String result;
+        Log.d(LOG_TAG, "getModemService");
+        TelephonyPermissions.enforceShellOnly(Binder.getCallingUid(), "getModemService");
+        TelephonyPermissions
+                        .enforceCallingOrSelfReadPrivilegedPhoneStatePermissionOrCarrierPrivilege(
+                        mApp, SubscriptionManager.INVALID_SUBSCRIPTION_ID,
+                        "getModemService");
+        result = mPhoneConfigurationManager.getModemService();
+        Log.d(LOG_TAG, "result = " + result);
+        return result;
+    }
 }
diff --git a/src/com/android/phone/TelephonyShellCommand.java b/src/com/android/phone/TelephonyShellCommand.java
index dbeb7ce..7eb3bd9 100644
--- a/src/com/android/phone/TelephonyShellCommand.java
+++ b/src/com/android/phone/TelephonyShellCommand.java
@@ -151,6 +151,10 @@
     private static final String UCE_SET_CAPABILITY_REQUEST_TIMEOUT =
             "set-capabilities-request-timeout";
 
+    private static final String RADIO_SUBCOMMAND = "radio";
+    private static final String RADIO_SET_MODEM_SERVICE = "set-modem-service";
+    private static final String RADIO_GET_MODEM_SERVICE = "get-modem-service";
+
     // Check if a package has carrier privileges on any SIM, regardless of subId/phoneId.
     private static final String HAS_CARRIER_PRIVILEGES_COMMAND = "has-carrier-privileges";
 
@@ -357,6 +361,8 @@
         pw.println("    Get the Allowed Network Types.");
         pw.println("  set-allowed-network-types-for-users");
         pw.println("    Set the Allowed Network Types.");
+        pw.println("  radio");
+        pw.println("    Radio Commands.");
         onHelpIms();
         onHelpUce();
         onHelpEmergencyNumber();
@@ -368,6 +374,7 @@
         onHelpD2D();
         onHelpDisableOrEnablePhysicalSubscription();
         onHelpAllowedNetworkTypes();
+        onHelpRadio();
     }
 
     private void onHelpD2D() {
@@ -656,6 +663,21 @@
         pw.println("        LTE only                   : 01000001000000000000");
     }
 
+    private void onHelpRadio() {
+        PrintWriter pw = getOutPrintWriter();
+        pw.println("Radio Commands:");
+        pw.println("  radio set-modem-service [-s SERVICE_NAME]");
+        pw.println("    Sets the class name of modem service defined in SERVICE_NAME");
+        pw.println("    to be the bound. Options are:");
+        pw.println("      -s: the service name that the modem service should be bound for.");
+        pw.println("          If no option is specified, it will bind to the default.");
+        pw.println("  radio get-modem-service");
+        pw.println("    Gets the service name of the currently defined modem service.");
+        pw.println("    If it is binding to default, 'default' returns.");
+        pw.println("    If it doesn't bind to any modem service for some reasons,");
+        pw.println("    the result would be 'unknown'.");
+    }
+
     private int handleImsCommand() {
         String arg = getNextArg();
         if (arg == null) {
@@ -2725,4 +2747,69 @@
             return -1;
         }
     }
+
+    private int handleRadioSetModemServiceCommand() {
+        PrintWriter errPw = getErrPrintWriter();
+        String serviceName = null;
+
+        String opt;
+        while ((opt = getNextOption()) != null) {
+            switch (opt) {
+                case "-s": {
+                    serviceName = getNextArgRequired();
+                    break;
+                }
+            }
+        }
+
+        try {
+            boolean result = mInterface.setModemService(serviceName);
+            if (VDBG) {
+                Log.v(LOG_TAG,
+                        "RadioSetModemService " + serviceName + ", result = " + result);
+            }
+            getOutPrintWriter().println(result);
+        } catch (RemoteException e) {
+            Log.w(LOG_TAG,
+                    "RadioSetModemService: " + serviceName + ", error = " + e.getMessage());
+            errPw.println("Exception: " + e.getMessage());
+            return -1;
+        }
+        return 0;
+    }
+
+    private int handleRadioGetModemServiceCommand() {
+        PrintWriter errPw = getErrPrintWriter();
+        String result;
+
+        try {
+            result = mInterface.getModemService();
+            getOutPrintWriter().println(result);
+        } catch (RemoteException e) {
+            errPw.println("Exception: " + e.getMessage());
+            return -1;
+        }
+        if (VDBG) {
+            Log.v(LOG_TAG, "RadioGetModemService, result = " + result);
+        }
+        return 0;
+    }
+
+    private int handleRadioCommand() {
+        String arg = getNextArg();
+        if (arg == null) {
+            onHelpRadio();
+            return 0;
+        }
+
+        switch (arg) {
+            case RADIO_SET_MODEM_SERVICE:
+                return handleRadioSetModemServiceCommand();
+
+            case RADIO_GET_MODEM_SERVICE:
+                return handleRadioGetModemServiceCommand();
+        }
+
+        return -1;
+    }
 }