Merge "Show distinct TaskMenus for each task in GroupedTaskView" into sc-v2-dev
This commit is contained in:
@@ -51,6 +51,7 @@ import com.android.quickstep.views.OverviewActionsView;
|
||||
import com.android.quickstep.views.RecentsView;
|
||||
import com.android.quickstep.views.TaskThumbnailView;
|
||||
import com.android.quickstep.views.TaskView;
|
||||
import com.android.quickstep.views.TaskView.TaskIdAttributeContainer;
|
||||
import com.android.systemui.shared.recents.model.Task;
|
||||
import com.android.systemui.shared.recents.model.ThumbnailData;
|
||||
|
||||
@@ -63,11 +64,16 @@ import java.util.List;
|
||||
public class TaskOverlayFactory implements ResourceBasedOverride {
|
||||
|
||||
public static List<SystemShortcut> getEnabledShortcuts(TaskView taskView,
|
||||
DeviceProfile deviceProfile) {
|
||||
DeviceProfile deviceProfile, TaskIdAttributeContainer taskContainer) {
|
||||
final ArrayList<SystemShortcut> shortcuts = new ArrayList<>();
|
||||
final BaseDraggingActivity activity = BaseActivity.fromContext(taskView.getContext());
|
||||
boolean hasMultipleTasks = taskView.getTaskIds()[1] != -1;
|
||||
for (TaskShortcutFactory menuOption : MENU_OPTIONS) {
|
||||
SystemShortcut shortcut = menuOption.getShortcut(activity, taskView);
|
||||
if (hasMultipleTasks && !menuOption.showForSplitscreen()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
SystemShortcut shortcut = menuOption.getShortcut(activity, taskContainer);
|
||||
if (shortcut == null) {
|
||||
continue;
|
||||
}
|
||||
@@ -87,7 +93,7 @@ public class TaskOverlayFactory implements ResourceBasedOverride {
|
||||
if (!canLauncherRotate && isInLandscape) {
|
||||
// Add screenshot action to task menu.
|
||||
SystemShortcut screenshotShortcut = TaskShortcutFactory.SCREENSHOT
|
||||
.getShortcut(activity, taskView);
|
||||
.getShortcut(activity, taskContainer);
|
||||
if (screenshotShortcut != null) {
|
||||
shortcuts.add(screenshotShortcut);
|
||||
}
|
||||
@@ -95,7 +101,7 @@ public class TaskOverlayFactory implements ResourceBasedOverride {
|
||||
// Add modal action only if display orientation is the same as the device orientation.
|
||||
if (orientedState.getDisplayRotation() == ROTATION_0) {
|
||||
SystemShortcut modalShortcut = TaskShortcutFactory.MODAL
|
||||
.getShortcut(activity, taskView);
|
||||
.getShortcut(activity, taskContainer);
|
||||
if (modalShortcut != null) {
|
||||
shortcuts.add(modalShortcut);
|
||||
}
|
||||
@@ -105,7 +111,7 @@ public class TaskOverlayFactory implements ResourceBasedOverride {
|
||||
}
|
||||
|
||||
|
||||
public static void addSplitOptions(List<SystemShortcut> outShortcuts,
|
||||
private static void addSplitOptions(List<SystemShortcut> outShortcuts,
|
||||
BaseDraggingActivity activity, TaskView taskView, DeviceProfile deviceProfile) {
|
||||
int[] taskViewTaskIds = taskView.getTaskIds();
|
||||
boolean alreadyHasMultipleTasks = taskViewTaskIds[0] != -1 &&
|
||||
|
||||
@@ -45,6 +45,7 @@ import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption;
|
||||
import com.android.quickstep.views.RecentsView;
|
||||
import com.android.quickstep.views.TaskThumbnailView;
|
||||
import com.android.quickstep.views.TaskView;
|
||||
import com.android.quickstep.views.TaskView.TaskIdAttributeContainer;
|
||||
import com.android.systemui.shared.recents.model.Task;
|
||||
import com.android.systemui.shared.recents.view.AppTransitionAnimationSpecCompat;
|
||||
import com.android.systemui.shared.recents.view.AppTransitionAnimationSpecsFuture;
|
||||
@@ -61,9 +62,25 @@ import java.util.List;
|
||||
* Represents a system shortcut that can be shown for a recent task.
|
||||
*/
|
||||
public interface TaskShortcutFactory {
|
||||
SystemShortcut getShortcut(BaseDraggingActivity activity, TaskView view);
|
||||
SystemShortcut getShortcut(BaseDraggingActivity activity,
|
||||
TaskIdAttributeContainer taskContainer);
|
||||
|
||||
TaskShortcutFactory APP_INFO = (activity, view) -> new AppInfo(activity, view.getItemInfo());
|
||||
default boolean showForSplitscreen() {
|
||||
return false;
|
||||
}
|
||||
|
||||
TaskShortcutFactory APP_INFO = new TaskShortcutFactory() {
|
||||
@Override
|
||||
public SystemShortcut getShortcut(BaseDraggingActivity activity,
|
||||
TaskIdAttributeContainer taskContainer) {
|
||||
return new AppInfo(activity, taskContainer.getItemInfo());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean showForSplitscreen() {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
abstract class MultiWindowFactory implements TaskShortcutFactory {
|
||||
|
||||
@@ -82,15 +99,16 @@ public interface TaskShortcutFactory {
|
||||
protected abstract boolean onActivityStarted(BaseDraggingActivity activity);
|
||||
|
||||
@Override
|
||||
public SystemShortcut getShortcut(BaseDraggingActivity activity, TaskView taskView) {
|
||||
final Task task = taskView.getTask();
|
||||
public SystemShortcut getShortcut(BaseDraggingActivity activity,
|
||||
TaskIdAttributeContainer taskContainer) {
|
||||
final Task task = taskContainer.getTask();
|
||||
if (!task.isDockable) {
|
||||
return null;
|
||||
}
|
||||
if (!isAvailable(activity, task.key.displayId)) {
|
||||
return null;
|
||||
}
|
||||
return new MultiWindowSystemShortcut(mIconRes, mTextRes, activity, taskView, this,
|
||||
return new MultiWindowSystemShortcut(mIconRes, mTextRes, activity, taskContainer, this,
|
||||
mLauncherEvent);
|
||||
}
|
||||
}
|
||||
@@ -123,13 +141,14 @@ public interface TaskShortcutFactory {
|
||||
private final LauncherEvent mLauncherEvent;
|
||||
|
||||
public MultiWindowSystemShortcut(int iconRes, int textRes, BaseDraggingActivity activity,
|
||||
TaskView taskView, MultiWindowFactory factory, LauncherEvent launcherEvent) {
|
||||
super(iconRes, textRes, activity, taskView.getItemInfo());
|
||||
TaskIdAttributeContainer taskContainer, MultiWindowFactory factory,
|
||||
LauncherEvent launcherEvent) {
|
||||
super(iconRes, textRes, activity, taskContainer.getItemInfo());
|
||||
mLauncherEvent = launcherEvent;
|
||||
mHandler = new Handler(Looper.getMainLooper());
|
||||
mTaskView = taskView;
|
||||
mTaskView = taskContainer.getTaskView();
|
||||
mRecentsView = activity.getOverviewPanel();
|
||||
mThumbnailView = taskView.getThumbnail();
|
||||
mThumbnailView = taskContainer.getThumbnailView();
|
||||
mFactory = factory;
|
||||
}
|
||||
|
||||
@@ -233,11 +252,13 @@ public interface TaskShortcutFactory {
|
||||
}
|
||||
|
||||
@Override
|
||||
public SystemShortcut getShortcut(BaseDraggingActivity activity, TaskView taskView) {
|
||||
SystemShortcut shortcut = super.getShortcut(activity, taskView);
|
||||
public SystemShortcut getShortcut(BaseDraggingActivity activity,
|
||||
TaskIdAttributeContainer taskContainer) {
|
||||
SystemShortcut shortcut = super.getShortcut(activity, taskContainer);
|
||||
if (shortcut != null && FeatureFlags.ENABLE_SPLIT_SELECT.get()) {
|
||||
// Disable if there's only one recent app for split screen
|
||||
shortcut.setEnabled(taskView.getRecentsView().getTaskViewCount() > 1);
|
||||
shortcut.setEnabled(taskContainer.getTaskView().
|
||||
getRecentsView().getTaskViewCount() > 1);
|
||||
}
|
||||
return shortcut;
|
||||
}
|
||||
@@ -284,7 +305,7 @@ public interface TaskShortcutFactory {
|
||||
}
|
||||
};
|
||||
|
||||
TaskShortcutFactory PIN = (activity, tv) -> {
|
||||
TaskShortcutFactory PIN = (activity, taskContainer) -> {
|
||||
if (!SystemUiProxy.INSTANCE.get(activity).isActive()) {
|
||||
return null;
|
||||
}
|
||||
@@ -295,7 +316,7 @@ public interface TaskShortcutFactory {
|
||||
// We shouldn't be able to pin while an app is locked.
|
||||
return null;
|
||||
}
|
||||
return new PinSystemShortcut(activity, tv);
|
||||
return new PinSystemShortcut(activity, taskContainer);
|
||||
};
|
||||
|
||||
class PinSystemShortcut extends SystemShortcut {
|
||||
@@ -304,9 +325,11 @@ public interface TaskShortcutFactory {
|
||||
|
||||
private final TaskView mTaskView;
|
||||
|
||||
public PinSystemShortcut(BaseDraggingActivity target, TaskView tv) {
|
||||
super(R.drawable.ic_pin, R.string.recent_task_option_pin, target, tv.getItemInfo());
|
||||
mTaskView = tv;
|
||||
public PinSystemShortcut(BaseDraggingActivity target,
|
||||
TaskIdAttributeContainer taskContainer) {
|
||||
super(R.drawable.ic_pin, R.string.recent_task_option_pin, target,
|
||||
taskContainer.getItemInfo());
|
||||
mTaskView = taskContainer.getTaskView();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -320,20 +343,22 @@ public interface TaskShortcutFactory {
|
||||
}
|
||||
}
|
||||
|
||||
TaskShortcutFactory INSTALL = (activity, view) ->
|
||||
TaskShortcutFactory INSTALL = (activity, taskContainer) ->
|
||||
InstantAppResolver.newInstance(activity).isInstantApp(activity,
|
||||
view.getTask().getTopComponent().getPackageName())
|
||||
? new SystemShortcut.Install(activity, view.getItemInfo()) : null;
|
||||
taskContainer.getTask().getTopComponent().getPackageName())
|
||||
? new SystemShortcut.Install(activity, taskContainer.getItemInfo()) : null;
|
||||
|
||||
TaskShortcutFactory WELLBEING = (activity, view) ->
|
||||
WellbeingModel.SHORTCUT_FACTORY.getShortcut(activity, view.getItemInfo());
|
||||
TaskShortcutFactory WELLBEING = (activity, taskContainer) ->
|
||||
WellbeingModel.SHORTCUT_FACTORY.getShortcut(activity, taskContainer.getItemInfo());
|
||||
|
||||
TaskShortcutFactory SCREENSHOT = (activity, tv) -> tv.getThumbnail().getTaskOverlay()
|
||||
.getScreenshotShortcut(activity, tv.getItemInfo());
|
||||
TaskShortcutFactory SCREENSHOT = (activity, taskContainer) ->
|
||||
taskContainer.getThumbnailView().getTaskOverlay()
|
||||
.getScreenshotShortcut(activity, taskContainer.getItemInfo());
|
||||
|
||||
TaskShortcutFactory MODAL = (activity, tv) -> {
|
||||
TaskShortcutFactory MODAL = (activity, taskContainer) -> {
|
||||
if (ENABLE_OVERVIEW_SELECTIONS.get()) {
|
||||
return tv.getThumbnail().getTaskOverlay().getModalStateSystemShortcut(tv.getItemInfo());
|
||||
return taskContainer.getThumbnailView()
|
||||
.getTaskOverlay().getModalStateSystemShortcut(taskContainer.getItemInfo());
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
package com.android.quickstep.views;
|
||||
|
||||
import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT;
|
||||
import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
import android.util.AttributeSet;
|
||||
@@ -11,7 +14,6 @@ import androidx.annotation.Nullable;
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.util.RunnableList;
|
||||
import com.android.launcher3.util.SplitConfigurationOptions;
|
||||
import com.android.launcher3.util.SplitConfigurationOptions.StagedSplitBounds;
|
||||
import com.android.launcher3.util.TransformingTouchDelegate;
|
||||
import com.android.quickstep.RecentsModel;
|
||||
@@ -72,7 +74,9 @@ public class GroupedTaskView extends TaskView {
|
||||
super.bind(primary, orientedState);
|
||||
mSecondaryTask = secondary;
|
||||
mTaskIdContainer[1] = secondary.key.id;
|
||||
mTaskIdAttributeContainer[1] = new TaskIdAttributeContainer(secondary, mSnapshotView2);
|
||||
mTaskIdAttributeContainer[1] = new TaskIdAttributeContainer(secondary, mSnapshotView2,
|
||||
STAGE_POSITION_BOTTOM_OR_RIGHT);
|
||||
mTaskIdAttributeContainer[0].setStagePosition(STAGE_POSITION_TOP_OR_LEFT);
|
||||
mSnapshotView2.bind(secondary);
|
||||
mSplitBoundsConfig = splitBoundsConfig;
|
||||
}
|
||||
@@ -112,6 +116,10 @@ public class GroupedTaskView extends TaskView {
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean showTaskMenuWithContainer(IconView iconView) {
|
||||
return TaskMenuView.showForTask(mTaskIdAttributeContainer[iconView == mIconView ? 0 : 1]);
|
||||
}
|
||||
|
||||
public void updateSplitBoundsConfig(StagedSplitBounds stagedSplitBounds) {
|
||||
mSplitBoundsConfig = stagedSplitBounds;
|
||||
invalidate();
|
||||
@@ -143,14 +151,14 @@ public class GroupedTaskView extends TaskView {
|
||||
@Override
|
||||
public RunnableList launchTaskAnimated() {
|
||||
getRecentsView().getSplitPlaceholder().launchTasks(mTask, mSecondaryTask,
|
||||
SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT, null /*callback*/);
|
||||
STAGE_POSITION_TOP_OR_LEFT, null /*callback*/);
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void launchTask(@NonNull Consumer<Boolean> callback, boolean freezeTaskList) {
|
||||
getRecentsView().getSplitPlaceholder().launchTasks(mTask, mSecondaryTask,
|
||||
SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT, callback);
|
||||
STAGE_POSITION_TOP_OR_LEFT, callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.quickstep.views;
|
||||
|
||||
import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT;
|
||||
import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_UNDEFINED;
|
||||
import static com.android.quickstep.views.TaskThumbnailView.DIM_ALPHA;
|
||||
|
||||
import android.animation.Animator;
|
||||
@@ -39,6 +41,7 @@ import android.widget.TextView;
|
||||
|
||||
import com.android.launcher3.AbstractFloatingView;
|
||||
import com.android.launcher3.BaseDraggingActivity;
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.anim.AnimationSuccessListener;
|
||||
import com.android.launcher3.anim.Interpolators;
|
||||
@@ -49,6 +52,7 @@ import com.android.launcher3.views.BaseDragLayer;
|
||||
import com.android.quickstep.TaskOverlayFactory;
|
||||
import com.android.quickstep.TaskUtils;
|
||||
import com.android.quickstep.util.TaskCornerRadius;
|
||||
import com.android.quickstep.views.TaskView.TaskIdAttributeContainer;
|
||||
|
||||
/**
|
||||
* Contains options for a recent task when long-pressing its icon.
|
||||
@@ -65,6 +69,7 @@ public class TaskMenuView extends AbstractFloatingView implements OnScrollChange
|
||||
private TextView mTaskName;
|
||||
private AnimatorSet mOpenCloseAnimator;
|
||||
private TaskView mTaskView;
|
||||
private TaskIdAttributeContainer mTaskContainer;
|
||||
private LinearLayout mOptionLayout;
|
||||
|
||||
public TaskMenuView(Context context, AttributeSet attrs) {
|
||||
@@ -129,7 +134,8 @@ public class TaskMenuView extends AbstractFloatingView implements OnScrollChange
|
||||
// Inset due to margin
|
||||
PointF additionalInset = pagedOrientationHandler
|
||||
.getAdditionalInsetForTaskMenu(mTaskInsetMargin);
|
||||
int taskTopMargin = mActivity.getDeviceProfile().overviewTaskThumbnailTopMarginPx;
|
||||
DeviceProfile deviceProfile = mActivity.getDeviceProfile();
|
||||
int taskTopMargin = deviceProfile.overviewTaskThumbnailTopMarginPx;
|
||||
|
||||
float adjustedY = y + taskTopMargin - additionalInset.y;
|
||||
float adjustedX = x - additionalInset.x;
|
||||
@@ -137,7 +143,7 @@ public class TaskMenuView extends AbstractFloatingView implements OnScrollChange
|
||||
// NOTE: Changing the pivots means the rotated view gets rotated about the new pivots set,
|
||||
// which would render the X and Y position set here incorrect
|
||||
setPivotX(0);
|
||||
if (mActivity.getDeviceProfile().overviewShowAsGrid) {
|
||||
if (deviceProfile.overviewShowAsGrid) {
|
||||
// In tablet, set pivotY to original position without mThumbnailTopMargin adjustment.
|
||||
setPivotY(-taskTopMargin);
|
||||
} else {
|
||||
@@ -145,9 +151,26 @@ public class TaskMenuView extends AbstractFloatingView implements OnScrollChange
|
||||
}
|
||||
setRotation(pagedOrientationHandler.getDegreesRotated());
|
||||
setX(pagedOrientationHandler.getTaskMenuX(adjustedX,
|
||||
mTaskView.getThumbnail(), overscrollShift));
|
||||
mTaskContainer.getThumbnailView(), overscrollShift));
|
||||
setY(pagedOrientationHandler.getTaskMenuY(
|
||||
adjustedY, mTaskView.getThumbnail(), overscrollShift));
|
||||
adjustedY, mTaskContainer.getThumbnailView(), overscrollShift));
|
||||
|
||||
// TODO(b/193432925) temporary menu placement for split screen task menus
|
||||
TaskIdAttributeContainer[] taskIdAttributeContainers =
|
||||
mTaskView.getTaskIdAttributeContainers();
|
||||
if (taskIdAttributeContainers[0].getStagePosition() != STAGE_POSITION_UNDEFINED) {
|
||||
if (mTaskContainer.getStagePosition() != STAGE_POSITION_BOTTOM_OR_RIGHT) {
|
||||
return;
|
||||
}
|
||||
Rect r = new Rect();
|
||||
mTaskContainer.getThumbnailView().getBoundsOnScreen(r);
|
||||
if (deviceProfile.isLandscape) {
|
||||
setX(r.left);
|
||||
} else {
|
||||
setY(r.top);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void onRotationChanged() {
|
||||
@@ -162,19 +185,21 @@ public class TaskMenuView extends AbstractFloatingView implements OnScrollChange
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean showForTask(TaskView taskView) {
|
||||
BaseDraggingActivity activity = BaseDraggingActivity.fromContext(taskView.getContext());
|
||||
public static boolean showForTask(TaskIdAttributeContainer taskContainer) {
|
||||
BaseDraggingActivity activity = BaseDraggingActivity.fromContext(
|
||||
taskContainer.getTaskView().getContext());
|
||||
final TaskMenuView taskMenuView = (TaskMenuView) activity.getLayoutInflater().inflate(
|
||||
R.layout.task_menu, activity.getDragLayer(), false);
|
||||
return taskMenuView.populateAndShowForTask(taskView);
|
||||
return taskMenuView.populateAndShowForTask(taskContainer);
|
||||
}
|
||||
|
||||
private boolean populateAndShowForTask(TaskView taskView) {
|
||||
private boolean populateAndShowForTask(TaskIdAttributeContainer taskContainer) {
|
||||
if (isAttachedToWindow()) {
|
||||
return false;
|
||||
}
|
||||
mActivity.getDragLayer().addView(this);
|
||||
mTaskView = taskView;
|
||||
mTaskView = taskContainer.getTaskView();
|
||||
mTaskContainer = taskContainer;
|
||||
if (!populateAndLayoutMenu()) {
|
||||
return false;
|
||||
}
|
||||
@@ -192,20 +217,21 @@ public class TaskMenuView extends AbstractFloatingView implements OnScrollChange
|
||||
|
||||
/** @return true if successfully able to populate task view menu, false otherwise */
|
||||
private boolean populateAndLayoutMenu() {
|
||||
if (mTaskView.getTask().icon == null) {
|
||||
if (mTaskContainer.getTask().icon == null) {
|
||||
// Icon may not be loaded
|
||||
return false;
|
||||
}
|
||||
addMenuOptions(mTaskView);
|
||||
orientAroundTaskView(mTaskView);
|
||||
addMenuOptions(mTaskContainer);
|
||||
orientAroundTaskView(mTaskContainer);
|
||||
return true;
|
||||
}
|
||||
|
||||
private void addMenuOptions(TaskView taskView) {
|
||||
mTaskName.setText(TaskUtils.getTitle(getContext(), taskView.getTask()));
|
||||
private void addMenuOptions(TaskIdAttributeContainer taskContainer) {
|
||||
mTaskName.setText(TaskUtils.getTitle(getContext(), taskContainer.getTask()));
|
||||
mTaskName.setOnClickListener(v -> close(true));
|
||||
|
||||
TaskOverlayFactory.getEnabledShortcuts(taskView, mActivity.getDeviceProfile())
|
||||
TaskOverlayFactory.getEnabledShortcuts(mTaskView, mActivity.getDeviceProfile(),
|
||||
taskContainer)
|
||||
.forEach(this::addMenuOption);
|
||||
}
|
||||
|
||||
@@ -223,23 +249,25 @@ public class TaskMenuView extends AbstractFloatingView implements OnScrollChange
|
||||
mOptionLayout.addView(menuOptionView);
|
||||
}
|
||||
|
||||
private void orientAroundTaskView(TaskView taskView) {
|
||||
PagedOrientationHandler orientationHandler = taskView.getPagedOrientationHandler();
|
||||
private void orientAroundTaskView(TaskIdAttributeContainer taskContainer) {
|
||||
RecentsView recentsView = mActivity.getOverviewPanel();
|
||||
PagedOrientationHandler orientationHandler = recentsView.getPagedOrientationHandler();
|
||||
measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
|
||||
orientationHandler.setTaskMenuAroundTaskView(this, mTaskInsetMargin);
|
||||
|
||||
// Get Position
|
||||
mActivity.getDragLayer().getDescendantRectRelativeToSelf(taskView, sTempRect);
|
||||
mActivity.getDragLayer().getDescendantRectRelativeToSelf(mTaskView, sTempRect);
|
||||
Rect insets = mActivity.getDragLayer().getInsets();
|
||||
BaseDragLayer.LayoutParams params = (BaseDragLayer.LayoutParams) getLayoutParams();
|
||||
int padding = getResources()
|
||||
.getDimensionPixelSize(R.dimen.task_menu_vertical_padding);
|
||||
params.width = orientationHandler.getTaskMenuWidth(taskView.getThumbnail()) - (2 * padding);
|
||||
params.width = orientationHandler
|
||||
.getTaskMenuWidth(taskContainer.getThumbnailView()) - (2 * padding);
|
||||
// Gravity set to Left instead of Start as sTempRect.left measures Left distance not Start
|
||||
params.gravity = Gravity.LEFT;
|
||||
setLayoutParams(params);
|
||||
setScaleX(taskView.getScaleX());
|
||||
setScaleY(taskView.getScaleY());
|
||||
setScaleX(mTaskView.getScaleX());
|
||||
setScaleY(mTaskView.getScaleY());
|
||||
|
||||
// Set divider spacing
|
||||
ShapeDrawable divider = new ShapeDrawable(new RectShape());
|
||||
@@ -272,7 +300,7 @@ public class TaskMenuView extends AbstractFloatingView implements OnScrollChange
|
||||
revealAnimator.setInterpolator(Interpolators.DEACCEL);
|
||||
mOpenCloseAnimator.playTogether(revealAnimator,
|
||||
ObjectAnimator.ofFloat(
|
||||
mTaskView.getThumbnail(), DIM_ALPHA,
|
||||
mTaskContainer.getThumbnailView(), DIM_ALPHA,
|
||||
closing ? 0 : TaskView.MAX_PAGE_SCRIM_ALPHA),
|
||||
ObjectAnimator.ofFloat(this, ALPHA, closing ? 0 : 1));
|
||||
mOpenCloseAnimator.addListener(new AnimationSuccessListener() {
|
||||
|
||||
@@ -18,13 +18,6 @@ package com.android.quickstep.views;
|
||||
|
||||
import static android.view.Gravity.BOTTOM;
|
||||
import static android.view.Gravity.CENTER_HORIZONTAL;
|
||||
import static android.view.Gravity.CENTER_VERTICAL;
|
||||
import static android.view.Gravity.END;
|
||||
import static android.view.Gravity.START;
|
||||
import static android.view.Gravity.TOP;
|
||||
import static android.view.Surface.ROTATION_180;
|
||||
import static android.view.Surface.ROTATION_270;
|
||||
import static android.view.Surface.ROTATION_90;
|
||||
import static android.widget.Toast.LENGTH_SHORT;
|
||||
|
||||
import static com.android.launcher3.AbstractFloatingView.TYPE_TASK_MENU;
|
||||
@@ -39,6 +32,7 @@ import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCH
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASK_LAUNCH_TAP;
|
||||
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
|
||||
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
|
||||
import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_UNDEFINED;
|
||||
|
||||
import static java.lang.annotation.RetentionPolicy.SOURCE;
|
||||
|
||||
@@ -58,7 +52,6 @@ import android.util.AttributeSet;
|
||||
import android.util.FloatProperty;
|
||||
import android.util.Log;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.Surface;
|
||||
import android.view.TouchDelegate;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
@@ -86,6 +79,7 @@ import com.android.launcher3.touch.PagedOrientationHandler;
|
||||
import com.android.launcher3.util.ActivityOptionsWrapper;
|
||||
import com.android.launcher3.util.ComponentKey;
|
||||
import com.android.launcher3.util.RunnableList;
|
||||
import com.android.launcher3.util.SplitConfigurationOptions;
|
||||
import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption;
|
||||
import com.android.launcher3.util.TransformingTouchDelegate;
|
||||
import com.android.launcher3.util.ViewPool.Reusable;
|
||||
@@ -466,7 +460,10 @@ public class TaskView extends FrameLayout implements Reusable {
|
||||
* Builds proto for logging
|
||||
*/
|
||||
public WorkspaceItemInfo getItemInfo() {
|
||||
final Task task = getTask();
|
||||
return getItemInfo(mTask);
|
||||
}
|
||||
|
||||
protected WorkspaceItemInfo getItemInfo(Task task) {
|
||||
ComponentKey componentKey = TaskUtils.getLaunchComponentKeyForTask(task.key);
|
||||
WorkspaceItemInfo stubInfo = new WorkspaceItemInfo();
|
||||
stubInfo.itemType = LauncherSettings.Favorites.ITEM_TYPE_TASK;
|
||||
@@ -569,7 +566,8 @@ public class TaskView extends FrameLayout implements Reusable {
|
||||
cancelPendingLoadTasks();
|
||||
mTask = task;
|
||||
mTaskIdContainer[0] = mTask.key.id;
|
||||
mTaskIdAttributeContainer[0] = new TaskIdAttributeContainer(task, mSnapshotView);
|
||||
mTaskIdAttributeContainer[0] = new TaskIdAttributeContainer(task, mSnapshotView,
|
||||
STAGE_POSITION_UNDEFINED);
|
||||
mSnapshotView.bind(task);
|
||||
setOrientationState(orientedState);
|
||||
}
|
||||
@@ -825,7 +823,7 @@ public class TaskView extends FrameLayout implements Reusable {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean showTaskMenu() {
|
||||
private boolean showTaskMenu(IconView iconView) {
|
||||
if (getRecentsView().mActivity.isInState(OVERVIEW_SPLIT_SELECT)) {
|
||||
// Don't show menu when selecting second split screen app
|
||||
return true;
|
||||
@@ -837,10 +835,14 @@ public class TaskView extends FrameLayout implements Reusable {
|
||||
} else {
|
||||
mActivity.getStatsLogManager().logger().withItemInfo(getItemInfo())
|
||||
.log(LAUNCHER_TASK_ICON_TAP_OR_LONGPRESS);
|
||||
return TaskMenuView.showForTask(this);
|
||||
return showTaskMenuWithContainer(iconView);
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean showTaskMenuWithContainer(IconView iconView) {
|
||||
return TaskMenuView.showForTask(mTaskIdAttributeContainer[0]);
|
||||
}
|
||||
|
||||
protected void setIcon(IconView iconView, Drawable icon) {
|
||||
if (icon != null) {
|
||||
iconView.setDrawable(icon);
|
||||
@@ -850,14 +852,14 @@ public class TaskView extends FrameLayout implements Reusable {
|
||||
recentsView.switchToScreenshot(
|
||||
() -> recentsView.finishRecentsAnimation(true /* toRecents */,
|
||||
false /* shouldPip */,
|
||||
this::showTaskMenu));
|
||||
() -> showTaskMenu(iconView)));
|
||||
} else {
|
||||
showTaskMenu();
|
||||
showTaskMenu(iconView);
|
||||
}
|
||||
});
|
||||
iconView.setOnLongClickListener(v -> {
|
||||
requestDisallowInterceptTouchEvent(true);
|
||||
return showTaskMenu();
|
||||
return showTaskMenu(iconView);
|
||||
});
|
||||
} else {
|
||||
iconView.setDrawable(null);
|
||||
@@ -1328,8 +1330,9 @@ public class TaskView extends FrameLayout implements Reusable {
|
||||
getContext().getText(R.string.accessibility_close)));
|
||||
|
||||
final Context context = getContext();
|
||||
// TODO(b/200609838) Determine which task to run A11y action on when in split screen
|
||||
for (SystemShortcut s : TaskOverlayFactory.getEnabledShortcuts(this,
|
||||
mActivity.getDeviceProfile())) {
|
||||
mActivity.getDeviceProfile(), mTaskIdAttributeContainer[0])) {
|
||||
info.addAction(s.createAccessibilityAction(context));
|
||||
}
|
||||
|
||||
@@ -1361,8 +1364,9 @@ public class TaskView extends FrameLayout implements Reusable {
|
||||
return true;
|
||||
}
|
||||
|
||||
// TODO(b/200609838) Determine which task to run A11y action on when in split screen
|
||||
for (SystemShortcut s : TaskOverlayFactory.getEnabledShortcuts(this,
|
||||
mActivity.getDeviceProfile())) {
|
||||
mActivity.getDeviceProfile(), mTaskIdAttributeContainer[0])) {
|
||||
if (s.hasHandlerForAction(action)) {
|
||||
s.onClick(this);
|
||||
return true;
|
||||
@@ -1581,20 +1585,40 @@ public class TaskView extends FrameLayout implements Reusable {
|
||||
}
|
||||
|
||||
public class TaskIdAttributeContainer {
|
||||
private final TaskThumbnailView thumbnailView;
|
||||
private final Task task;
|
||||
private final TaskThumbnailView mThumbnailView;
|
||||
private final Task mTask;
|
||||
/** Defaults to STAGE_POSITION_UNDEFINED if in not a split screen task view */
|
||||
private @SplitConfigurationOptions.StagePosition int mStagePosition;
|
||||
|
||||
public TaskIdAttributeContainer(Task task, TaskThumbnailView thumbnailView) {
|
||||
this.task = task;
|
||||
this.thumbnailView = thumbnailView;
|
||||
public TaskIdAttributeContainer(Task task, TaskThumbnailView thumbnailView,
|
||||
int stagePosition) {
|
||||
this.mTask = task;
|
||||
this.mThumbnailView = thumbnailView;
|
||||
this.mStagePosition = stagePosition;
|
||||
}
|
||||
|
||||
public TaskThumbnailView getThumbnailView() {
|
||||
return thumbnailView;
|
||||
return mThumbnailView;
|
||||
}
|
||||
|
||||
public Task getTask() {
|
||||
return task;
|
||||
return mTask;
|
||||
}
|
||||
|
||||
public WorkspaceItemInfo getItemInfo() {
|
||||
return TaskView.this.getItemInfo(mTask);
|
||||
}
|
||||
|
||||
public TaskView getTaskView() {
|
||||
return TaskView.this;
|
||||
}
|
||||
|
||||
public int getStagePosition() {
|
||||
return mStagePosition;
|
||||
}
|
||||
|
||||
void setStagePosition(@SplitConfigurationOptions.StagePosition int stagePosition) {
|
||||
this.mStagePosition = stagePosition;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user