Merge "New Autofill API: SaveCallback.onSuccess(IntentSender)."
diff --git a/api/current.txt b/api/current.txt
index c1188dc..93b6b42 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -37499,6 +37499,7 @@
   public final class SaveCallback {
     method public void onFailure(java.lang.CharSequence);
     method public void onSuccess();
+    method public void onSuccess(android.content.IntentSender);
   }
 
   public final class SaveInfo implements android.os.Parcelable {
diff --git a/core/java/android/service/autofill/ISaveCallback.aidl b/core/java/android/service/autofill/ISaveCallback.aidl
index e260c73..a9364fe 100644
--- a/core/java/android/service/autofill/ISaveCallback.aidl
+++ b/core/java/android/service/autofill/ISaveCallback.aidl
@@ -16,12 +16,14 @@
 
 package android.service.autofill;
 
+import android.content.IntentSender;
+
 /**
  * Interface to receive the result of a save request.
  *
  * @hide
  */
 interface ISaveCallback {
-    void onSuccess();
+    void onSuccess(in IntentSender intentSender);
     void onFailure(CharSequence message);
 }
diff --git a/core/java/android/service/autofill/SaveCallback.java b/core/java/android/service/autofill/SaveCallback.java
index 7207f1d..855981a 100644
--- a/core/java/android/service/autofill/SaveCallback.java
+++ b/core/java/android/service/autofill/SaveCallback.java
@@ -16,9 +16,14 @@
 
 package android.service.autofill;
 
+import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.app.Activity;
+import android.content.IntentSender;
 import android.os.RemoteException;
 
+import com.android.internal.util.Preconditions;
+
 /**
  * Handles save requests from the {@link AutofillService} into the {@link Activity} being
  * autofilled.
@@ -36,18 +41,33 @@
      * Notifies the Android System that an
      * {@link AutofillService#onSaveRequest(SaveRequest, SaveCallback)} was successfully handled
      * by the service.
-     *
-     * <p>If the service could not handle the request right away&mdash;for example, because it must
-     * launch an activity asking the user to authenticate first or because the network is
-     * down&mdash;it should still call {@link #onSuccess()}.
-     *
-     * @throws RuntimeException if an error occurred while calling the Android System.
      */
     public void onSuccess() {
+        onSuccessInternal(null);
+    }
+
+    /**
+     * Notifies the Android System that an
+     * {@link AutofillService#onSaveRequest(SaveRequest, SaveCallback)} was successfully handled
+     * by the service.
+     *
+     * <p>This method is useful when the service requires extra work&mdash;for example, launching an
+     * activity asking the user to authenticate first &mdash;before it can process the request,
+     * as the intent will be launched from the context of the activity being autofilled and hence
+     * will be part of that activity's stack.
+     *
+     * @param intentSender intent that will be launched from the context of activity being
+     * autofilled.
+     */
+    public void onSuccess(@NonNull IntentSender intentSender) {
+        onSuccessInternal(Preconditions.checkNotNull(intentSender));
+    }
+
+    private void onSuccessInternal(@Nullable IntentSender intentSender) {
         assertNotCalled();
         mCalled = true;
         try {
-            mCallback.onSuccess();
+            mCallback.onSuccess(intentSender);
         } catch (RemoteException e) {
             e.rethrowAsRuntimeException();
         }
@@ -63,11 +83,10 @@
      * the {@link SaveRequest} and call {@link #onSuccess()} instead.
      *
      * <p><b>Note:</b> The Android System displays an UI with the supplied error message; if
-     * you prefer to show your own message, call {@link #onSuccess()} instead.
+     * you prefer to show your own message, call {@link #onSuccess()} or
+     * {@link #onSuccess(IntentSender)} instead.
      *
      * @param message error message to be displayed to the user.
-     *
-     * @throws RuntimeException if an error occurred while calling the Android System.
      */
     public void onFailure(CharSequence message) {
         assertNotCalled();
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index 1917847..32af29d 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -4010,7 +4010,8 @@
     FIELD_AUTOFILL_NUM_IDS = 917;
 
     // ACTION: An autofill service was reqiested to save data
-    // Type TYPE_SUCCESS: The request succeeded
+    // Type TYPE_SUCCESS: The request succeeded right away
+    // Type TYPE_OPEN: The request succeeded but the service launched an IntentSender
     // Type TYPE_FAILURE: The request failed
     // Package: Package of app that was autofilled
     // Tag FIELD_AUTOFILL_SERVICE: Package of service that processed the request
diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
index af55807..831c488 100644
--- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java
+++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
@@ -26,6 +26,7 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentSender;
 import android.content.ServiceConnection;
 import android.os.Handler;
 import android.os.IBinder;
@@ -100,7 +101,8 @@
                 @NonNull String servicePackageName);
         void onFillRequestFailure(@Nullable CharSequence message,
                 @NonNull String servicePackageName);
-        void onSaveRequestSuccess(@NonNull String servicePackageName);
+        void onSaveRequestSuccess(@NonNull String servicePackageName,
+                @Nullable IntentSender intentSender);
         void onSaveRequestFailure(@Nullable CharSequence message,
                 @NonNull String servicePackageName);
         void onServiceDied(RemoteFillService service);
@@ -308,10 +310,11 @@
         });
     }
 
-    private void dispatchOnSaveRequestSuccess(PendingRequest pendingRequest) {
+    private void dispatchOnSaveRequestSuccess(PendingRequest pendingRequest,
+            IntentSender intentSender) {
         mHandler.getHandler().post(() -> {
             if (handleResponseCallbackCommon(pendingRequest)) {
-                mCallbacks.onSaveRequestSuccess(mComponentName.getPackageName());
+                mCallbacks.onSaveRequestSuccess(mComponentName.getPackageName(), intentSender);
             }
         });
     }
@@ -624,12 +627,13 @@
 
             mCallback = new ISaveCallback.Stub() {
                 @Override
-                public void onSuccess() {
+                public void onSuccess(IntentSender intentSender) {
                     if (!finish()) return;
 
                     final RemoteFillService remoteService = getService();
                     if (remoteService != null) {
-                        remoteService.dispatchOnSaveRequestSuccess(PendingSaveRequest.this);
+                        remoteService.dispatchOnSaveRequestSuccess(PendingSaveRequest.this,
+                                intentSender);
                     }
                 }
 
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 9741486..99b92b9 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -561,7 +561,8 @@
 
     // FillServiceCallbacks
     @Override
-    public void onSaveRequestSuccess(@NonNull String servicePackageName) {
+    public void onSaveRequestSuccess(@NonNull String servicePackageName,
+            @Nullable IntentSender intentSender) {
         synchronized (mLock) {
             mIsSaving = false;
 
@@ -572,8 +573,12 @@
             }
         }
         LogMaker log = newLogMaker(MetricsEvent.AUTOFILL_DATA_SAVE_REQUEST, servicePackageName)
-                .setType(MetricsEvent.TYPE_SUCCESS);
+                .setType(intentSender == null ? MetricsEvent.TYPE_SUCCESS : MetricsEvent.TYPE_OPEN);
         mMetricsLogger.write(log);
+        if (intentSender != null) {
+            if (sDebug) Slog.d(TAG, "Starting intent sender on save()");
+            startIntentSender(intentSender);
+        }
 
         // Nothing left to do...
         removeSelf();