Merge "Move split functions from RecentsView to SplitSelectStateController" into tm-qpr-dev
This commit is contained in:
@@ -877,9 +877,9 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
|
|||||||
* (potentially breaking a split pair).
|
* (potentially breaking a split pair).
|
||||||
*/
|
*/
|
||||||
private void launchFromTaskbarPreservingSplitIfVisible(RecentsView recents, ItemInfo info) {
|
private void launchFromTaskbarPreservingSplitIfVisible(RecentsView recents, ItemInfo info) {
|
||||||
recents.findLastActiveTaskAndRunCallback(
|
recents.getSplitSelectController().findLastActiveTaskAndRunCallback(
|
||||||
info.getTargetComponent(),
|
info.getTargetComponent(),
|
||||||
(Consumer<Task>) foundTask -> {
|
foundTask -> {
|
||||||
if (foundTask != null) {
|
if (foundTask != null) {
|
||||||
TaskView foundTaskView =
|
TaskView foundTaskView =
|
||||||
recents.getTaskViewByTaskId(foundTask.key.id);
|
recents.getTaskViewByTaskId(foundTask.key.id);
|
||||||
|
|||||||
@@ -189,9 +189,9 @@ public class TaskbarUIController {
|
|||||||
if (recentsView == null) {
|
if (recentsView == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
recentsView.findLastActiveTaskAndRunCallback(
|
recentsView.getSplitSelectController().findLastActiveTaskAndRunCallback(
|
||||||
splitSelectSource.intent.getComponent(),
|
splitSelectSource.intent.getComponent(),
|
||||||
(Consumer<Task>) foundTask -> {
|
foundTask -> {
|
||||||
splitSelectSource.alreadyRunningTaskId = foundTask == null
|
splitSelectSource.alreadyRunningTaskId = foundTask == null
|
||||||
? INVALID_TASK_ID
|
? INVALID_TASK_ID
|
||||||
: foundTask.key.id;
|
: foundTask.key.id;
|
||||||
@@ -206,9 +206,9 @@ public class TaskbarUIController {
|
|||||||
*/
|
*/
|
||||||
public void triggerSecondAppForSplit(ItemInfoWithIcon info, Intent intent, View startingView) {
|
public void triggerSecondAppForSplit(ItemInfoWithIcon info, Intent intent, View startingView) {
|
||||||
RecentsView recents = getRecentsView();
|
RecentsView recents = getRecentsView();
|
||||||
recents.findLastActiveTaskAndRunCallback(
|
recents.getSplitSelectController().findLastActiveTaskAndRunCallback(
|
||||||
info.getTargetComponent(),
|
info.getTargetComponent(),
|
||||||
(Consumer<Task>) foundTask -> {
|
foundTask -> {
|
||||||
if (foundTask != null) {
|
if (foundTask != null) {
|
||||||
TaskView foundTaskView = recents.getTaskViewByTaskId(foundTask.key.id);
|
TaskView foundTaskView = recents.getTaskViewByTaskId(foundTask.key.id);
|
||||||
// TODO (b/266482558): This additional null check is needed because there
|
// TODO (b/266482558): This additional null check is needed because there
|
||||||
|
|||||||
@@ -579,9 +579,9 @@ public class QuickstepLauncher extends Launcher {
|
|||||||
RecentsView recentsView = getOverviewPanel();
|
RecentsView recentsView = getOverviewPanel();
|
||||||
// Check if there is already an instance of this app running, if so, initiate the split
|
// Check if there is already an instance of this app running, if so, initiate the split
|
||||||
// using that.
|
// using that.
|
||||||
recentsView.findLastActiveTaskAndRunCallback(
|
mSplitSelectStateController.findLastActiveTaskAndRunCallback(
|
||||||
splitSelectSource.intent.getComponent(),
|
splitSelectSource.intent.getComponent(),
|
||||||
(Consumer<Task>) foundTask -> {
|
foundTask -> {
|
||||||
splitSelectSource.alreadyRunningTaskId = foundTask == null
|
splitSelectSource.alreadyRunningTaskId = foundTask == null
|
||||||
? INVALID_TASK_ID
|
? INVALID_TASK_ID
|
||||||
: foundTask.key.id;
|
: foundTask.key.id;
|
||||||
@@ -595,8 +595,7 @@ public class QuickstepLauncher extends Launcher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** TODO(b/266482558) Migrate into SplitSelectStateController or someplace split specific. */
|
/** TODO(b/266482558) Migrate into SplitSelectStateController or someplace split specific. */
|
||||||
private void startSplitToHome(
|
private void startSplitToHome(SplitSelectSource source) {
|
||||||
SplitSelectSource source) {
|
|
||||||
AbstractFloatingView.closeAllOpenViews(this);
|
AbstractFloatingView.closeAllOpenViews(this);
|
||||||
int splitPlaceholderSize = getResources().getDimensionPixelSize(
|
int splitPlaceholderSize = getResources().getDimensionPixelSize(
|
||||||
R.dimen.split_placeholder_size);
|
R.dimen.split_placeholder_size);
|
||||||
@@ -604,14 +603,14 @@ public class QuickstepLauncher extends Launcher {
|
|||||||
R.dimen.split_placeholder_inset);
|
R.dimen.split_placeholder_inset);
|
||||||
Rect tempRect = new Rect();
|
Rect tempRect = new Rect();
|
||||||
|
|
||||||
SplitSelectStateController controller = getSplitSelectStateController();
|
mSplitSelectStateController.setInitialTaskSelect(source.intent,
|
||||||
controller.setInitialTaskSelect(source.intent, source.position.stagePosition,
|
source.position.stagePosition, source.itemInfo, source.splitEvent,
|
||||||
source.itemInfo, source.splitEvent, source.alreadyRunningTaskId);
|
source.alreadyRunningTaskId);
|
||||||
|
|
||||||
RecentsView recentsView = getOverviewPanel();
|
RecentsView recentsView = getOverviewPanel();
|
||||||
recentsView.getPagedOrientationHandler().getInitialSplitPlaceholderBounds(
|
recentsView.getPagedOrientationHandler().getInitialSplitPlaceholderBounds(
|
||||||
splitPlaceholderSize, splitPlaceholderInset, getDeviceProfile(),
|
splitPlaceholderSize, splitPlaceholderInset, getDeviceProfile(),
|
||||||
controller.getActiveSplitStagePosition(), tempRect);
|
mSplitSelectStateController.getActiveSplitStagePosition(), tempRect);
|
||||||
|
|
||||||
PendingAnimation anim = new PendingAnimation(TABLET_HOME_TO_SPLIT.getDuration());
|
PendingAnimation anim = new PendingAnimation(TABLET_HOME_TO_SPLIT.getDuration());
|
||||||
RectF startingTaskRect = new RectF();
|
RectF startingTaskRect = new RectF();
|
||||||
@@ -620,12 +619,12 @@ public class QuickstepLauncher extends Launcher {
|
|||||||
floatingTaskView.setAlpha(1);
|
floatingTaskView.setAlpha(1);
|
||||||
floatingTaskView.addStagingAnimation(anim, startingTaskRect, tempRect,
|
floatingTaskView.addStagingAnimation(anim, startingTaskRect, tempRect,
|
||||||
false /* fadeWithThumbnail */, true /* isStagedTask */);
|
false /* fadeWithThumbnail */, true /* isStagedTask */);
|
||||||
controller.setFirstFloatingTaskView(floatingTaskView);
|
mSplitSelectStateController.setFirstFloatingTaskView(floatingTaskView);
|
||||||
anim.addListener(new AnimatorListenerAdapter() {
|
anim.addListener(new AnimatorListenerAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void onAnimationCancel(Animator animation) {
|
public void onAnimationCancel(Animator animation) {
|
||||||
getDragLayer().removeView(floatingTaskView);
|
getDragLayer().removeView(floatingTaskView);
|
||||||
controller.resetState();
|
mSplitSelectStateController.resetState();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
anim.buildAnim().start();
|
anim.buildAnim().start();
|
||||||
@@ -1156,14 +1155,12 @@ public class QuickstepLauncher extends Launcher {
|
|||||||
// Launcher to first restore into Overview state, wait for the relevant tasks and icons to
|
// Launcher to first restore into Overview state, wait for the relevant tasks and icons to
|
||||||
// load in, and then proceed to OverviewSplitSelect.
|
// load in, and then proceed to OverviewSplitSelect.
|
||||||
if (isInState(OVERVIEW_SPLIT_SELECT)) {
|
if (isInState(OVERVIEW_SPLIT_SELECT)) {
|
||||||
SplitSelectStateController splitSelectStateController =
|
|
||||||
((RecentsView) getOverviewPanel()).getSplitSelectController();
|
|
||||||
// Launcher will restart in Overview and then transition to OverviewSplitSelect.
|
// Launcher will restart in Overview and then transition to OverviewSplitSelect.
|
||||||
outState.putIBinder(PENDING_SPLIT_SELECT_INFO, ObjectWrapper.wrap(
|
outState.putIBinder(PENDING_SPLIT_SELECT_INFO, ObjectWrapper.wrap(
|
||||||
new PendingSplitSelectInfo(
|
new PendingSplitSelectInfo(
|
||||||
splitSelectStateController.getInitialTaskId(),
|
mSplitSelectStateController.getInitialTaskId(),
|
||||||
splitSelectStateController.getActiveSplitStagePosition(),
|
mSplitSelectStateController.getActiveSplitStagePosition(),
|
||||||
splitSelectStateController.getSplitEvent())
|
mSplitSelectStateController.getSplitEvent())
|
||||||
));
|
));
|
||||||
outState.putInt(RUNTIME_STATE, OVERVIEW.ordinal);
|
outState.putInt(RUNTIME_STATE, OVERVIEW.ordinal);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import android.app.ActivityManager;
|
|||||||
import android.app.ActivityOptions;
|
import android.app.ActivityOptions;
|
||||||
import android.app.ActivityThread;
|
import android.app.ActivityThread;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
@@ -59,6 +60,7 @@ import com.android.launcher3.testing.TestLogging;
|
|||||||
import com.android.launcher3.testing.shared.TestProtocol;
|
import com.android.launcher3.testing.shared.TestProtocol;
|
||||||
import com.android.launcher3.util.SplitConfigurationOptions;
|
import com.android.launcher3.util.SplitConfigurationOptions;
|
||||||
import com.android.launcher3.util.SplitConfigurationOptions.StagePosition;
|
import com.android.launcher3.util.SplitConfigurationOptions.StagePosition;
|
||||||
|
import com.android.quickstep.RecentsModel;
|
||||||
import com.android.quickstep.SystemUiProxy;
|
import com.android.quickstep.SystemUiProxy;
|
||||||
import com.android.quickstep.TaskAnimationManager;
|
import com.android.quickstep.TaskAnimationManager;
|
||||||
import com.android.quickstep.TaskViewUtils;
|
import com.android.quickstep.TaskViewUtils;
|
||||||
@@ -79,10 +81,12 @@ public class SplitSelectStateController {
|
|||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final Handler mHandler;
|
private final Handler mHandler;
|
||||||
|
private final RecentsModel mRecentTasksModel;
|
||||||
private StatsLogManager mStatsLogManager;
|
private StatsLogManager mStatsLogManager;
|
||||||
private final SystemUiProxy mSystemUiProxy;
|
private final SystemUiProxy mSystemUiProxy;
|
||||||
private final StateManager mStateManager;
|
private final StateManager mStateManager;
|
||||||
private final DepthController mDepthController;
|
@Nullable
|
||||||
|
private DepthController mDepthController;
|
||||||
private @StagePosition int mStagePosition;
|
private @StagePosition int mStagePosition;
|
||||||
private ItemInfo mItemInfo;
|
private ItemInfo mItemInfo;
|
||||||
private Intent mInitialTaskIntent;
|
private Intent mInitialTaskIntent;
|
||||||
@@ -110,6 +114,7 @@ public class SplitSelectStateController {
|
|||||||
mSystemUiProxy = SystemUiProxy.INSTANCE.get(mContext);
|
mSystemUiProxy = SystemUiProxy.INSTANCE.get(mContext);
|
||||||
mStateManager = stateManager;
|
mStateManager = stateManager;
|
||||||
mDepthController = depthController;
|
mDepthController = depthController;
|
||||||
|
mRecentTasksModel = RecentsModel.INSTANCE.get(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -148,6 +153,50 @@ public class SplitSelectStateController {
|
|||||||
mSplitEvent = splitEvent;
|
mSplitEvent = splitEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pulls the list of active Tasks from RecentsModel, and finds the most recently active Task
|
||||||
|
* matching a given ComponentName. Then uses that Task (which could be null) with the given
|
||||||
|
* callback.
|
||||||
|
*
|
||||||
|
* Used in various task-switching or splitscreen operations when we need to check if there is a
|
||||||
|
* currently running Task of a certain type and use the most recent one.
|
||||||
|
*/
|
||||||
|
public void findLastActiveTaskAndRunCallback(ComponentName componentName,
|
||||||
|
Consumer<Task> callback) {
|
||||||
|
mRecentTasksModel.getTasks(taskGroups -> {
|
||||||
|
Task lastActiveTask = null;
|
||||||
|
// Loop through tasks in reverse, since they are ordered with most-recent tasks last.
|
||||||
|
for (int i = taskGroups.size() - 1; i >= 0; i--) {
|
||||||
|
GroupTask groupTask = taskGroups.get(i);
|
||||||
|
Task task1 = groupTask.task1;
|
||||||
|
if (isInstanceOfComponent(task1, componentName)) {
|
||||||
|
lastActiveTask = task1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Task task2 = groupTask.task2;
|
||||||
|
if (isInstanceOfComponent(task2, componentName)) {
|
||||||
|
lastActiveTask = task2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
callback.accept(lastActiveTask);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a given Task is the most recently-active Task of type componentName. Used for
|
||||||
|
* selecting already-running Tasks for splitscreen.
|
||||||
|
*/
|
||||||
|
public boolean isInstanceOfComponent(@Nullable Task task, ComponentName componentName) {
|
||||||
|
// Exclude the task that is already staged
|
||||||
|
if (task == null || task.key.id == mInitialTaskId) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return task.key.baseIntent.getComponent().equals(componentName);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To be called when the actual tasks ({@link #mInitialTaskId}, {@link #mSecondTaskId}) are
|
* To be called when the actual tasks ({@link #mInitialTaskId}, {@link #mSecondTaskId}) are
|
||||||
* to be launched. Call after launcher side animations are complete.
|
* to be launched. Call after launcher side animations are complete.
|
||||||
|
|||||||
@@ -1285,53 +1285,6 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Pulls the list of active Tasks from RecentsModel, and finds the most recently active Task
|
|
||||||
* matching a given ComponentName. Then uses that Task (which could be null) with the given
|
|
||||||
* callback.
|
|
||||||
*
|
|
||||||
* Used in various task-switching or splitscreen operations when we need to check if there is a
|
|
||||||
* currently running Task of a certain type and use the most recent one.
|
|
||||||
*/
|
|
||||||
public void findLastActiveTaskAndRunCallback(ComponentName componentName,
|
|
||||||
Consumer<Task> callback) {
|
|
||||||
mModel.getTasks(taskGroups -> {
|
|
||||||
Task lastActiveTask = null;
|
|
||||||
// Loop through tasks in reverse, since they are ordered with most-recent tasks last.
|
|
||||||
for (int i = taskGroups.size() - 1; i >= 0; i--) {
|
|
||||||
GroupTask groupTask = taskGroups.get(i);
|
|
||||||
Task task1 = groupTask.task1;
|
|
||||||
if (isInstanceOfComponent(task1, componentName)) {
|
|
||||||
lastActiveTask = task1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Task task2 = groupTask.task2;
|
|
||||||
if (isInstanceOfComponent(task2, componentName)) {
|
|
||||||
lastActiveTask = task2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
callback.accept(lastActiveTask);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if a given Task is the most recently-active Task of type componentName. Used for
|
|
||||||
* selecting already-running Tasks for splitscreen.
|
|
||||||
*/
|
|
||||||
public boolean isInstanceOfComponent(@Nullable Task task, ComponentName componentName) {
|
|
||||||
if (task == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// Exclude the task that is already staged
|
|
||||||
if (mSplitHiddenTaskView != null && mSplitHiddenTaskView.getTask().equals(task)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return task.key.baseIntent.getComponent().equals(componentName);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setOverviewStateEnabled(boolean enabled) {
|
public void setOverviewStateEnabled(boolean enabled) {
|
||||||
mOverviewStateEnabled = enabled;
|
mOverviewStateEnabled = enabled;
|
||||||
updateTaskStackListenerState();
|
updateTaskStackListenerState();
|
||||||
|
|||||||
Reference in New Issue
Block a user