summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Louis Chang <louischang@google.com> 2022-03-15 02:31:24 +0000
committer Louis Chang <louischang@google.com> 2022-03-15 02:31:24 +0000
commitd9ba94bf79d1a615e4bfae7f09e31bf9853f7a7e (patch)
tree277f22cc9b71ebaed10d373012b9d7d63c247dca
parent4a04b83e12f10ac642939662cb917b440f0f3909 (diff)
Revert "Move touch handling out of NavigationBarView."
This reverts commit 4a04b83e12f10ac642939662cb917b440f0f3909. Reason for revert: breaking wm presubmit Bug: 224629724 Change-Id: I351c6e9ef17a45fab4a1f957af29c835e8fc1e30
-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, 234 insertions, 164 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
index 086cca1c2163..ec6094dd9973 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
@@ -47,7 +47,6 @@ 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;
@@ -62,6 +61,7 @@ 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,15 +107,13 @@ 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;
@@ -127,7 +125,6 @@ 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;
@@ -149,15 +146,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 {
+public class NavigationBar implements View.OnAttachStateChangeListener,
+ Callbacks, NavigationModeController.ModeChangedListener {
public static final String TAG = "NavigationBar";
private static final boolean DEBUG = false;
@@ -184,6 +181,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
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;
@@ -202,7 +200,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
private @WindowVisibleState int mNavigationBarWindowState = WINDOW_STATE_SHOWING;
private int mNavigationIconHints = 0;
- private @TransitionMode int mTransitionMode;
+ private @TransitionMode int mNavigationBarMode;
+ private ContentResolver mContentResolver;
private boolean mLongPressHomeEnabled;
private int mDisabledFlags1;
@@ -256,8 +255,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
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 {
@@ -473,9 +471,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
}
};
- @AssistedInject
- NavigationBar(
- @Assisted Context context,
+ private NavigationBar(Context context,
WindowManager windowManager,
Lazy<AssistManager> assistManagerLazy,
AccessibilityManager accessibilityManager,
@@ -483,6 +479,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
MetricsLogger metricsLogger,
OverviewProxyService overviewProxyService,
NavigationModeController navigationModeController,
+ AccessibilityButtonModeObserver accessibilityButtonModeObserver,
StatusBarStateController statusBarStateController,
SysUiState sysUiFlagsContainer,
BroadcastDispatcher broadcastDispatcher,
@@ -517,6 +514,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
mNotificationRemoteInputManager = notificationRemoteInputManager;
mOverviewProxyService = overviewProxyService;
mNavigationModeController = navigationModeController;
+ mAccessibilityButtonModeObserver = accessibilityButtonModeObserver;
mBroadcastDispatcher = broadcastDispatcher;
mCommandQueue = commandQueue;
mPipOptional = pipOptional;
@@ -534,7 +532,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
mTelecomManagerOptional = telecomManagerOptional;
mInputMethodManager = inputMethodManager;
- mNavBarMode = mNavigationModeController.addListener(mModeChangedListener);
+ mNavBarMode = mNavigationModeController.addListener(this);
}
public NavigationBarView getView() {
@@ -548,11 +546,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
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);
@@ -565,6 +558,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
mCommandQueue.addCallback(this);
mLongPressHomeEnabled = mNavBarHelper.getLongPressHomeEnabled();
+ mContentResolver = mContext.getContentResolver();
mNavBarHelper.init();
mAllowForceNavBarHandleOpaque = mContext.getResources().getBoolean(
R.bool.allow_force_nav_bar_handle_opaque);
@@ -603,7 +597,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
setAutoHideController(/* autoHideController */ null);
mCommandQueue.removeCallback(this);
mWindowManager.removeViewImmediate(mNavigationBarView.getRootView());
- mNavigationModeController.removeListener(mModeChangedListener);
+ mNavigationModeController.removeListener(this);
mNavBarHelper.removeNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
mNavBarHelper.destroy();
@@ -618,16 +612,15 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
final Display display = v.getDisplay();
mNavigationBarView.setComponents(mRecentsOptional);
mNavigationBarView.setComponents(mCentralSurfacesOptionalLazy.get().get().getPanelController());
- mNavigationBarView.setDisabledFlags(mDisabledFlags1, mSysUiFlagsContainer);
+ mNavigationBarView.setDisabledFlags(mDisabledFlags1);
mNavigationBarView.setOnVerticalChangedListener(this::onVerticalChanged);
mNavigationBarView.setOnTouchListener(this::onNavigationTouch);
if (mSavedState != null) {
mNavigationBarView.getLightTransitionsController().restoreState(mSavedState);
}
- setNavigationIconHints(mNavigationIconHints);
+ mNavigationBarView.setNavigationIconHints(mNavigationIconHints);
mNavigationBarView.setWindowVisible(isNavBarWindowVisible());
mNavigationBarView.setBehavior(mBehavior);
- mNavigationBarView.setNavBarMode(mNavBarMode);
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
@@ -872,8 +865,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
pw.println(" mLongPressHomeEnabled=" + mLongPressHomeEnabled);
pw.println(" mNavigationBarWindowState="
+ windowStateToString(mNavigationBarWindowState));
- pw.println(" mTransitionMode="
- + BarTransitions.modeToString(mTransitionMode));
+ pw.println(" mNavigationBarMode="
+ + BarTransitions.modeToString(mNavigationBarMode));
pw.println(" mTransientShown=" + mTransientShown);
pw.println(" mTransientShownFromGestureOnSystemBar="
+ mTransientShownFromGestureOnSystemBar);
@@ -895,7 +888,11 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
imeShown, showImeSwitcher);
if (hints == mNavigationIconHints) return;
- setNavigationIconHints(hints);
+ mNavigationIconHints = hints;
+ if (!isTablet(mContext)) {
+ // All IME functions handled by launcher via Sysui flags for large screen
+ mNavigationBarView.setNavigationIconHints(hints);
+ }
checkBarModes();
updateSystemUiStateFlags();
}
@@ -955,15 +952,15 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
/** Restores the appearance and the transient saved state to {@link NavigationBar}. */
public void restoreAppearanceAndTransientState() {
- final int transitionMode = transitionMode(mTransientShown, mAppearance);
- mTransitionMode = transitionMode;
+ final int barMode = barMode(mTransientShown, mAppearance);
+ mNavigationBarMode = barMode;
checkNavBarModes();
if (mAutoHideController != null) {
mAutoHideController.touchAutoHide();
}
if (mLightBarController != null) {
mLightBarController.onNavigationBarAppearanceChanged(mAppearance,
- true /* nbModeChanged */, transitionMode, false /* navbarColorManagedByIme */);
+ true /* nbModeChanged */, barMode, false /* navbarColorManagedByIme */);
}
}
@@ -977,11 +974,11 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
boolean nbModeChanged = false;
if (mAppearance != appearance) {
mAppearance = appearance;
- nbModeChanged = updateTransitionMode(transitionMode(mTransientShown, appearance));
+ nbModeChanged = updateBarMode(barMode(mTransientShown, appearance));
}
if (mLightBarController != null) {
mLightBarController.onNavigationBarAppearanceChanged(appearance, nbModeChanged,
- mTransitionMode, navbarColorManagedByIme);
+ mNavigationBarMode, navbarColorManagedByIme);
}
if (mBehavior != behavior) {
mBehavior = behavior;
@@ -1028,16 +1025,16 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
private void handleTransientChanged() {
mNavigationBarView.onTransientStateChanged(mTransientShown,
mTransientShownFromGestureOnSystemBar);
- final int transitionMode = transitionMode(mTransientShown, mAppearance);
- if (updateTransitionMode(transitionMode) && mLightBarController != null) {
- mLightBarController.onNavigationBarModeChanged(transitionMode);
+ final int barMode = barMode(mTransientShown, mAppearance);
+ if (updateBarMode(barMode) && mLightBarController != null) {
+ mLightBarController.onNavigationBarModeChanged(barMode);
}
}
// Returns true if the bar mode is changed.
- private boolean updateTransitionMode(int barMode) {
- if (mTransitionMode != barMode) {
- mTransitionMode = barMode;
+ private boolean updateBarMode(int barMode) {
+ if (mNavigationBarMode != barMode) {
+ mNavigationBarMode = barMode;
checkNavBarModes();
if (mAutoHideController != null) {
mAutoHideController.touchAutoHide();
@@ -1047,7 +1044,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
return false;
}
- private static @TransitionMode int transitionMode(boolean isTransient, int appearance) {
+ private static @TransitionMode int barMode(boolean isTransient, int appearance) {
final int lightsOutOpaque = APPEARANCE_LOW_PROFILE_BARS | APPEARANCE_OPAQUE_NAVIGATION_BARS;
if (isTransient) {
return MODE_SEMI_TRANSPARENT;
@@ -1076,7 +1073,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
| StatusBarManager.DISABLE_SEARCH);
if (masked != mDisabledFlags1) {
mDisabledFlags1 = masked;
- mNavigationBarView.setDisabledFlags(state1, mSysUiFlagsContainer);
+ mNavigationBarView.setDisabledFlags(state1);
updateScreenPinningGestures();
}
@@ -1458,7 +1455,24 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
mCentralSurfacesOptionalLazy.get().map(CentralSurfaces::isDeviceInteractive)
.orElse(false)
&& mNavigationBarWindowState != WINDOW_STATE_HIDDEN;
- mNavigationBarView.getBarTransitions().transitionTo(mTransitionMode, anim);
+ 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();
+ }
}
public void disableAnimationsDuringHide(long delay) {
@@ -1599,102 +1613,114 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Callback
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}.
*/
- @AssistedFactory
- public interface Factory {
+ 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;
+ }
+
/** Construct a {@link NavigationBar} */
- NavigationBar create(Context context);
+ 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);
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
index f5abe28914c3..017bbdffdc4f 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
@@ -65,7 +65,6 @@ 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;
@@ -85,12 +84,13 @@ 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,14 +101,15 @@ import java.util.Optional;
import java.util.concurrent.Executor;
import java.util.function.Consumer;
-/** */
-public class NavigationBarView extends FrameLayout {
+public class NavigationBarView extends FrameLayout implements
+ NavigationModeController.ModeChangedListener {
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;
@@ -196,7 +197,6 @@ public class NavigationBarView extends FrameLayout {
* <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,8 +333,10 @@ public class NavigationBarView extends FrameLayout {
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,
@@ -363,6 +365,8 @@ public class NavigationBarView extends FrameLayout {
R.drawable.ic_sysbar_rotate_button_cw_start_90,
() -> getDisplay().getRotation());
+ updateRotationButton();
+
mOverviewProxyService = Dependency.get(OverviewProxyService.class);
mConfiguration = new Configuration();
@@ -444,18 +448,19 @@ public class NavigationBarView extends FrameLayout {
notifyVerticalChangedListener(mIsVertical);
}
- public void setTouchHandler(Gefingerpoken touchHandler) {
- mTouchHandler = touchHandler;
- }
-
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
- return mTouchHandler.onInterceptTouchEvent(event) || super.onInterceptTouchEvent(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);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
- mTouchHandler.onTouchEvent(event);
+ shouldDeadZoneConsumeTouchEvents(event);
return super.onTouchEvent(event);
}
@@ -492,6 +497,30 @@ public class NavigationBarView extends FrameLayout {
}
}
+ 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();
}
@@ -560,7 +589,7 @@ public class NavigationBarView extends FrameLayout {
return (mDisabledFlags & View.STATUS_BAR_DISABLE_RECENT) == 0;
}
- private boolean isQuickStepSwipeUpEnabled() {
+ public boolean isQuickStepSwipeUpEnabled() {
return mOverviewProxyService.shouldShowSwipeUpUI() && isOverviewEnabled();
}
@@ -589,7 +618,7 @@ public class NavigationBarView extends FrameLayout {
/**
* Updates the rotation button based on the current navigation mode.
*/
- void updateRotationButton() {
+ private void updateRotationButton() {
if (isGesturalMode(mNavBarMode)) {
mContextualButtonGroup.removeButton(R.id.rotate_suggestion);
mButtonDispatchers.remove(R.id.rotate_suggestion);
@@ -693,13 +722,25 @@ public class NavigationBarView extends FrameLayout {
super.setLayoutDirection(layoutDirection);
}
- void setNavigationIconHints(int hints) {
+ public 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();
}
- void onImeVisibilityChanged(boolean visible) {
+ private void onImeVisibilityChanged(boolean visible) {
if (!visible) {
mTransitionListener.onBackAltCleared();
}
@@ -710,7 +751,7 @@ public class NavigationBarView extends FrameLayout {
}
}
- void setDisabledFlags(int disabledFlags, SysUiState sysUiState) {
+ public void setDisabledFlags(int disabledFlags) {
if (mDisabledFlags == disabledFlags) return;
final boolean overviewEnabledBefore = isOverviewEnabled();
@@ -723,7 +764,7 @@ public class NavigationBarView extends FrameLayout {
updateNavButtonIcons();
updateSlippery();
- updateDisabledSystemUiStateFlags(sysUiState);
+ updateDisabledSystemUiStateFlags();
}
public void updateNavButtonIcons() {
@@ -866,11 +907,10 @@ public class NavigationBarView extends FrameLayout {
updateSlippery();
}
- /** */
- public void updateDisabledSystemUiStateFlags(SysUiState sysUiState) {
+ public void updateDisabledSystemUiStateFlags() {
int displayId = mContext.getDisplayId();
- sysUiState.setFlag(SYSUI_STATE_SCREEN_PINNING,
+ mSysUiFlagContainer.setFlag(SYSUI_STATE_SCREEN_PINNING,
ActivityManagerWrapper.getInstance().isScreenPinningActive())
.setFlag(SYSUI_STATE_OVERVIEW_DISABLED,
(mDisabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0)
@@ -912,12 +952,12 @@ public class NavigationBarView extends FrameLayout {
* 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.
*/
- void updateSlippery() {
+ public void updateSlippery() {
setSlippery(!isQuickStepSwipeUpEnabled() ||
(mPanelView != null && mPanelView.isFullyExpanded() && !mPanelView.isCollapsing()));
}
- void setSlippery(boolean slippery) {
+ private void setSlippery(boolean slippery) {
setWindowFlag(WindowManager.LayoutParams.FLAG_SLIPPERY, slippery);
}
@@ -939,7 +979,8 @@ public class NavigationBarView extends FrameLayout {
wm.updateViewLayout(navbarView, lp);
}
- void setNavBarMode(int mode) {
+ @Override
+ public void onNavigationModeChanged(int mode) {
mNavBarMode = mode;
mImeDrawsImeNavBar = Dependency.get(NavigationModeController.class).getImeDrawsImeNavBar();
mBarTransitions.onNavigationModeChanged(mNavBarMode);
@@ -1282,6 +1323,7 @@ public class NavigationBarView extends FrameLayout {
mEdgeBackGestureHandler.onNavBarAttached();
requestApplyInsets();
reorient();
+ onNavigationModeChanged(mNavBarMode);
if (mRotationButtonController != null) {
mRotationButtonController.registerListeners();
}
@@ -1296,6 +1338,7 @@ public class NavigationBarView extends FrameLayout {
@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 53a27ff4e08b..a3dea1c68b14 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.CentralSurfaces;
import com.android.systemui.statusbar.phone.NotificationPanelViewController;
+import com.android.systemui.statusbar.phone.CentralSurfaces;
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(mSysUiState);
+ navBarView.updateDisabledSystemUiStateFlags();
}
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 a0aa267e850e..eb1e1a2e3d04 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);
- return spy(new NavigationBar(context,
- mWindowManager,
+ NavigationBar.Factory factory = new NavigationBar.Factory(
() -> mAssistManager,
mock(AccessibilityManager.class),
deviceProvisionedController,
new MetricsLogger(),
mOverviewProxyService,
mNavigationModeController,
+ mock(AccessibilityButtonModeObserver.class),
mStatusBarStateController,
mMockSysUiState,
mBroadcastDispatcher,
@@ -415,7 +415,8 @@ public class NavigationBarTest extends SysuiTestCase {
mAutoHideControllerFactory,
Optional.of(mTelecomManager),
mInputMethodManager,
- Optional.of(mock(BackAnimation.class))));
+ Optional.of(mock(BackAnimation.class)));
+ return spy(factory.create(context));
}
private void processAllMessages() {