Add ability to add sim-initiated MO call to UI (2/4)

Add supporting (hidden) APIs to TelecomManager to add the ability to
add a previous unknown call to Telecom

Bug: 17787391

Change-Id: Ibdfaee81a55e11451c146751cf970980dccad435
diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java
index efd311e..5c15b4e 100644
--- a/telecomm/java/android/telecom/ConnectionService.java
+++ b/telecomm/java/android/telecom/ConnectionService.java
@@ -104,12 +104,14 @@
                 PhoneAccountHandle connectionManagerPhoneAccount,
                 String id,
                 ConnectionRequest request,
-                boolean isIncoming) {
+                boolean isIncoming,
+                boolean isUnknown) {
             SomeArgs args = SomeArgs.obtain();
             args.arg1 = connectionManagerPhoneAccount;
             args.arg2 = id;
             args.arg3 = request;
             args.argi1 = isIncoming ? 1 : 0;
+            args.argi2 = isUnknown ? 1 : 0;
             mHandler.obtainMessage(MSG_CREATE_CONNECTION, args).sendToTarget();
         }
 
@@ -221,6 +223,7 @@
                         final String id = (String) args.arg2;
                         final ConnectionRequest request = (ConnectionRequest) args.arg3;
                         final boolean isIncoming = args.argi1 == 1;
+                        final boolean isUnknown = args.argi2 == 1;
                         if (!mAreAccountsInitialized) {
                             Log.d(this, "Enqueueing pre-init request %s", id);
                             mPreInitializationConnectionRequests.add(new Runnable() {
@@ -230,7 +233,8 @@
                                             connectionManagerPhoneAccount,
                                             id,
                                             request,
-                                            isIncoming);
+                                            isIncoming,
+                                            isUnknown);
                                 }
                             });
                         } else {
@@ -238,7 +242,8 @@
                                     connectionManagerPhoneAccount,
                                     id,
                                     request,
-                                    isIncoming);
+                                    isIncoming,
+                                    isUnknown);
                         }
                     } finally {
                         args.recycle();
@@ -523,12 +528,14 @@
             final PhoneAccountHandle callManagerAccount,
             final String callId,
             final ConnectionRequest request,
-            boolean isIncoming) {
+            boolean isIncoming,
+            boolean isUnknown) {
         Log.d(this, "createConnection, callManagerAccount: %s, callId: %s, request: %s, " +
-                "isIncoming: %b", callManagerAccount, callId, request, isIncoming);
+                "isIncoming: %b, isUnknown: %b", callManagerAccount, callId, request, isIncoming,
+                isUnknown);
 
-        Connection connection = isIncoming
-                ? onCreateIncomingConnection(callManagerAccount, request)
+        Connection connection = isUnknown ? onCreateUnknownConnection(callManagerAccount, request)
+                : isIncoming ? onCreateIncomingConnection(callManagerAccount, request)
                 : onCreateOutgoingConnection(callManagerAccount, request);
         Log.d(this, "createConnection, connection: %s", connection);
         if (connection == null) {
@@ -873,6 +880,21 @@
     }
 
     /**
+     * Create a {@code Connection} for a new unknown call. An unknown call is a call originating
+     * from the ConnectionService that was neither a user-initiated outgoing call, nor an incoming
+     * call created using
+     * {@code TelecomManager#addNewIncomingCall(PhoneAccountHandle, android.os.Bundle)}.
+     *
+     * @param connectionManagerPhoneAccount
+     * @param request
+     * @return
+     */
+    public Connection onCreateUnknownConnection(PhoneAccountHandle connectionManagerPhoneAccount,
+            ConnectionRequest request) {
+       return null;
+    }
+
+    /**
      * Conference two specified connections. Invoked when the user has made a request to merge the
      * specified connections into a conference call. In response, the connection service should
      * create an instance of {@link Conference} and pass it into {@link #addConference}.
diff --git a/telecomm/java/android/telecom/RemoteConnectionService.java b/telecomm/java/android/telecom/RemoteConnectionService.java
index 328dc86..de1dc17 100644
--- a/telecomm/java/android/telecom/RemoteConnectionService.java
+++ b/telecomm/java/android/telecom/RemoteConnectionService.java
@@ -348,7 +348,8 @@
                     connectionManagerPhoneAccount,
                     id,
                     newRequest,
-                    isIncoming);
+                    isIncoming,
+                    false /* isUnknownCall */);
             connection.registerCallback(new RemoteConnection.Callback() {
                 @Override
                 public void onDestroyed(RemoteConnection connection) {
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index b4d429a..f3358f8 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -51,6 +51,13 @@
     public static final String ACTION_INCOMING_CALL = "android.telecom.action.INCOMING_CALL";
 
     /**
+     * Similar to {@link #ACTION_INCOMING_CALL}, but is used only by Telephony to add a new
+     * sim-initiated MO call for carrier testing.
+     * @hide
+     */
+    public static final String ACTION_NEW_UNKNOWN_CALL = "android.telecom.action.NEW_UNKNOWN_CALL";
+
+    /**
      * The {@link android.content.Intent} action used to configure a
      * {@link android.telecom.ConnectionService}.
      * @hide
@@ -125,6 +132,12 @@
             "android.telecom.extra.OUTGOING_CALL_EXTRAS";
 
     /**
+     * @hide
+     */
+    public static final String EXTRA_UNKNOWN_CALL_HANDLE =
+            "android.telecom.extra.UNKNOWN_CALL_HANDLE";
+
+    /**
      * Optional extra for {@link android.telephony.TelephonyManager#ACTION_PHONE_STATE_CHANGED}
      * containing the disconnect code.
      */
@@ -815,6 +828,29 @@
     }
 
     /**
+     * Registers a new unknown call with Telecom. This can only be called by the system Telephony
+     * service. This is invoked when Telephony detects a new unknown connection that was neither
+     * a new incoming call, nor an user-initiated outgoing call.
+     *
+     * @param phoneAccount A {@link PhoneAccountHandle} registered with
+     *            {@link #registerPhoneAccount}.
+     * @param extras A bundle that will be passed through to
+     *            {@link ConnectionService#onCreateIncomingConnection}.
+     * @hide
+     */
+    @SystemApi
+    public void addNewUnknownCall(PhoneAccountHandle phoneAccount, Bundle extras) {
+        try {
+            if (isServiceConnected()) {
+                getTelecomService().addNewUnknownCall(
+                        phoneAccount, extras == null ? new Bundle() : extras);
+            }
+        } catch (RemoteException e) {
+            Log.e(TAG, "RemoteException adding a new unknown call: " + phoneAccount, e);
+        }
+    }
+
+    /**
      * Processes the specified dial string as an MMI code.
      * MMI codes are any sequence of characters entered into the dialpad that contain a "*" or "#".
      * Some of these sequences launch special behavior through handled by Telephony.
diff --git a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl
index 1059da37..339a982 100644
--- a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl
+++ b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl
@@ -39,7 +39,8 @@
             in PhoneAccountHandle connectionManagerPhoneAccount,
             String callId,
             in ConnectionRequest request,
-            boolean isIncoming);
+            boolean isIncoming,
+            boolean isUnknown);
 
     void abort(String callId);
 
diff --git a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
index feb09d5..f1cf885 100644
--- a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
+++ b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
@@ -177,4 +177,9 @@
      * @see TelecomServiceImpl#addNewIncomingCall
      */
     void addNewIncomingCall(in PhoneAccountHandle phoneAccount, in Bundle extras);
+
+    /**
+     * @see TelecomServiceImpl#addNewUnknownCall
+     */
+    void addNewUnknownCall(in PhoneAccountHandle phoneAccount, in Bundle extras);
 }