Merge "Move touch handling out of NavigationBarView." into tm-dev

This commit is contained in:
Dave Mankoff
2022-03-14 19:34:14 +00:00
committed by Android (Google) Code Review
4 changed files with 164 additions and 234 deletions

View File

@@ -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_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SWITCHER_SHOWING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SWITCHER_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN;
import static com.android.systemui.shared.system.QuickStepContract.isGesturalMode;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT; 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_LIGHTS_OUT_TRANSPARENT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE; 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.IActivityTaskManager;
import android.app.StatusBarManager; import android.app.StatusBarManager;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; 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.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.util.LatencyTracker; import com.android.internal.util.LatencyTracker;
import com.android.internal.view.AppearanceRegion; import com.android.internal.view.AppearanceRegion;
import com.android.systemui.Gefingerpoken;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
import com.android.systemui.assist.AssistManager; import com.android.systemui.assist.AssistManager;
import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.model.SysUiState; 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.ButtonDispatcher;
import com.android.systemui.navigationbar.buttons.DeadZone;
import com.android.systemui.navigationbar.buttons.KeyButtonView; import com.android.systemui.navigationbar.buttons.KeyButtonView;
import com.android.systemui.navigationbar.buttons.RotationContextButton; import com.android.systemui.navigationbar.buttons.RotationContextButton;
import com.android.systemui.navigationbar.gestural.QuickswitchOrientedNavHandle; 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.rotation.RotationButtonController;
import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.SysUiStatsLog;
import com.android.systemui.statusbar.AutoHideUiElement; import com.android.systemui.statusbar.AutoHideUiElement;
import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CommandQueue.Callbacks; import com.android.systemui.statusbar.CommandQueue.Callbacks;
@@ -146,15 +149,15 @@ import java.util.Locale;
import java.util.Optional; import java.util.Optional;
import java.util.function.Consumer; import java.util.function.Consumer;
import javax.inject.Inject;
import dagger.Lazy; import dagger.Lazy;
import dagger.assisted.Assisted;
import dagger.assisted.AssistedFactory;
import dagger.assisted.AssistedInject;
/** /**
* Contains logic for a navigation bar view. * Contains logic for a navigation bar view.
*/ */
public class NavigationBar implements View.OnAttachStateChangeListener, public class NavigationBar implements View.OnAttachStateChangeListener, Callbacks {
Callbacks, NavigationModeController.ModeChangedListener {
public static final String TAG = "NavigationBar"; public static final String TAG = "NavigationBar";
private static final boolean DEBUG = false; private static final boolean DEBUG = false;
@@ -181,7 +184,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
private final NotificationRemoteInputManager mNotificationRemoteInputManager; private final NotificationRemoteInputManager mNotificationRemoteInputManager;
private final OverviewProxyService mOverviewProxyService; private final OverviewProxyService mOverviewProxyService;
private final NavigationModeController mNavigationModeController; private final NavigationModeController mNavigationModeController;
private final AccessibilityButtonModeObserver mAccessibilityButtonModeObserver;
private final BroadcastDispatcher mBroadcastDispatcher; private final BroadcastDispatcher mBroadcastDispatcher;
private final CommandQueue mCommandQueue; private final CommandQueue mCommandQueue;
private final Optional<Pip> mPipOptional; private final Optional<Pip> mPipOptional;
@@ -200,8 +202,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
private @WindowVisibleState int mNavigationBarWindowState = WINDOW_STATE_SHOWING; private @WindowVisibleState int mNavigationBarWindowState = WINDOW_STATE_SHOWING;
private int mNavigationIconHints = 0; private int mNavigationIconHints = 0;
private @TransitionMode int mNavigationBarMode; private @TransitionMode int mTransitionMode;
private ContentResolver mContentResolver;
private boolean mLongPressHomeEnabled; private boolean mLongPressHomeEnabled;
private int mDisabledFlags1; private int mDisabledFlags1;
@@ -255,7 +256,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
private int mCurrentRotation; private int mCurrentRotation;
private ViewTreeObserver.OnGlobalLayoutListener mOrientationHandleGlobalLayoutListener; private ViewTreeObserver.OnGlobalLayoutListener mOrientationHandleGlobalLayoutListener;
private boolean mShowOrientedHandleForImmersiveMode; private boolean mShowOrientedHandleForImmersiveMode;
private DeadZone mDeadZone;
private boolean mImeVisible;
@com.android.internal.annotations.VisibleForTesting @com.android.internal.annotations.VisibleForTesting
public enum NavBarActionEvent implements UiEventLogger.UiEventEnum { 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, WindowManager windowManager,
Lazy<AssistManager> assistManagerLazy, Lazy<AssistManager> assistManagerLazy,
AccessibilityManager accessibilityManager, AccessibilityManager accessibilityManager,
@@ -479,7 +483,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
MetricsLogger metricsLogger, MetricsLogger metricsLogger,
OverviewProxyService overviewProxyService, OverviewProxyService overviewProxyService,
NavigationModeController navigationModeController, NavigationModeController navigationModeController,
AccessibilityButtonModeObserver accessibilityButtonModeObserver,
StatusBarStateController statusBarStateController, StatusBarStateController statusBarStateController,
SysUiState sysUiFlagsContainer, SysUiState sysUiFlagsContainer,
BroadcastDispatcher broadcastDispatcher, BroadcastDispatcher broadcastDispatcher,
@@ -514,7 +517,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mNotificationRemoteInputManager = notificationRemoteInputManager; mNotificationRemoteInputManager = notificationRemoteInputManager;
mOverviewProxyService = overviewProxyService; mOverviewProxyService = overviewProxyService;
mNavigationModeController = navigationModeController; mNavigationModeController = navigationModeController;
mAccessibilityButtonModeObserver = accessibilityButtonModeObserver;
mBroadcastDispatcher = broadcastDispatcher; mBroadcastDispatcher = broadcastDispatcher;
mCommandQueue = commandQueue; mCommandQueue = commandQueue;
mPipOptional = pipOptional; mPipOptional = pipOptional;
@@ -532,7 +534,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mTelecomManagerOptional = telecomManagerOptional; mTelecomManagerOptional = telecomManagerOptional;
mInputMethodManager = inputMethodManager; mInputMethodManager = inputMethodManager;
mNavBarMode = mNavigationModeController.addListener(this); mNavBarMode = mNavigationModeController.addListener(mModeChangedListener);
} }
public NavigationBarView getView() { public NavigationBarView getView() {
@@ -546,6 +548,11 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
R.layout.navigation_bar, mFrame); R.layout.navigation_bar, mFrame);
barView.addOnAttachStateChangeListener(this); barView.addOnAttachStateChangeListener(this);
mNavigationBarView = barView.findViewById(R.id.navigation_bar_view); 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); mNavigationBarView.setVisibility(initialVisibility ? View.VISIBLE : View.INVISIBLE);
@@ -558,7 +565,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mCommandQueue.addCallback(this); mCommandQueue.addCallback(this);
mLongPressHomeEnabled = mNavBarHelper.getLongPressHomeEnabled(); mLongPressHomeEnabled = mNavBarHelper.getLongPressHomeEnabled();
mContentResolver = mContext.getContentResolver();
mNavBarHelper.init(); mNavBarHelper.init();
mAllowForceNavBarHandleOpaque = mContext.getResources().getBoolean( mAllowForceNavBarHandleOpaque = mContext.getResources().getBoolean(
R.bool.allow_force_nav_bar_handle_opaque); R.bool.allow_force_nav_bar_handle_opaque);
@@ -597,7 +603,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
setAutoHideController(/* autoHideController */ null); setAutoHideController(/* autoHideController */ null);
mCommandQueue.removeCallback(this); mCommandQueue.removeCallback(this);
mWindowManager.removeViewImmediate(mNavigationBarView.getRootView()); mWindowManager.removeViewImmediate(mNavigationBarView.getRootView());
mNavigationModeController.removeListener(this); mNavigationModeController.removeListener(mModeChangedListener);
mNavBarHelper.removeNavTaskStateUpdater(mNavbarTaskbarStateUpdater); mNavBarHelper.removeNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
mNavBarHelper.destroy(); mNavBarHelper.destroy();
@@ -612,15 +618,16 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
final Display display = v.getDisplay(); final Display display = v.getDisplay();
mNavigationBarView.setComponents(mRecentsOptional); mNavigationBarView.setComponents(mRecentsOptional);
mNavigationBarView.setComponents(mCentralSurfacesOptionalLazy.get().get().getPanelController()); mNavigationBarView.setComponents(mCentralSurfacesOptionalLazy.get().get().getPanelController());
mNavigationBarView.setDisabledFlags(mDisabledFlags1); mNavigationBarView.setDisabledFlags(mDisabledFlags1, mSysUiFlagsContainer);
mNavigationBarView.setOnVerticalChangedListener(this::onVerticalChanged); mNavigationBarView.setOnVerticalChangedListener(this::onVerticalChanged);
mNavigationBarView.setOnTouchListener(this::onNavigationTouch); mNavigationBarView.setOnTouchListener(this::onNavigationTouch);
if (mSavedState != null) { if (mSavedState != null) {
mNavigationBarView.getLightTransitionsController().restoreState(mSavedState); mNavigationBarView.getLightTransitionsController().restoreState(mSavedState);
} }
mNavigationBarView.setNavigationIconHints(mNavigationIconHints); setNavigationIconHints(mNavigationIconHints);
mNavigationBarView.setWindowVisible(isNavBarWindowVisible()); mNavigationBarView.setWindowVisible(isNavBarWindowVisible());
mNavigationBarView.setBehavior(mBehavior); mNavigationBarView.setBehavior(mBehavior);
mNavigationBarView.setNavBarMode(mNavBarMode);
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater); mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
@@ -865,8 +872,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
pw.println(" mLongPressHomeEnabled=" + mLongPressHomeEnabled); pw.println(" mLongPressHomeEnabled=" + mLongPressHomeEnabled);
pw.println(" mNavigationBarWindowState=" pw.println(" mNavigationBarWindowState="
+ windowStateToString(mNavigationBarWindowState)); + windowStateToString(mNavigationBarWindowState));
pw.println(" mNavigationBarMode=" pw.println(" mTransitionMode="
+ BarTransitions.modeToString(mNavigationBarMode)); + BarTransitions.modeToString(mTransitionMode));
pw.println(" mTransientShown=" + mTransientShown); pw.println(" mTransientShown=" + mTransientShown);
pw.println(" mTransientShownFromGestureOnSystemBar=" pw.println(" mTransientShownFromGestureOnSystemBar="
+ mTransientShownFromGestureOnSystemBar); + mTransientShownFromGestureOnSystemBar);
@@ -888,11 +895,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
imeShown, showImeSwitcher); imeShown, showImeSwitcher);
if (hints == mNavigationIconHints) return; if (hints == mNavigationIconHints) return;
mNavigationIconHints = hints; setNavigationIconHints(hints);
if (!isTablet(mContext)) {
// All IME functions handled by launcher via Sysui flags for large screen
mNavigationBarView.setNavigationIconHints(hints);
}
checkBarModes(); checkBarModes();
updateSystemUiStateFlags(); updateSystemUiStateFlags();
} }
@@ -952,15 +955,15 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
/** Restores the appearance and the transient saved state to {@link NavigationBar}. */ /** Restores the appearance and the transient saved state to {@link NavigationBar}. */
public void restoreAppearanceAndTransientState() { public void restoreAppearanceAndTransientState() {
final int barMode = barMode(mTransientShown, mAppearance); final int transitionMode = transitionMode(mTransientShown, mAppearance);
mNavigationBarMode = barMode; mTransitionMode = transitionMode;
checkNavBarModes(); checkNavBarModes();
if (mAutoHideController != null) { if (mAutoHideController != null) {
mAutoHideController.touchAutoHide(); mAutoHideController.touchAutoHide();
} }
if (mLightBarController != null) { if (mLightBarController != null) {
mLightBarController.onNavigationBarAppearanceChanged(mAppearance, 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; boolean nbModeChanged = false;
if (mAppearance != appearance) { if (mAppearance != appearance) {
mAppearance = appearance; mAppearance = appearance;
nbModeChanged = updateBarMode(barMode(mTransientShown, appearance)); nbModeChanged = updateTransitionMode(transitionMode(mTransientShown, appearance));
} }
if (mLightBarController != null) { if (mLightBarController != null) {
mLightBarController.onNavigationBarAppearanceChanged(appearance, nbModeChanged, mLightBarController.onNavigationBarAppearanceChanged(appearance, nbModeChanged,
mNavigationBarMode, navbarColorManagedByIme); mTransitionMode, navbarColorManagedByIme);
} }
if (mBehavior != behavior) { if (mBehavior != behavior) {
mBehavior = behavior; mBehavior = behavior;
@@ -1025,16 +1028,16 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
private void handleTransientChanged() { private void handleTransientChanged() {
mNavigationBarView.onTransientStateChanged(mTransientShown, mNavigationBarView.onTransientStateChanged(mTransientShown,
mTransientShownFromGestureOnSystemBar); mTransientShownFromGestureOnSystemBar);
final int barMode = barMode(mTransientShown, mAppearance); final int transitionMode = transitionMode(mTransientShown, mAppearance);
if (updateBarMode(barMode) && mLightBarController != null) { if (updateTransitionMode(transitionMode) && mLightBarController != null) {
mLightBarController.onNavigationBarModeChanged(barMode); mLightBarController.onNavigationBarModeChanged(transitionMode);
} }
} }
// Returns true if the bar mode is changed. // Returns true if the bar mode is changed.
private boolean updateBarMode(int barMode) { private boolean updateTransitionMode(int barMode) {
if (mNavigationBarMode != barMode) { if (mTransitionMode != barMode) {
mNavigationBarMode = barMode; mTransitionMode = barMode;
checkNavBarModes(); checkNavBarModes();
if (mAutoHideController != null) { if (mAutoHideController != null) {
mAutoHideController.touchAutoHide(); mAutoHideController.touchAutoHide();
@@ -1044,7 +1047,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
return false; 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; final int lightsOutOpaque = APPEARANCE_LOW_PROFILE_BARS | APPEARANCE_OPAQUE_NAVIGATION_BARS;
if (isTransient) { if (isTransient) {
return MODE_SEMI_TRANSPARENT; return MODE_SEMI_TRANSPARENT;
@@ -1073,7 +1076,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
| StatusBarManager.DISABLE_SEARCH); | StatusBarManager.DISABLE_SEARCH);
if (masked != mDisabledFlags1) { if (masked != mDisabledFlags1) {
mDisabledFlags1 = masked; mDisabledFlags1 = masked;
mNavigationBarView.setDisabledFlags(state1); mNavigationBarView.setDisabledFlags(state1, mSysUiFlagsContainer);
updateScreenPinningGestures(); updateScreenPinningGestures();
} }
@@ -1455,24 +1458,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mCentralSurfacesOptionalLazy.get().map(CentralSurfaces::isDeviceInteractive) mCentralSurfacesOptionalLazy.get().map(CentralSurfaces::isDeviceInteractive)
.orElse(false) .orElse(false)
&& mNavigationBarWindowState != WINDOW_STATE_HIDDEN; && mNavigationBarWindowState != WINDOW_STATE_HIDDEN;
mNavigationBarView.getBarTransitions().transitionTo(mNavigationBarMode, anim); mNavigationBarView.getBarTransitions().transitionTo(mTransitionMode, 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) { public void disableAnimationsDuringHide(long delay) {
@@ -1613,114 +1599,102 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
return mNavigationIconHints; 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}. * Injectable factory for construction a {@link NavigationBar}.
*/ */
public static class Factory { @AssistedFactory
private final Lazy<AssistManager> mAssistManagerLazy; public interface Factory {
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} */ /** Construct a {@link NavigationBar} */
public NavigationBar create(Context context) { 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);
}
} }
} }

View File

@@ -65,6 +65,7 @@ import android.widget.FrameLayout;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.settingslib.Utils; import com.android.settingslib.Utils;
import com.android.systemui.Dependency; import com.android.systemui.Dependency;
import com.android.systemui.Gefingerpoken;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.animation.Interpolators; import com.android.systemui.animation.Interpolators;
import com.android.systemui.model.SysUiState; 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.rotation.RotationButtonController;
import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.SysUiStatsLog;
import com.android.systemui.shared.system.WindowManagerWrapper; import com.android.systemui.shared.system.WindowManagerWrapper;
import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.AutoHideController; import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.LightBarTransitionsController; import com.android.systemui.statusbar.phone.LightBarTransitionsController;
import com.android.systemui.statusbar.phone.NotificationPanelViewController; 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.back.BackAnimation;
import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.Pip;
@@ -101,15 +101,14 @@ import java.util.Optional;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.function.Consumer; 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 boolean DEBUG = false;
final static String TAG = "NavBarView"; final static String TAG = "NavBarView";
final static boolean ALTERNATE_CAR_MODE_UI = false; final static boolean ALTERNATE_CAR_MODE_UI = false;
private final RegionSamplingHelper mRegionSamplingHelper; private final RegionSamplingHelper mRegionSamplingHelper;
private final int mNavColorSampleMargin; private final int mNavColorSampleMargin;
private final SysUiState mSysUiFlagContainer;
// The current view is one of mHorizontal or mVertical depending on the current configuration // The current view is one of mHorizontal or mVertical depending on the current configuration
View mCurrentView = null; View mCurrentView = null;
@@ -197,6 +196,7 @@ public class NavigationBarView extends FrameLayout implements
* <p>Cache the value here for better performance.</p> * <p>Cache the value here for better performance.</p>
*/ */
private final boolean mImeCanRenderGesturalNavButtons = canImeRenderGesturalNavButtons(); private final boolean mImeCanRenderGesturalNavButtons = canImeRenderGesturalNavButtons();
private Gefingerpoken mTouchHandler;
private class NavTransitionListener implements TransitionListener { private class NavTransitionListener implements TransitionListener {
private boolean mBackTransitioning; private boolean mBackTransitioning;
@@ -333,10 +333,8 @@ public class NavigationBarView extends FrameLayout implements
mDarkIconColor = Utils.getColorAttrDefaultColor(darkContext, R.attr.singleToneColor); mDarkIconColor = Utils.getColorAttrDefaultColor(darkContext, R.attr.singleToneColor);
mIsVertical = false; mIsVertical = false;
mLongClickableAccessibilityButton = false; mLongClickableAccessibilityButton = false;
mNavBarMode = Dependency.get(NavigationModeController.class).addListener(this);
mImeDrawsImeNavBar = Dependency.get(NavigationModeController.class).getImeDrawsImeNavBar(); mImeDrawsImeNavBar = Dependency.get(NavigationModeController.class).getImeDrawsImeNavBar();
mSysUiFlagContainer = Dependency.get(SysUiState.class);
// Set up the context group of buttons // Set up the context group of buttons
mContextualButtonGroup = new ContextualButtonGroup(R.id.menu_container); mContextualButtonGroup = new ContextualButtonGroup(R.id.menu_container);
final ContextualButton imeSwitcherButton = new ContextualButton(R.id.ime_switcher, 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, R.drawable.ic_sysbar_rotate_button_cw_start_90,
() -> getDisplay().getRotation()); () -> getDisplay().getRotation());
updateRotationButton();
mOverviewProxyService = Dependency.get(OverviewProxyService.class); mOverviewProxyService = Dependency.get(OverviewProxyService.class);
mConfiguration = new Configuration(); mConfiguration = new Configuration();
@@ -448,19 +444,18 @@ public class NavigationBarView extends FrameLayout implements
notifyVerticalChangedListener(mIsVertical); notifyVerticalChangedListener(mIsVertical);
} }
public void setTouchHandler(Gefingerpoken touchHandler) {
mTouchHandler = touchHandler;
}
@Override @Override
public boolean onInterceptTouchEvent(MotionEvent event) { public boolean onInterceptTouchEvent(MotionEvent event) {
if (isGesturalMode(mNavBarMode) && mImeVisible return mTouchHandler.onInterceptTouchEvent(event) || super.onInterceptTouchEvent(event);
&& event.getAction() == MotionEvent.ACTION_DOWN) {
SysUiStatsLog.write(SysUiStatsLog.IME_TOUCH_REPORTED,
(int) event.getX(), (int) event.getY());
}
return shouldDeadZoneConsumeTouchEvents(event) || super.onInterceptTouchEvent(event);
} }
@Override @Override
public boolean onTouchEvent(MotionEvent event) { public boolean onTouchEvent(MotionEvent event) {
shouldDeadZoneConsumeTouchEvents(event); mTouchHandler.onTouchEvent(event);
return super.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() { public void abortCurrentGesture() {
getHomeButton().abortCurrentGesture(); getHomeButton().abortCurrentGesture();
} }
@@ -589,7 +560,7 @@ public class NavigationBarView extends FrameLayout implements
return (mDisabledFlags & View.STATUS_BAR_DISABLE_RECENT) == 0; return (mDisabledFlags & View.STATUS_BAR_DISABLE_RECENT) == 0;
} }
public boolean isQuickStepSwipeUpEnabled() { private boolean isQuickStepSwipeUpEnabled() {
return mOverviewProxyService.shouldShowSwipeUpUI() && isOverviewEnabled(); return mOverviewProxyService.shouldShowSwipeUpUI() && isOverviewEnabled();
} }
@@ -618,7 +589,7 @@ public class NavigationBarView extends FrameLayout implements
/** /**
* Updates the rotation button based on the current navigation mode. * Updates the rotation button based on the current navigation mode.
*/ */
private void updateRotationButton() { void updateRotationButton() {
if (isGesturalMode(mNavBarMode)) { if (isGesturalMode(mNavBarMode)) {
mContextualButtonGroup.removeButton(R.id.rotate_suggestion); mContextualButtonGroup.removeButton(R.id.rotate_suggestion);
mButtonDispatchers.remove(R.id.rotate_suggestion); mButtonDispatchers.remove(R.id.rotate_suggestion);
@@ -722,25 +693,13 @@ public class NavigationBarView extends FrameLayout implements
super.setLayoutDirection(layoutDirection); super.setLayoutDirection(layoutDirection);
} }
public void setNavigationIconHints(int hints) { void setNavigationIconHints(int hints) {
if (hints == mNavigationIconHints) return; 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; mNavigationIconHints = hints;
updateNavButtonIcons(); updateNavButtonIcons();
} }
private void onImeVisibilityChanged(boolean visible) { void onImeVisibilityChanged(boolean visible) {
if (!visible) { if (!visible) {
mTransitionListener.onBackAltCleared(); 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; if (mDisabledFlags == disabledFlags) return;
final boolean overviewEnabledBefore = isOverviewEnabled(); final boolean overviewEnabledBefore = isOverviewEnabled();
@@ -764,7 +723,7 @@ public class NavigationBarView extends FrameLayout implements
updateNavButtonIcons(); updateNavButtonIcons();
updateSlippery(); updateSlippery();
updateDisabledSystemUiStateFlags(); updateDisabledSystemUiStateFlags(sysUiState);
} }
public void updateNavButtonIcons() { public void updateNavButtonIcons() {
@@ -907,10 +866,11 @@ public class NavigationBarView extends FrameLayout implements
updateSlippery(); updateSlippery();
} }
public void updateDisabledSystemUiStateFlags() { /** */
public void updateDisabledSystemUiStateFlags(SysUiState sysUiState) {
int displayId = mContext.getDisplayId(); int displayId = mContext.getDisplayId();
mSysUiFlagContainer.setFlag(SYSUI_STATE_SCREEN_PINNING, sysUiState.setFlag(SYSUI_STATE_SCREEN_PINNING,
ActivityManagerWrapper.getInstance().isScreenPinningActive()) ActivityManagerWrapper.getInstance().isScreenPinningActive())
.setFlag(SYSUI_STATE_OVERVIEW_DISABLED, .setFlag(SYSUI_STATE_OVERVIEW_DISABLED,
(mDisabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0) (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 * 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. * app/home window, if not nav bar will receive a cancelled touch event once gesture leaves bar.
*/ */
public void updateSlippery() { void updateSlippery() {
setSlippery(!isQuickStepSwipeUpEnabled() || setSlippery(!isQuickStepSwipeUpEnabled() ||
(mPanelView != null && mPanelView.isFullyExpanded() && !mPanelView.isCollapsing())); (mPanelView != null && mPanelView.isFullyExpanded() && !mPanelView.isCollapsing()));
} }
private void setSlippery(boolean slippery) { void setSlippery(boolean slippery) {
setWindowFlag(WindowManager.LayoutParams.FLAG_SLIPPERY, slippery); setWindowFlag(WindowManager.LayoutParams.FLAG_SLIPPERY, slippery);
} }
@@ -979,8 +939,7 @@ public class NavigationBarView extends FrameLayout implements
wm.updateViewLayout(navbarView, lp); wm.updateViewLayout(navbarView, lp);
} }
@Override void setNavBarMode(int mode) {
public void onNavigationModeChanged(int mode) {
mNavBarMode = mode; mNavBarMode = mode;
mImeDrawsImeNavBar = Dependency.get(NavigationModeController.class).getImeDrawsImeNavBar(); mImeDrawsImeNavBar = Dependency.get(NavigationModeController.class).getImeDrawsImeNavBar();
mBarTransitions.onNavigationModeChanged(mNavBarMode); mBarTransitions.onNavigationModeChanged(mNavBarMode);
@@ -1323,7 +1282,6 @@ public class NavigationBarView extends FrameLayout implements
mEdgeBackGestureHandler.onNavBarAttached(); mEdgeBackGestureHandler.onNavBarAttached();
requestApplyInsets(); requestApplyInsets();
reorient(); reorient();
onNavigationModeChanged(mNavBarMode);
if (mRotationButtonController != null) { if (mRotationButtonController != null) {
mRotationButtonController.registerListeners(); mRotationButtonController.registerListeners();
} }
@@ -1338,7 +1296,6 @@ public class NavigationBarView extends FrameLayout implements
@Override @Override
protected void onDetachedFromWindow() { protected void onDetachedFromWindow() {
super.onDetachedFromWindow(); super.onDetachedFromWindow();
Dependency.get(NavigationModeController.class).removeListener(this);
for (int i = 0; i < mButtonDispatchers.size(); ++i) { for (int i = 0; i < mButtonDispatchers.size(); ++i) {
mButtonDispatchers.valueAt(i).onDestroy(); mButtonDispatchers.valueAt(i).onDestroy();
} }

View File

@@ -101,8 +101,8 @@ import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NotificationShadeWindowController; 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.CentralSurfaces;
import com.android.systemui.statusbar.phone.NotificationPanelViewController;
import com.android.systemui.statusbar.phone.StatusBarWindowCallback; import com.android.systemui.statusbar.phone.StatusBarWindowCallback;
import com.android.systemui.statusbar.policy.CallbackController; import com.android.systemui.statusbar.policy.CallbackController;
import com.android.wm.shell.back.BackAnimation; import com.android.wm.shell.back.BackAnimation;
@@ -675,7 +675,7 @@ public class OverviewProxyService extends CurrentUserTracker implements
navBarFragment.updateSystemUiStateFlags(); navBarFragment.updateSystemUiStateFlags();
} }
if (navBarView != null) { if (navBarView != null) {
navBarView.updateDisabledSystemUiStateFlags(); navBarView.updateDisabledSystemUiStateFlags(mSysUiState);
} }
if (panelController != null) { if (panelController != null) {
panelController.updateSystemUiStateFlags(); panelController.updateSystemUiStateFlags();

View File

@@ -91,10 +91,10 @@ import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeDepthController;
import com.android.systemui.statusbar.phone.AutoHideController; import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.phone.LightBarController;
import com.android.systemui.statusbar.phone.NotificationShadeWindowView; import com.android.systemui.statusbar.phone.NotificationShadeWindowView;
import com.android.systemui.statusbar.phone.ShadeController; 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.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.utils.leaks.LeakCheckedTest; import com.android.systemui.utils.leaks.LeakCheckedTest;
@@ -387,14 +387,14 @@ public class NavigationBarTest extends SysuiTestCase {
DeviceProvisionedController deviceProvisionedController = DeviceProvisionedController deviceProvisionedController =
mock(DeviceProvisionedController.class); mock(DeviceProvisionedController.class);
when(deviceProvisionedController.isDeviceProvisioned()).thenReturn(true); when(deviceProvisionedController.isDeviceProvisioned()).thenReturn(true);
NavigationBar.Factory factory = new NavigationBar.Factory( return spy(new NavigationBar(context,
mWindowManager,
() -> mAssistManager, () -> mAssistManager,
mock(AccessibilityManager.class), mock(AccessibilityManager.class),
deviceProvisionedController, deviceProvisionedController,
new MetricsLogger(), new MetricsLogger(),
mOverviewProxyService, mOverviewProxyService,
mNavigationModeController, mNavigationModeController,
mock(AccessibilityButtonModeObserver.class),
mStatusBarStateController, mStatusBarStateController,
mMockSysUiState, mMockSysUiState,
mBroadcastDispatcher, mBroadcastDispatcher,
@@ -415,8 +415,7 @@ public class NavigationBarTest extends SysuiTestCase {
mAutoHideControllerFactory, mAutoHideControllerFactory,
Optional.of(mTelecomManager), Optional.of(mTelecomManager),
mInputMethodManager, mInputMethodManager,
Optional.of(mock(BackAnimation.class))); Optional.of(mock(BackAnimation.class))));
return spy(factory.create(context));
} }
private void processAllMessages() { private void processAllMessages() {