mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-03-03 01:16:49 +00:00
Move split functions from RecentsView to SplitSelectStateController
* Moving things out of RecentsView to avoid dependency on a non-testable class * Also helping prevent bloating RecentsView.java Bug: 266482558 Test: Single Chrome instance in recents. Initiate split with Chrome from workspace, tap on Chrome again in Taskbar, ensure no crash. Change-Id: I99ec704479ffaa860f4d80c2cb9f54182f31f41a
This commit is contained in:
@@ -29,6 +29,7 @@ import android.app.ActivityManager;
|
||||
import android.app.ActivityOptions;
|
||||
import android.app.ActivityThread;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
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.util.SplitConfigurationOptions;
|
||||
import com.android.launcher3.util.SplitConfigurationOptions.StagePosition;
|
||||
import com.android.quickstep.RecentsModel;
|
||||
import com.android.quickstep.SystemUiProxy;
|
||||
import com.android.quickstep.TaskAnimationManager;
|
||||
import com.android.quickstep.TaskViewUtils;
|
||||
@@ -79,10 +81,12 @@ public class SplitSelectStateController {
|
||||
|
||||
private final Context mContext;
|
||||
private final Handler mHandler;
|
||||
private final RecentsModel mRecentTasksModel;
|
||||
private StatsLogManager mStatsLogManager;
|
||||
private final SystemUiProxy mSystemUiProxy;
|
||||
private final StateManager mStateManager;
|
||||
private final DepthController mDepthController;
|
||||
@Nullable
|
||||
private DepthController mDepthController;
|
||||
private @StagePosition int mStagePosition;
|
||||
private ItemInfo mItemInfo;
|
||||
private Intent mInitialTaskIntent;
|
||||
@@ -110,6 +114,7 @@ public class SplitSelectStateController {
|
||||
mSystemUiProxy = SystemUiProxy.INSTANCE.get(mContext);
|
||||
mStateManager = stateManager;
|
||||
mDepthController = depthController;
|
||||
mRecentTasksModel = RecentsModel.INSTANCE.get(context);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -148,6 +153,50 @@ public class SplitSelectStateController {
|
||||
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 launched. Call after launcher side animations are complete.
|
||||
|
||||
Reference in New Issue
Block a user