Merge "Add API to allow launcher to suspend AutoHideController" into sc-v2-dev

This commit is contained in:
Vinit Nayak
2021-10-14 19:11:53 +00:00
committed by Android (Google) Code Review
6 changed files with 110 additions and 21 deletions

View File

@@ -143,5 +143,12 @@ interface ISystemUiProxy {
/** Notifies when taskbar status updated */ /** Notifies when taskbar status updated */
oneway void notifyTaskbarStatus(boolean visible, boolean stashed) = 47; oneway void notifyTaskbarStatus(boolean visible, boolean stashed) = 47;
// Next id = 48 /**
* Notifies sysui when taskbar requests autoHide to stop auto-hiding
* If called to suspend, caller is also responsible for calling this method to un-suspend
* @param suspend should be true to stop auto-hide, false to resume normal behavior
*/
oneway void notifyTaskbarAutohideSuspend(boolean suspend) = 48;
// Next id = 49
} }

View File

@@ -61,6 +61,7 @@ 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.NotificationRemoteInputManager; import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeDepthController;
import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.BarTransitions.TransitionMode; import com.android.systemui.statusbar.phone.BarTransitions.TransitionMode;
import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar;
@@ -160,7 +161,8 @@ public class NavigationBarController implements
NavigationBarA11yHelper navigationBarA11yHelper, NavigationBarA11yHelper navigationBarA11yHelper,
TaskbarDelegate taskbarDelegate, TaskbarDelegate taskbarDelegate,
UserTracker userTracker, UserTracker userTracker,
DumpManager dumpManager) { DumpManager dumpManager,
AutoHideController autoHideController) {
mContext = context; mContext = context;
mWindowManager = windowManager; mWindowManager = windowManager;
mAssistManagerLazy = assistManagerLazy; mAssistManagerLazy = assistManagerLazy;
@@ -194,9 +196,9 @@ public class NavigationBarController implements
mNavMode = mNavigationModeController.addListener(this); mNavMode = mNavigationModeController.addListener(this);
mNavigationModeController.addListener(this); mNavigationModeController.addListener(this);
mTaskbarDelegate = taskbarDelegate; mTaskbarDelegate = taskbarDelegate;
mTaskbarDelegate.setOverviewProxyService(commandQueue, overviewProxyService, mTaskbarDelegate.setDependencies(commandQueue, overviewProxyService,
navigationBarA11yHelper, navigationModeController, sysUiFlagsContainer, navigationBarA11yHelper, navigationModeController, sysUiFlagsContainer,
dumpManager); dumpManager, autoHideController);
mIsTablet = isTablet(mContext); mIsTablet = isTablet(mContext);
mUserTracker = userTracker; mUserTracker = userTracker;

View File

@@ -19,6 +19,8 @@ package com.android.systemui.navigationbar;
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_SHOWN; import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SHOWN;
import static android.app.StatusBarManager.WINDOW_STATE_SHOWING; import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
import static android.view.InsetsState.containsType;
import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
@@ -57,7 +59,9 @@ import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler;
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.ActivityManagerWrapper; import com.android.systemui.shared.system.ActivityManagerWrapper;
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 java.io.FileDescriptor; import java.io.FileDescriptor;
import java.io.PrintWriter; import java.io.PrintWriter;
@@ -77,6 +81,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
private NavigationBarA11yHelper mNavigationBarA11yHelper; private NavigationBarA11yHelper mNavigationBarA11yHelper;
private NavigationModeController mNavigationModeController; private NavigationModeController mNavigationModeController;
private SysUiState mSysUiState; private SysUiState mSysUiState;
private AutoHideController mAutoHideController;
private int mDisplayId; private int mDisplayId;
private int mNavigationIconHints; private int mNavigationIconHints;
private final NavigationBarA11yHelper.NavA11yEventListener mNavA11yEventListener = private final NavigationBarA11yHelper.NavA11yEventListener mNavA11yEventListener =
@@ -87,6 +92,28 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
private final Context mContext; private final Context mContext;
private final DisplayManager mDisplayManager; private final DisplayManager mDisplayManager;
private Context mWindowContext; private Context mWindowContext;
/**
* Tracks the system calls for when taskbar should transiently show or hide so we can return
* this value in {@link AutoHideUiElement#isVisible()} below.
*
* This also gets set by {@link #onTaskbarAutohideSuspend(boolean)} to force show the transient
* taskbar if launcher has requested to suspend auto-hide behavior.
*/
private boolean mTaskbarTransientShowing;
private final AutoHideUiElement mAutoHideUiElement = new AutoHideUiElement() {
@Override
public void synchronizeState() {
}
@Override
public boolean isVisible() {
return mTaskbarTransientShowing;
}
@Override
public void hide() {
}
};
@Inject @Inject
public TaskbarDelegate(Context context) { public TaskbarDelegate(Context context) {
@@ -96,11 +123,12 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
mDisplayManager = mContext.getSystemService(DisplayManager.class); mDisplayManager = mContext.getSystemService(DisplayManager.class);
} }
public void setOverviewProxyService(CommandQueue commandQueue, public void setDependencies(CommandQueue commandQueue,
OverviewProxyService overviewProxyService, OverviewProxyService overviewProxyService,
NavigationBarA11yHelper navigationBarA11yHelper, NavigationBarA11yHelper navigationBarA11yHelper,
NavigationModeController navigationModeController, NavigationModeController navigationModeController,
SysUiState sysUiState, DumpManager dumpManager) { SysUiState sysUiState, DumpManager dumpManager,
AutoHideController autoHideController) {
// 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;
@@ -108,18 +136,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
mNavigationModeController = navigationModeController; mNavigationModeController = navigationModeController;
mSysUiState = sysUiState; mSysUiState = sysUiState;
dumpManager.registerDumpable(this); dumpManager.registerDumpable(this);
} mAutoHideController = autoHideController;
public void destroy() {
mCommandQueue.removeCallback(this);
mOverviewProxyService.removeCallback(this);
mNavigationModeController.removeListener(this);
mNavigationBarA11yHelper.removeA11yEventListener(mNavA11yEventListener);
mEdgeBackGestureHandler.onNavBarDetached();
if (mWindowContext != null) {
mWindowContext.unregisterComponentCallbacks(this);
mWindowContext = null;
}
} }
public void init(int displayId) { public void init(int displayId) {
@@ -136,6 +153,20 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
mWindowContext.registerComponentCallbacks(this); mWindowContext.registerComponentCallbacks(this);
// Set initial state for any listeners // Set initial state for any listeners
updateSysuiFlags(); updateSysuiFlags();
mAutoHideController.setNavigationBar(mAutoHideUiElement);
}
public void destroy() {
mCommandQueue.removeCallback(this);
mOverviewProxyService.removeCallback(this);
mNavigationModeController.removeListener(this);
mNavigationBarA11yHelper.removeA11yEventListener(mNavA11yEventListener);
mEdgeBackGestureHandler.onNavBarDetached();
if (mWindowContext != null) {
mWindowContext.unregisterComponentCallbacks(this);
mWindowContext = null;
}
mAutoHideController.setNavigationBar(null);
} }
private void updateSysuiFlags() { private void updateSysuiFlags() {
@@ -208,6 +239,38 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
} }
} }
@Override
public void showTransient(int displayId, int[] types) {
if (displayId != mDisplayId) {
return;
}
if (!containsType(types, ITYPE_NAVIGATION_BAR)) {
return;
}
mTaskbarTransientShowing = true;
}
@Override
public void abortTransient(int displayId, int[] types) {
if (displayId != mDisplayId) {
return;
}
if (!containsType(types, ITYPE_NAVIGATION_BAR)) {
return;
}
mTaskbarTransientShowing = false;
}
@Override
public void onTaskbarAutohideSuspend(boolean suspend) {
mTaskbarTransientShowing = suspend;
if (suspend) {
mAutoHideController.suspendAutoHide();
} else {
mAutoHideController.resumeSuspendedAutoHide();
}
}
@Override @Override
public void onNavigationModeChanged(int mode) { public void onNavigationModeChanged(int mode) {
mEdgeBackGestureHandler.onNavigationModeChanged(mode); mEdgeBackGestureHandler.onNavigationModeChanged(mode);
@@ -236,6 +299,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
pw.println(" mDisabledFlags=" + mDisabledFlags); pw.println(" mDisabledFlags=" + mDisabledFlags);
pw.println(" mTaskBarWindowState=" + mTaskBarWindowState); pw.println(" mTaskBarWindowState=" + mTaskBarWindowState);
pw.println(" mBehavior=" + mBehavior); pw.println(" mBehavior=" + mBehavior);
pw.println(" mTaskbarTransientShowing=" + mTaskbarTransientShowing);
mEdgeBackGestureHandler.dump(pw); mEdgeBackGestureHandler.dump(pw);
} }
} }

View File

@@ -248,6 +248,12 @@ public class OverviewProxyService extends CurrentUserTracker implements
onTaskbarStatusUpdated(visible, stashed)); onTaskbarStatusUpdated(visible, stashed));
} }
@Override
public void notifyTaskbarAutohideSuspend(boolean suspend) {
verifyCallerAndClearCallingIdentityPostMain("notifyTaskbarAutohideSuspend", () ->
onTaskbarAutohideSuspend(suspend));
}
private boolean sendEvent(int action, int code) { private boolean sendEvent(int action, int code) {
long when = SystemClock.uptimeMillis(); long when = SystemClock.uptimeMillis();
final KeyEvent ev = new KeyEvent(when, when, action, code, 0 /* repeat */, final KeyEvent ev = new KeyEvent(when, when, action, code, 0 /* repeat */,
@@ -818,6 +824,12 @@ public class OverviewProxyService extends CurrentUserTracker implements
} }
} }
private void onTaskbarAutohideSuspend(boolean suspend) {
for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {
mConnectionCallbacks.get(i).onTaskbarAutohideSuspend(suspend);
}
}
private void notifyConnectionChanged() { private void notifyConnectionChanged() {
for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) { for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {
mConnectionCallbacks.get(i).onConnectionChanged(mOverviewProxy != null); mConnectionCallbacks.get(i).onConnectionChanged(mOverviewProxy != null);
@@ -1000,6 +1012,7 @@ public class OverviewProxyService extends CurrentUserTracker implements
default void onNavBarButtonAlphaChanged(float alpha, boolean animate) {} default void onNavBarButtonAlphaChanged(float alpha, boolean animate) {}
default void onHomeRotationEnabled(boolean enabled) {} default void onHomeRotationEnabled(boolean enabled) {}
default void onTaskbarStatusUpdated(boolean visible, boolean stashed) {} default void onTaskbarStatusUpdated(boolean visible, boolean stashed) {}
default void onTaskbarAutohideSuspend(boolean suspend) {}
default void onSystemUiStateChanged(int sysuiStateFlags) {} default void onSystemUiStateChanged(int sysuiStateFlags) {}
default void onAssistantProgress(@FloatRange(from = 0.0, to = 1.0) float progress) {} default void onAssistantProgress(@FloatRange(from = 0.0, to = 1.0) float progress) {}
default void onAssistantGestureCompletion(float velocity) {} default void onAssistantGestureCompletion(float velocity) {}

View File

@@ -37,6 +37,7 @@ public class AutoHideController {
private final Handler mHandler; private final Handler mHandler;
private AutoHideUiElement mStatusBar; private AutoHideUiElement mStatusBar;
/** For tablets, this will represent the Taskbar */
private AutoHideUiElement mNavigationBar; private AutoHideUiElement mNavigationBar;
private int mDisplayId; private int mDisplayId;
@@ -89,7 +90,7 @@ public class AutoHideController {
} }
} }
void resumeSuspendedAutoHide() { public void resumeSuspendedAutoHide() {
if (mAutoHideSuspended) { if (mAutoHideSuspended) {
scheduleAutoHide(); scheduleAutoHide();
Runnable checkBarModesRunnable = getCheckBarModesRunnable(); Runnable checkBarModesRunnable = getCheckBarModesRunnable();
@@ -99,7 +100,7 @@ public class AutoHideController {
} }
} }
void suspendAutoHide() { public void suspendAutoHide() {
mHandler.removeCallbacks(mAutoHide); mHandler.removeCallbacks(mAutoHide);
Runnable checkBarModesRunnable = getCheckBarModesRunnable(); Runnable checkBarModesRunnable = getCheckBarModesRunnable();
if (checkBarModesRunnable != null) { if (checkBarModesRunnable != null) {

View File

@@ -57,6 +57,7 @@ import com.android.systemui.settings.UserTracker;
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;
import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper; import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
@@ -118,7 +119,8 @@ public class NavigationBarControllerTest extends SysuiTestCase {
mock(NavigationBarA11yHelper.class), mock(NavigationBarA11yHelper.class),
mock(TaskbarDelegate.class), mock(TaskbarDelegate.class),
mock(UserTracker.class), mock(UserTracker.class),
mock(DumpManager.class))); mock(DumpManager.class),
mock(AutoHideController.class)));
initializeNavigationBars(); initializeNavigationBars();
} }