diff options
| author | 2022-03-15 02:31:24 +0000 | |
|---|---|---|
| committer | 2022-03-15 02:31:24 +0000 | |
| commit | d9ba94bf79d1a615e4bfae7f09e31bf9853f7a7e (patch) | |
| tree | 277f22cc9b71ebaed10d373012b9d7d63c247dca | |
| parent | 4a04b83e12f10ac642939662cb917b440f0f3909 (diff) | |
Revert "Move touch handling out of NavigationBarView."
This reverts commit 4a04b83e12f10ac642939662cb917b440f0f3909.
Reason for revert: breaking wm presubmit
Bug: 224629724
Change-Id: I351c6e9ef17a45fab4a1f957af29c835e8fc1e30
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() { |