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