summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dave Mankoff <mankoff@google.com> 2022-02-08 13:51:17 -0500
committer Dave Mankoff <mankoff@google.com> 2022-03-14 11:13:58 -0400
commit4a04b83e12f10ac642939662cb917b440f0f3909 (patch)
tree0994ad1da706acf949a96cb72da4c833cb3997f9
parent3f1d6d7567dd7c387de77eeed1355e16e0295049 (diff)
Move touch handling out of NavigationBarView.
This allows for removing several calls to Dependency#get out of NavigationBarView and into its controller, NavigationBar. Bug: 218354102 Test: manual && atest SystemUITests Change-Id: I9faef58ada4ef61854aa88b05e580f80dce648cd
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java296
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java89
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java9
4 files changed, 164 insertions, 234 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
index ec6094dd9973..086cca1c2163 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
@@ -47,6 +47,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_SWITCHER_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN;
+import static com.android.systemui.shared.system.QuickStepContract.isGesturalMode;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT_TRANSPARENT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE;
@@ -61,7 +62,6 @@ import android.app.ActivityTaskManager;
import android.app.IActivityTaskManager;
import android.app.StatusBarManager;
import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -107,13 +107,15 @@ import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.util.LatencyTracker;
import com.android.internal.view.AppearanceRegion;
+import com.android.systemui.Gefingerpoken;
import com.android.systemui.R;
-import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.model.SysUiState;
+import com.android.systemui.navigationbar.NavigationModeController.ModeChangedListener;
import com.android.systemui.navigationbar.buttons.ButtonDispatcher;
+import com.android.systemui.navigationbar.buttons.DeadZone;
import com.android.systemui.navigationbar.buttons.KeyButtonView;
import com.android.systemui.navigationbar.buttons.RotationContextButton;
import com.android.systemui.navigationbar.gestural.QuickswitchOrientedNavHandle;
@@ -125,6 +127,7 @@ import com.android.systemui.shared.rotation.RotationButton;
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.SysUiStatsLog;
import com.android.systemui.statusbar.AutoHideUiElement;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CommandQueue.Callbacks;
@@ -146,15 +149,15 @@ import java.util.Locale;
import java.util.Optional;
import java.util.function.Consumer;
-import javax.inject.Inject;
-
import dagger.Lazy;
+import dagger.assisted.Assisted;
+import dagger.assisted.AssistedFactory;
+import dagger.assisted.AssistedInject;
/**
* Contains logic for a navigation bar view.
*/
-public class NavigationBar implements View.OnAttachStateChangeListener,
- Callbacks, NavigationModeController.ModeChangedListener {
+public class NavigationBar implements View.OnAttachStateChangeListener, Callbacks {
public static final String TAG = "NavigationBar";
private static final boolean DEBUG = false;
@@ -181,7 +184,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
private final NotificationRemoteInputManager mNotificationRemoteInputManager;
private final OverviewProxyService mOverviewProxyService;
private final NavigationModeController mNavigationModeController;
- private final AccessibilityButtonModeObserver mAccessibilityButtonModeObserver;
private final BroadcastDispatcher mBroadcastDispatcher;
private final CommandQueue mCommandQueue;
private final Optional<Pip> mPipOptional;
@@ -200,8 +202,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
private @WindowVisibleState int mNavigationBarWindowState = WINDOW_STATE_SHOWING;
private int mNavigationIconHints = 0;
- private @TransitionMode int mNavigationBarMode;
- private ContentResolver mContentResolver;
+ private @TransitionMode int mTransitionMode;
private boolean mLongPressHomeEnabled;
private int mDisabledFlags1;
@@ -255,7 +256,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
private int mCurrentRotation;
private ViewTreeObserver.OnGlobalLayoutListener mOrientationHandleGlobalLayoutListener;
private boolean mShowOrientedHandleForImmersiveMode;
-
+ private DeadZone mDeadZone;
+ private boolean mImeVisible;
@com.android.internal.annotations.VisibleForTesting
public enum NavBarActionEvent implements UiEventLogger.UiEventEnum {
@@ -471,7 +473,9 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
}
};
- private NavigationBar(Context context,
+ @AssistedInject
+ NavigationBar(
+ @Assisted Context context,
WindowManager windowManager,
Lazy<AssistManager> assistManagerLazy,
AccessibilityManager accessibilityManager,
@@ -479,7 +483,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
MetricsLogger metricsLogger,
OverviewProxyService overviewProxyService,
NavigationModeController navigationModeController,
- AccessibilityButtonModeObserver accessibilityButtonModeObserver,
StatusBarStateController statusBarStateController,
SysUiState sysUiFlagsContainer,
BroadcastDispatcher broadcastDispatcher,
@@ -514,7 +517,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mNotificationRemoteInputManager = notificationRemoteInputManager;
mOverviewProxyService = overviewProxyService;
mNavigationModeController = navigationModeController;
- mAccessibilityButtonModeObserver = accessibilityButtonModeObserver;
mBroadcastDispatcher = broadcastDispatcher;
mCommandQueue = commandQueue;
mPipOptional = pipOptional;
@@ -532,7 +534,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mTelecomManagerOptional = telecomManagerOptional;
mInputMethodManager = inputMethodManager;
- mNavBarMode = mNavigationModeController.addListener(this);
+ mNavBarMode = mNavigationModeController.addListener(mModeChangedListener);
}
public NavigationBarView getView() {
@@ -546,6 +548,11 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
R.layout.navigation_bar, mFrame);
barView.addOnAttachStateChangeListener(this);
mNavigationBarView = barView.findViewById(R.id.navigation_bar_view);
+ mDeadZone = new DeadZone(mNavigationBarView);
+ mNavigationBarView.setTouchHandler(mTouchHandler);
+ mNavigationBarView.setNavBarMode(mNavBarMode);
+
+ mNavigationBarView.updateRotationButton();
mNavigationBarView.setVisibility(initialVisibility ? View.VISIBLE : View.INVISIBLE);
@@ -558,7 +565,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mCommandQueue.addCallback(this);
mLongPressHomeEnabled = mNavBarHelper.getLongPressHomeEnabled();
- mContentResolver = mContext.getContentResolver();
mNavBarHelper.init();
mAllowForceNavBarHandleOpaque = mContext.getResources().getBoolean(
R.bool.allow_force_nav_bar_handle_opaque);
@@ -597,7 +603,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
setAutoHideController(/* autoHideController */ null);
mCommandQueue.removeCallback(this);
mWindowManager.removeViewImmediate(mNavigationBarView.getRootView());
- mNavigationModeController.removeListener(this);
+ mNavigationModeController.removeListener(mModeChangedListener);
mNavBarHelper.removeNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
mNavBarHelper.destroy();
@@ -612,15 +618,16 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
final Display display = v.getDisplay();
mNavigationBarView.setComponents(mRecentsOptional);
mNavigationBarView.setComponents(mCentralSurfacesOptionalLazy.get().get().getPanelController());
- mNavigationBarView.setDisabledFlags(mDisabledFlags1);
+ mNavigationBarView.setDisabledFlags(mDisabledFlags1, mSysUiFlagsContainer);
mNavigationBarView.setOnVerticalChangedListener(this::onVerticalChanged);
mNavigationBarView.setOnTouchListener(this::onNavigationTouch);
if (mSavedState != null) {
mNavigationBarView.getLightTransitionsController().restoreState(mSavedState);
}
- mNavigationBarView.setNavigationIconHints(mNavigationIconHints);
+ setNavigationIconHints(mNavigationIconHints);
mNavigationBarView.setWindowVisible(isNavBarWindowVisible());
mNavigationBarView.setBehavior(mBehavior);
+ mNavigationBarView.setNavBarMode(mNavBarMode);
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
@@ -865,8 +872,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
pw.println(" mLongPressHomeEnabled=" + mLongPressHomeEnabled);
pw.println(" mNavigationBarWindowState="
+ windowStateToString(mNavigationBarWindowState));
- pw.println(" mNavigationBarMode="
- + BarTransitions.modeToString(mNavigationBarMode));
+ pw.println(" mTransitionMode="
+ + BarTransitions.modeToString(mTransitionMode));
pw.println(" mTransientShown=" + mTransientShown);
pw.println(" mTransientShownFromGestureOnSystemBar="
+ mTransientShownFromGestureOnSystemBar);
@@ -888,11 +895,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
imeShown, showImeSwitcher);
if (hints == mNavigationIconHints) return;
- mNavigationIconHints = hints;
- if (!isTablet(mContext)) {
- // All IME functions handled by launcher via Sysui flags for large screen
- mNavigationBarView.setNavigationIconHints(hints);
- }
+ setNavigationIconHints(hints);
checkBarModes();
updateSystemUiStateFlags();
}
@@ -952,15 +955,15 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
/** Restores the appearance and the transient saved state to {@link NavigationBar}. */
public void restoreAppearanceAndTransientState() {
- final int barMode = barMode(mTransientShown, mAppearance);
- mNavigationBarMode = barMode;
+ final int transitionMode = transitionMode(mTransientShown, mAppearance);
+ mTransitionMode = transitionMode;
checkNavBarModes();
if (mAutoHideController != null) {
mAutoHideController.touchAutoHide();
}
if (mLightBarController != null) {
mLightBarController.onNavigationBarAppearanceChanged(mAppearance,
- true /* nbModeChanged */, barMode, false /* navbarColorManagedByIme */);
+ true /* nbModeChanged */, transitionMode, false /* navbarColorManagedByIme */);
}
}
@@ -974,11 +977,11 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
boolean nbModeChanged = false;
if (mAppearance != appearance) {
mAppearance = appearance;
- nbModeChanged = updateBarMode(barMode(mTransientShown, appearance));
+ nbModeChanged = updateTransitionMode(transitionMode(mTransientShown, appearance));
}
if (mLightBarController != null) {
mLightBarController.onNavigationBarAppearanceChanged(appearance, nbModeChanged,
- mNavigationBarMode, navbarColorManagedByIme);
+ mTransitionMode, navbarColorManagedByIme);
}
if (mBehavior != behavior) {
mBehavior = behavior;
@@ -1025,16 +1028,16 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
private void handleTransientChanged() {
mNavigationBarView.onTransientStateChanged(mTransientShown,
mTransientShownFromGestureOnSystemBar);
- final int barMode = barMode(mTransientShown, mAppearance);
- if (updateBarMode(barMode) && mLightBarController != null) {
- mLightBarController.onNavigationBarModeChanged(barMode);
+ final int transitionMode = transitionMode(mTransientShown, mAppearance);
+ if (updateTransitionMode(transitionMode) && mLightBarController != null) {
+ mLightBarController.onNavigationBarModeChanged(transitionMode);
}
}
// Returns true if the bar mode is changed.
- private boolean updateBarMode(int barMode) {
- if (mNavigationBarMode != barMode) {
- mNavigationBarMode = barMode;
+ private boolean updateTransitionMode(int barMode) {
+ if (mTransitionMode != barMode) {
+ mTransitionMode = barMode;
checkNavBarModes();
if (mAutoHideController != null) {
mAutoHideController.touchAutoHide();
@@ -1044,7 +1047,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
return false;
}
- private static @TransitionMode int barMode(boolean isTransient, int appearance) {
+ private static @TransitionMode int transitionMode(boolean isTransient, int appearance) {
final int lightsOutOpaque = APPEARANCE_LOW_PROFILE_BARS | APPEARANCE_OPAQUE_NAVIGATION_BARS;
if (isTransient) {
return MODE_SEMI_TRANSPARENT;
@@ -1073,7 +1076,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
| StatusBarManager.DISABLE_SEARCH);
if (masked != mDisabledFlags1) {
mDisabledFlags1 = masked;
- mNavigationBarView.setDisabledFlags(state1);
+ mNavigationBarView.setDisabledFlags(state1, mSysUiFlagsContainer);
updateScreenPinningGestures();
}
@@ -1455,24 +1458,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mCentralSurfacesOptionalLazy.get().map(CentralSurfaces::isDeviceInteractive)
.orElse(false)
&& mNavigationBarWindowState != WINDOW_STATE_HIDDEN;
- mNavigationBarView.getBarTransitions().transitionTo(mNavigationBarMode, anim);
- }
-
- @Override
- public void onNavigationModeChanged(int mode) {
- mNavBarMode = mode;
-
- if (!QuickStepContract.isGesturalMode(mode)) {
- // Reset the override alpha
- if (getBarTransitions() != null) {
- getBarTransitions().setBackgroundOverrideAlpha(1f);
- }
- }
- updateScreenPinningGestures();
-
- if (!canShowSecondaryHandle()) {
- resetSecondaryHandle();
- }
+ mNavigationBarView.getBarTransitions().transitionTo(mTransitionMode, anim);
}
public void disableAnimationsDuringHide(long delay) {
@@ -1613,114 +1599,102 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
return mNavigationIconHints;
}
+ private void setNavigationIconHints(int hints) {
+ if (hints == mNavigationIconHints) return;
+ if (!isTablet(mContext)) {
+ // All IME functions handled by launcher via Sysui flags for large screen
+ final boolean newBackAlt = (hints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) != 0;
+ final boolean oldBackAlt =
+ (mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) != 0;
+ if (newBackAlt != oldBackAlt) {
+ mNavigationBarView.onImeVisibilityChanged(newBackAlt);
+ mImeVisible = newBackAlt;
+ }
+
+ mNavigationBarView.setNavigationIconHints(hints);
+ }
+ if (DEBUG) {
+ android.widget.Toast.makeText(mContext,
+ "Navigation icon hints = " + hints,
+ 500).show();
+ }
+ mNavigationIconHints = hints;
+ }
+
+ private final ModeChangedListener mModeChangedListener = new ModeChangedListener() {
+ @Override
+ public void onNavigationModeChanged(int mode) {
+ mNavBarMode = mode;
+
+ if (!QuickStepContract.isGesturalMode(mode)) {
+ // Reset the override alpha
+ if (getBarTransitions() != null) {
+ getBarTransitions().setBackgroundOverrideAlpha(1f);
+ }
+ }
+ updateScreenPinningGestures();
+
+ if (!canShowSecondaryHandle()) {
+ resetSecondaryHandle();
+ }
+ if (mNavigationBarView != null) {
+ mNavigationBarView.setNavBarMode(mode);
+ }
+ }
+ };
+
+ private final Gefingerpoken mTouchHandler = new Gefingerpoken() {
+ private boolean mDeadZoneConsuming;
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ if (isGesturalMode(mNavBarMode) && mImeVisible
+ && ev.getAction() == MotionEvent.ACTION_DOWN) {
+ SysUiStatsLog.write(SysUiStatsLog.IME_TOUCH_REPORTED,
+ (int) ev.getX(), (int) ev.getY());
+ }
+ return shouldDeadZoneConsumeTouchEvents(ev);
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ shouldDeadZoneConsumeTouchEvents(ev);
+ return false;
+ }
+
+ private boolean shouldDeadZoneConsumeTouchEvents(MotionEvent event) {
+ int action = event.getActionMasked();
+ if (action == MotionEvent.ACTION_DOWN) {
+ mDeadZoneConsuming = false;
+ }
+ if (mDeadZone.onTouchEvent(event) || mDeadZoneConsuming) {
+ switch (action) {
+ case MotionEvent.ACTION_DOWN:
+ // Allow gestures starting in the deadzone to be slippery
+ mNavigationBarView.setSlippery(true);
+ mDeadZoneConsuming = true;
+ break;
+ case MotionEvent.ACTION_CANCEL:
+ case MotionEvent.ACTION_UP:
+ // When a gesture started in the deadzone is finished, restore
+ // slippery state
+ mNavigationBarView.updateSlippery();
+ mDeadZoneConsuming = false;
+ break;
+ }
+ return true;
+ }
+ return false;
+ }
+ };
+
+
/**
* Injectable factory for construction a {@link NavigationBar}.
*/
- public static class Factory {
- private final Lazy<AssistManager> mAssistManagerLazy;
- private final AccessibilityManager mAccessibilityManager;
- private final DeviceProvisionedController mDeviceProvisionedController;
- private final MetricsLogger mMetricsLogger;
- private final OverviewProxyService mOverviewProxyService;
- private final NavigationModeController mNavigationModeController;
- private final AccessibilityButtonModeObserver mAccessibilityButtonModeObserver;
- private final StatusBarStateController mStatusBarStateController;
- private final SysUiState mSysUiFlagsContainer;
- private final BroadcastDispatcher mBroadcastDispatcher;
- private final CommandQueue mCommandQueue;
- private final Optional<Pip> mPipOptional;
- private final Optional<Recents> mRecentsOptional;
- private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
- private final ShadeController mShadeController;
- private final NotificationRemoteInputManager mNotificationRemoteInputManager;
- private final NotificationShadeDepthController mNotificationShadeDepthController;
- private final Handler mMainHandler;
- private final NavigationBarOverlayController mNavbarOverlayController;
- private final UiEventLogger mUiEventLogger;
- private final NavBarHelper mNavBarHelper;
- private final LightBarController mMainLightBarController;
- private final LightBarController.Factory mLightBarControllerFactory;
- private final AutoHideController mMainAutoHideController;
- private final AutoHideController.Factory mAutoHideControllerFactory;
- private final Optional<TelecomManager> mTelecomManagerOptional;
- private final InputMethodManager mInputMethodManager;
- private final Optional<BackAnimation> mBackAnimation;
-
- @Inject
- public Factory(
- Lazy<AssistManager> assistManagerLazy,
- AccessibilityManager accessibilityManager,
- DeviceProvisionedController deviceProvisionedController,
- MetricsLogger metricsLogger,
- OverviewProxyService overviewProxyService,
- NavigationModeController navigationModeController,
- AccessibilityButtonModeObserver accessibilityButtonModeObserver,
- StatusBarStateController statusBarStateController,
- SysUiState sysUiFlagsContainer,
- BroadcastDispatcher broadcastDispatcher,
- CommandQueue commandQueue,
- Optional<Pip> pipOptional,
- Optional<Recents> recentsOptional,
- Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy,
- ShadeController shadeController,
- NotificationRemoteInputManager notificationRemoteInputManager,
- NotificationShadeDepthController notificationShadeDepthController,
- @Main Handler mainHandler,
- NavigationBarOverlayController navbarOverlayController,
- UiEventLogger uiEventLogger,
- NavBarHelper navBarHelper,
- LightBarController mainLightBarController,
- LightBarController.Factory lightBarControllerFactory,
- AutoHideController mainAutoHideController,
- AutoHideController.Factory autoHideControllerFactory,
- Optional<TelecomManager> telecomManagerOptional,
- InputMethodManager inputMethodManager,
- Optional<BackAnimation> backAnimation) {
- mAssistManagerLazy = assistManagerLazy;
- mAccessibilityManager = accessibilityManager;
- mDeviceProvisionedController = deviceProvisionedController;
- mMetricsLogger = metricsLogger;
- mOverviewProxyService = overviewProxyService;
- mNavigationModeController = navigationModeController;
- mAccessibilityButtonModeObserver = accessibilityButtonModeObserver;
- mStatusBarStateController = statusBarStateController;
- mSysUiFlagsContainer = sysUiFlagsContainer;
- mBroadcastDispatcher = broadcastDispatcher;
- mCommandQueue = commandQueue;
- mPipOptional = pipOptional;
- mRecentsOptional = recentsOptional;
- mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy;
- mShadeController = shadeController;
- mNotificationRemoteInputManager = notificationRemoteInputManager;
- mNotificationShadeDepthController = notificationShadeDepthController;
- mMainHandler = mainHandler;
- mNavbarOverlayController = navbarOverlayController;
- mUiEventLogger = uiEventLogger;
- mNavBarHelper = navBarHelper;
- mMainLightBarController = mainLightBarController;
- mLightBarControllerFactory = lightBarControllerFactory;
- mMainAutoHideController = mainAutoHideController;
- mAutoHideControllerFactory = autoHideControllerFactory;
- mTelecomManagerOptional = telecomManagerOptional;
- mInputMethodManager = inputMethodManager;
- mBackAnimation = backAnimation;
- }
-
+ @AssistedFactory
+ public interface Factory {
/** Construct a {@link NavigationBar} */
- public NavigationBar create(Context context) {
- final WindowManager wm = context.getSystemService(WindowManager.class);
- return new NavigationBar(context, wm, mAssistManagerLazy,
- mAccessibilityManager, mDeviceProvisionedController, mMetricsLogger,
- mOverviewProxyService, mNavigationModeController,
- mAccessibilityButtonModeObserver, mStatusBarStateController,
- mSysUiFlagsContainer, mBroadcastDispatcher, mCommandQueue, mPipOptional,
- mRecentsOptional, mCentralSurfacesOptionalLazy,
- mShadeController, mNotificationRemoteInputManager,
- mNotificationShadeDepthController, mMainHandler,
- mNavbarOverlayController, mUiEventLogger, mNavBarHelper,
- mMainLightBarController, mLightBarControllerFactory,
- mMainAutoHideController, mAutoHideControllerFactory, mTelecomManagerOptional,
- mInputMethodManager, mBackAnimation);
- }
+ NavigationBar create(Context context);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
index 017bbdffdc4f..f5abe28914c3 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
@@ -65,6 +65,7 @@ import android.widget.FrameLayout;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
+import com.android.systemui.Gefingerpoken;
import com.android.systemui.R;
import com.android.systemui.animation.Interpolators;
import com.android.systemui.model.SysUiState;
@@ -84,13 +85,12 @@ import com.android.systemui.shared.rotation.RotationButton.RotationButtonUpdates
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.SysUiStatsLog;
import com.android.systemui.shared.system.WindowManagerWrapper;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.AutoHideController;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.LightBarTransitionsController;
import com.android.systemui.statusbar.phone.NotificationPanelViewController;
-import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.wm.shell.back.BackAnimation;
import com.android.wm.shell.pip.Pip;
@@ -101,15 +101,14 @@ import java.util.Optional;
import java.util.concurrent.Executor;
import java.util.function.Consumer;
-public class NavigationBarView extends FrameLayout implements
- NavigationModeController.ModeChangedListener {
+/** */
+public class NavigationBarView extends FrameLayout {
final static boolean DEBUG = false;
final static String TAG = "NavBarView";
final static boolean ALTERNATE_CAR_MODE_UI = false;
private final RegionSamplingHelper mRegionSamplingHelper;
private final int mNavColorSampleMargin;
- private final SysUiState mSysUiFlagContainer;
// The current view is one of mHorizontal or mVertical depending on the current configuration
View mCurrentView = null;
@@ -197,6 +196,7 @@ public class NavigationBarView extends FrameLayout implements
* <p>Cache the value here for better performance.</p>
*/
private final boolean mImeCanRenderGesturalNavButtons = canImeRenderGesturalNavButtons();
+ private Gefingerpoken mTouchHandler;
private class NavTransitionListener implements TransitionListener {
private boolean mBackTransitioning;
@@ -333,10 +333,8 @@ public class NavigationBarView extends FrameLayout implements
mDarkIconColor = Utils.getColorAttrDefaultColor(darkContext, R.attr.singleToneColor);
mIsVertical = false;
mLongClickableAccessibilityButton = false;
- mNavBarMode = Dependency.get(NavigationModeController.class).addListener(this);
mImeDrawsImeNavBar = Dependency.get(NavigationModeController.class).getImeDrawsImeNavBar();
- mSysUiFlagContainer = Dependency.get(SysUiState.class);
// Set up the context group of buttons
mContextualButtonGroup = new ContextualButtonGroup(R.id.menu_container);
final ContextualButton imeSwitcherButton = new ContextualButton(R.id.ime_switcher,
@@ -365,8 +363,6 @@ public class NavigationBarView extends FrameLayout implements
R.drawable.ic_sysbar_rotate_button_cw_start_90,
() -> getDisplay().getRotation());
- updateRotationButton();
-
mOverviewProxyService = Dependency.get(OverviewProxyService.class);
mConfiguration = new Configuration();
@@ -448,19 +444,18 @@ public class NavigationBarView extends FrameLayout implements
notifyVerticalChangedListener(mIsVertical);
}
+ public void setTouchHandler(Gefingerpoken touchHandler) {
+ mTouchHandler = touchHandler;
+ }
+
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
- if (isGesturalMode(mNavBarMode) && mImeVisible
- && event.getAction() == MotionEvent.ACTION_DOWN) {
- SysUiStatsLog.write(SysUiStatsLog.IME_TOUCH_REPORTED,
- (int) event.getX(), (int) event.getY());
- }
- return shouldDeadZoneConsumeTouchEvents(event) || super.onInterceptTouchEvent(event);
+ return mTouchHandler.onInterceptTouchEvent(event) || super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
- shouldDeadZoneConsumeTouchEvents(event);
+ mTouchHandler.onTouchEvent(event);
return super.onTouchEvent(event);
}
@@ -497,30 +492,6 @@ public class NavigationBarView extends FrameLayout implements
}
}
- private boolean shouldDeadZoneConsumeTouchEvents(MotionEvent event) {
- int action = event.getActionMasked();
- if (action == MotionEvent.ACTION_DOWN) {
- mDeadZoneConsuming = false;
- }
- if (mDeadZone.onTouchEvent(event) || mDeadZoneConsuming) {
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- // Allow gestures starting in the deadzone to be slippery
- setSlippery(true);
- mDeadZoneConsuming = true;
- break;
- case MotionEvent.ACTION_CANCEL:
- case MotionEvent.ACTION_UP:
- // When a gesture started in the deadzone is finished, restore slippery state
- updateSlippery();
- mDeadZoneConsuming = false;
- break;
- }
- return true;
- }
- return false;
- }
-
public void abortCurrentGesture() {
getHomeButton().abortCurrentGesture();
}
@@ -589,7 +560,7 @@ public class NavigationBarView extends FrameLayout implements
return (mDisabledFlags & View.STATUS_BAR_DISABLE_RECENT) == 0;
}
- public boolean isQuickStepSwipeUpEnabled() {
+ private boolean isQuickStepSwipeUpEnabled() {
return mOverviewProxyService.shouldShowSwipeUpUI() && isOverviewEnabled();
}
@@ -618,7 +589,7 @@ public class NavigationBarView extends FrameLayout implements
/**
* Updates the rotation button based on the current navigation mode.
*/
- private void updateRotationButton() {
+ void updateRotationButton() {
if (isGesturalMode(mNavBarMode)) {
mContextualButtonGroup.removeButton(R.id.rotate_suggestion);
mButtonDispatchers.remove(R.id.rotate_suggestion);
@@ -722,25 +693,13 @@ public class NavigationBarView extends FrameLayout implements
super.setLayoutDirection(layoutDirection);
}
- public void setNavigationIconHints(int hints) {
+ void setNavigationIconHints(int hints) {
if (hints == mNavigationIconHints) return;
- final boolean newBackAlt = (hints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) != 0;
- final boolean oldBackAlt =
- (mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) != 0;
- if (newBackAlt != oldBackAlt) {
- onImeVisibilityChanged(newBackAlt);
- }
-
- if (DEBUG) {
- android.widget.Toast.makeText(getContext(),
- "Navigation icon hints = " + hints,
- 500).show();
- }
mNavigationIconHints = hints;
updateNavButtonIcons();
}
- private void onImeVisibilityChanged(boolean visible) {
+ void onImeVisibilityChanged(boolean visible) {
if (!visible) {
mTransitionListener.onBackAltCleared();
}
@@ -751,7 +710,7 @@ public class NavigationBarView extends FrameLayout implements
}
}
- public void setDisabledFlags(int disabledFlags) {
+ void setDisabledFlags(int disabledFlags, SysUiState sysUiState) {
if (mDisabledFlags == disabledFlags) return;
final boolean overviewEnabledBefore = isOverviewEnabled();
@@ -764,7 +723,7 @@ public class NavigationBarView extends FrameLayout implements
updateNavButtonIcons();
updateSlippery();
- updateDisabledSystemUiStateFlags();
+ updateDisabledSystemUiStateFlags(sysUiState);
}
public void updateNavButtonIcons() {
@@ -907,10 +866,11 @@ public class NavigationBarView extends FrameLayout implements
updateSlippery();
}
- public void updateDisabledSystemUiStateFlags() {
+ /** */
+ public void updateDisabledSystemUiStateFlags(SysUiState sysUiState) {
int displayId = mContext.getDisplayId();
- mSysUiFlagContainer.setFlag(SYSUI_STATE_SCREEN_PINNING,
+ sysUiState.setFlag(SYSUI_STATE_SCREEN_PINNING,
ActivityManagerWrapper.getInstance().isScreenPinningActive())
.setFlag(SYSUI_STATE_OVERVIEW_DISABLED,
(mDisabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0)
@@ -952,12 +912,12 @@ public class NavigationBarView extends FrameLayout implements
* slippery is enabled, touch events will leave the nav bar window and enter into the fullscreen
* app/home window, if not nav bar will receive a cancelled touch event once gesture leaves bar.
*/
- public void updateSlippery() {
+ void updateSlippery() {
setSlippery(!isQuickStepSwipeUpEnabled() ||
(mPanelView != null && mPanelView.isFullyExpanded() && !mPanelView.isCollapsing()));
}
- private void setSlippery(boolean slippery) {
+ void setSlippery(boolean slippery) {
setWindowFlag(WindowManager.LayoutParams.FLAG_SLIPPERY, slippery);
}
@@ -979,8 +939,7 @@ public class NavigationBarView extends FrameLayout implements
wm.updateViewLayout(navbarView, lp);
}
- @Override
- public void onNavigationModeChanged(int mode) {
+ void setNavBarMode(int mode) {
mNavBarMode = mode;
mImeDrawsImeNavBar = Dependency.get(NavigationModeController.class).getImeDrawsImeNavBar();
mBarTransitions.onNavigationModeChanged(mNavBarMode);
@@ -1323,7 +1282,6 @@ public class NavigationBarView extends FrameLayout implements
mEdgeBackGestureHandler.onNavBarAttached();
requestApplyInsets();
reorient();
- onNavigationModeChanged(mNavBarMode);
if (mRotationButtonController != null) {
mRotationButtonController.registerListeners();
}
@@ -1338,7 +1296,6 @@ public class NavigationBarView extends FrameLayout implements
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
- Dependency.get(NavigationModeController.class).removeListener(this);
for (int i = 0; i < mButtonDispatchers.size(); ++i) {
mButtonDispatchers.valueAt(i).onDestroy();
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index a3dea1c68b14..53a27ff4e08b 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -101,8 +101,8 @@ import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NotificationShadeWindowController;
-import com.android.systemui.statusbar.phone.NotificationPanelViewController;
import com.android.systemui.statusbar.phone.CentralSurfaces;
+import com.android.systemui.statusbar.phone.NotificationPanelViewController;
import com.android.systemui.statusbar.phone.StatusBarWindowCallback;
import com.android.systemui.statusbar.policy.CallbackController;
import com.android.wm.shell.back.BackAnimation;
@@ -675,7 +675,7 @@ public class OverviewProxyService extends CurrentUserTracker implements
navBarFragment.updateSystemUiStateFlags();
}
if (navBarView != null) {
- navBarView.updateDisabledSystemUiStateFlags();
+ navBarView.updateDisabledSystemUiStateFlags(mSysUiState);
}
if (panelController != null) {
panelController.updateSystemUiStateFlags();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
index eb1e1a2e3d04..a0aa267e850e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
@@ -91,10 +91,10 @@ import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.NotificationShadeDepthController;
import com.android.systemui.statusbar.phone.AutoHideController;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.LightBarController;
import com.android.systemui.statusbar.phone.NotificationShadeWindowView;
import com.android.systemui.statusbar.phone.ShadeController;
-import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.utils.leaks.LeakCheckedTest;
@@ -387,14 +387,14 @@ public class NavigationBarTest extends SysuiTestCase {
DeviceProvisionedController deviceProvisionedController =
mock(DeviceProvisionedController.class);
when(deviceProvisionedController.isDeviceProvisioned()).thenReturn(true);
- NavigationBar.Factory factory = new NavigationBar.Factory(
+ return spy(new NavigationBar(context,
+ mWindowManager,
() -> mAssistManager,
mock(AccessibilityManager.class),
deviceProvisionedController,
new MetricsLogger(),
mOverviewProxyService,
mNavigationModeController,
- mock(AccessibilityButtonModeObserver.class),
mStatusBarStateController,
mMockSysUiState,
mBroadcastDispatcher,
@@ -415,8 +415,7 @@ public class NavigationBarTest extends SysuiTestCase {
mAutoHideControllerFactory,
Optional.of(mTelecomManager),
mInputMethodManager,
- Optional.of(mock(BackAnimation.class)));
- return spy(factory.create(context));
+ Optional.of(mock(BackAnimation.class))));
}
private void processAllMessages() {