mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-20 19:38:21 +00:00
Merge "Fix bug with Taskbar launches in Overview" into tm-qpr-dev
This commit is contained in:
@@ -101,7 +101,7 @@ public interface QuickstepSystemShortcut {
|
||||
RecentsView recentsView = mTarget.getOverviewPanel();
|
||||
// Check if there is already an instance of this app running, if so, initiate the split
|
||||
// using that.
|
||||
recentsView.findLastActiveTaskAndDoSplitOperation(
|
||||
recentsView.findLastActiveTaskAndRunCallback(
|
||||
intent.getComponent(),
|
||||
(Consumer<Task>) foundTask -> {
|
||||
SplitSelectSource source = new SplitSelectSource(mOriginalView,
|
||||
|
||||
@@ -94,6 +94,7 @@ import com.android.launcher3.util.TraceHelper;
|
||||
import com.android.launcher3.util.ViewCache;
|
||||
import com.android.launcher3.views.ActivityContext;
|
||||
import com.android.quickstep.views.RecentsView;
|
||||
import com.android.quickstep.views.TaskView;
|
||||
import com.android.systemui.shared.recents.model.Task;
|
||||
import com.android.systemui.shared.rotation.RotationButtonController;
|
||||
import com.android.systemui.shared.system.ActivityManagerWrapper;
|
||||
@@ -101,6 +102,7 @@ import com.android.systemui.unfold.updates.RotationChangeProvider;
|
||||
import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* The {@link ActivityContext} with which we inflate Taskbar-related Views. This allows UI elements
|
||||
@@ -778,12 +780,12 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
|
||||
});
|
||||
});
|
||||
} else if (tag instanceof WorkspaceItemInfo) {
|
||||
// Tapping a launchable icon on Taskbar
|
||||
WorkspaceItemInfo info = (WorkspaceItemInfo) tag;
|
||||
if (!info.isDisabled() || !ItemClickHandler.handleDisabledItemClicked(info, this)) {
|
||||
TaskbarUIController taskbarUIController = mControllers.uiController;
|
||||
RecentsView recents = taskbarUIController.getRecentsView();
|
||||
if (recents != null
|
||||
&& taskbarUIController.getRecentsView().isSplitSelectionActive()) {
|
||||
if (recents != null && recents.isSplitSelectionActive()) {
|
||||
// If we are selecting a second app for split, launch the split tasks
|
||||
taskbarUIController.triggerSecondAppForSplit(info, info.intent, view);
|
||||
} else {
|
||||
@@ -810,7 +812,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
|
||||
getSystemService(LauncherApps.class)
|
||||
.startShortcut(packageName, id, null, null, info.user);
|
||||
} else {
|
||||
startItemInfoActivity(info);
|
||||
launchFromTaskbarPreservingSplitIfVisible(recents, info);
|
||||
}
|
||||
|
||||
mControllers.uiController.onTaskbarIconLaunched(info);
|
||||
@@ -825,6 +827,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
|
||||
mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(true);
|
||||
}
|
||||
} else if (tag instanceof AppInfo) {
|
||||
// Tapping an item in AllApps
|
||||
AppInfo info = (AppInfo) tag;
|
||||
TaskbarUIController taskbarUIController = mControllers.uiController;
|
||||
RecentsView recents = taskbarUIController.getRecentsView();
|
||||
@@ -833,9 +836,8 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
|
||||
// If we are selecting a second app for split, launch the split tasks
|
||||
taskbarUIController.triggerSecondAppForSplit(info, info.intent, view);
|
||||
} else {
|
||||
// Else launch the selected task
|
||||
startItemInfoActivity((AppInfo) tag);
|
||||
mControllers.uiController.onTaskbarIconLaunched((AppInfo) tag);
|
||||
launchFromTaskbarPreservingSplitIfVisible(recents, info);
|
||||
mControllers.uiController.onTaskbarIconLaunched(info);
|
||||
}
|
||||
mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(true);
|
||||
} else if (tag instanceof ItemClickProxy) {
|
||||
@@ -847,6 +849,31 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
|
||||
AbstractFloatingView.closeAllOpenViews(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Run when the user taps a Taskbar icon while in Overview. If the tapped app is currently
|
||||
* visible to the user in Overview, or is part of a visible split pair, we expand the TaskView
|
||||
* as if the user tapped on it (preserving the split pair). Otherwise, launch it normally
|
||||
* (potentially breaking a split pair).
|
||||
*/
|
||||
private void launchFromTaskbarPreservingSplitIfVisible(RecentsView recents, ItemInfo info) {
|
||||
recents.findLastActiveTaskAndRunCallback(
|
||||
info.getTargetComponent(),
|
||||
(Consumer<Task>) foundTask -> {
|
||||
if (foundTask != null) {
|
||||
TaskView foundTaskView =
|
||||
recents.getTaskViewByTaskId(foundTask.key.id);
|
||||
if (foundTaskView != null
|
||||
&& foundTaskView.isVisibleToUser()) {
|
||||
TestLogging.recordEvent(
|
||||
TestProtocol.SEQUENCE_MAIN, "start: taskbarAppIcon");
|
||||
foundTaskView.launchTasks();
|
||||
return;
|
||||
}
|
||||
}
|
||||
startItemInfoActivity(info);
|
||||
});
|
||||
}
|
||||
|
||||
private void startItemInfoActivity(ItemInfo info) {
|
||||
Intent intent = new Intent(info.getIntent())
|
||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
|
||||
@@ -170,7 +170,7 @@ public class TaskbarUIController {
|
||||
*/
|
||||
public void triggerSecondAppForSplit(ItemInfoWithIcon info, Intent intent, View startingView) {
|
||||
RecentsView recents = getRecentsView();
|
||||
recents.findLastActiveTaskAndDoSplitOperation(
|
||||
recents.findLastActiveTaskAndRunCallback(
|
||||
info.getTargetComponent(),
|
||||
(Consumer<Task>) foundTask -> {
|
||||
if (foundTask != null) {
|
||||
|
||||
@@ -1275,14 +1275,14 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
}
|
||||
|
||||
/**
|
||||
* Pulls the list of active Tasks from RecentModel, and finds the most recently active Task
|
||||
* 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 splitscreen operations when we need to check if there is a currently running
|
||||
* Task of a certain type and use the most recent one.
|
||||
* 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 findLastActiveTaskAndDoSplitOperation(ComponentName componentName,
|
||||
public void findLastActiveTaskAndRunCallback(ComponentName componentName,
|
||||
Consumer<Task> callback) {
|
||||
mModel.getTasks(taskGroups -> {
|
||||
Task lastActiveTask = null;
|
||||
|
||||
Reference in New Issue
Block a user