Merge "Revert "Support launching an intent based drag into split"" into main
diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml
index 48e6428..cbfa74e 100644
--- a/libs/WindowManager/Shell/res/values/dimen.xml
+++ b/libs/WindowManager/Shell/res/values/dimen.xml
@@ -101,10 +101,6 @@
<dimen name="split_divider_bar_width">10dp</dimen>
<dimen name="split_divider_corner_size">42dp</dimen>
- <!-- The distance from the edge of the screen to invoke splitscreen when the user is dragging
- an intent that can be launched into split. -->
- <dimen name="drag_launchable_intent_edge_margin">48dp</dimen>
-
<!-- One-Handed Mode -->
<!-- Threshold for dragging distance to enable one-handed mode -->
<dimen name="gestures_onehanded_drag_threshold">20dp</dimen>
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java
index 7da1b23..1afbdf9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java
@@ -59,6 +59,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
+import com.android.internal.logging.InstanceId;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.protolog.common.ProtoLog;
import com.android.launcher3.icons.IconProvider;
@@ -315,11 +316,12 @@
return false;
}
// TODO(b/290391688): Also update the session data with task stack changes
- pd.dragSession = new DragSession(ActivityTaskManager.getInstance(),
+ InstanceId loggerSessionId = mLogger.logStart(event);
+ pd.activeDragCount++;
+ pd.dragSession = new DragSession(mContext, ActivityTaskManager.getInstance(),
mDisplayController.getDisplayLayout(displayId), event.getClipData());
pd.dragSession.update();
- pd.activeDragCount++;
- pd.dragLayout.prepare(pd.dragSession, mLogger.logStart(pd.dragSession));
+ pd.dragLayout.prepare(pd.dragSession, loggerSessionId);
setDropTargetWindowVisibility(pd, View.VISIBLE);
notifyListeners(l -> {
l.onDragStarted();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropEventLogger.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropEventLogger.java
index 75b126c..2a7dd5a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropEventLogger.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropEventLogger.java
@@ -53,21 +53,17 @@
/**
* Logs the start of a drag.
*/
- public InstanceId logStart(DragSession session) {
- mInstanceId = session.appData != null
- ? session.appData.getParcelableExtra(ClipDescription.EXTRA_LOGGING_INSTANCE_ID,
- InstanceId.class)
- : null;
+ public InstanceId logStart(DragEvent event) {
+ final ClipDescription description = event.getClipDescription();
+ final ClipData data = event.getClipData();
+ final ClipData.Item item = data.getItemAt(0);
+ mInstanceId = item.getIntent().getParcelableExtra(
+ ClipDescription.EXTRA_LOGGING_INSTANCE_ID);
if (mInstanceId == null) {
mInstanceId = mIdSequence.newInstanceId();
}
- mActivityInfo = session.activityInfo;
- if (session.appData != null) {
- log(getStartEnum(session.getClipDescription()), mActivityInfo);
- } else {
- // TODO(b/255649902): Update this once we have a new enum
- log(DragAndDropUiEventEnum.GLOBAL_APP_DRAG_START_ACTIVITY, mActivityInfo);
- }
+ mActivityInfo = item.getActivityInfo();
+ log(getStartEnum(description), mActivityInfo);
return mInstanceId;
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java
index 29fe9ab..a31a773 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java
@@ -29,8 +29,6 @@
import static android.content.Intent.EXTRA_SHORTCUT_ID;
import static android.content.Intent.EXTRA_TASK_ID;
import static android.content.Intent.EXTRA_USER;
-import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
-import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT;
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT;
@@ -54,7 +52,6 @@
import android.graphics.Insets;
import android.graphics.Rect;
import android.graphics.RectF;
-import android.os.Build;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.UserHandle;
@@ -66,10 +63,8 @@
import androidx.annotation.VisibleForTesting;
import com.android.internal.logging.InstanceId;
-import com.android.internal.protolog.common.ProtoLog;
import com.android.wm.shell.R;
import com.android.wm.shell.common.split.SplitScreenConstants.SplitPosition;
-import com.android.wm.shell.protolog.ShellProtoLogGroup;
import com.android.wm.shell.splitscreen.SplitScreenController;
import java.lang.annotation.Retention;
@@ -109,9 +104,7 @@
void start(DragSession session, InstanceId loggerSessionId) {
mLoggerSessionId = loggerSessionId;
mSession = session;
- RectF disallowHitRegion = mSession.appData != null
- ? (RectF) mSession.appData.getExtra(EXTRA_DISALLOW_HIT_REGION)
- : null;
+ RectF disallowHitRegion = (RectF) mSession.dragData.getExtra(EXTRA_DISALLOW_HIT_REGION);
if (disallowHitRegion == null) {
mDisallowHitRegion.setEmpty();
} else {
@@ -230,7 +223,7 @@
}
@VisibleForTesting
- void handleDrop(Target target) {
+ void handleDrop(Target target, ClipData data) {
if (target == null || !mTargets.contains(target)) {
return;
}
@@ -245,81 +238,41 @@
mSplitScreen.onDroppedToSplit(position, mLoggerSessionId);
}
- if (mSession.appData != null) {
- launchApp(mSession, position);
- } else {
- launchIntent(mSession, position);
- }
+ final ClipDescription description = data.getDescription();
+ final Intent dragData = mSession.dragData;
+ startClipDescription(description, dragData, position);
}
- /**
- * Launches an app provided by SysUI.
- */
- private void launchApp(DragSession session, @SplitPosition int position) {
- ProtoLog.v(ShellProtoLogGroup.WM_SHELL_DRAG_AND_DROP, "Launching app data at position=%d",
- position);
- final ClipDescription description = session.getClipDescription();
+ private void startClipDescription(ClipDescription description, Intent intent,
+ @SplitPosition int position) {
final boolean isTask = description.hasMimeType(MIMETYPE_APPLICATION_TASK);
final boolean isShortcut = description.hasMimeType(MIMETYPE_APPLICATION_SHORTCUT);
final ActivityOptions baseActivityOpts = ActivityOptions.makeBasic();
baseActivityOpts.setDisallowEnterPictureInPictureWhileLaunching(true);
final Bundle opts = baseActivityOpts.toBundle();
- if (session.appData.hasExtra(EXTRA_ACTIVITY_OPTIONS)) {
- opts.putAll(session.appData.getBundleExtra(EXTRA_ACTIVITY_OPTIONS));
+ if (intent.hasExtra(EXTRA_ACTIVITY_OPTIONS)) {
+ opts.putAll(intent.getBundleExtra(EXTRA_ACTIVITY_OPTIONS));
}
// Put BAL flags to avoid activity start aborted.
opts.putBoolean(KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED, true);
opts.putBoolean(KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED_BY_PERMISSION, true);
- final UserHandle user = session.appData.getParcelableExtra(EXTRA_USER);
+ final UserHandle user = intent.getParcelableExtra(EXTRA_USER);
if (isTask) {
- final int taskId = session.appData.getIntExtra(EXTRA_TASK_ID, INVALID_TASK_ID);
+ final int taskId = intent.getIntExtra(EXTRA_TASK_ID, INVALID_TASK_ID);
mStarter.startTask(taskId, position, opts);
} else if (isShortcut) {
- final String packageName = session.appData.getStringExtra(EXTRA_PACKAGE_NAME);
- final String id = session.appData.getStringExtra(EXTRA_SHORTCUT_ID);
+ final String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME);
+ final String id = intent.getStringExtra(EXTRA_SHORTCUT_ID);
mStarter.startShortcut(packageName, id, position, opts, user);
} else {
- final PendingIntent launchIntent =
- session.appData.getParcelableExtra(EXTRA_PENDING_INTENT);
- if (Build.IS_DEBUGGABLE) {
- if (launchIntent.isImmutable()) {
- throw new IllegalStateException("Expected immutable app pending intent from "
- + "SysUI");
- } else if (!user.equals(launchIntent.getCreatorUserHandle())) {
- throw new IllegalStateException("Expected app intent's EXTRA_USER to match "
- + "pending intent user");
- }
- }
+ final PendingIntent launchIntent = intent.getParcelableExtra(EXTRA_PENDING_INTENT);
mStarter.startIntent(launchIntent, user.getIdentifier(), null /* fillIntent */,
position, opts);
}
}
/**
- * Launches an intent sender provided by an application.
- */
- private void launchIntent(DragSession session, @SplitPosition int position) {
- ProtoLog.v(ShellProtoLogGroup.WM_SHELL_DRAG_AND_DROP, "Launching intent at position=%d",
- position);
- final ActivityOptions baseActivityOpts = ActivityOptions.makeBasic();
- baseActivityOpts.setDisallowEnterPictureInPictureWhileLaunching(true);
- // TODO(b/255649902): Rework this so that SplitScreenController can always use the options
- // instead of a fillInIntent since it's assuming that the PendingIntent is mutable
- baseActivityOpts.setPendingIntentLaunchFlags(FLAG_ACTIVITY_NEW_TASK
- | FLAG_ACTIVITY_MULTIPLE_TASK);
-
- final Bundle opts = baseActivityOpts.toBundle();
- // Put BAL flags to avoid activity start aborted.
- opts.putBoolean(KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED, true);
- opts.putBoolean(KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED_BY_PERMISSION, true);
-
- mStarter.startIntent(session.launchableIntent,
- session.launchableIntent.getCreatorUserHandle().getIdentifier(),
- null /* fillIntent */, position, opts);
- }
-
- /**
* Interface for actually committing the task launches.
*/
public interface Starter {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java
index ecb53dc..619f624 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java
@@ -22,8 +22,6 @@
import static android.content.pm.ActivityInfo.CONFIG_ASSETS_PATHS;
import static android.content.pm.ActivityInfo.CONFIG_UI_MODE;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
-import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME;
-import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION;
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT;
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT;
@@ -40,15 +38,12 @@
import android.app.StatusBarManager;
import android.content.Context;
import android.content.res.Configuration;
-import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Insets;
import android.graphics.Rect;
-import android.graphics.Region;
import android.graphics.drawable.Drawable;
import android.view.DragEvent;
import android.view.SurfaceControl;
-import android.view.ViewTreeObserver;
import android.view.WindowInsets;
import android.view.WindowInsets.Type;
import android.widget.LinearLayout;
@@ -70,8 +65,7 @@
/**
* Coordinates the visible drop targets for the current drag within a single display.
*/
-public class DragLayout extends LinearLayout
- implements ViewTreeObserver.OnComputeInternalInsetsListener {
+public class DragLayout extends LinearLayout {
// While dragging the status bar is hidden.
private static final int HIDE_STATUS_BAR_FLAGS = StatusBarManager.DISABLE_NOTIFICATION_ICONS
@@ -96,9 +90,7 @@
private int mDisplayMargin;
private int mDividerSize;
- private int mLaunchIntentEdgeMargin;
private Insets mInsets = Insets.NONE;
- private Region mTouchableRegion;
private boolean mIsShowing;
private boolean mHasDropped;
@@ -114,11 +106,10 @@
mStatusBarManager = context.getSystemService(StatusBarManager.class);
mLastConfiguration.setTo(context.getResources().getConfiguration());
- final Resources res = context.getResources();
- mDisplayMargin = res.getDimensionPixelSize(R.dimen.drop_layout_display_margin);
- mDividerSize = res.getDimensionPixelSize(R.dimen.split_divider_bar_width);
- mLaunchIntentEdgeMargin =
- res.getDimensionPixelSize(R.dimen.drag_launchable_intent_edge_margin);
+ mDisplayMargin = context.getResources().getDimensionPixelSize(
+ R.dimen.drop_layout_display_margin);
+ mDividerSize = context.getResources().getDimensionPixelSize(
+ R.dimen.split_divider_bar_width);
// Always use LTR because we assume dropZoneView1 is on the left and 2 is on the right when
// showing the highlight.
@@ -140,66 +131,6 @@
}
@Override
- protected void onAttachedToWindow() {
- super.onAttachedToWindow();
- mTouchableRegion = Region.obtain();
- getViewTreeObserver().addOnComputeInternalInsetsListener(this);
- }
-
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- getViewTreeObserver().removeOnComputeInternalInsetsListener(this);
- mTouchableRegion.recycle();
- }
-
- @Override
- public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo inOutInfo) {
- if (mSession != null && mSession.launchableIntent != null) {
- inOutInfo.touchableRegion.set(mTouchableRegion);
- inOutInfo.setTouchableInsets(TOUCHABLE_INSETS_REGION);
- }
- }
-
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- super.onLayout(changed, l, t, r, b);
- updateTouchableRegion();
- }
-
- /**
- * Updates the touchable region, this should be called after any configuration changes have
- * been applied.
- */
- private void updateTouchableRegion() {
- mTouchableRegion.setEmpty();
- if (mSession != null && mSession.launchableIntent != null) {
- final int width = getMeasuredWidth();
- final int height = getMeasuredHeight();
- if (mIsLeftRightSplit) {
- mTouchableRegion.union(
- new Rect(0, 0, mInsets.left + mLaunchIntentEdgeMargin, height));
- mTouchableRegion.union(
- new Rect(width - mInsets.right - mLaunchIntentEdgeMargin, 0, width,
- height));
- } else {
- mTouchableRegion.union(
- new Rect(0, 0, width, mInsets.top + mLaunchIntentEdgeMargin));
- mTouchableRegion.union(
- new Rect(0, height - mInsets.bottom - mLaunchIntentEdgeMargin, width,
- height));
- }
- ProtoLog.v(ShellProtoLogGroup.WM_SHELL_DRAG_AND_DROP,
- "Updating drag layout width=%d height=%d touchable region=%s",
- width, height, mTouchableRegion);
-
- // Reapply insets to update the touchable region
- requestApplyInsets();
- }
- }
-
-
- @Override
public WindowInsets onApplyWindowInsets(WindowInsets insets) {
mInsets = insets.getInsets(Type.tappableElement() | Type.displayCutout());
recomputeDropTargets();
@@ -233,7 +164,6 @@
mDropZoneView2.onThemeChange();
}
mLastConfiguration.setTo(newConfig);
- requestLayout();
}
private void updateContainerMarginsForSingleTask() {
@@ -312,7 +242,6 @@
mSplitScreenController.getStageBounds(topOrLeftBounds, bottomOrRightBounds);
updateDropZoneSizes(topOrLeftBounds, bottomOrRightBounds);
}
- requestLayout();
}
private void updateDropZoneSizesForSingleTask() {
@@ -463,7 +392,7 @@
mHasDropped = true;
// Process the drop
- mPolicy.handleDrop(mCurrentTarget);
+ mPolicy.handleDrop(mCurrentTarget, event.getClipData());
// Start animating the drop UI out with the drag surface
hide(event, dropCompleteCallback);
@@ -576,7 +505,5 @@
pw.println(innerPrefix + "mIsShowing=" + mIsShowing);
pw.println(innerPrefix + "mHasDropped=" + mHasDropped);
pw.println(innerPrefix + "mCurrentTarget=" + mCurrentTarget);
- pw.println(innerPrefix + "mInsets=" + mInsets);
- pw.println(innerPrefix + "mTouchableRegion=" + mTouchableRegion);
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragSession.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragSession.java
index 8f1bc59..353d702 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragSession.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragSession.java
@@ -21,15 +21,12 @@
import android.app.ActivityManager;
import android.app.ActivityTaskManager;
-import android.app.PendingIntent;
import android.app.WindowConfiguration;
import android.content.ClipData;
-import android.content.ClipDescription;
+import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
-import androidx.annotation.Nullable;
-
import com.android.wm.shell.common.DisplayLayout;
import java.util.List;
@@ -42,18 +39,7 @@
private final ClipData mInitialDragData;
final DisplayLayout displayLayout;
- // The activity info associated with the activity in the appData or the launchableIntent
- @Nullable
- ActivityInfo activityInfo;
- // The intent bundle that includes data about an app-type drag that is started by
- // Launcher/SysUI. Only one of appDragData OR launchableIntent will be non-null for a session.
- @Nullable
- Intent appData;
- // A launchable intent that is specified in the ClipData directly.
- // Only one of appDragData OR launchableIntent will be non-null for a session.
- @Nullable
- PendingIntent launchableIntent;
- // Stores the current running task at the time that the drag was initiated
+ Intent dragData;
ActivityManager.RunningTaskInfo runningTaskInfo;
@WindowConfiguration.WindowingMode
int runningTaskWinMode = WINDOWING_MODE_UNDEFINED;
@@ -61,7 +47,7 @@
int runningTaskActType = ACTIVITY_TYPE_STANDARD;
boolean dragItemSupportsSplitscreen;
- DragSession(ActivityTaskManager activityTaskManager,
+ DragSession(Context context, ActivityTaskManager activityTaskManager,
DisplayLayout dispLayout, ClipData data) {
mActivityTaskManager = activityTaskManager;
mInitialDragData = data;
@@ -69,14 +55,6 @@
}
/**
- * Returns the clip description associated with the drag.
- * @return
- */
- ClipDescription getClipDescription() {
- return mInitialDragData.getDescription();
- }
-
- /**
* Updates the session data based on the current state of the system.
*/
void update() {
@@ -89,11 +67,9 @@
runningTaskActType = task.getActivityType();
}
- activityInfo = mInitialDragData.getItemAt(0).getActivityInfo();
- // TODO: This should technically check & respect config_supportsNonResizableMultiWindow
- dragItemSupportsSplitscreen = activityInfo == null
- || ActivityInfo.isResizeableMode(activityInfo.resizeMode);
- appData = mInitialDragData.getItemAt(0).getIntent();
- launchableIntent = DragUtils.getLaunchIntent(mInitialDragData);
+ final ActivityInfo info = mInitialDragData.getItemAt(0).getActivityInfo();
+ dragItemSupportsSplitscreen = info == null
+ || ActivityInfo.isResizeableMode(info.resizeMode);
+ dragData = mInitialDragData.getItemAt(0).getIntent();
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragUtils.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragUtils.java
index 24f8e18..f7bcc94 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragUtils.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragUtils.java
@@ -36,21 +36,8 @@
* Returns whether we can handle this particular drag.
*/
public static boolean canHandleDrag(DragEvent event) {
- if (event.getClipData().getItemCount() <= 0) {
- // No clip data, ignore this drag
- return false;
- }
- if (isAppDrag(event.getClipDescription())) {
- // Clip data contains an app drag initiated from SysUI, handle it
- return true;
- }
- if (com.android.window.flags.Flags.delegateUnhandledDrags()
- && getLaunchIntent(event) != null) {
- // Clip data contains a launchable intent drag, handle it
- return true;
- }
- // Otherwise ignore
- return false;
+ return event.getClipData().getItemCount() > 0
+ && (isAppDrag(event.getClipDescription()));
}
/**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
index 32be419..53dd981 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
@@ -806,9 +806,6 @@
@Override
public void startIntent(PendingIntent intent, int userId1, @Nullable Intent fillInIntent,
@SplitPosition int position, @Nullable Bundle options) {
- ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN,
- "startIntent(): intent=%s user=%d fillInIntent=%s position=%d", intent, userId1,
- fillInIntent, position);
// Flag this as a no-user-action launch to prevent sending user leaving event to the current
// top activity since it's going to be put into another side of the split. This prevents the
// current top activity from going into pip mode due to user leaving event.
@@ -827,8 +824,6 @@
.map(recentTasks -> recentTasks.findTaskInBackground(component, userId1))
.orElse(null);
if (taskInfo != null) {
- ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN,
- "Found suitable background task=%s", taskInfo);
if (ENABLE_SHELL_TRANSITIONS) {
mStageCoordinator.startTask(taskInfo.taskId, position, options);
} else {
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropPolicyTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropPolicyTest.java
index 5dd9d8a..1b347e0 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropPolicyTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropPolicyTest.java
@@ -22,11 +22,9 @@
import static android.content.ClipDescription.MIMETYPE_APPLICATION_ACTIVITY;
import static android.content.ClipDescription.MIMETYPE_APPLICATION_SHORTCUT;
import static android.content.ClipDescription.MIMETYPE_APPLICATION_TASK;
-import static android.content.ClipDescription.MIMETYPE_TEXT_INTENT;
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT;
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT;
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_UNDEFINED;
@@ -48,8 +46,6 @@
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-import static org.mockito.quality.Strictness.LENIENT;
import android.app.ActivityManager;
import android.app.ActivityTaskManager;
@@ -65,7 +61,6 @@
import android.graphics.Insets;
import android.os.RemoteException;
import android.view.DisplayInfo;
-import android.view.DragEvent;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
@@ -75,15 +70,12 @@
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.draganddrop.DragAndDropPolicy.Target;
import com.android.wm.shell.splitscreen.SplitScreenController;
-import com.android.wm.shell.startingsurface.TaskSnapshotWindow;
-import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import org.mockito.MockitoSession;
import java.util.ArrayList;
import java.util.Collections;
@@ -115,7 +107,6 @@
private DragAndDropPolicy mPolicy;
private ClipData mActivityClipData;
- private ClipData mLaunchableIntentClipData;
private ClipData mNonResizeableActivityClipData;
private ClipData mTaskClipData;
private ClipData mShortcutClipData;
@@ -124,16 +115,9 @@
private ActivityManager.RunningTaskInfo mFullscreenAppTask;
private ActivityManager.RunningTaskInfo mNonResizeableFullscreenAppTask;
- private MockitoSession mMockitoSession;
-
@Before
public void setUp() throws RemoteException {
MockitoAnnotations.initMocks(this);
- mMockitoSession = mockitoSession()
- .strictness(LENIENT)
- .mockStatic(DragUtils.class)
- .startMocking();
- when(DragUtils.canHandleDrag(any())).thenReturn(true);
Resources res = mock(Resources.class);
Configuration config = new Configuration();
@@ -150,12 +134,11 @@
mInsets = Insets.of(0, 0, 0, 0);
mPolicy = spy(new DragAndDropPolicy(mContext, mSplitScreenStarter, mSplitScreenStarter));
- mActivityClipData = createAppClipData(MIMETYPE_APPLICATION_ACTIVITY);
- mLaunchableIntentClipData = createIntentClipData();
- mNonResizeableActivityClipData = createAppClipData(MIMETYPE_APPLICATION_ACTIVITY);
+ mActivityClipData = createClipData(MIMETYPE_APPLICATION_ACTIVITY);
+ mNonResizeableActivityClipData = createClipData(MIMETYPE_APPLICATION_ACTIVITY);
setClipDataResizeable(mNonResizeableActivityClipData, false);
- mTaskClipData = createAppClipData(MIMETYPE_APPLICATION_TASK);
- mShortcutClipData = createAppClipData(MIMETYPE_APPLICATION_SHORTCUT);
+ mTaskClipData = createClipData(MIMETYPE_APPLICATION_TASK);
+ mShortcutClipData = createClipData(MIMETYPE_APPLICATION_SHORTCUT);
mHomeTask = createTaskInfo(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME);
mFullscreenAppTask = createTaskInfo(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
@@ -166,15 +149,10 @@
setRunningTask(mFullscreenAppTask);
}
- @After
- public void tearDown() {
- mMockitoSession.finishMocking();
- }
-
/**
- * Creates an app-based clip data that is by default resizeable.
+ * Creates a clip data that is by default resizeable.
*/
- private ClipData createAppClipData(String mimeType) {
+ private ClipData createClipData(String mimeType) {
ClipDescription clipDescription = new ClipDescription(mimeType, new String[] { mimeType });
Intent i = new Intent();
switch (mimeType) {
@@ -186,9 +164,7 @@
i.putExtra(Intent.EXTRA_TASK_ID, 12345);
break;
case MIMETYPE_APPLICATION_ACTIVITY:
- final PendingIntent pi = mock(PendingIntent.class);
- doReturn(android.os.Process.myUserHandle()).when(pi).getCreatorUserHandle();
- i.putExtra(ClipDescription.EXTRA_PENDING_INTENT, pi);
+ i.putExtra(ClipDescription.EXTRA_PENDING_INTENT, mock(PendingIntent.class));
break;
}
i.putExtra(Intent.EXTRA_USER, android.os.Process.myUserHandle());
@@ -199,22 +175,6 @@
return data;
}
- /**
- * Creates an intent-based clip data that is by default resizeable.
- */
- private ClipData createIntentClipData() {
- ClipDescription clipDescription = new ClipDescription("Intent",
- new String[] { MIMETYPE_TEXT_INTENT });
- PendingIntent intent = mock(PendingIntent.class);
- when(intent.getCreatorUserHandle()).thenReturn(android.os.Process.myUserHandle());
- ClipData.Item item = new ClipData.Item.Builder()
- .setIntentSender(intent.getIntentSender())
- .build();
- ClipData data = new ClipData(clipDescription, item);
- when(DragUtils.getLaunchIntent((ClipData) any())).thenReturn(intent);
- return data;
- }
-
private ActivityManager.RunningTaskInfo createTaskInfo(int winMode, int actType) {
ActivityManager.RunningTaskInfo info = new ActivityManager.RunningTaskInfo();
info.configuration.windowConfiguration.setActivityType(actType);
@@ -244,85 +204,58 @@
@Test
public void testDragAppOverFullscreenHome_expectOnlyFullscreenTarget() {
- dragOverFullscreenHome_expectOnlyFullscreenTarget(mActivityClipData);
- }
-
- @Test
- public void testDragAppOverFullscreenApp_expectSplitScreenTargets() {
- dragOverFullscreenApp_expectSplitScreenTargets(mActivityClipData);
- }
-
- @Test
- public void testDragAppOverFullscreenAppPhone_expectVerticalSplitScreenTargets() {
- dragOverFullscreenAppPhone_expectVerticalSplitScreenTargets(mActivityClipData);
- }
-
- @Test
- public void testDragIntentOverFullscreenHome_expectOnlyFullscreenTarget() {
- dragOverFullscreenHome_expectOnlyFullscreenTarget(mLaunchableIntentClipData);
- }
-
- @Test
- public void testDragIntentOverFullscreenApp_expectSplitScreenTargets() {
- dragOverFullscreenApp_expectSplitScreenTargets(mLaunchableIntentClipData);
- }
-
- @Test
- public void testDragIntentOverFullscreenAppPhone_expectVerticalSplitScreenTargets() {
- dragOverFullscreenAppPhone_expectVerticalSplitScreenTargets(mLaunchableIntentClipData);
- }
-
- private void dragOverFullscreenHome_expectOnlyFullscreenTarget(ClipData data) {
doReturn(true).when(mSplitScreenStarter).isLeftRightSplit();
setRunningTask(mHomeTask);
- DragSession dragSession = new DragSession(mActivityTaskManager,
- mLandscapeDisplayLayout, data);
+ DragSession dragSession = new DragSession(mContext, mActivityTaskManager,
+ mLandscapeDisplayLayout, mActivityClipData);
dragSession.update();
mPolicy.start(dragSession, mLoggerSessionId);
ArrayList<Target> targets = assertExactTargetTypes(
mPolicy.getTargets(mInsets), TYPE_FULLSCREEN);
- mPolicy.handleDrop(filterTargetByType(targets, TYPE_FULLSCREEN));
+ mPolicy.handleDrop(filterTargetByType(targets, TYPE_FULLSCREEN), mActivityClipData);
verify(mSplitScreenStarter).startIntent(any(), anyInt(), any(),
eq(SPLIT_POSITION_UNDEFINED), any());
}
- private void dragOverFullscreenApp_expectSplitScreenTargets(ClipData data) {
+ @Test
+ public void testDragAppOverFullscreenApp_expectSplitScreenTargets() {
doReturn(true).when(mSplitScreenStarter).isLeftRightSplit();
setRunningTask(mFullscreenAppTask);
- DragSession dragSession = new DragSession(mActivityTaskManager,
- mLandscapeDisplayLayout, data);
+ DragSession dragSession = new DragSession(mContext, mActivityTaskManager,
+ mLandscapeDisplayLayout, mActivityClipData);
dragSession.update();
mPolicy.start(dragSession, mLoggerSessionId);
ArrayList<Target> targets = assertExactTargetTypes(
mPolicy.getTargets(mInsets), TYPE_SPLIT_LEFT, TYPE_SPLIT_RIGHT);
- mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_LEFT));
+ mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_LEFT), mActivityClipData);
verify(mSplitScreenStarter).startIntent(any(), anyInt(), any(),
eq(SPLIT_POSITION_TOP_OR_LEFT), any());
reset(mSplitScreenStarter);
- mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_RIGHT));
+ mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_RIGHT), mActivityClipData);
verify(mSplitScreenStarter).startIntent(any(), anyInt(), any(),
eq(SPLIT_POSITION_BOTTOM_OR_RIGHT), any());
}
- private void dragOverFullscreenAppPhone_expectVerticalSplitScreenTargets(ClipData data) {
+ @Test
+ public void testDragAppOverFullscreenAppPhone_expectVerticalSplitScreenTargets() {
doReturn(false).when(mSplitScreenStarter).isLeftRightSplit();
setRunningTask(mFullscreenAppTask);
- DragSession dragSession = new DragSession(mActivityTaskManager,
- mPortraitDisplayLayout, data);
+ DragSession dragSession = new DragSession(mContext, mActivityTaskManager,
+ mPortraitDisplayLayout, mActivityClipData);
dragSession.update();
mPolicy.start(dragSession, mLoggerSessionId);
ArrayList<Target> targets = assertExactTargetTypes(
mPolicy.getTargets(mInsets), TYPE_SPLIT_TOP, TYPE_SPLIT_BOTTOM);
- mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_TOP));
+ mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_TOP), mActivityClipData);
verify(mSplitScreenStarter).startIntent(any(), anyInt(), any(),
eq(SPLIT_POSITION_TOP_OR_LEFT), any());
reset(mSplitScreenStarter);
- mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_BOTTOM));
+ mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_BOTTOM), mActivityClipData);
verify(mSplitScreenStarter).startIntent(any(), anyInt(), any(),
eq(SPLIT_POSITION_BOTTOM_OR_RIGHT), any());
}
@@ -330,7 +263,7 @@
@Test
public void testTargetHitRects() {
setRunningTask(mFullscreenAppTask);
- DragSession dragSession = new DragSession(mActivityTaskManager,
+ DragSession dragSession = new DragSession(mContext, mActivityTaskManager,
mLandscapeDisplayLayout, mActivityClipData);
dragSession.update();
mPolicy.start(dragSession, mLoggerSessionId);
diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java
index b266caa..76038b9 100644
--- a/services/core/java/com/android/server/wm/DragState.java
+++ b/services/core/java/com/android/server/wm/DragState.java
@@ -216,7 +216,8 @@
mIsClosing = true;
// Unregister the input interceptor.
if (mInputInterceptor != null) {
- if (DEBUG_DRAG) Slog.d(TAG_WM, "Unregistering drag input channel");
+ if (DEBUG_DRAG)
+ Slog.d(TAG_WM, "unregistering drag input channel");
// Input channel should be disposed on the thread where the input is being handled.
mDragDropController.sendHandlerMessage(
@@ -226,7 +227,9 @@
// Send drag end broadcast if drag start has been sent.
if (mDragInProgress) {
- if (DEBUG_DRAG) Slog.d(TAG_WM, "Broadcasting DRAG_ENDED");
+ if (DEBUG_DRAG) {
+ Slog.d(TAG_WM, "broadcasting DRAG_ENDED");
+ }
for (WindowState ws : mNotifiedWindows) {
float x = 0;
float y = 0;
@@ -245,7 +248,6 @@
x, y, mThumbOffsetX, mThumbOffsetY, null, null, null, dragSurface, null,
mDragResult);
try {
- if (DEBUG_DRAG) Slog.d(TAG_WM, "Sending DRAG_ENDED to " + ws);
ws.mClient.dispatchDragEvent(event);
} catch (RemoteException e) {
Slog.w(TAG_WM, "Unable to drag-end window " + ws);
@@ -362,7 +364,7 @@
return false;
}
- if (DEBUG_DRAG) Slog.d(TAG_WM, "Sending DROP to " + touchedWin);
+ if (DEBUG_DRAG) Slog.d(TAG_WM, "sending DROP to " + touchedWin);
final IBinder clientToken = touchedWin.mClient.asBinder();
final DragEvent event = createDropEvent(x, y, touchedWin, false /* includePrivateInfo */);
@@ -458,7 +460,7 @@
*/
CompletableFuture<Void> register(Display display) {
display.getRealSize(mDisplaySize);
- if (DEBUG_DRAG) Slog.d(TAG_WM, "Registering drag input channel");
+ if (DEBUG_DRAG) Slog.d(TAG_WM, "registering drag input channel");
if (mInputInterceptor != null) {
Slog.e(TAG_WM, "Duplicate register of drag input channel");
return completedFuture(null);
@@ -487,7 +489,7 @@
mSourceUserId, UserManager.DISALLOW_CROSS_PROFILE_COPY_PASTE);
if (DEBUG_DRAG) {
- Slog.d(TAG_WM, "Broadcasting DRAG_STARTED at (" + touchX + ", " + touchY + ")");
+ Slog.d(TAG_WM, "broadcasting DRAG_STARTED at (" + touchX + ", " + touchY + ")");
}
final boolean containsAppExtras = containsApplicationExtras(mDataDescription);