Merge "Remove expensive queries for lock task mode (screen pinning)" into tm-qpr-dev

This commit is contained in:
TreeHugger Robot
2023-01-12 19:33:56 +00:00
committed by Android (Google) Code Review
9 changed files with 146 additions and 37 deletions

View File

@@ -282,17 +282,6 @@ public class ActivityManagerWrapper {
} }
} }
/**
* @return whether screen pinning is active.
*/
public boolean isScreenPinningActive() {
try {
return getService().getLockTaskModeState() == LOCK_TASK_MODE_PINNED;
} catch (RemoteException e) {
return false;
}
}
/** /**
* @return whether screen pinning is enabled. * @return whether screen pinning is enabled.
*/ */

View File

@@ -16,6 +16,7 @@
package com.android.systemui.shared.system; package com.android.systemui.shared.system;
import android.annotation.NonNull;
import android.app.ActivityManager.RunningTaskInfo; import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityTaskManager; import android.app.ActivityTaskManager;
import android.app.TaskStackListener; import android.app.TaskStackListener;
@@ -27,6 +28,8 @@ import android.os.Trace;
import android.util.Log; import android.util.Log;
import android.window.TaskSnapshot; import android.window.TaskSnapshot;
import androidx.annotation.VisibleForTesting;
import com.android.internal.os.SomeArgs; import com.android.internal.os.SomeArgs;
import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.recents.model.ThumbnailData;
@@ -43,14 +46,50 @@ public class TaskStackChangeListeners {
private final Impl mImpl; private final Impl mImpl;
/**
* Proxies calls to the given handler callback synchronously for testing purposes.
*/
private static class TestSyncHandler extends Handler {
private Handler.Callback mCb;
public TestSyncHandler() {
super(Looper.getMainLooper());
}
public void setCallback(Handler.Callback cb) {
mCb = cb;
}
@Override
public boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) {
return mCb.handleMessage(msg);
}
}
private TaskStackChangeListeners() { private TaskStackChangeListeners() {
mImpl = new Impl(Looper.getMainLooper()); mImpl = new Impl(Looper.getMainLooper());
} }
private TaskStackChangeListeners(Handler h) {
mImpl = new Impl(h);
}
public static TaskStackChangeListeners getInstance() { public static TaskStackChangeListeners getInstance() {
return INSTANCE; return INSTANCE;
} }
/**
* Returns an instance of the listeners that can be called upon synchronously for testsing
* purposes.
*/
@VisibleForTesting
public static TaskStackChangeListeners getTestInstance() {
TestSyncHandler h = new TestSyncHandler();
TaskStackChangeListeners l = new TaskStackChangeListeners(h);
h.setCallback(l.mImpl);
return l;
}
/** /**
* Registers a task stack listener with the system. * Registers a task stack listener with the system.
* This should be called on the main thread. * This should be called on the main thread.
@@ -71,7 +110,15 @@ public class TaskStackChangeListeners {
} }
} }
private static class Impl extends TaskStackListener implements Handler.Callback { /**
* Returns an instance of the listener to call upon from tests.
*/
@VisibleForTesting
public TaskStackListener getListenerImpl() {
return mImpl;
}
private class Impl extends TaskStackListener implements Handler.Callback {
private static final int ON_TASK_STACK_CHANGED = 1; private static final int ON_TASK_STACK_CHANGED = 1;
private static final int ON_TASK_SNAPSHOT_CHANGED = 2; private static final int ON_TASK_SNAPSHOT_CHANGED = 2;
@@ -104,10 +151,14 @@ public class TaskStackChangeListeners {
private final Handler mHandler; private final Handler mHandler;
private boolean mRegistered; private boolean mRegistered;
Impl(Looper looper) { private Impl(Looper looper) {
mHandler = new Handler(looper, this); mHandler = new Handler(looper, this);
} }
private Impl(Handler handler) {
mHandler = handler;
}
public void addListener(TaskStackChangeListener listener) { public void addListener(TaskStackChangeListener listener) {
synchronized (mTaskStackListeners) { synchronized (mTaskStackListeners) {
mTaskStackListeners.add(listener); mTaskStackListeners.add(listener);

View File

@@ -16,6 +16,7 @@
package com.android.systemui.navigationbar; package com.android.systemui.navigationbar;
import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED;
import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT; import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT;
import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SWITCHER_SHOWN; import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SWITCHER_SHOWN;
import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN; import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN;
@@ -44,6 +45,7 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SHOWING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SWITCHER_SHOWING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SWITCHER_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING;
import static com.android.systemui.shared.system.QuickStepContract.isGesturalMode; import static com.android.systemui.shared.system.QuickStepContract.isGesturalMode;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE;
import static com.android.systemui.statusbar.phone.BarTransitions.TransitionMode; import static com.android.systemui.statusbar.phone.BarTransitions.TransitionMode;
@@ -136,9 +138,10 @@ import com.android.systemui.shared.navigationbar.RegionSamplingHelper;
import com.android.systemui.shared.recents.utilities.Utilities; import com.android.systemui.shared.recents.utilities.Utilities;
import com.android.systemui.shared.rotation.RotationButton; import com.android.systemui.shared.rotation.RotationButton;
import com.android.systemui.shared.rotation.RotationButtonController; import com.android.systemui.shared.rotation.RotationButtonController;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.SysUiStatsLog; import com.android.systemui.shared.system.SysUiStatsLog;
import com.android.systemui.shared.system.TaskStackChangeListener;
import com.android.systemui.shared.system.TaskStackChangeListeners;
import com.android.systemui.statusbar.AutoHideUiElement; import com.android.systemui.statusbar.AutoHideUiElement;
import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CommandQueue.Callbacks; import com.android.systemui.statusbar.CommandQueue.Callbacks;
@@ -252,6 +255,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
private final AutoHideController.Factory mAutoHideControllerFactory; private final AutoHideController.Factory mAutoHideControllerFactory;
private final Optional<TelecomManager> mTelecomManagerOptional; private final Optional<TelecomManager> mTelecomManagerOptional;
private final InputMethodManager mInputMethodManager; private final InputMethodManager mInputMethodManager;
private final TaskStackChangeListeners mTaskStackChangeListeners;
@VisibleForTesting @VisibleForTesting
public int mDisplayId; public int mDisplayId;
@@ -488,6 +492,18 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
} }
}; };
private boolean mScreenPinningActive = false;
private final TaskStackChangeListener mTaskStackListener = new TaskStackChangeListener() {
@Override
public void onLockTaskModeChanged(int mode) {
mScreenPinningActive = (mode == LOCK_TASK_MODE_PINNED);
mSysUiFlagsContainer.setFlag(SYSUI_STATE_SCREEN_PINNING, mScreenPinningActive)
.commitUpdate(mDisplayId);
mView.setInScreenPinning(mScreenPinningActive);
updateScreenPinningGestures();
}
};
@Inject @Inject
NavigationBar( NavigationBar(
NavigationBarView navigationBarView, NavigationBarView navigationBarView,
@@ -529,7 +545,8 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
EdgeBackGestureHandler edgeBackGestureHandler, EdgeBackGestureHandler edgeBackGestureHandler,
Optional<BackAnimation> backAnimation, Optional<BackAnimation> backAnimation,
UserContextProvider userContextProvider, UserContextProvider userContextProvider,
WakefulnessLifecycle wakefulnessLifecycle) { WakefulnessLifecycle wakefulnessLifecycle,
TaskStackChangeListeners taskStackChangeListeners) {
super(navigationBarView); super(navigationBarView);
mFrame = navigationBarFrame; mFrame = navigationBarFrame;
mContext = context; mContext = context;
@@ -568,6 +585,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
mInputMethodManager = inputMethodManager; mInputMethodManager = inputMethodManager;
mUserContextProvider = userContextProvider; mUserContextProvider = userContextProvider;
mWakefulnessLifecycle = wakefulnessLifecycle; mWakefulnessLifecycle = wakefulnessLifecycle;
mTaskStackChangeListeners = taskStackChangeListeners;
mNavColorSampleMargin = getResources() mNavColorSampleMargin = getResources()
.getDimensionPixelSize(R.dimen.navigation_handle_sample_horizontal_margin); .getDimensionPixelSize(R.dimen.navigation_handle_sample_horizontal_margin);
@@ -676,6 +694,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
mCommandQueue.recomputeDisableFlags(mDisplayId, false); mCommandQueue.recomputeDisableFlags(mDisplayId, false);
mNotificationShadeDepthController.addListener(mDepthListener); mNotificationShadeDepthController.addListener(mDepthListener);
mTaskStackChangeListeners.registerTaskStackListener(mTaskStackListener);
} }
public void destroyView() { public void destroyView() {
@@ -689,6 +708,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
mNotificationShadeDepthController.removeListener(mDepthListener); mNotificationShadeDepthController.removeListener(mDepthListener);
mDeviceConfigProxy.removeOnPropertiesChangedListener(mOnPropertiesChangedListener); mDeviceConfigProxy.removeOnPropertiesChangedListener(mOnPropertiesChangedListener);
mTaskStackChangeListeners.unregisterTaskStackListener(mTaskStackListener);
} }
@Override @Override
@@ -990,6 +1010,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
pw.println(" mTransientShown=" + mTransientShown); pw.println(" mTransientShown=" + mTransientShown);
pw.println(" mTransientShownFromGestureOnSystemBar=" pw.println(" mTransientShownFromGestureOnSystemBar="
+ mTransientShownFromGestureOnSystemBar); + mTransientShownFromGestureOnSystemBar);
pw.println(" mScreenPinningActive=" + mScreenPinningActive);
dumpBarTransitions(pw, "mNavigationBarView", getBarTransitions()); dumpBarTransitions(pw, "mNavigationBarView", getBarTransitions());
pw.println(" mOrientedHandleSamplingRegion: " + mOrientedHandleSamplingRegion); pw.println(" mOrientedHandleSamplingRegion: " + mOrientedHandleSamplingRegion);
@@ -1213,10 +1234,9 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
private void updateScreenPinningGestures() { private void updateScreenPinningGestures() {
// Change the cancel pin gesture to home and back if recents button is invisible // Change the cancel pin gesture to home and back if recents button is invisible
boolean pinningActive = ActivityManagerWrapper.getInstance().isScreenPinningActive();
ButtonDispatcher backButton = mView.getBackButton(); ButtonDispatcher backButton = mView.getBackButton();
ButtonDispatcher recentsButton = mView.getRecentsButton(); ButtonDispatcher recentsButton = mView.getRecentsButton();
if (pinningActive) { if (mScreenPinningActive) {
boolean recentsVisible = mView.isRecentsButtonVisible(); boolean recentsVisible = mView.isRecentsButtonVisible();
backButton.setOnLongClickListener(recentsVisible backButton.setOnLongClickListener(recentsVisible
? this::onLongPressBackRecents ? this::onLongPressBackRecents
@@ -1227,8 +1247,8 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
recentsButton.setOnLongClickListener(null); recentsButton.setOnLongClickListener(null);
} }
// Note, this needs to be set after even if we're setting the listener to null // Note, this needs to be set after even if we're setting the listener to null
backButton.setLongClickable(pinningActive); backButton.setLongClickable(mScreenPinningActive);
recentsButton.setLongClickable(pinningActive); recentsButton.setLongClickable(mScreenPinningActive);
} }
private void notifyNavigationBarScreenOn() { private void notifyNavigationBarScreenOn() {
@@ -1311,8 +1331,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
@VisibleForTesting @VisibleForTesting
boolean onHomeLongClick(View v) { boolean onHomeLongClick(View v) {
if (!mView.isRecentsButtonVisible() if (!mView.isRecentsButtonVisible() && mScreenPinningActive) {
&& ActivityManagerWrapper.getInstance().isScreenPinningActive()) {
return onLongPressBackHome(v); return onLongPressBackHome(v);
} }
if (shouldDisableNavbarGestures()) { if (shouldDisableNavbarGestures()) {

View File

@@ -57,6 +57,7 @@ import com.android.systemui.flags.Flags;
import com.android.systemui.model.SysUiState; import com.android.systemui.model.SysUiState;
import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.TaskStackChangeListeners;
import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CommandQueue.Callbacks; import com.android.systemui.statusbar.CommandQueue.Callbacks;
import com.android.systemui.statusbar.phone.AutoHideController; import com.android.systemui.statusbar.phone.AutoHideController;
@@ -88,7 +89,6 @@ public class NavigationBarController implements
private FeatureFlags mFeatureFlags; private FeatureFlags mFeatureFlags;
private final DisplayManager mDisplayManager; private final DisplayManager mDisplayManager;
private final TaskbarDelegate mTaskbarDelegate; private final TaskbarDelegate mTaskbarDelegate;
private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
private int mNavMode; private int mNavMode;
@VisibleForTesting boolean mIsTablet; @VisibleForTesting boolean mIsTablet;
@@ -112,10 +112,10 @@ public class NavigationBarController implements
NavBarHelper navBarHelper, NavBarHelper navBarHelper,
TaskbarDelegate taskbarDelegate, TaskbarDelegate taskbarDelegate,
NavigationBarComponent.Factory navigationBarComponentFactory, NavigationBarComponent.Factory navigationBarComponentFactory,
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
DumpManager dumpManager, DumpManager dumpManager,
AutoHideController autoHideController, AutoHideController autoHideController,
LightBarController lightBarController, LightBarController lightBarController,
TaskStackChangeListeners taskStackChangeListeners,
Optional<Pip> pipOptional, Optional<Pip> pipOptional,
Optional<BackAnimation> backAnimation, Optional<BackAnimation> backAnimation,
FeatureFlags featureFlags) { FeatureFlags featureFlags) {
@@ -129,11 +129,10 @@ public class NavigationBarController implements
mConfigChanges.applyNewConfig(mContext.getResources()); mConfigChanges.applyNewConfig(mContext.getResources());
mNavMode = navigationModeController.addListener(this); mNavMode = navigationModeController.addListener(this);
mTaskbarDelegate = taskbarDelegate; mTaskbarDelegate = taskbarDelegate;
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
mTaskbarDelegate.setDependencies(commandQueue, overviewProxyService, mTaskbarDelegate.setDependencies(commandQueue, overviewProxyService,
navBarHelper, navigationModeController, sysUiFlagsContainer, navBarHelper, navigationModeController, sysUiFlagsContainer,
dumpManager, autoHideController, lightBarController, pipOptional, dumpManager, autoHideController, lightBarController, pipOptional,
backAnimation.orElse(null)); backAnimation.orElse(null), taskStackChangeListeners);
mIsTablet = isTablet(mContext); mIsTablet = isTablet(mContext);
dumpManager.registerDumpable(this); dumpManager.registerDumpable(this);
} }

View File

@@ -16,6 +16,7 @@
package com.android.systemui.navigationbar; package com.android.systemui.navigationbar;
import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED;
import static android.inputmethodservice.InputMethodService.canImeRenderGesturalNavButtons; import static android.inputmethodservice.InputMethodService.canImeRenderGesturalNavButtons;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
@@ -80,6 +81,7 @@ import com.android.systemui.shared.rotation.RotationButton.RotationButtonUpdates
import com.android.systemui.shared.rotation.RotationButtonController; import com.android.systemui.shared.rotation.RotationButtonController;
import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.TaskStackChangeListener;
import com.android.systemui.statusbar.phone.AutoHideController; import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.CentralSurfaces; import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.LightBarTransitionsController; import com.android.systemui.statusbar.phone.LightBarTransitionsController;
@@ -160,6 +162,7 @@ public class NavigationBarView extends FrameLayout {
* fully locked mode we only show that unlocking is blocked. * fully locked mode we only show that unlocking is blocked.
*/ */
private ScreenPinningNotify mScreenPinningNotify; private ScreenPinningNotify mScreenPinningNotify;
private boolean mScreenPinningActive = false;
/** /**
* {@code true} if the IME can render the back button and the IME switcher button. * {@code true} if the IME can render the back button and the IME switcher button.
@@ -636,14 +639,13 @@ public class NavigationBarView extends FrameLayout {
// When screen pinning, don't hide back and home when connected service or back and // When screen pinning, don't hide back and home when connected service or back and
// recents buttons when disconnected from launcher service in screen pinning mode, // recents buttons when disconnected from launcher service in screen pinning mode,
// as they are used for exiting. // as they are used for exiting.
final boolean pinningActive = ActivityManagerWrapper.getInstance().isScreenPinningActive();
if (mOverviewProxyEnabled) { if (mOverviewProxyEnabled) {
// Force disable recents when not in legacy mode // Force disable recents when not in legacy mode
disableRecent |= !QuickStepContract.isLegacyMode(mNavBarMode); disableRecent |= !QuickStepContract.isLegacyMode(mNavBarMode);
if (pinningActive && !QuickStepContract.isGesturalMode(mNavBarMode)) { if (mScreenPinningActive && !QuickStepContract.isGesturalMode(mNavBarMode)) {
disableBack = disableHome = false; disableBack = disableHome = false;
} }
} else if (pinningActive) { } else if (mScreenPinningActive) {
disableBack = disableRecent = false; disableBack = disableRecent = false;
} }
@@ -738,9 +740,7 @@ public class NavigationBarView extends FrameLayout {
public void updateDisabledSystemUiStateFlags(SysUiState sysUiState) { public void updateDisabledSystemUiStateFlags(SysUiState sysUiState) {
int displayId = mContext.getDisplayId(); int displayId = mContext.getDisplayId();
sysUiState.setFlag(SYSUI_STATE_SCREEN_PINNING, sysUiState.setFlag(SYSUI_STATE_OVERVIEW_DISABLED,
ActivityManagerWrapper.getInstance().isScreenPinningActive())
.setFlag(SYSUI_STATE_OVERVIEW_DISABLED,
(mDisabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0) (mDisabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0)
.setFlag(SYSUI_STATE_HOME_DISABLED, .setFlag(SYSUI_STATE_HOME_DISABLED,
(mDisabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0) (mDisabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0)
@@ -749,6 +749,10 @@ public class NavigationBarView extends FrameLayout {
.commitUpdate(displayId); .commitUpdate(displayId);
} }
public void setInScreenPinning(boolean active) {
mScreenPinningActive = active;
}
private void updatePanelSystemUiStateFlags() { private void updatePanelSystemUiStateFlags() {
if (SysUiState.DEBUG) { if (SysUiState.DEBUG) {
Log.d(TAG, "Updating panel sysui state flags: panelView=" + mPanelView); Log.d(TAG, "Updating panel sysui state flags: panelView=" + mPanelView);

View File

@@ -16,6 +16,7 @@
package com.android.systemui.navigationbar; package com.android.systemui.navigationbar;
import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED;
import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT; import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT;
import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SWITCHER_SHOWN; import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SWITCHER_SHOWN;
import static android.app.StatusBarManager.WINDOW_STATE_SHOWING; import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
@@ -40,6 +41,7 @@ import static com.android.systemui.statusbar.phone.BarTransitions.TransitionMode
import android.app.StatusBarManager; import android.app.StatusBarManager;
import android.app.StatusBarManager.WindowVisibleState; import android.app.StatusBarManager.WindowVisibleState;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.graphics.Rect; import android.graphics.Rect;
@@ -68,6 +70,8 @@ import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.shared.recents.utilities.Utilities; import com.android.systemui.shared.recents.utilities.Utilities;
import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.TaskStackChangeListener;
import com.android.systemui.shared.system.TaskStackChangeListeners;
import com.android.systemui.statusbar.AutoHideUiElement; import com.android.systemui.statusbar.AutoHideUiElement;
import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.AutoHideController; import com.android.systemui.statusbar.phone.AutoHideController;
@@ -101,6 +105,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
private AutoHideController mAutoHideController; private AutoHideController mAutoHideController;
private LightBarController mLightBarController; private LightBarController mLightBarController;
private LightBarTransitionsController mLightBarTransitionsController; private LightBarTransitionsController mLightBarTransitionsController;
private TaskStackChangeListeners mTaskStackChangeListeners;
private Optional<Pip> mPipOptional; private Optional<Pip> mPipOptional;
private int mDisplayId; private int mDisplayId;
private int mNavigationIconHints; private int mNavigationIconHints;
@@ -127,6 +132,14 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
private final DisplayManager mDisplayManager; private final DisplayManager mDisplayManager;
private Context mWindowContext; private Context mWindowContext;
private ScreenPinningNotify mScreenPinningNotify; private ScreenPinningNotify mScreenPinningNotify;
private final TaskStackChangeListener mTaskStackListener = new TaskStackChangeListener() {
@Override
public void onLockTaskModeChanged(int mode) {
mSysUiState.setFlag(SYSUI_STATE_SCREEN_PINNING, mode == LOCK_TASK_MODE_PINNED)
.commitUpdate(mDisplayId);
}
};
private int mNavigationMode = -1; private int mNavigationMode = -1;
private final Consumer<Rect> mPipListener; private final Consumer<Rect> mPipListener;
@@ -176,7 +189,8 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
AutoHideController autoHideController, AutoHideController autoHideController,
LightBarController lightBarController, LightBarController lightBarController,
Optional<Pip> pipOptional, Optional<Pip> pipOptional,
BackAnimation backAnimation) { BackAnimation backAnimation,
TaskStackChangeListeners taskStackChangeListeners) {
// TODO: adding this in the ctor results in a dagger dependency cycle :( // TODO: adding this in the ctor results in a dagger dependency cycle :(
mCommandQueue = commandQueue; mCommandQueue = commandQueue;
mOverviewProxyService = overviewProxyService; mOverviewProxyService = overviewProxyService;
@@ -189,6 +203,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
mPipOptional = pipOptional; mPipOptional = pipOptional;
mBackAnimation = backAnimation; mBackAnimation = backAnimation;
mLightBarTransitionsController = createLightBarTransitionsController(); mLightBarTransitionsController = createLightBarTransitionsController();
mTaskStackChangeListeners = taskStackChangeListeners;
} }
// Separated into a method to keep setDependencies() clean/readable. // Separated into a method to keep setDependencies() clean/readable.
@@ -234,6 +249,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
mPipOptional.ifPresent(this::addPipExclusionBoundsChangeListener); mPipOptional.ifPresent(this::addPipExclusionBoundsChangeListener);
mEdgeBackGestureHandler.setBackAnimation(mBackAnimation); mEdgeBackGestureHandler.setBackAnimation(mBackAnimation);
mEdgeBackGestureHandler.onConfigurationChanged(mContext.getResources().getConfiguration()); mEdgeBackGestureHandler.onConfigurationChanged(mContext.getResources().getConfiguration());
mTaskStackChangeListeners.registerTaskStackListener(mTaskStackListener);
mInitialized = true; mInitialized = true;
} }
@@ -253,6 +269,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
mLightBarTransitionsController.destroy(); mLightBarTransitionsController.destroy();
mLightBarController.setNavigationBar(null); mLightBarController.setNavigationBar(null);
mPipOptional.ifPresent(this::removePipExclusionBoundsChangeListener); mPipOptional.ifPresent(this::removePipExclusionBoundsChangeListener);
mTaskStackChangeListeners.unregisterTaskStackListener(mTaskStackListener);
mInitialized = false; mInitialized = false;
} }
@@ -300,8 +317,6 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
.setFlag(SYSUI_STATE_NAV_BAR_HIDDEN, !isWindowVisible()) .setFlag(SYSUI_STATE_NAV_BAR_HIDDEN, !isWindowVisible())
.setFlag(SYSUI_STATE_ALLOW_GESTURE_IGNORING_BAR_VISIBILITY, .setFlag(SYSUI_STATE_ALLOW_GESTURE_IGNORING_BAR_VISIBILITY,
allowSystemGestureIgnoringBarVisibility()) allowSystemGestureIgnoringBarVisibility())
.setFlag(SYSUI_STATE_SCREEN_PINNING,
ActivityManagerWrapper.getInstance().isScreenPinningActive())
.setFlag(SYSUI_STATE_IMMERSIVE_MODE, isImmersiveMode()) .setFlag(SYSUI_STATE_IMMERSIVE_MODE, isImmersiveMode())
.commitUpdate(mDisplayId); .commitUpdate(mDisplayId);
} }

View File

@@ -51,6 +51,7 @@ import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.model.SysUiState; import com.android.systemui.model.SysUiState;
import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.shared.recents.utilities.Utilities; import com.android.systemui.shared.recents.utilities.Utilities;
import com.android.systemui.shared.system.TaskStackChangeListeners;
import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.AutoHideController; import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.phone.LightBarController;
@@ -102,10 +103,10 @@ public class NavigationBarControllerTest extends SysuiTestCase {
mock(NavBarHelper.class), mock(NavBarHelper.class),
mTaskbarDelegate, mTaskbarDelegate,
mNavigationBarFactory, mNavigationBarFactory,
mock(StatusBarKeyguardViewManager.class),
mock(DumpManager.class), mock(DumpManager.class),
mock(AutoHideController.class), mock(AutoHideController.class),
mock(LightBarController.class), mock(LightBarController.class),
TaskStackChangeListeners.getTestInstance(),
Optional.of(mock(Pip.class)), Optional.of(mock(Pip.class)),
Optional.of(mock(BackAnimation.class)), Optional.of(mock(BackAnimation.class)),
mock(FeatureFlags.class))); mock(FeatureFlags.class)));

View File

@@ -28,6 +28,7 @@ import static android.view.WindowInsets.Type.ime;
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.HOME_BUTTON_LONG_PRESS_DURATION_MS; import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.HOME_BUTTON_LONG_PRESS_DURATION_MS;
import static com.android.systemui.navigationbar.NavigationBar.NavBarActionEvent.NAVBAR_ASSIST_LONGPRESS; import static com.android.systemui.navigationbar.NavigationBar.NavBarActionEvent.NAVBAR_ASSIST_LONGPRESS;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
@@ -44,6 +45,7 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.app.ActivityManager;
import android.content.Context; import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import android.hardware.display.DisplayManagerGlobal; import android.hardware.display.DisplayManagerGlobal;
@@ -90,6 +92,7 @@ import com.android.systemui.settings.UserTracker;
import com.android.systemui.shade.NotificationShadeWindowView; import com.android.systemui.shade.NotificationShadeWindowView;
import com.android.systemui.shade.ShadeController; import com.android.systemui.shade.ShadeController;
import com.android.systemui.shared.rotation.RotationButtonController; import com.android.systemui.shared.rotation.RotationButtonController;
import com.android.systemui.shared.system.TaskStackChangeListeners;
import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeDepthController;
@@ -203,6 +206,8 @@ public class NavigationBarTest extends SysuiTestCase {
private ViewRootImpl mViewRootImpl; private ViewRootImpl mViewRootImpl;
private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock()); private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
private DeviceConfigProxyFake mDeviceConfigProxyFake = new DeviceConfigProxyFake(); private DeviceConfigProxyFake mDeviceConfigProxyFake = new DeviceConfigProxyFake();
private TaskStackChangeListeners mTaskStackChangeListeners =
TaskStackChangeListeners.getTestInstance();
@Rule @Rule
public final LeakCheckedTest.SysuiLeakCheck mLeakCheck = new LeakCheckedTest.SysuiLeakCheck(); public final LeakCheckedTest.SysuiLeakCheck mLeakCheck = new LeakCheckedTest.SysuiLeakCheck();
@@ -437,6 +442,14 @@ public class NavigationBarTest extends SysuiTestCase {
verify(mNavBarHelper, times(1)).getCurrentSysuiState(); verify(mNavBarHelper, times(1)).getCurrentSysuiState();
} }
@Test
public void testScreenPinningEnabled_updatesSysuiState() {
mNavigationBar.init();
mTaskStackChangeListeners.getListenerImpl().onLockTaskModeChanged(
ActivityManager.LOCK_TASK_MODE_PINNED);
verify(mMockSysUiState).setFlag(eq(SYSUI_STATE_SCREEN_PINNING), eq(true));
}
private NavigationBar createNavBar(Context context) { private NavigationBar createNavBar(Context context) {
DeviceProvisionedController deviceProvisionedController = DeviceProvisionedController deviceProvisionedController =
mock(DeviceProvisionedController.class); mock(DeviceProvisionedController.class);
@@ -481,7 +494,8 @@ public class NavigationBarTest extends SysuiTestCase {
mEdgeBackGestureHandler, mEdgeBackGestureHandler,
Optional.of(mock(BackAnimation.class)), Optional.of(mock(BackAnimation.class)),
mUserContextProvider, mUserContextProvider,
mWakefulnessLifecycle)); mWakefulnessLifecycle,
mTaskStackChangeListeners));
} }
private void processAllMessages() { private void processAllMessages() {

View File

@@ -1,11 +1,14 @@
package com.android.systemui.navigationbar package com.android.systemui.navigationbar
import android.app.ActivityManager
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase
import com.android.systemui.dump.DumpManager import com.android.systemui.dump.DumpManager
import com.android.systemui.model.SysUiState import com.android.systemui.model.SysUiState
import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler
import com.android.systemui.recents.OverviewProxyService import com.android.systemui.recents.OverviewProxyService
import com.android.systemui.shared.system.QuickStepContract
import com.android.systemui.shared.system.TaskStackChangeListeners
import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.CommandQueue
import com.android.systemui.statusbar.phone.AutoHideController import com.android.systemui.statusbar.phone.AutoHideController
import com.android.systemui.statusbar.phone.LightBarController import com.android.systemui.statusbar.phone.LightBarController
@@ -14,6 +17,7 @@ import com.android.wm.shell.back.BackAnimation
import com.android.wm.shell.pip.Pip import com.android.wm.shell.pip.Pip
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.mockito.ArgumentMatchers
import org.mockito.Mock import org.mockito.Mock
import org.mockito.Mockito.`when` import org.mockito.Mockito.`when`
import org.mockito.Mockito.any import org.mockito.Mockito.any
@@ -30,6 +34,7 @@ class TaskbarDelegateTest : SysuiTestCase() {
val MODE_GESTURE = 0; val MODE_GESTURE = 0;
val MODE_THREE_BUTTON = 1; val MODE_THREE_BUTTON = 1;
private lateinit var mTaskStackChangeListeners: TaskStackChangeListeners
private lateinit var mTaskbarDelegate: TaskbarDelegate private lateinit var mTaskbarDelegate: TaskbarDelegate
@Mock @Mock
lateinit var mEdgeBackGestureHandlerFactory : EdgeBackGestureHandler.Factory lateinit var mEdgeBackGestureHandlerFactory : EdgeBackGestureHandler.Factory
@@ -69,11 +74,12 @@ class TaskbarDelegateTest : SysuiTestCase() {
`when`(mLightBarControllerFactory.create(any())).thenReturn(mLightBarTransitionController) `when`(mLightBarControllerFactory.create(any())).thenReturn(mLightBarTransitionController)
`when`(mNavBarHelper.currentSysuiState).thenReturn(mCurrentSysUiState) `when`(mNavBarHelper.currentSysuiState).thenReturn(mCurrentSysUiState)
`when`(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState) `when`(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState)
mTaskStackChangeListeners = TaskStackChangeListeners.getTestInstance()
mTaskbarDelegate = TaskbarDelegate(context, mEdgeBackGestureHandlerFactory, mTaskbarDelegate = TaskbarDelegate(context, mEdgeBackGestureHandlerFactory,
mLightBarControllerFactory) mLightBarControllerFactory)
mTaskbarDelegate.setDependencies(mCommandQueue, mOverviewProxyService, mNavBarHelper, mTaskbarDelegate.setDependencies(mCommandQueue, mOverviewProxyService, mNavBarHelper,
mNavigationModeController, mSysUiState, mDumpManager, mAutoHideController, mNavigationModeController, mSysUiState, mDumpManager, mAutoHideController,
mLightBarController, mOptionalPip, mBackAnimation) mLightBarController, mOptionalPip, mBackAnimation, mTaskStackChangeListeners)
} }
@Test @Test
@@ -90,4 +96,15 @@ class TaskbarDelegateTest : SysuiTestCase() {
mTaskbarDelegate.init(DISPLAY_ID) mTaskbarDelegate.init(DISPLAY_ID)
verify(mEdgeBackGestureHandler, times(1)).onNavigationModeChanged(MODE_GESTURE) verify(mEdgeBackGestureHandler, times(1)).onNavigationModeChanged(MODE_GESTURE)
} }
@Test
fun screenPinningEnabled_updatesSysuiState() {
mTaskbarDelegate.init(DISPLAY_ID)
mTaskStackChangeListeners.listenerImpl.onLockTaskModeChanged(
ActivityManager.LOCK_TASK_MODE_PINNED)
verify(mSysUiState, times(1)).setFlag(
ArgumentMatchers.eq(QuickStepContract.SYSUI_STATE_SCREEN_PINNING),
ArgumentMatchers.eq(true)
)
}
} }