Merge "Fix gestures for exclude-from-recents + translucent tasks" into udc-qpr-dev

This commit is contained in:
Tony Wickham
2023-10-05 18:16:40 +00:00
committed by Android (Google) Code Review
6 changed files with 55 additions and 24 deletions

View File

@@ -16,6 +16,8 @@
package com.android.quickstep;
import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
import static com.android.quickstep.views.DesktopTaskView.DESKTOP_IS_PROTO2_ENABLED;
import static com.android.wm.shell.util.GroupedRecentTaskInfo.TYPE_FREEFORM;
@@ -269,6 +271,7 @@ public class RecentTasksList {
TaskLoadResult allTasks = new TaskLoadResult(requestId, loadKeysOnly, rawTasks.size());
int numVisibleTasks = 0;
for (GroupedRecentTaskInfo rawTask : rawTasks) {
if (DESKTOP_IS_PROTO2_ENABLED && rawTask.getType() == TYPE_FREEFORM) {
GroupTask desktopTask = createDesktopTask(rawTask);
@@ -285,12 +288,27 @@ public class RecentTasksList {
task1.setLastSnapshotData(taskInfo1);
Task task2 = null;
if (taskInfo2 != null) {
// Is split task
Task.TaskKey task2Key = new Task.TaskKey(taskInfo2);
task2 = loadKeysOnly
? new Task(task2Key)
: Task.from(task2Key, taskInfo2,
tmpLockedUsers.get(task2Key.userId) /* isLocked */);
task2.setLastSnapshotData(taskInfo2);
} else {
// Is fullscreen task
if (numVisibleTasks > 0) {
boolean isExcluded = (taskInfo1.baseIntent.getFlags()
& FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) != 0;
if (taskInfo1.isTopActivityTransparent && isExcluded) {
// If there are already visible tasks, then ignore the excluded tasks and
// don't add them to the returned list
continue;
}
}
}
if (taskInfo1.isVisible) {
numVisibleTasks++;
}
final SplitConfigurationOptions.SplitBounds launcherSplitBounds =
convertSplitBounds(rawTask.getSplitBounds());

View File

@@ -16,7 +16,6 @@
package com.android.quickstep;
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
@@ -229,12 +228,21 @@ public class TopTaskTracker extends ISplitScreenListener.Stub implements TaskSta
}
/**
* Returns true if the given task holds an Assistant activity that is excluded from recents
* If the given task holds an activity that is excluded from recents, and there
* is another running task that is not excluded from recents, returns that underlying task.
*/
public boolean isExcludedAssistant() {
return mTopTask != null && mTopTask.configuration.windowConfiguration
.getActivityType() == ACTIVITY_TYPE_ASSISTANT
&& (mTopTask.baseIntent.getFlags() & FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) != 0;
public @Nullable CachedTaskInfo otherVisibleTaskThisIsExcludedOver() {
if (mTopTask == null
|| (mTopTask.baseIntent.getFlags() & FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) == 0) {
// Not an excluded task.
return null;
}
List<RunningTaskInfo> visibleNonExcludedTasks = mAllCachedTasks.stream()
.filter(t -> t.isVisible
&& (t.baseIntent.getFlags() & FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) == 0)
.toList();
return visibleNonExcludedTasks.isEmpty() ? null
: new CachedTaskInfo(visibleNonExcludedTasks);
}
/**

View File

@@ -1044,13 +1044,19 @@ public class TouchInteractionService extends Service {
boolean forceOverviewInputConsumer = gestureState.getActivityInterface().isStarted()
&& gestureState.getRunningTask() != null
&& gestureState.getRunningTask().isRootChooseActivity();
if (gestureState.getRunningTask() != null
&& gestureState.getRunningTask().isExcludedAssistant()) {
// In the case where we are in the excluded assistant state, ignore it and treat the
// running activity as the task behind the assistant
gestureState.updateRunningTask(TopTaskTracker.INSTANCE.get(this)
.getCachedTopTask(true /* filterOnlyVisibleRecents */));
forceOverviewInputConsumer = gestureState.getRunningTask().isHomeTask();
// In the case where we are in an excluded, translucent overlay, ignore it and treat the
// running activity as the task behind the overlay.
TopTaskTracker.CachedTaskInfo otherVisibleTask = gestureState.getRunningTask() == null
? null
: gestureState.getRunningTask().otherVisibleTaskThisIsExcludedOver();
if (otherVisibleTask != null) {
ActiveGestureLog.INSTANCE.addLog(new CompoundString("Changing active task to ")
.append(otherVisibleTask.getPackageName())
.append(" because the previous task running on top of this one (")
.append(gestureState.getRunningTask().getPackageName())
.append(") was excluded from recents"));
gestureState.updateRunningTask(otherVisibleTask);
}
boolean previousGestureAnimatedToLauncher =

View File

@@ -375,6 +375,7 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
mInversePositionMatrix.mapRect(mTempRectF);
mTempRectF.roundOut(mTmpCropRect);
params.setProgress(1f - fullScreenProgress);
params.applySurfaceParams(params.createSurfaceParams(this));
if (!DEBUG) {

View File

@@ -15,8 +15,8 @@
*/
package com.android.quickstep.util;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
import android.util.FloatProperty;
import android.view.RemoteAnimationTarget;
@@ -54,6 +54,7 @@ public class TransformParams {
}
};
/** Progress from 0 to 1 where 0 is in-app and 1 is Overview */
private float mProgress;
private float mTargetAlpha;
private float mCornerRadius;
@@ -135,6 +136,7 @@ public class TransformParams {
return this;
}
/** Builds the SurfaceTransaction from the given BuilderProxy params. */
public SurfaceTransaction createSurfaceParams(BuilderProxy proxy) {
RemoteAnimationTargets targets = mTargetSet;
SurfaceTransaction transaction = new SurfaceTransaction();
@@ -150,8 +152,12 @@ public class TransformParams {
if (activityType == ACTIVITY_TYPE_HOME) {
mHomeBuilderProxy.onBuildTargetParams(builder, app, this);
} else {
// Fade out Assistant overlay.
if (activityType == ACTIVITY_TYPE_ASSISTANT && app.isNotInRecents) {
// Fade out translucent overlay.
// TODO(b/303351074): use app.isNotInRecents directly once it is fixed.
boolean isNotInRecents = app.taskInfo != null
&& (app.taskInfo.baseIntent.getFlags()
& FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) != 0;
if (app.isTranslucent && isNotInRecents) {
float progress = Utilities.boundToRange(getProgress(), 0, 1);
builder.setAlpha(1 - Interpolators.DECELERATE_QUINT
.getInterpolation(progress));

View File

@@ -1010,14 +1010,6 @@ public class TaskView extends FrameLayout implements Reusable {
mActivity.getStateManager(), recentsView,
recentsView.getDepthController());
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
recentsView.runActionOnRemoteHandles(
(Consumer<RemoteTargetHandle>) remoteTargetHandle ->
remoteTargetHandle
.getTaskViewSimulator()
.setDrawsBelowRecents(false));
}
@Override
public void onAnimationEnd(Animator animator) {