Merge "Move active task tracking to a repository" into tm-qpr-dev
This commit is contained in:
@@ -55,6 +55,8 @@ import com.android.wm.shell.common.annotations.ShellBackgroundThread;
|
|||||||
import com.android.wm.shell.common.annotations.ShellMainThread;
|
import com.android.wm.shell.common.annotations.ShellMainThread;
|
||||||
import com.android.wm.shell.common.annotations.ShellSplashscreenThread;
|
import com.android.wm.shell.common.annotations.ShellSplashscreenThread;
|
||||||
import com.android.wm.shell.compatui.CompatUIController;
|
import com.android.wm.shell.compatui.CompatUIController;
|
||||||
|
import com.android.wm.shell.desktopmode.DesktopMode;
|
||||||
|
import com.android.wm.shell.desktopmode.DesktopModeTaskRepository;
|
||||||
import com.android.wm.shell.displayareahelper.DisplayAreaHelper;
|
import com.android.wm.shell.displayareahelper.DisplayAreaHelper;
|
||||||
import com.android.wm.shell.displayareahelper.DisplayAreaHelperController;
|
import com.android.wm.shell.displayareahelper.DisplayAreaHelperController;
|
||||||
import com.android.wm.shell.draganddrop.DragAndDropController;
|
import com.android.wm.shell.draganddrop.DragAndDropController;
|
||||||
@@ -477,11 +479,12 @@ public abstract class WMShellBaseModule {
|
|||||||
ShellInit shellInit,
|
ShellInit shellInit,
|
||||||
ShellCommandHandler shellCommandHandler,
|
ShellCommandHandler shellCommandHandler,
|
||||||
TaskStackListenerImpl taskStackListener,
|
TaskStackListenerImpl taskStackListener,
|
||||||
|
Optional<DesktopModeTaskRepository> desktopModeTaskRepository,
|
||||||
@ShellMainThread ShellExecutor mainExecutor
|
@ShellMainThread ShellExecutor mainExecutor
|
||||||
) {
|
) {
|
||||||
return Optional.ofNullable(
|
return Optional.ofNullable(
|
||||||
RecentTasksController.create(context, shellInit, shellCommandHandler,
|
RecentTasksController.create(context, shellInit, shellCommandHandler,
|
||||||
taskStackListener, mainExecutor));
|
taskStackListener, desktopModeTaskRepository, mainExecutor));
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -665,6 +668,24 @@ public abstract class WMShellBaseModule {
|
|||||||
return new ShellController(shellInit, shellCommandHandler, mainExecutor);
|
return new ShellController(shellInit, shellCommandHandler, mainExecutor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Desktop mode (optional feature)
|
||||||
|
//
|
||||||
|
|
||||||
|
@BindsOptionalOf
|
||||||
|
@DynamicOverride
|
||||||
|
abstract DesktopModeTaskRepository optionalDesktopModeTaskRepository();
|
||||||
|
|
||||||
|
@WMSingleton
|
||||||
|
@Provides
|
||||||
|
static Optional<DesktopModeTaskRepository> providesDesktopModeTaskRepository(
|
||||||
|
@DynamicOverride Optional<DesktopModeTaskRepository> desktopModeTaskRepository) {
|
||||||
|
if (DesktopMode.IS_SUPPORTED) {
|
||||||
|
return desktopModeTaskRepository;
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Misc
|
// Misc
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ import com.android.wm.shell.common.annotations.ShellBackgroundThread;
|
|||||||
import com.android.wm.shell.common.annotations.ShellMainThread;
|
import com.android.wm.shell.common.annotations.ShellMainThread;
|
||||||
import com.android.wm.shell.desktopmode.DesktopMode;
|
import com.android.wm.shell.desktopmode.DesktopMode;
|
||||||
import com.android.wm.shell.desktopmode.DesktopModeController;
|
import com.android.wm.shell.desktopmode.DesktopModeController;
|
||||||
|
import com.android.wm.shell.desktopmode.DesktopModeTaskRepository;
|
||||||
import com.android.wm.shell.draganddrop.DragAndDropController;
|
import com.android.wm.shell.draganddrop.DragAndDropController;
|
||||||
import com.android.wm.shell.freeform.FreeformComponents;
|
import com.android.wm.shell.freeform.FreeformComponents;
|
||||||
import com.android.wm.shell.freeform.FreeformTaskListener;
|
import com.android.wm.shell.freeform.FreeformTaskListener;
|
||||||
@@ -220,14 +221,14 @@ public abstract class WMShellModule {
|
|||||||
Context context,
|
Context context,
|
||||||
ShellInit shellInit,
|
ShellInit shellInit,
|
||||||
ShellTaskOrganizer shellTaskOrganizer,
|
ShellTaskOrganizer shellTaskOrganizer,
|
||||||
Optional<RecentTasksController> recentTasksController,
|
Optional<DesktopModeTaskRepository> desktopModeTaskRepository,
|
||||||
WindowDecorViewModel<?> windowDecorViewModel) {
|
WindowDecorViewModel<?> windowDecorViewModel) {
|
||||||
// TODO(b/238217847): Temporarily add this check here until we can remove the dynamic
|
// TODO(b/238217847): Temporarily add this check here until we can remove the dynamic
|
||||||
// override for this controller from the base module
|
// override for this controller from the base module
|
||||||
ShellInit init = FreeformComponents.isFreeformEnabled(context)
|
ShellInit init = FreeformComponents.isFreeformEnabled(context)
|
||||||
? shellInit
|
? shellInit
|
||||||
: null;
|
: null;
|
||||||
return new FreeformTaskListener<>(init, shellTaskOrganizer, recentTasksController,
|
return new FreeformTaskListener<>(init, shellTaskOrganizer, desktopModeTaskRepository,
|
||||||
windowDecorViewModel);
|
windowDecorViewModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -610,6 +611,13 @@ public abstract class WMShellModule {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@WMSingleton
|
||||||
|
@Provides
|
||||||
|
@DynamicOverride
|
||||||
|
static DesktopModeTaskRepository provideDesktopModeTaskRepository() {
|
||||||
|
return new DesktopModeTaskRepository();
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Misc
|
// Misc
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.wm.shell.desktopmode
|
||||||
|
|
||||||
|
import android.util.ArraySet
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Keeps track of task data related to desktop mode.
|
||||||
|
*/
|
||||||
|
class DesktopModeTaskRepository {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set of task ids that are marked as active in desktop mode.
|
||||||
|
* Active tasks in desktop mode are freeform tasks that are visible or have been visible after
|
||||||
|
* desktop mode was activated.
|
||||||
|
* Task gets removed from this list when it vanishes. Or when desktop mode is turned off.
|
||||||
|
*/
|
||||||
|
private val activeTasks = ArraySet<Int>()
|
||||||
|
private val listeners = ArraySet<Listener>()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a [Listener] to be notified of updates to the repository.
|
||||||
|
*/
|
||||||
|
fun addListener(listener: Listener) {
|
||||||
|
listeners.add(listener)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a previously registered [Listener]
|
||||||
|
*/
|
||||||
|
fun removeListener(listener: Listener) {
|
||||||
|
listeners.remove(listener)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mark a task with given [taskId] as active.
|
||||||
|
*/
|
||||||
|
fun addActiveTask(taskId: Int) {
|
||||||
|
val added = activeTasks.add(taskId)
|
||||||
|
if (added) {
|
||||||
|
listeners.onEach { it.onActiveTasksChanged() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove task with given [taskId] from active tasks.
|
||||||
|
*/
|
||||||
|
fun removeActiveTask(taskId: Int) {
|
||||||
|
val removed = activeTasks.remove(taskId)
|
||||||
|
if (removed) {
|
||||||
|
listeners.onEach { it.onActiveTasksChanged() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a task with the given [taskId] was marked as an active task
|
||||||
|
*/
|
||||||
|
fun isActiveTask(taskId: Int): Boolean {
|
||||||
|
return activeTasks.contains(taskId)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a set of the active tasks
|
||||||
|
*/
|
||||||
|
fun getActiveTasks(): ArraySet<Int> {
|
||||||
|
return ArraySet(activeTasks)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines interface for classes that can listen to changes in repository state.
|
||||||
|
*/
|
||||||
|
interface Listener {
|
||||||
|
fun onActiveTasksChanged()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -29,8 +29,8 @@ import androidx.annotation.Nullable;
|
|||||||
import com.android.internal.protolog.common.ProtoLog;
|
import com.android.internal.protolog.common.ProtoLog;
|
||||||
import com.android.wm.shell.ShellTaskOrganizer;
|
import com.android.wm.shell.ShellTaskOrganizer;
|
||||||
import com.android.wm.shell.desktopmode.DesktopMode;
|
import com.android.wm.shell.desktopmode.DesktopMode;
|
||||||
|
import com.android.wm.shell.desktopmode.DesktopModeTaskRepository;
|
||||||
import com.android.wm.shell.protolog.ShellProtoLogGroup;
|
import com.android.wm.shell.protolog.ShellProtoLogGroup;
|
||||||
import com.android.wm.shell.recents.RecentTasksController;
|
|
||||||
import com.android.wm.shell.sysui.ShellInit;
|
import com.android.wm.shell.sysui.ShellInit;
|
||||||
import com.android.wm.shell.transition.Transitions;
|
import com.android.wm.shell.transition.Transitions;
|
||||||
import com.android.wm.shell.windowdecor.WindowDecorViewModel;
|
import com.android.wm.shell.windowdecor.WindowDecorViewModel;
|
||||||
@@ -49,7 +49,7 @@ public class FreeformTaskListener<T extends AutoCloseable>
|
|||||||
private static final String TAG = "FreeformTaskListener";
|
private static final String TAG = "FreeformTaskListener";
|
||||||
|
|
||||||
private final ShellTaskOrganizer mShellTaskOrganizer;
|
private final ShellTaskOrganizer mShellTaskOrganizer;
|
||||||
private final Optional<RecentTasksController> mRecentTasksOptional;
|
private final Optional<DesktopModeTaskRepository> mDesktopModeTaskRepository;
|
||||||
private final WindowDecorViewModel<T> mWindowDecorationViewModel;
|
private final WindowDecorViewModel<T> mWindowDecorationViewModel;
|
||||||
|
|
||||||
private final SparseArray<State<T>> mTasks = new SparseArray<>();
|
private final SparseArray<State<T>> mTasks = new SparseArray<>();
|
||||||
@@ -64,11 +64,11 @@ public class FreeformTaskListener<T extends AutoCloseable>
|
|||||||
public FreeformTaskListener(
|
public FreeformTaskListener(
|
||||||
ShellInit shellInit,
|
ShellInit shellInit,
|
||||||
ShellTaskOrganizer shellTaskOrganizer,
|
ShellTaskOrganizer shellTaskOrganizer,
|
||||||
Optional<RecentTasksController> recentTasksController,
|
Optional<DesktopModeTaskRepository> desktopModeTaskRepository,
|
||||||
WindowDecorViewModel<T> windowDecorationViewModel) {
|
WindowDecorViewModel<T> windowDecorationViewModel) {
|
||||||
mShellTaskOrganizer = shellTaskOrganizer;
|
mShellTaskOrganizer = shellTaskOrganizer;
|
||||||
mWindowDecorationViewModel = windowDecorationViewModel;
|
mWindowDecorationViewModel = windowDecorationViewModel;
|
||||||
mRecentTasksOptional = recentTasksController;
|
mDesktopModeTaskRepository = desktopModeTaskRepository;
|
||||||
if (shellInit != null) {
|
if (shellInit != null) {
|
||||||
shellInit.addInitCallback(this::onInit, this);
|
shellInit.addInitCallback(this::onInit, this);
|
||||||
}
|
}
|
||||||
@@ -93,7 +93,7 @@ public class FreeformTaskListener<T extends AutoCloseable>
|
|||||||
if (DesktopMode.IS_SUPPORTED && taskInfo.isVisible) {
|
if (DesktopMode.IS_SUPPORTED && taskInfo.isVisible) {
|
||||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
|
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
|
||||||
"Adding active freeform task: #%d", taskInfo.taskId);
|
"Adding active freeform task: #%d", taskInfo.taskId);
|
||||||
mRecentTasksOptional.ifPresent(rt -> rt.addActiveFreeformTask(taskInfo.taskId));
|
mDesktopModeTaskRepository.ifPresent(it -> it.addActiveTask(taskInfo.taskId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -126,7 +126,7 @@ public class FreeformTaskListener<T extends AutoCloseable>
|
|||||||
if (DesktopMode.IS_SUPPORTED) {
|
if (DesktopMode.IS_SUPPORTED) {
|
||||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
|
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
|
||||||
"Removing active freeform task: #%d", taskInfo.taskId);
|
"Removing active freeform task: #%d", taskInfo.taskId);
|
||||||
mRecentTasksOptional.ifPresent(rt -> rt.removeActiveFreeformTask(taskInfo.taskId));
|
mDesktopModeTaskRepository.ifPresent(it -> it.removeActiveTask(taskInfo.taskId));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Transitions.ENABLE_SHELL_TRANSITIONS) {
|
if (Transitions.ENABLE_SHELL_TRANSITIONS) {
|
||||||
@@ -154,7 +154,7 @@ public class FreeformTaskListener<T extends AutoCloseable>
|
|||||||
if (taskInfo.isVisible) {
|
if (taskInfo.isVisible) {
|
||||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
|
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
|
||||||
"Adding active freeform task: #%d", taskInfo.taskId);
|
"Adding active freeform task: #%d", taskInfo.taskId);
|
||||||
mRecentTasksOptional.ifPresent(rt -> rt.addActiveFreeformTask(taskInfo.taskId));
|
mDesktopModeTaskRepository.ifPresent(it -> it.addActiveTask(taskInfo.taskId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ import com.android.wm.shell.common.TaskStackListenerImpl;
|
|||||||
import com.android.wm.shell.common.annotations.ExternalThread;
|
import com.android.wm.shell.common.annotations.ExternalThread;
|
||||||
import com.android.wm.shell.common.annotations.ShellMainThread;
|
import com.android.wm.shell.common.annotations.ShellMainThread;
|
||||||
import com.android.wm.shell.desktopmode.DesktopMode;
|
import com.android.wm.shell.desktopmode.DesktopMode;
|
||||||
|
import com.android.wm.shell.desktopmode.DesktopModeTaskRepository;
|
||||||
import com.android.wm.shell.protolog.ShellProtoLogGroup;
|
import com.android.wm.shell.protolog.ShellProtoLogGroup;
|
||||||
import com.android.wm.shell.sysui.ShellCommandHandler;
|
import com.android.wm.shell.sysui.ShellCommandHandler;
|
||||||
import com.android.wm.shell.sysui.ShellInit;
|
import com.android.wm.shell.sysui.ShellInit;
|
||||||
@@ -53,19 +54,20 @@ import com.android.wm.shell.util.SplitBounds;
|
|||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Manages the recent task list from the system, caching it as necessary.
|
* Manages the recent task list from the system, caching it as necessary.
|
||||||
*/
|
*/
|
||||||
public class RecentTasksController implements TaskStackListenerCallback,
|
public class RecentTasksController implements TaskStackListenerCallback,
|
||||||
RemoteCallable<RecentTasksController> {
|
RemoteCallable<RecentTasksController>, DesktopModeTaskRepository.Listener {
|
||||||
private static final String TAG = RecentTasksController.class.getSimpleName();
|
private static final String TAG = RecentTasksController.class.getSimpleName();
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final ShellCommandHandler mShellCommandHandler;
|
private final ShellCommandHandler mShellCommandHandler;
|
||||||
|
private final Optional<DesktopModeTaskRepository> mDesktopModeTaskRepository;
|
||||||
private final ShellExecutor mMainExecutor;
|
private final ShellExecutor mMainExecutor;
|
||||||
private final TaskStackListenerImpl mTaskStackListener;
|
private final TaskStackListenerImpl mTaskStackListener;
|
||||||
private final RecentTasks mImpl = new RecentTasksImpl();
|
private final RecentTasks mImpl = new RecentTasksImpl();
|
||||||
@@ -83,15 +85,6 @@ public class RecentTasksController implements TaskStackListenerCallback,
|
|||||||
*/
|
*/
|
||||||
private final Map<Integer, SplitBounds> mTaskSplitBoundsMap = new HashMap<>();
|
private final Map<Integer, SplitBounds> mTaskSplitBoundsMap = new HashMap<>();
|
||||||
|
|
||||||
/**
|
|
||||||
* Set of taskId's that have been launched in freeform mode.
|
|
||||||
* This includes tasks that are currently running, visible and in freeform mode. And also
|
|
||||||
* includes tasks that are running in the background, are no longer visible, but at some point
|
|
||||||
* were visible to the user.
|
|
||||||
* This is used to decide which freeform apps belong to the user's desktop.
|
|
||||||
*/
|
|
||||||
private final HashSet<Integer> mActiveFreeformTasks = new HashSet<>();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates {@link RecentTasksController}, returns {@code null} if the feature is not
|
* Creates {@link RecentTasksController}, returns {@code null} if the feature is not
|
||||||
* supported.
|
* supported.
|
||||||
@@ -102,24 +95,27 @@ public class RecentTasksController implements TaskStackListenerCallback,
|
|||||||
ShellInit shellInit,
|
ShellInit shellInit,
|
||||||
ShellCommandHandler shellCommandHandler,
|
ShellCommandHandler shellCommandHandler,
|
||||||
TaskStackListenerImpl taskStackListener,
|
TaskStackListenerImpl taskStackListener,
|
||||||
|
Optional<DesktopModeTaskRepository> desktopModeTaskRepository,
|
||||||
@ShellMainThread ShellExecutor mainExecutor
|
@ShellMainThread ShellExecutor mainExecutor
|
||||||
) {
|
) {
|
||||||
if (!context.getResources().getBoolean(com.android.internal.R.bool.config_hasRecents)) {
|
if (!context.getResources().getBoolean(com.android.internal.R.bool.config_hasRecents)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return new RecentTasksController(context, shellInit, shellCommandHandler, taskStackListener,
|
return new RecentTasksController(context, shellInit, shellCommandHandler, taskStackListener,
|
||||||
mainExecutor);
|
desktopModeTaskRepository, mainExecutor);
|
||||||
}
|
}
|
||||||
|
|
||||||
RecentTasksController(Context context,
|
RecentTasksController(Context context,
|
||||||
ShellInit shellInit,
|
ShellInit shellInit,
|
||||||
ShellCommandHandler shellCommandHandler,
|
ShellCommandHandler shellCommandHandler,
|
||||||
TaskStackListenerImpl taskStackListener,
|
TaskStackListenerImpl taskStackListener,
|
||||||
|
Optional<DesktopModeTaskRepository> desktopModeTaskRepository,
|
||||||
ShellExecutor mainExecutor) {
|
ShellExecutor mainExecutor) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mShellCommandHandler = shellCommandHandler;
|
mShellCommandHandler = shellCommandHandler;
|
||||||
mIsDesktopMode = mContext.getPackageManager().hasSystemFeature(FEATURE_PC);
|
mIsDesktopMode = mContext.getPackageManager().hasSystemFeature(FEATURE_PC);
|
||||||
mTaskStackListener = taskStackListener;
|
mTaskStackListener = taskStackListener;
|
||||||
|
mDesktopModeTaskRepository = desktopModeTaskRepository;
|
||||||
mMainExecutor = mainExecutor;
|
mMainExecutor = mainExecutor;
|
||||||
shellInit.addInitCallback(this::onInit, this);
|
shellInit.addInitCallback(this::onInit, this);
|
||||||
}
|
}
|
||||||
@@ -131,6 +127,7 @@ public class RecentTasksController implements TaskStackListenerCallback,
|
|||||||
private void onInit() {
|
private void onInit() {
|
||||||
mShellCommandHandler.addDumpCallback(this::dump, this);
|
mShellCommandHandler.addDumpCallback(this::dump, this);
|
||||||
mTaskStackListener.addListener(this);
|
mTaskStackListener.addListener(this);
|
||||||
|
mDesktopModeTaskRepository.ifPresent(it -> it.addListener(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -217,19 +214,8 @@ public class RecentTasksController implements TaskStackListenerCallback,
|
|||||||
notifyRecentTasksChanged();
|
notifyRecentTasksChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Mark a task with given {@code taskId} as active in freeform
|
public void onActiveTasksChanged() {
|
||||||
*/
|
|
||||||
public void addActiveFreeformTask(int taskId) {
|
|
||||||
mActiveFreeformTasks.add(taskId);
|
|
||||||
notifyRecentTasksChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove task with given {@code taskId} from active freeform tasks
|
|
||||||
*/
|
|
||||||
public void removeActiveFreeformTask(int taskId) {
|
|
||||||
mActiveFreeformTasks.remove(taskId);
|
|
||||||
notifyRecentTasksChanged();
|
notifyRecentTasksChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -312,7 +298,8 @@ public class RecentTasksController implements TaskStackListenerCallback,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (desktopModeActive && mActiveFreeformTasks.contains(taskInfo.taskId)) {
|
if (desktopModeActive && mDesktopModeTaskRepository.isPresent()
|
||||||
|
&& mDesktopModeTaskRepository.get().isActiveTask(taskInfo.taskId)) {
|
||||||
// Freeform tasks will be added as a separate entry
|
// Freeform tasks will be added as a separate entry
|
||||||
freeformTasks.add(taskInfo);
|
freeformTasks.add(taskInfo);
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.wm.shell.desktopmode
|
||||||
|
|
||||||
|
import android.testing.AndroidTestingRunner
|
||||||
|
import androidx.test.filters.SmallTest
|
||||||
|
import com.android.wm.shell.ShellTestCase
|
||||||
|
import com.google.common.truth.Truth.assertThat
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
|
||||||
|
@SmallTest
|
||||||
|
@RunWith(AndroidTestingRunner::class)
|
||||||
|
class DesktopModeTaskRepositoryTest : ShellTestCase() {
|
||||||
|
|
||||||
|
private lateinit var repo: DesktopModeTaskRepository
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun setUp() {
|
||||||
|
repo = DesktopModeTaskRepository()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun addActiveTask_listenerNotifiedAndTaskIsActive() {
|
||||||
|
val listener = TestListener()
|
||||||
|
repo.addListener(listener)
|
||||||
|
|
||||||
|
repo.addActiveTask(1)
|
||||||
|
assertThat(listener.activeTaskChangedCalls).isEqualTo(1)
|
||||||
|
assertThat(repo.isActiveTask(1)).isTrue()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun addActiveTask_sameTaskDoesNotNotify() {
|
||||||
|
val listener = TestListener()
|
||||||
|
repo.addListener(listener)
|
||||||
|
|
||||||
|
repo.addActiveTask(1)
|
||||||
|
repo.addActiveTask(1)
|
||||||
|
assertThat(listener.activeTaskChangedCalls).isEqualTo(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun addActiveTask_multipleTasksAddedNotifiesForEach() {
|
||||||
|
val listener = TestListener()
|
||||||
|
repo.addListener(listener)
|
||||||
|
|
||||||
|
repo.addActiveTask(1)
|
||||||
|
repo.addActiveTask(2)
|
||||||
|
assertThat(listener.activeTaskChangedCalls).isEqualTo(2)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun removeActiveTask_listenerNotifiedAndTaskNotActive() {
|
||||||
|
val listener = TestListener()
|
||||||
|
repo.addListener(listener)
|
||||||
|
|
||||||
|
repo.addActiveTask(1)
|
||||||
|
repo.removeActiveTask(1)
|
||||||
|
// Notify once for add and once for remove
|
||||||
|
assertThat(listener.activeTaskChangedCalls).isEqualTo(2)
|
||||||
|
assertThat(repo.isActiveTask(1)).isFalse()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun removeActiveTask_removeNotExistingTaskDoesNotNotify() {
|
||||||
|
val listener = TestListener()
|
||||||
|
repo.addListener(listener)
|
||||||
|
repo.removeActiveTask(99)
|
||||||
|
assertThat(listener.activeTaskChangedCalls).isEqualTo(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun isActiveTask_notExistingTaskReturnsFalse() {
|
||||||
|
assertThat(repo.isActiveTask(99)).isFalse()
|
||||||
|
}
|
||||||
|
|
||||||
|
class TestListener : DesktopModeTaskRepository.Listener {
|
||||||
|
var activeTaskChangedCalls = 0
|
||||||
|
override fun onActiveTasksChanged() {
|
||||||
|
activeTaskChangedCalls++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -55,6 +55,7 @@ import com.android.wm.shell.TestShellExecutor;
|
|||||||
import com.android.wm.shell.common.ShellExecutor;
|
import com.android.wm.shell.common.ShellExecutor;
|
||||||
import com.android.wm.shell.common.TaskStackListenerImpl;
|
import com.android.wm.shell.common.TaskStackListenerImpl;
|
||||||
import com.android.wm.shell.desktopmode.DesktopMode;
|
import com.android.wm.shell.desktopmode.DesktopMode;
|
||||||
|
import com.android.wm.shell.desktopmode.DesktopModeTaskRepository;
|
||||||
import com.android.wm.shell.sysui.ShellCommandHandler;
|
import com.android.wm.shell.sysui.ShellCommandHandler;
|
||||||
import com.android.wm.shell.sysui.ShellInit;
|
import com.android.wm.shell.sysui.ShellInit;
|
||||||
import com.android.wm.shell.util.GroupedRecentTaskInfo;
|
import com.android.wm.shell.util.GroupedRecentTaskInfo;
|
||||||
@@ -82,6 +83,8 @@ public class RecentTasksControllerTest extends ShellTestCase {
|
|||||||
private TaskStackListenerImpl mTaskStackListener;
|
private TaskStackListenerImpl mTaskStackListener;
|
||||||
@Mock
|
@Mock
|
||||||
private ShellCommandHandler mShellCommandHandler;
|
private ShellCommandHandler mShellCommandHandler;
|
||||||
|
@Mock
|
||||||
|
private DesktopModeTaskRepository mDesktopModeTaskRepository;
|
||||||
|
|
||||||
private ShellTaskOrganizer mShellTaskOrganizer;
|
private ShellTaskOrganizer mShellTaskOrganizer;
|
||||||
private RecentTasksController mRecentTasksController;
|
private RecentTasksController mRecentTasksController;
|
||||||
@@ -94,7 +97,8 @@ public class RecentTasksControllerTest extends ShellTestCase {
|
|||||||
when(mContext.getPackageManager()).thenReturn(mock(PackageManager.class));
|
when(mContext.getPackageManager()).thenReturn(mock(PackageManager.class));
|
||||||
mShellInit = spy(new ShellInit(mMainExecutor));
|
mShellInit = spy(new ShellInit(mMainExecutor));
|
||||||
mRecentTasksController = spy(new RecentTasksController(mContext, mShellInit,
|
mRecentTasksController = spy(new RecentTasksController(mContext, mShellInit,
|
||||||
mShellCommandHandler, mTaskStackListener, mMainExecutor));
|
mShellCommandHandler, mTaskStackListener, Optional.of(mDesktopModeTaskRepository),
|
||||||
|
mMainExecutor));
|
||||||
mShellTaskOrganizer = new ShellTaskOrganizer(mShellInit, mShellCommandHandler,
|
mShellTaskOrganizer = new ShellTaskOrganizer(mShellInit, mShellCommandHandler,
|
||||||
null /* sizeCompatUI */, Optional.empty(), Optional.of(mRecentTasksController),
|
null /* sizeCompatUI */, Optional.empty(), Optional.of(mRecentTasksController),
|
||||||
mMainExecutor);
|
mMainExecutor);
|
||||||
@@ -195,8 +199,8 @@ public class RecentTasksControllerTest extends ShellTestCase {
|
|||||||
ActivityManager.RecentTaskInfo t4 = makeTaskInfo(4);
|
ActivityManager.RecentTaskInfo t4 = makeTaskInfo(4);
|
||||||
setRawList(t1, t2, t3, t4);
|
setRawList(t1, t2, t3, t4);
|
||||||
|
|
||||||
mRecentTasksController.addActiveFreeformTask(1);
|
when(mDesktopModeTaskRepository.isActiveTask(1)).thenReturn(true);
|
||||||
mRecentTasksController.addActiveFreeformTask(3);
|
when(mDesktopModeTaskRepository.isActiveTask(3)).thenReturn(true);
|
||||||
|
|
||||||
ArrayList<GroupedRecentTaskInfo> recentTasks = mRecentTasksController.getRecentTasks(
|
ArrayList<GroupedRecentTaskInfo> recentTasks = mRecentTasksController.getRecentTasks(
|
||||||
MAX_VALUE, RECENT_IGNORE_UNAVAILABLE, 0);
|
MAX_VALUE, RECENT_IGNORE_UNAVAILABLE, 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user