Add single use App specific incoming SMSes

This allows applications to request that an upcoming incoming SMS be
routed directly to the calling application and to do so without
needing the RECEIVE_SMS permission.

This is especially important for ephemeral applications which we do not
want to have the ability to get the RECEIVE_SMS permission but do want
to support SMS based phone number verification. Ephemeral apps can use
this API to receive and SMS from their backend but will not be able to
access other SMSes on the device.

This is done by providing the app a token which when included in a
subsequent SMS message causes the application provided PendingIntent to
be sent with the SMS message data attached.

Test: Verified that an SMS containing the code is routed to the app.
Test: runtest --path GsmInboundHandlerTest.java
Test: cts-tradefed run cts -m CtsPermission2TestCases

Bug: 33047670
Change-Id: Iea60bfd1d3f9b8f013b34a82a480c65006416c4c
diff --git a/api/current.txt b/api/current.txt
index 6bec747..59cc432 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -37584,6 +37584,7 @@
   }
 
   public final class SmsManager {
+    method public java.lang.String createAppSpecificSmsToken(android.app.PendingIntent);
     method public java.util.ArrayList<java.lang.String> divideMessage(java.lang.String);
     method public void downloadMultimediaMessage(android.content.Context, java.lang.String, android.net.Uri, android.os.Bundle, android.app.PendingIntent);
     method public android.os.Bundle getCarrierConfigValues();
diff --git a/api/system-current.txt b/api/system-current.txt
index 1f3fd7d..141f12f 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -40664,6 +40664,7 @@
   }
 
   public final class SmsManager {
+    method public java.lang.String createAppSpecificSmsToken(android.app.PendingIntent);
     method public java.util.ArrayList<java.lang.String> divideMessage(java.lang.String);
     method public void downloadMultimediaMessage(android.content.Context, java.lang.String, android.net.Uri, android.os.Bundle, android.app.PendingIntent);
     method public android.os.Bundle getCarrierConfigValues();
diff --git a/api/test-current.txt b/api/test-current.txt
index 4a4bf70..c9a3579 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -37678,6 +37678,7 @@
   }
 
   public final class SmsManager {
+    method public java.lang.String createAppSpecificSmsToken(android.app.PendingIntent);
     method public java.util.ArrayList<java.lang.String> divideMessage(java.lang.String);
     method public void downloadMultimediaMessage(android.content.Context, java.lang.String, android.net.Uri, android.os.Bundle, android.app.PendingIntent);
     method public android.os.Bundle getCarrierConfigValues();
diff --git a/telephony/java/com/android/internal/telephony/ISms.aidl b/telephony/java/com/android/internal/telephony/ISms.aidl
index 6115656..fe37531 100644
--- a/telephony/java/com/android/internal/telephony/ISms.aidl
+++ b/telephony/java/com/android/internal/telephony/ISms.aidl
@@ -447,4 +447,16 @@
     void sendStoredMultipartText(int subId, String callingPkg, in Uri messageUri,
                 String scAddress, in List<PendingIntent> sentIntents,
                 in List<PendingIntent> deliveryIntents);
+
+    /**
+     * Create an app-only incoming SMS request for the calling package.
+     *
+     * If an incoming text contains the token returned by this method the provided
+     * <code>PendingIntent</code> will be sent containing the SMS data.
+     *
+     * @param subId the SIM id.
+     * @param callingPkg the package name of the calling app.
+     * @param intent PendingIntent to be sent when an SMS is received containing the token.
+     */
+    String createAppSpecificSmsToken(int subId, String callingPkg, in PendingIntent intent);
 }