mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-03-03 09:26:51 +00:00
Refactor handling data launching split screen to separate class
* SplitSelectDataHolder contains logic for knowing how to launch split, separate from the actual API calls to launch split Flag: ENABLE_SPLIT_LAUNCH_DATA_REFACTOR Bug: 279494325 Test: Tested w/ all 6 types of launches noted in SplitSelectDataHolder#@SplitLaunchType. Also checked to make sure most-recent running tasks are still being used where applicable. Change-Id: I8114f87e9956b100622c80f578e291937ed4eeac
This commit is contained in:
@@ -24,6 +24,12 @@ import static com.android.launcher3.Utilities.postAsyncCallback;
|
||||
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
|
||||
import static com.android.launcher3.util.SplitConfigurationOptions.DEFAULT_SPLIT_RATIO;
|
||||
import static com.android.launcher3.util.SplitConfigurationOptions.getOppositeStagePosition;
|
||||
import static com.android.quickstep.util.SplitSelectDataHolder.SPLIT_PENDINGINTENT_PENDINGINTENT;
|
||||
import static com.android.quickstep.util.SplitSelectDataHolder.SPLIT_PENDINGINTENT_TASK;
|
||||
import static com.android.quickstep.util.SplitSelectDataHolder.SPLIT_SHORTCUT_TASK;
|
||||
import static com.android.quickstep.util.SplitSelectDataHolder.SPLIT_TASK_PENDINGINTENT;
|
||||
import static com.android.quickstep.util.SplitSelectDataHolder.SPLIT_TASK_SHORTCUT;
|
||||
import static com.android.quickstep.util.SplitSelectDataHolder.SPLIT_TASK_TASK;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.app.ActivityManager;
|
||||
@@ -34,6 +40,7 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ShortcutInfo;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
@@ -51,6 +58,7 @@ import android.window.TransitionInfo;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.internal.logging.InstanceId;
|
||||
import com.android.launcher3.config.FeatureFlags;
|
||||
import com.android.launcher3.logging.StatsLogManager;
|
||||
import com.android.launcher3.model.data.ItemInfo;
|
||||
import com.android.launcher3.shortcuts.ShortcutKey;
|
||||
@@ -71,6 +79,7 @@ import com.android.quickstep.views.TaskView;
|
||||
import com.android.systemui.shared.recents.model.Task;
|
||||
import com.android.systemui.shared.system.RemoteAnimationRunnerCompat;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
@@ -85,6 +94,7 @@ public class SplitSelectStateController {
|
||||
private final RecentsModel mRecentTasksModel;
|
||||
private final SplitAnimationController mSplitAnimationController;
|
||||
private final AppPairsController mAppPairsController;
|
||||
private final SplitSelectDataHolder mSplitSelectDataHolder;
|
||||
private StatsLogManager mStatsLogManager;
|
||||
private final SystemUiProxy mSystemUiProxy;
|
||||
private final StateManager mStateManager;
|
||||
@@ -137,6 +147,7 @@ public class SplitSelectStateController {
|
||||
mRecentTasksModel = recentsModel;
|
||||
mSplitAnimationController = new SplitAnimationController(this);
|
||||
mAppPairsController = new AppPairsController(context, this);
|
||||
mSplitSelectDataHolder = new SplitSelectDataHolder(mContext);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -155,6 +166,11 @@ public class SplitSelectStateController {
|
||||
}
|
||||
|
||||
setInitialData(stagePosition, splitEvent, itemInfo);
|
||||
|
||||
if (FeatureFlags.ENABLE_SPLIT_LAUNCH_DATA_REFACTOR.get()) {
|
||||
mSplitSelectDataHolder.setInitialTaskSelect(intent, stagePosition, itemInfo, splitEvent,
|
||||
alreadyRunningTask);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -166,6 +182,10 @@ public class SplitSelectStateController {
|
||||
StatsLogManager.EventEnum splitEvent) {
|
||||
mInitialTaskId = info.taskId;
|
||||
setInitialData(stagePosition, splitEvent, itemInfo);
|
||||
|
||||
if (FeatureFlags.ENABLE_SPLIT_LAUNCH_DATA_REFACTOR.get()) {
|
||||
mSplitSelectDataHolder.setInitialTaskSelect(info, stagePosition, itemInfo, splitEvent);
|
||||
}
|
||||
}
|
||||
|
||||
private void setInitialData(@StagePosition int stagePosition,
|
||||
@@ -243,6 +263,10 @@ public class SplitSelectStateController {
|
||||
*/
|
||||
public void setSecondTask(Task task) {
|
||||
mSecondTaskId = task.key.id;
|
||||
|
||||
if (FeatureFlags.ENABLE_SPLIT_LAUNCH_DATA_REFACTOR.get()) {
|
||||
mSplitSelectDataHolder.setSecondTask(task.key.id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -253,6 +277,10 @@ public class SplitSelectStateController {
|
||||
public void setSecondTask(Intent intent, UserHandle user) {
|
||||
mSecondTaskIntent = intent;
|
||||
mSecondUser = user;
|
||||
|
||||
if (FeatureFlags.ENABLE_SPLIT_LAUNCH_DATA_REFACTOR.get()) {
|
||||
mSplitSelectDataHolder.setSecondTask(intent, user);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -263,6 +291,10 @@ public class SplitSelectStateController {
|
||||
public void setSecondTask(PendingIntent pendingIntent) {
|
||||
mSecondPendingIntent = pendingIntent;
|
||||
mSecondUser = pendingIntent.getCreatorUserHandle();
|
||||
|
||||
if (FeatureFlags.ENABLE_SPLIT_LAUNCH_DATA_REFACTOR.get()) {
|
||||
mSplitSelectDataHolder.setSecondTask(pendingIntent);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -285,6 +317,12 @@ public class SplitSelectStateController {
|
||||
*/
|
||||
public void launchTasks(int taskId1, int taskId2, @StagePosition int stagePosition,
|
||||
Consumer<Boolean> callback, boolean freezeTaskList, float splitRatio) {
|
||||
if (FeatureFlags.ENABLE_SPLIT_LAUNCH_DATA_REFACTOR.get()) {
|
||||
mSplitSelectDataHolder.setInitialTaskSelect(null /*intent*/,
|
||||
stagePosition, null /*itemInfo*/, null /*splitEvent*/,
|
||||
taskId1);
|
||||
mSplitSelectDataHolder.setSecondTask(taskId2);
|
||||
}
|
||||
launchTasks(taskId1, null /* intent1 */, taskId2, null /* intent2 */, stagePosition,
|
||||
callback, freezeTaskList, splitRatio, null);
|
||||
}
|
||||
@@ -305,6 +343,11 @@ public class SplitSelectStateController {
|
||||
@Nullable InstanceId shellInstanceId) {
|
||||
TestLogging.recordEvent(
|
||||
TestProtocol.SEQUENCE_MAIN, "launchSplitTasks");
|
||||
if (FeatureFlags.ENABLE_SPLIT_LAUNCH_DATA_REFACTOR.get()) {
|
||||
launchTasksRefactored(callback, freezeTaskList, splitRatio, shellInstanceId);
|
||||
return;
|
||||
}
|
||||
|
||||
final ActivityOptions options1 = ActivityOptions.makeBasic();
|
||||
if (freezeTaskList) {
|
||||
options1.setFreezeRecentTasksReordering();
|
||||
@@ -367,6 +410,101 @@ public class SplitSelectStateController {
|
||||
}
|
||||
}
|
||||
|
||||
private void launchTasksRefactored(Consumer<Boolean> callback, boolean freezeTaskList,
|
||||
float splitRatio, @Nullable InstanceId shellInstanceId) {
|
||||
final ActivityOptions options1 = ActivityOptions.makeBasic();
|
||||
if (freezeTaskList) {
|
||||
options1.setFreezeRecentTasksReordering();
|
||||
}
|
||||
|
||||
SplitSelectDataHolder.SplitLaunchData launchData =
|
||||
mSplitSelectDataHolder.getSplitLaunchData();
|
||||
int firstTaskId = launchData.getInitialTaskId();
|
||||
int secondTaskId = launchData.getSecondTaskId();
|
||||
ShortcutInfo firstShortcut = launchData.getInitialShortcut();
|
||||
ShortcutInfo secondShortcut = launchData.getSecondShortcut();
|
||||
PendingIntent firstPI = launchData.getInitialPendingIntent();
|
||||
PendingIntent secondPI = launchData.getSecondPendingIntent();
|
||||
int initialStagePosition = launchData.getInitialStagePosition();
|
||||
Bundle optionsBundle = options1.toBundle();
|
||||
|
||||
if (TaskAnimationManager.ENABLE_SHELL_TRANSITIONS) {
|
||||
final RemoteSplitLaunchTransitionRunner animationRunner =
|
||||
new RemoteSplitLaunchTransitionRunner(firstTaskId, secondTaskId, callback);
|
||||
final RemoteTransition remoteTransition = new RemoteTransition(animationRunner,
|
||||
ActivityThread.currentActivityThread().getApplicationThread(),
|
||||
"LaunchSplitPair");
|
||||
switch (launchData.getSplitLaunchType()) {
|
||||
case SPLIT_TASK_TASK ->
|
||||
mSystemUiProxy.startTasks(firstTaskId, optionsBundle, secondTaskId,
|
||||
null /* options2 */, initialStagePosition, splitRatio,
|
||||
remoteTransition, shellInstanceId);
|
||||
|
||||
case SPLIT_TASK_PENDINGINTENT ->
|
||||
mSystemUiProxy.startIntentAndTask(secondPI, optionsBundle, firstTaskId,
|
||||
null /*options2*/, initialStagePosition, splitRatio,
|
||||
remoteTransition, shellInstanceId);
|
||||
|
||||
case SPLIT_TASK_SHORTCUT ->
|
||||
mSystemUiProxy.startShortcutAndTask(secondShortcut, optionsBundle,
|
||||
firstTaskId, null /*options2*/, initialStagePosition, splitRatio,
|
||||
remoteTransition, shellInstanceId);
|
||||
|
||||
case SPLIT_PENDINGINTENT_TASK ->
|
||||
mSystemUiProxy.startIntentAndTask(firstPI, optionsBundle, secondTaskId,
|
||||
null /*options2*/, initialStagePosition, splitRatio,
|
||||
remoteTransition, shellInstanceId);
|
||||
|
||||
case SPLIT_PENDINGINTENT_PENDINGINTENT ->
|
||||
mSystemUiProxy.startIntents(firstPI, firstShortcut, optionsBundle, secondPI,
|
||||
secondShortcut, null /*options2*/, initialStagePosition, splitRatio,
|
||||
remoteTransition, shellInstanceId);
|
||||
|
||||
case SPLIT_SHORTCUT_TASK ->
|
||||
mSystemUiProxy.startShortcutAndTask(firstShortcut, optionsBundle,
|
||||
secondTaskId, null /*options2*/, initialStagePosition, splitRatio,
|
||||
remoteTransition, shellInstanceId);
|
||||
}
|
||||
} else {
|
||||
final RemoteSplitLaunchAnimationRunner animationRunner =
|
||||
new RemoteSplitLaunchAnimationRunner(firstTaskId, secondTaskId, callback);
|
||||
final RemoteAnimationAdapter adapter = new RemoteAnimationAdapter(
|
||||
animationRunner, 300, 150,
|
||||
ActivityThread.currentActivityThread().getApplicationThread());
|
||||
switch (launchData.getSplitLaunchType()) {
|
||||
case SPLIT_TASK_TASK ->
|
||||
mSystemUiProxy.startTasksWithLegacyTransition(firstTaskId, optionsBundle,
|
||||
secondTaskId, null /* options2 */, initialStagePosition,
|
||||
splitRatio, adapter, shellInstanceId);
|
||||
|
||||
case SPLIT_TASK_PENDINGINTENT ->
|
||||
mSystemUiProxy.startIntentAndTaskWithLegacyTransition(secondPI,
|
||||
optionsBundle, firstTaskId, null /*options2*/, initialStagePosition,
|
||||
splitRatio, adapter, shellInstanceId);
|
||||
|
||||
case SPLIT_TASK_SHORTCUT ->
|
||||
mSystemUiProxy.startShortcutAndTaskWithLegacyTransition(secondShortcut,
|
||||
optionsBundle, firstTaskId, null /*options2*/, initialStagePosition,
|
||||
splitRatio, adapter, shellInstanceId);
|
||||
|
||||
case SPLIT_PENDINGINTENT_TASK ->
|
||||
mSystemUiProxy.startIntentAndTaskWithLegacyTransition(firstPI,
|
||||
optionsBundle, secondTaskId, null /*options2*/,
|
||||
initialStagePosition, splitRatio, adapter, shellInstanceId);
|
||||
|
||||
case SPLIT_PENDINGINTENT_PENDINGINTENT ->
|
||||
mSystemUiProxy.startIntentsWithLegacyTransition(firstPI, firstShortcut,
|
||||
optionsBundle, secondPI, secondShortcut, null /*options2*/,
|
||||
initialStagePosition, splitRatio, adapter, shellInstanceId);
|
||||
|
||||
case SPLIT_SHORTCUT_TASK ->
|
||||
mSystemUiProxy.startShortcutAndTaskWithLegacyTransition(firstShortcut,
|
||||
optionsBundle, secondTaskId, null /*options2*/,
|
||||
initialStagePosition, splitRatio, adapter, shellInstanceId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void launchIntentOrShortcut(Intent intent, UserHandle user, ActivityOptions options1,
|
||||
int taskId, @StagePosition int stagePosition, float splitRatio,
|
||||
RemoteTransition remoteTransition, @Nullable InstanceId shellInstanceId) {
|
||||
@@ -572,6 +710,9 @@ public class SplitSelectStateController {
|
||||
* To be called if split select was cancelled
|
||||
*/
|
||||
public void resetState() {
|
||||
if (FeatureFlags.ENABLE_SPLIT_LAUNCH_DATA_REFACTOR.get()) {
|
||||
mSplitSelectDataHolder.resetState();
|
||||
}
|
||||
mInitialTaskId = INVALID_TASK_ID;
|
||||
mInitialTaskIntent = null;
|
||||
mSecondTaskId = INVALID_TASK_ID;
|
||||
@@ -593,7 +734,11 @@ public class SplitSelectStateController {
|
||||
* chosen
|
||||
*/
|
||||
public boolean isSplitSelectActive() {
|
||||
return isInitialTaskIntentSet() && !isSecondTaskIntentSet();
|
||||
if (FeatureFlags.ENABLE_SPLIT_LAUNCH_DATA_REFACTOR.get()) {
|
||||
return mSplitSelectDataHolder.isSplitSelectActive();
|
||||
} else {
|
||||
return isInitialTaskIntentSet() && !isSecondTaskIntentSet();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -601,7 +746,11 @@ public class SplitSelectStateController {
|
||||
* be launched
|
||||
*/
|
||||
public boolean isBothSplitAppsConfirmed() {
|
||||
return isInitialTaskIntentSet() && isSecondTaskIntentSet();
|
||||
if (FeatureFlags.ENABLE_SPLIT_LAUNCH_DATA_REFACTOR.get()) {
|
||||
return mSplitSelectDataHolder.isBothSplitAppsConfirmed();
|
||||
} else {
|
||||
return isInitialTaskIntentSet() && isSecondTaskIntentSet();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isInitialTaskIntentSet() {
|
||||
@@ -609,11 +758,19 @@ public class SplitSelectStateController {
|
||||
}
|
||||
|
||||
public int getInitialTaskId() {
|
||||
return mInitialTaskId;
|
||||
if (FeatureFlags.ENABLE_SPLIT_LAUNCH_DATA_REFACTOR.get()) {
|
||||
return mSplitSelectDataHolder.getInitialTaskId();
|
||||
} else {
|
||||
return mInitialTaskId;
|
||||
}
|
||||
}
|
||||
|
||||
public int getSecondTaskId() {
|
||||
return mSecondTaskId;
|
||||
if (FeatureFlags.ENABLE_SPLIT_LAUNCH_DATA_REFACTOR.get()) {
|
||||
return mSplitSelectDataHolder.getSecondTaskId();
|
||||
} else {
|
||||
return mSecondTaskId;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isSecondTaskIntentSet() {
|
||||
@@ -632,4 +789,10 @@ public class SplitSelectStateController {
|
||||
public AppPairsController getAppPairsController() {
|
||||
return mAppPairsController;
|
||||
}
|
||||
|
||||
public void dump(String prefix, PrintWriter writer) {
|
||||
if (mSplitSelectDataHolder != null) {
|
||||
mSplitSelectDataHolder.dump(prefix, writer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user