Loading libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +49 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager.RunningTaskInfo; import android.app.TaskInfo; import android.app.WindowConfiguration; import android.content.Context; import android.content.LocusId; import android.content.pm.ActivityInfo; Loading Loading @@ -121,6 +122,16 @@ public class ShellTaskOrganizer extends TaskOrganizer implements void onVisibilityChanged(int taskId, LocusId locus, boolean visible); } /** * Callbacks for events in which the focus has changed. */ public interface FocusListener { /** * Notifies when the task which is focused has changed. */ void onFocusTaskChanged(RunningTaskInfo taskInfo); } /** * Keys map from either a task id or {@link TaskListenerType}. * @see #addListenerForTaskId Loading @@ -142,6 +153,8 @@ public class ShellTaskOrganizer extends TaskOrganizer implements /** @see #addLocusIdListener */ private final ArraySet<LocusIdListener> mLocusIdListeners = new ArraySet<>(); private final ArraySet<FocusListener> mFocusListeners = new ArraySet<>(); private final Object mLock = new Object(); private StartingWindowController mStartingWindow; Loading @@ -155,6 +168,9 @@ public class ShellTaskOrganizer extends TaskOrganizer implements @Nullable private final Optional<RecentTasksController> mRecentTasks; @Nullable private RunningTaskInfo mLastFocusedTaskInfo; public ShellTaskOrganizer(ShellExecutor mainExecutor, Context context) { this(null /* taskOrganizerController */, mainExecutor, context, null /* sizeCompatUI */, Optional.empty() /* recentTasksController */); Loading Loading @@ -331,6 +347,27 @@ public class ShellTaskOrganizer extends TaskOrganizer implements } } /** * Adds a listener to be notified for task focus changes. */ public void addFocusListener(FocusListener listener) { synchronized (mLock) { mFocusListeners.add(listener); if (mLastFocusedTaskInfo != null) { listener.onFocusTaskChanged(mLastFocusedTaskInfo); } } } /** * Removes listener. */ public void removeLocusIdListener(FocusListener listener) { synchronized (mLock) { mFocusListeners.remove(listener); } } @Override public void addStartingWindow(StartingWindowInfo info, IBinder appToken) { if (mStartingWindow != null) { Loading Loading @@ -422,6 +459,18 @@ public class ShellTaskOrganizer extends TaskOrganizer implements mRecentTasks.ifPresent(recentTasks -> recentTasks.onTaskWindowingModeChanged(taskInfo)); } // TODO (b/207687679): Remove check for HOME once bug is fixed final boolean isFocusedOrHome = taskInfo.isFocused || (taskInfo.topActivityType == WindowConfiguration.ACTIVITY_TYPE_HOME && taskInfo.isVisible); final boolean focusTaskChanged = (mLastFocusedTaskInfo == null || mLastFocusedTaskInfo.taskId != taskInfo.taskId) && isFocusedOrHome; if (focusTaskChanged) { for (int i = 0; i < mFocusListeners.size(); i++) { mFocusListeners.valueAt(i).onFocusTaskChanged(taskInfo); } mLastFocusedTaskInfo = taskInfo; } } } Loading libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +2 −1 Original line number Diff line number Diff line Loading @@ -241,10 +241,11 @@ public class WMShellModule { static PhonePipMenuController providesPipPhoneMenuController(Context context, PipBoundsState pipBoundsState, PipMediaController pipMediaController, SystemWindows systemWindows, Optional<SplitScreenController> splitScreenOptional, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler) { return new PhonePipMenuController(context, pipBoundsState, pipMediaController, systemWindows, mainExecutor, mainHandler); systemWindows, splitScreenOptional, mainExecutor, mainHandler); } @WMSingleton Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMenuController.java +5 −0 Original line number Diff line number Diff line Loading @@ -89,6 +89,11 @@ public interface PipMenuController { */ default void updateMenuBounds(Rect destinationBounds) {} /** * Update when the current focused task changes. */ default void onFocusTaskChanged(RunningTaskInfo taskInfo) {} /** * Returns a default LayoutParams for the PIP Menu. * @param width the PIP stack width. Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java +7 −1 Original line number Diff line number Diff line Loading @@ -98,7 +98,7 @@ import java.util.function.IntConsumer; * see also {@link PipMotionHelper}. */ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, DisplayController.OnDisplaysChangedListener { DisplayController.OnDisplaysChangedListener, ShellTaskOrganizer.FocusListener { private static final String TAG = PipTaskOrganizer.class.getSimpleName(); private static final boolean DEBUG = false; /** Loading Loading @@ -286,6 +286,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, mMainExecutor.execute(() -> { mTaskOrganizer.addListenerForType(this, TASK_LISTENER_TYPE_PIP); }); mTaskOrganizer.addFocusListener(this); mPipTransitionController.setPipOrganizer(this); displayController.addDisplayWindowListener(this); } Loading Loading @@ -771,6 +772,11 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, null /* updateBoundsCallback */); } @Override public void onFocusTaskChanged(ActivityManager.RunningTaskInfo taskInfo) { mPipMenuController.onFocusTaskChanged(taskInfo); } @Override public boolean supportSizeCompatUI() { // PIP doesn't support size compat. Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipMenuController.java +15 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.wm.shell.pip.phone; import static android.view.WindowManager.SHELL_ROOT_LAYER_PIP; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.RemoteAction; import android.content.Context; import android.content.pm.ParceledListSlice; Loading @@ -43,10 +44,12 @@ import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipMediaController; import com.android.wm.shell.pip.PipMediaController.ActionListener; import com.android.wm.shell.pip.PipMenuController; import com.android.wm.shell.splitscreen.SplitScreenController; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.Optional; /** * Manages the PiP menu view which can show menu options or a scrim. Loading Loading @@ -114,6 +117,7 @@ public class PhonePipMenuController implements PipMenuController { private final ArrayList<Listener> mListeners = new ArrayList<>(); private final SystemWindows mSystemWindows; private final Optional<SplitScreenController> mSplitScreenController; private ParceledListSlice<RemoteAction> mAppActions; private ParceledListSlice<RemoteAction> mMediaActions; private SyncRtSurfaceTransactionApplier mApplier; Loading Loading @@ -145,6 +149,7 @@ public class PhonePipMenuController implements PipMenuController { public PhonePipMenuController(Context context, PipBoundsState pipBoundsState, PipMediaController mediaController, SystemWindows systemWindows, Optional<SplitScreenController> splitScreenOptional, ShellExecutor mainExecutor, Handler mainHandler) { mContext = context; mPipBoundsState = pipBoundsState; Loading @@ -152,6 +157,7 @@ public class PhonePipMenuController implements PipMenuController { mSystemWindows = systemWindows; mMainExecutor = mainExecutor; mMainHandler = mainHandler; mSplitScreenController = splitScreenOptional; } public boolean isMenuVisible() { Loading Loading @@ -180,7 +186,8 @@ public class PhonePipMenuController implements PipMenuController { if (mPipMenuView != null) { detachPipMenuView(); } mPipMenuView = new PipMenuView(mContext, this, mMainExecutor, mMainHandler); mPipMenuView = new PipMenuView(mContext, this, mMainExecutor, mMainHandler, mSplitScreenController); mSystemWindows.addView(mPipMenuView, getPipMenuLayoutParams(MENU_WINDOW_TITLE, 0 /* width */, 0 /* height */), 0, SHELL_ROOT_LAYER_PIP); Loading Loading @@ -209,6 +216,13 @@ public class PhonePipMenuController implements PipMenuController { updateMenuLayout(destinationBounds); } @Override public void onFocusTaskChanged(ActivityManager.RunningTaskInfo taskInfo) { if (mPipMenuView != null) { mPipMenuView.onFocusTaskChanged(taskInfo); } } /** * Tries to grab a surface control from {@link PipMenuView}. If this isn't available for some * reason (ie. the window isn't ready yet, thus {@link android.view.ViewRootImpl} is Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +49 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager.RunningTaskInfo; import android.app.TaskInfo; import android.app.WindowConfiguration; import android.content.Context; import android.content.LocusId; import android.content.pm.ActivityInfo; Loading Loading @@ -121,6 +122,16 @@ public class ShellTaskOrganizer extends TaskOrganizer implements void onVisibilityChanged(int taskId, LocusId locus, boolean visible); } /** * Callbacks for events in which the focus has changed. */ public interface FocusListener { /** * Notifies when the task which is focused has changed. */ void onFocusTaskChanged(RunningTaskInfo taskInfo); } /** * Keys map from either a task id or {@link TaskListenerType}. * @see #addListenerForTaskId Loading @@ -142,6 +153,8 @@ public class ShellTaskOrganizer extends TaskOrganizer implements /** @see #addLocusIdListener */ private final ArraySet<LocusIdListener> mLocusIdListeners = new ArraySet<>(); private final ArraySet<FocusListener> mFocusListeners = new ArraySet<>(); private final Object mLock = new Object(); private StartingWindowController mStartingWindow; Loading @@ -155,6 +168,9 @@ public class ShellTaskOrganizer extends TaskOrganizer implements @Nullable private final Optional<RecentTasksController> mRecentTasks; @Nullable private RunningTaskInfo mLastFocusedTaskInfo; public ShellTaskOrganizer(ShellExecutor mainExecutor, Context context) { this(null /* taskOrganizerController */, mainExecutor, context, null /* sizeCompatUI */, Optional.empty() /* recentTasksController */); Loading Loading @@ -331,6 +347,27 @@ public class ShellTaskOrganizer extends TaskOrganizer implements } } /** * Adds a listener to be notified for task focus changes. */ public void addFocusListener(FocusListener listener) { synchronized (mLock) { mFocusListeners.add(listener); if (mLastFocusedTaskInfo != null) { listener.onFocusTaskChanged(mLastFocusedTaskInfo); } } } /** * Removes listener. */ public void removeLocusIdListener(FocusListener listener) { synchronized (mLock) { mFocusListeners.remove(listener); } } @Override public void addStartingWindow(StartingWindowInfo info, IBinder appToken) { if (mStartingWindow != null) { Loading Loading @@ -422,6 +459,18 @@ public class ShellTaskOrganizer extends TaskOrganizer implements mRecentTasks.ifPresent(recentTasks -> recentTasks.onTaskWindowingModeChanged(taskInfo)); } // TODO (b/207687679): Remove check for HOME once bug is fixed final boolean isFocusedOrHome = taskInfo.isFocused || (taskInfo.topActivityType == WindowConfiguration.ACTIVITY_TYPE_HOME && taskInfo.isVisible); final boolean focusTaskChanged = (mLastFocusedTaskInfo == null || mLastFocusedTaskInfo.taskId != taskInfo.taskId) && isFocusedOrHome; if (focusTaskChanged) { for (int i = 0; i < mFocusListeners.size(); i++) { mFocusListeners.valueAt(i).onFocusTaskChanged(taskInfo); } mLastFocusedTaskInfo = taskInfo; } } } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +2 −1 Original line number Diff line number Diff line Loading @@ -241,10 +241,11 @@ public class WMShellModule { static PhonePipMenuController providesPipPhoneMenuController(Context context, PipBoundsState pipBoundsState, PipMediaController pipMediaController, SystemWindows systemWindows, Optional<SplitScreenController> splitScreenOptional, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler) { return new PhonePipMenuController(context, pipBoundsState, pipMediaController, systemWindows, mainExecutor, mainHandler); systemWindows, splitScreenOptional, mainExecutor, mainHandler); } @WMSingleton Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMenuController.java +5 −0 Original line number Diff line number Diff line Loading @@ -89,6 +89,11 @@ public interface PipMenuController { */ default void updateMenuBounds(Rect destinationBounds) {} /** * Update when the current focused task changes. */ default void onFocusTaskChanged(RunningTaskInfo taskInfo) {} /** * Returns a default LayoutParams for the PIP Menu. * @param width the PIP stack width. Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java +7 −1 Original line number Diff line number Diff line Loading @@ -98,7 +98,7 @@ import java.util.function.IntConsumer; * see also {@link PipMotionHelper}. */ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, DisplayController.OnDisplaysChangedListener { DisplayController.OnDisplaysChangedListener, ShellTaskOrganizer.FocusListener { private static final String TAG = PipTaskOrganizer.class.getSimpleName(); private static final boolean DEBUG = false; /** Loading Loading @@ -286,6 +286,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, mMainExecutor.execute(() -> { mTaskOrganizer.addListenerForType(this, TASK_LISTENER_TYPE_PIP); }); mTaskOrganizer.addFocusListener(this); mPipTransitionController.setPipOrganizer(this); displayController.addDisplayWindowListener(this); } Loading Loading @@ -771,6 +772,11 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, null /* updateBoundsCallback */); } @Override public void onFocusTaskChanged(ActivityManager.RunningTaskInfo taskInfo) { mPipMenuController.onFocusTaskChanged(taskInfo); } @Override public boolean supportSizeCompatUI() { // PIP doesn't support size compat. Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipMenuController.java +15 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.wm.shell.pip.phone; import static android.view.WindowManager.SHELL_ROOT_LAYER_PIP; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.RemoteAction; import android.content.Context; import android.content.pm.ParceledListSlice; Loading @@ -43,10 +44,12 @@ import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipMediaController; import com.android.wm.shell.pip.PipMediaController.ActionListener; import com.android.wm.shell.pip.PipMenuController; import com.android.wm.shell.splitscreen.SplitScreenController; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.Optional; /** * Manages the PiP menu view which can show menu options or a scrim. Loading Loading @@ -114,6 +117,7 @@ public class PhonePipMenuController implements PipMenuController { private final ArrayList<Listener> mListeners = new ArrayList<>(); private final SystemWindows mSystemWindows; private final Optional<SplitScreenController> mSplitScreenController; private ParceledListSlice<RemoteAction> mAppActions; private ParceledListSlice<RemoteAction> mMediaActions; private SyncRtSurfaceTransactionApplier mApplier; Loading Loading @@ -145,6 +149,7 @@ public class PhonePipMenuController implements PipMenuController { public PhonePipMenuController(Context context, PipBoundsState pipBoundsState, PipMediaController mediaController, SystemWindows systemWindows, Optional<SplitScreenController> splitScreenOptional, ShellExecutor mainExecutor, Handler mainHandler) { mContext = context; mPipBoundsState = pipBoundsState; Loading @@ -152,6 +157,7 @@ public class PhonePipMenuController implements PipMenuController { mSystemWindows = systemWindows; mMainExecutor = mainExecutor; mMainHandler = mainHandler; mSplitScreenController = splitScreenOptional; } public boolean isMenuVisible() { Loading Loading @@ -180,7 +186,8 @@ public class PhonePipMenuController implements PipMenuController { if (mPipMenuView != null) { detachPipMenuView(); } mPipMenuView = new PipMenuView(mContext, this, mMainExecutor, mMainHandler); mPipMenuView = new PipMenuView(mContext, this, mMainExecutor, mMainHandler, mSplitScreenController); mSystemWindows.addView(mPipMenuView, getPipMenuLayoutParams(MENU_WINDOW_TITLE, 0 /* width */, 0 /* height */), 0, SHELL_ROOT_LAYER_PIP); Loading Loading @@ -209,6 +216,13 @@ public class PhonePipMenuController implements PipMenuController { updateMenuLayout(destinationBounds); } @Override public void onFocusTaskChanged(ActivityManager.RunningTaskInfo taskInfo) { if (mPipMenuView != null) { mPipMenuView.onFocusTaskChanged(taskInfo); } } /** * Tries to grab a surface control from {@link PipMenuView}. If this isn't available for some * reason (ie. the window isn't ready yet, thus {@link android.view.ViewRootImpl} is Loading