summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Miranda Kephart <mkephart@google.com> 2024-02-13 14:52:32 -0500
committer Miranda Kephart <mkephart@google.com> 2024-02-27 18:41:56 +0000
commitf95951a0192dc29c6995929a5200c1995f49fdac (patch)
tree0e4c93972309cd871e3d9e0fe2d09e5d50025a35
parent3ef58a6d9853efacb3d651a56c821a9058ab51a0 (diff)
Remove obsolete action transition code from SaveImageInBackgroundTask
These action intents are now only used via their construction in ActionIntentCreator. Bug: 288586463 Bug: 287452614 Flag: NONE Test: atest, verify that shared transitions to markup/sharesheet still look correct Change-Id: Ia0f0767372611b80837e3eb9284d51424589ff64
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentExecutor.kt16
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java179
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java117
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java21
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/screenshot/SaveImageInBackgroundTaskTest.kt4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotNotificationSmartActionsTest.java93
6 files changed, 63 insertions, 367 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentExecutor.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentExecutor.kt
index fb5339df7212..1f9853b17a28 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentExecutor.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ActionIntentExecutor.kt
@@ -16,6 +16,8 @@
package com.android.systemui.screenshot
+import android.app.ActivityOptions
+import android.app.ExitTransitionCoordinator
import android.content.Context
import android.content.Intent
import android.os.Bundle
@@ -23,6 +25,7 @@ import android.os.Process.myUserHandle
import android.os.RemoteException
import android.os.UserHandle
import android.util.Log
+import android.util.Pair
import android.view.IRemoteAnimationFinishedCallback
import android.view.IRemoteAnimationRunner
import android.view.RemoteAnimationAdapter
@@ -64,18 +67,18 @@ constructor(
*/
fun launchIntentAsync(
intent: Intent,
- options: Bundle?,
+ transition: Pair<ActivityOptions, ExitTransitionCoordinator>?,
user: UserHandle,
overrideTransition: Boolean,
) {
applicationScope.launch("$TAG#launchIntentAsync") {
- launchIntent(intent, options, user, overrideTransition)
+ launchIntent(intent, transition, user, overrideTransition)
}
}
suspend fun launchIntent(
intent: Intent,
- options: Bundle?,
+ transition: Pair<ActivityOptions, ExitTransitionCoordinator>?,
user: UserHandle,
overrideTransition: Boolean,
) {
@@ -87,11 +90,14 @@ constructor(
} else {
dismissKeyguard()
}
+ transition?.second?.startExit()
if (user == myUserHandle()) {
- withContext(mainDispatcher) { context.startActivity(intent, options) }
+ withContext(mainDispatcher) {
+ context.startActivity(intent, transition?.first?.toBundle())
+ }
} else {
- launchCrossProfileIntent(user, intent, options)
+ launchCrossProfileIntent(user, intent, transition?.first?.toBundle())
}
if (overrideTransition) {
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
index 31086d85f747..bbf7ed529220 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/SaveImageInBackgroundTask.java
@@ -16,40 +16,29 @@
package com.android.systemui.screenshot;
-import static com.android.systemui.screenshot.LogConfig.DEBUG_ACTIONS;
import static com.android.systemui.screenshot.LogConfig.DEBUG_CALLBACK;
import static com.android.systemui.screenshot.LogConfig.DEBUG_STORAGE;
import static com.android.systemui.screenshot.LogConfig.logTag;
import static com.android.systemui.screenshot.ScreenshotNotificationSmartActionsProvider.ScreenshotSmartActionType;
-import android.app.ActivityTaskManager;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.ClipData;
import android.content.ClipDescription;
-import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.UserInfo;
-import android.content.res.Resources;
import android.graphics.Bitmap;
-import android.graphics.drawable.Icon;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Process;
-import android.os.RemoteException;
import android.os.UserHandle;
-import android.os.UserManager;
import android.provider.DeviceConfig;
-import android.text.TextUtils;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
-import com.android.systemui.res.R;
import com.android.systemui.flags.FeatureFlags;
-import com.android.systemui.screenshot.ScreenshotController.SavedImageData.ActionTransition;
import com.google.common.util.concurrent.ListenableFuture;
@@ -60,7 +49,6 @@ import java.util.List;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
-import java.util.function.Supplier;
/**
* An AsyncTask that saves an image to the media store in the background.
@@ -81,7 +69,6 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
private final ScreenshotNotificationSmartActionsProvider mSmartActionsProvider;
private String mScreenshotId;
private final Random mRandom = new Random();
- private final Supplier<ActionTransition> mSharedElementTransition;
private final ImageExporter mImageExporter;
private long mImageTime;
@@ -91,7 +78,6 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
ImageExporter exporter,
ScreenshotSmartActions screenshotSmartActions,
ScreenshotController.SaveImageInBackgroundData data,
- Supplier<ActionTransition> sharedElementTransition,
ScreenshotNotificationSmartActionsProvider
screenshotNotificationSmartActionsProvider
) {
@@ -100,7 +86,6 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
mScreenshotSmartActions = screenshotSmartActions;
mImageData = new ScreenshotController.SavedImageData();
mQuickShareData = new ScreenshotController.QuickShareData();
- mSharedElementTransition = sharedElementTransition;
mImageExporter = exporter;
// Prepare all the output metadata
@@ -176,12 +161,6 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
mImageData.uri = uri;
mImageData.owner = mParams.owner;
mImageData.smartActions = smartActions;
- mImageData.shareTransition = createShareAction(mContext, mContext.getResources(), uri,
- smartActionsEnabled);
- mImageData.editTransition = createEditAction(mContext, mContext.getResources(), uri,
- smartActionsEnabled);
- mImageData.deleteAction = createDeleteAction(mContext, mContext.getResources(), uri,
- smartActionsEnabled);
mImageData.quickShareAction = createQuickShareAction(
mQuickShareData.quickShareAction, mScreenshotId, uri, mImageTime, image,
mParams.owner);
@@ -234,164 +213,6 @@ class SaveImageInBackgroundTask extends AsyncTask<Void, Void, Void> {
mParams.clearImage();
}
- /**
- * Assumes that the action intent is sent immediately after being supplied.
- */
- @VisibleForTesting
- Supplier<ActionTransition> createShareAction(Context context, Resources r, Uri uri,
- boolean smartActionsEnabled) {
- return () -> {
- ActionTransition transition = mSharedElementTransition.get();
-
- // Note: Both the share and edit actions are proxied through ActionProxyReceiver in
- // order to do some common work like dismissing the keyguard and sending
- // closeSystemWindows
-
- // Create a share intent, this will always go through the chooser activity first
- // which should not trigger auto-enter PiP
- Intent sharingIntent = new Intent(Intent.ACTION_SEND);
- sharingIntent.setDataAndType(uri, "image/png");
- sharingIntent.putExtra(Intent.EXTRA_STREAM, uri);
- // Include URI in ClipData also, so that grantPermission picks it up.
- // We don't use setData here because some apps interpret this as "to:".
- ClipData clipdata = new ClipData(new ClipDescription("content",
- new String[]{ClipDescription.MIMETYPE_TEXT_PLAIN}),
- new ClipData.Item(uri));
- sharingIntent.setClipData(clipdata);
- sharingIntent.putExtra(Intent.EXTRA_SUBJECT, getSubjectString(mImageTime));
- sharingIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
- .addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
-
-
- // Make sure pending intents for the system user are still unique across users
- // by setting the (otherwise unused) request code to the current user id.
- int requestCode = context.getUserId();
-
- Intent sharingChooserIntent = Intent.createChooser(sharingIntent, null)
- .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK)
- .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
-
-
- // cancel current pending intent (if any) since clipData isn't used for matching
- PendingIntent pendingIntent = PendingIntent.getActivityAsUser(
- context, 0, sharingChooserIntent,
- PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
- transition.bundle, UserHandle.CURRENT);
-
- // Create a share action for the notification
- PendingIntent shareAction = PendingIntent.getBroadcastAsUser(context, requestCode,
- new Intent(context, ActionProxyReceiver.class)
- .putExtra(ScreenshotController.EXTRA_ACTION_INTENT, pendingIntent)
- .putExtra(ScreenshotController.EXTRA_DISALLOW_ENTER_PIP, true)
- .putExtra(ScreenshotController.EXTRA_ID, mScreenshotId)
- .putExtra(ScreenshotController.EXTRA_SMART_ACTIONS_ENABLED,
- smartActionsEnabled)
- .setAction(Intent.ACTION_SEND)
- .addFlags(Intent.FLAG_RECEIVER_FOREGROUND),
- PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
- UserHandle.SYSTEM);
-
- Notification.Action.Builder shareActionBuilder = new Notification.Action.Builder(
- Icon.createWithResource(r, R.drawable.ic_screenshot_share),
- r.getString(com.android.internal.R.string.share), shareAction);
-
- transition.action = shareActionBuilder.build();
- return transition;
- };
- }
-
- @VisibleForTesting
- Supplier<ActionTransition> createEditAction(Context context, Resources r, Uri uri,
- boolean smartActionsEnabled) {
- return () -> {
- ActionTransition transition = mSharedElementTransition.get();
- // Note: Both the share and edit actions are proxied through ActionProxyReceiver in
- // order to do some common work like dismissing the keyguard and sending
- // closeSystemWindows
-
- // Create an edit intent, if a specific package is provided as the editor, then
- // launch that directly
- String editorPackage = context.getString(R.string.config_screenshotEditor);
- Intent editIntent = new Intent(Intent.ACTION_EDIT);
- if (!TextUtils.isEmpty(editorPackage)) {
- editIntent.setComponent(ComponentName.unflattenFromString(editorPackage));
- }
- editIntent.setDataAndType(uri, "image/png");
- editIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- editIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
- editIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
-
- PendingIntent pendingIntent = PendingIntent.getActivityAsUser(
- context, 0, editIntent, PendingIntent.FLAG_IMMUTABLE,
- transition.bundle, UserHandle.CURRENT);
-
- // Make sure pending intents for the system user are still unique across users
- // by setting the (otherwise unused) request code to the current user id.
- int requestCode = mContext.getUserId();
-
- // Create an edit action
- PendingIntent editAction = PendingIntent.getBroadcastAsUser(context, requestCode,
- new Intent(context, ActionProxyReceiver.class)
- .putExtra(ScreenshotController.EXTRA_ACTION_INTENT, pendingIntent)
- .putExtra(ScreenshotController.EXTRA_ID, mScreenshotId)
- .putExtra(ScreenshotController.EXTRA_SMART_ACTIONS_ENABLED,
- smartActionsEnabled)
- .putExtra(ScreenshotController.EXTRA_OVERRIDE_TRANSITION, true)
- .setAction(Intent.ACTION_EDIT)
- .addFlags(Intent.FLAG_RECEIVER_FOREGROUND),
- PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
- UserHandle.SYSTEM);
- Notification.Action.Builder editActionBuilder = new Notification.Action.Builder(
- Icon.createWithResource(r, R.drawable.ic_screenshot_edit),
- r.getString(com.android.internal.R.string.screenshot_edit), editAction);
-
- transition.action = editActionBuilder.build();
- return transition;
- };
- }
-
- @VisibleForTesting
- Notification.Action createDeleteAction(Context context, Resources r, Uri uri,
- boolean smartActionsEnabled) {
- // Make sure pending intents for the system user are still unique across users
- // by setting the (otherwise unused) request code to the current user id.
- int requestCode = mContext.getUserId();
-
- // Create a delete action for the notification
- PendingIntent deleteAction = PendingIntent.getBroadcast(context, requestCode,
- new Intent(context, DeleteScreenshotReceiver.class)
- .putExtra(ScreenshotController.SCREENSHOT_URI_ID, uri.toString())
- .putExtra(ScreenshotController.EXTRA_ID, mScreenshotId)
- .putExtra(ScreenshotController.EXTRA_SMART_ACTIONS_ENABLED,
- smartActionsEnabled)
- .addFlags(Intent.FLAG_RECEIVER_FOREGROUND),
- PendingIntent.FLAG_CANCEL_CURRENT
- | PendingIntent.FLAG_ONE_SHOT
- | PendingIntent.FLAG_IMMUTABLE);
- Notification.Action.Builder deleteActionBuilder = new Notification.Action.Builder(
- Icon.createWithResource(r, R.drawable.ic_screenshot_delete),
- r.getString(com.android.internal.R.string.delete), deleteAction);
-
- return deleteActionBuilder.build();
- }
-
- private UserHandle getUserHandleOfForegroundApplication(Context context) {
- UserManager manager = UserManager.get(context);
- int result;
- // This logic matches
- // com.android.systemui.statusbar.phone.PhoneStatusBarPolicy#updateManagedProfile
- try {
- result = ActivityTaskManager.getService().getLastResumedActivityUserId();
- } catch (RemoteException e) {
- if (DEBUG_ACTIONS) {
- Log.d(TAG, "Failed to get UserHandle of foreground app: ", e);
- }
- result = context.getUserId();
- }
- UserInfo userInfo = manager.getUserInfo(result);
- return userInfo.getUserHandle();
- }
-
private List<Notification.Action> buildSmartActions(
List<Notification.Action> actions, Context context) {
List<Notification.Action> broadcastActions = new ArrayList<>();
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
index 21a08a9a4980..ee3e7ba9e8b3 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java
@@ -39,7 +39,6 @@ import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityOptions;
import android.app.ExitTransitionCoordinator;
-import android.app.ExitTransitionCoordinator.ExitTransitionCallbacks;
import android.app.ICompatCameraControlCallback;
import android.app.Notification;
import android.app.assist.AssistContent;
@@ -54,7 +53,6 @@ import android.graphics.Insets;
import android.graphics.Rect;
import android.hardware.display.DisplayManager;
import android.net.Uri;
-import android.os.Bundle;
import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
@@ -87,13 +85,12 @@ import com.android.internal.app.ChooserActivity;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.policy.PhoneWindow;
import com.android.settingslib.applications.InterestingConfigChanges;
-import com.android.systemui.res.R;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.clipboardoverlay.ClipboardOverlayController;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
-import com.android.systemui.screenshot.ScreenshotController.SavedImageData.ActionTransition;
+import com.android.systemui.res.R;
import com.android.systemui.screenshot.TakeScreenshotService.RequestCallback;
import com.android.systemui.util.Assert;
@@ -111,7 +108,6 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.function.Consumer;
-import java.util.function.Supplier;
import javax.inject.Provider;
@@ -171,31 +167,16 @@ public class ScreenshotController {
*/
static class SavedImageData {
public Uri uri;
- public Supplier<ActionTransition> shareTransition;
- public Supplier<ActionTransition> editTransition;
- public Notification.Action deleteAction;
public List<Notification.Action> smartActions;
public Notification.Action quickShareAction;
public UserHandle owner;
public String subject; // Title for sharing
/**
- * POD for shared element transition.
- */
- static class ActionTransition {
- public Bundle bundle;
- public Notification.Action action;
- public Runnable onCancelRunnable;
- }
-
- /**
* Used to reset the return data on error
*/
public void reset() {
uri = null;
- shareTransition = null;
- editTransition = null;
- deleteAction = null;
smartActions = null;
quickShareAction = null;
subject = null;
@@ -469,8 +450,9 @@ public class ScreenshotController {
if (!shouldShowUi()) {
saveScreenshotInWorkerThread(
- screenshot.getUserHandle(), finisher, this::logSuccessOnActionsReady,
- (ignored) -> {});
+ screenshot.getUserHandle(), finisher, this::logSuccessOnActionsReady,
+ (ignored) -> {
+ });
return;
}
@@ -489,7 +471,7 @@ public class ScreenshotController {
if (screenshot.getType() == WindowManager.TAKE_SCREENSHOT_PROVIDED_IMAGE) {
if (screenshot.getScreenBounds() != null
&& aspectRatiosMatch(screenshot.getBitmap(), screenshot.getInsets(),
- screenshot.getScreenBounds())) {
+ screenshot.getScreenBounds())) {
showFlash = false;
} else {
showFlash = true;
@@ -643,6 +625,12 @@ public class ScreenshotController {
}
@Override
+ public void onAction(Intent intent, UserHandle owner, boolean overrideTransition) {
+ mActionExecutor.launchIntentAsync(
+ intent, createWindowTransition(), owner, overrideTransition);
+ }
+
+ @Override
public void onDismiss() {
finishDismiss();
}
@@ -652,7 +640,7 @@ public class ScreenshotController {
// TODO(159460485): Remove this when focus is handled properly in the system
setWindowFocusable(false);
}
- }, mActionExecutor, mFlags);
+ }, mFlags);
mScreenshotView.setDefaultDisplay(mDisplayId);
mScreenshotView.setDefaultTimeoutMillis(mScreenshotHandler.getDefaultTimeoutMillis());
@@ -964,6 +952,35 @@ public class ScreenshotController {
mScreenshotAnimation.start();
}
+ /**
+ * Supplies the necessary bits for the shared element transition to share sheet.
+ * Note that once called, the action intent to share must be sent immediately after.
+ */
+ private Pair<ActivityOptions, ExitTransitionCoordinator> createWindowTransition() {
+ ExitTransitionCoordinator.ExitTransitionCallbacks callbacks =
+ new ExitTransitionCoordinator.ExitTransitionCallbacks() {
+ @Override
+ public boolean isReturnTransitionAllowed() {
+ return false;
+ }
+
+ @Override
+ public void hideSharedElements() {
+ finishDismiss();
+ }
+
+ @Override
+ public void onFinish() {
+ }
+ };
+ Pair<ActivityOptions, ExitTransitionCoordinator> transition =
+ ActivityOptions.startSharedElementAnimation(mWindow, callbacks, null,
+ Pair.create(mScreenshotView.getScreenshotPreview(),
+ ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME));
+
+ return transition;
+ }
+
/** Reset screenshot view and then call onCompleteRunnable */
private void finishDismiss() {
Log.d(TAG, "finishDismiss");
@@ -1011,7 +1028,7 @@ public class ScreenshotController {
}
mSaveInBgTask = new SaveImageInBackgroundTask(mContext, mFlags, mImageExporter,
- mScreenshotSmartActions, data, getActionTransitionSupplier(),
+ mScreenshotSmartActions, data,
mScreenshotNotificationSmartActionsProvider);
mSaveInBgTask.execute();
}
@@ -1078,26 +1095,6 @@ public class ScreenshotController {
}
/**
- * Supplies the necessary bits for the shared element transition to share sheet.
- * Note that once supplied, the action intent to share must be sent immediately after.
- */
- private Supplier<ActionTransition> getActionTransitionSupplier() {
- return () -> {
- Pair<ActivityOptions, ExitTransitionCoordinator> transition =
- ActivityOptions.startSharedElementAnimation(
- mWindow, new ScreenshotExitTransitionCallbacksSupplier(true).get(),
- null, Pair.create(mScreenshotView.getScreenshotPreview(),
- ChooserActivity.FIRST_IMAGE_PREVIEW_TRANSITION_NAME));
- transition.second.startExit();
-
- ActionTransition supply = new ActionTransition();
- supply.bundle = transition.first.toBundle();
- supply.onCancelRunnable = () -> ActivityOptions.stopSharedElementAnimation(mWindow);
- return supply;
- };
- }
-
- /**
* Logs success/failure of the screenshot saving task, and shows an error if it failed.
*/
private void logSuccessOnActionsReady(ScreenshotController.SavedImageData imageData) {
@@ -1186,36 +1183,6 @@ public class ScreenshotController {
return matchWithinTolerance;
}
- private class ScreenshotExitTransitionCallbacksSupplier implements
- Supplier<ExitTransitionCallbacks> {
- final boolean mDismissOnHideSharedElements;
-
- ScreenshotExitTransitionCallbacksSupplier(boolean dismissOnHideSharedElements) {
- mDismissOnHideSharedElements = dismissOnHideSharedElements;
- }
-
- @Override
- public ExitTransitionCallbacks get() {
- return new ExitTransitionCallbacks() {
- @Override
- public boolean isReturnTransitionAllowed() {
- return false;
- }
-
- @Override
- public void hideSharedElements() {
- if (mDismissOnHideSharedElements) {
- finishDismiss();
- }
- }
-
- @Override
- public void onFinish() {
- }
- };
- }
- }
-
/** Injectable factory to create screenshot controller instances for a specific display. */
@AssistedFactory
public interface Factory {
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
index 31c928406aac..be30a1576b21 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java
@@ -57,6 +57,7 @@ import android.graphics.drawable.LayerDrawable;
import android.os.Bundle;
import android.os.Looper;
import android.os.RemoteException;
+import android.os.UserHandle;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
@@ -86,9 +87,9 @@ import androidx.constraintlayout.widget.ConstraintLayout;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.logging.UiEventLogger;
-import com.android.systemui.res.R;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
+import com.android.systemui.res.R;
import com.android.systemui.shared.system.InputChannelCompat;
import com.android.systemui.shared.system.InputMonitorCompat;
import com.android.systemui.shared.system.QuickStepContract;
@@ -104,6 +105,8 @@ public class ScreenshotView extends FrameLayout implements
interface ScreenshotViewCallback {
void onUserInteraction();
+ void onAction(Intent intent, UserHandle owner, boolean overrideTransition);
+
void onDismiss();
/** DOWN motion event was observed outside of the touchable areas of this view. */
@@ -166,7 +169,6 @@ public class ScreenshotView extends FrameLayout implements
private final InteractionJankMonitor mInteractionJankMonitor;
private long mDefaultTimeoutOfTimeoutHandler;
- private ActionIntentExecutor mActionExecutor;
private FeatureFlags mFlags;
private final Bundle mInteractiveBroadcastOption;
@@ -430,11 +432,9 @@ public class ScreenshotView extends FrameLayout implements
* Note: must be called before any other (non-constructor) method or null pointer exceptions
* may occur.
*/
- void init(UiEventLogger uiEventLogger, ScreenshotViewCallback callbacks,
- ActionIntentExecutor actionExecutor, FeatureFlags flags) {
+ void init(UiEventLogger uiEventLogger, ScreenshotViewCallback callbacks, FeatureFlags flags) {
mUiEventLogger = uiEventLogger;
mCallbacks = callbacks;
- mActionExecutor = actionExecutor;
mFlags = flags;
}
@@ -800,24 +800,21 @@ public class ScreenshotView extends FrameLayout implements
shareIntent = ActionIntentCreator.INSTANCE.createShareWithSubject(
imageData.uri, imageData.subject);
}
- mActionExecutor.launchIntentAsync(shareIntent,
- imageData.shareTransition.get().bundle,
- imageData.owner, false);
+ mCallbacks.onAction(shareIntent, imageData.owner, false);
+
});
mEditChip.setOnClickListener(v -> {
mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_EDIT_TAPPED, 0, mPackageName);
prepareSharedTransition();
- mActionExecutor.launchIntentAsync(
+ mCallbacks.onAction(
ActionIntentCreator.INSTANCE.createEdit(imageData.uri, mContext),
- imageData.editTransition.get().bundle,
imageData.owner, true);
});
mScreenshotPreview.setOnClickListener(v -> {
mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_PREVIEW_TAPPED, 0, mPackageName);
prepareSharedTransition();
- mActionExecutor.launchIntentAsync(
+ mCallbacks.onAction(
ActionIntentCreator.INSTANCE.createEdit(imageData.uri, mContext),
- imageData.editTransition.get().bundle,
imageData.owner, true);
});
if (mQuickShareChip != null) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/SaveImageInBackgroundTaskTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/SaveImageInBackgroundTaskTest.kt
index fbb77cdc3049..25dd9fedba7c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/SaveImageInBackgroundTaskTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/SaveImageInBackgroundTaskTest.kt
@@ -34,7 +34,6 @@ import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import java.util.concurrent.CompletableFuture
-import java.util.function.Supplier
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Before
@@ -46,8 +45,6 @@ class SaveImageInBackgroundTaskTest : SysuiTestCase() {
private val smartActions = mock<ScreenshotSmartActions>()
private val smartActionsProvider = mock<ScreenshotNotificationSmartActionsProvider>()
private val saveImageData = SaveImageInBackgroundData()
- private val sharedTransitionSupplier =
- mock<Supplier<ScreenshotController.SavedImageData.ActionTransition>>()
private val testScreenshotId: String = "testScreenshotId"
private val testBitmap = mock<Bitmap>()
private val testUser = UserHandle.getUserHandleForUid(0)
@@ -88,7 +85,6 @@ class SaveImageInBackgroundTaskTest : SysuiTestCase() {
imageExporter,
smartActions,
saveImageData,
- sharedTransitionSupplier,
smartActionsProvider,
)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotNotificationSmartActionsTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotNotificationSmartActionsTest.java
index 85c8ba7e77b3..2a9aca7f5a35 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotNotificationSmartActionsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotNotificationSmartActionsTest.java
@@ -20,8 +20,6 @@ import static com.android.systemui.screenshot.ScreenshotNotificationSmartActions
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.doThrow;
@@ -32,19 +30,15 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.Notification;
-import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
-import android.os.Bundle;
import android.os.Handler;
-import android.os.Looper;
import android.os.UserHandle;
import android.testing.AndroidTestingRunner;
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
-import com.android.systemui.screenshot.ScreenshotController.SavedImageData.ActionTransition;
import org.junit.Before;
import org.junit.Test;
@@ -84,7 +78,7 @@ public class ScreenshotNotificationSmartActionsTest extends SysuiTestCase {
ScreenshotNotificationSmartActionsProvider smartActionsProvider = mock(
ScreenshotNotificationSmartActionsProvider.class);
when(smartActionsProvider.getActions(any(), any(), any(), any(), any(), any()))
- .thenThrow(RuntimeException.class);
+ .thenThrow(RuntimeException.class);
CompletableFuture<List<Notification.Action>> smartActionsFuture =
mScreenshotSmartActions.getSmartActionsFuture(
"", Uri.parse("content://authority/data"), bitmap, smartActionsProvider,
@@ -166,89 +160,4 @@ public class ScreenshotNotificationSmartActionsTest extends SysuiTestCase {
List<Notification.Action> smartActions = smartActionsFuture.get(5, TimeUnit.MILLISECONDS);
assertEquals(smartActions.size(), 0);
}
-
- // Tests for share action extras
- @Test
- public void testShareActionExtras() {
- if (Looper.myLooper() == null) {
- Looper.prepare();
- }
-
- ScreenshotController.SaveImageInBackgroundData
- data = new ScreenshotController.SaveImageInBackgroundData();
- data.image = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
- data.finisher = null;
- data.mActionsReadyListener = null;
- SaveImageInBackgroundTask task =
- new SaveImageInBackgroundTask(mContext, null, null, mScreenshotSmartActions, data,
- ActionTransition::new, mSmartActionsProvider);
-
- Notification.Action shareAction = task.createShareAction(mContext, mContext.getResources(),
- Uri.parse("Screenshot_123.png"), true).get().action;
-
- Intent intent = shareAction.actionIntent.getIntent();
- assertNotNull(intent);
- Bundle bundle = intent.getExtras();
- assertTrue(bundle.containsKey(ScreenshotController.EXTRA_ID));
- assertTrue(bundle.containsKey(ScreenshotController.EXTRA_SMART_ACTIONS_ENABLED));
- assertEquals(ScreenshotController.ACTION_TYPE_SHARE, shareAction.title);
- assertEquals(Intent.ACTION_SEND, intent.getAction());
- }
-
- // Tests for edit action extras
- @Test
- public void testEditActionExtras() {
- if (Looper.myLooper() == null) {
- Looper.prepare();
- }
-
- ScreenshotController.SaveImageInBackgroundData
- data = new ScreenshotController.SaveImageInBackgroundData();
- data.image = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
- data.finisher = null;
- data.mActionsReadyListener = null;
- SaveImageInBackgroundTask task =
- new SaveImageInBackgroundTask(mContext, null, null, mScreenshotSmartActions, data,
- ActionTransition::new, mSmartActionsProvider);
-
- Notification.Action editAction = task.createEditAction(mContext, mContext.getResources(),
- Uri.parse("Screenshot_123.png"), true).get().action;
-
- Intent intent = editAction.actionIntent.getIntent();
- assertNotNull(intent);
- Bundle bundle = intent.getExtras();
- assertTrue(bundle.containsKey(ScreenshotController.EXTRA_ID));
- assertTrue(bundle.containsKey(ScreenshotController.EXTRA_SMART_ACTIONS_ENABLED));
- assertEquals(ScreenshotController.ACTION_TYPE_EDIT, editAction.title);
- assertEquals(Intent.ACTION_EDIT, intent.getAction());
- }
-
- // Tests for share action extras
- @Test
- public void testDeleteActionExtras() {
- if (Looper.myLooper() == null) {
- Looper.prepare();
- }
-
- ScreenshotController.SaveImageInBackgroundData
- data = new ScreenshotController.SaveImageInBackgroundData();
- data.image = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
- data.finisher = null;
- data.mActionsReadyListener = null;
- SaveImageInBackgroundTask task =
- new SaveImageInBackgroundTask(mContext, null, null, mScreenshotSmartActions, data,
- ActionTransition::new, mSmartActionsProvider);
-
- Notification.Action deleteAction = task.createDeleteAction(mContext,
- mContext.getResources(),
- Uri.parse("Screenshot_123.png"), true);
-
- Intent intent = deleteAction.actionIntent.getIntent();
- assertNotNull(intent);
- Bundle bundle = intent.getExtras();
- assertTrue(bundle.containsKey(ScreenshotController.EXTRA_ID));
- assertTrue(bundle.containsKey(ScreenshotController.EXTRA_SMART_ACTIONS_ENABLED));
- assertEquals(deleteAction.title, ScreenshotController.ACTION_TYPE_DELETE);
- assertNull(intent.getAction());
- }
}