From 1aa24b9b5e9ea80016de60c40afe0ebb61c2ce84 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Wed, 24 Apr 2019 15:17:33 -0700 Subject: [PATCH] Ensure we get the right nav bar mode for the current user in sysui - Load resources from the current user's context to ensure the right overlays are read - Create a controller in sysui to dispatch mode change to prevent callers from calling with the wrong user's context - Clean up the quickstep contract to prevent launcher from calling methods using the baked in fw resource ids Bug: 130185871 Test: Switch to secondary user, ensure the mode is read correctly Change-Id: I00d9276185777e340b3e758345a00d2e9b3e3e64 --- .../shared/system/QuickStepContract.java | 46 ------ .../src/com/android/systemui/Dependency.java | 4 + .../recents/OverviewProxyService.java | 28 ++-- .../systemui/recents/RecentsOnboarding.java | 8 +- .../phone/EdgeBackGestureHandler.java | 13 +- .../statusbar/phone/NavBarTintController.java | 12 +- .../phone/NavigationBarFragment.java | 20 ++- .../phone/NavigationBarInflaterView.java | 15 +- .../phone/NavigationBarTransitions.java | 9 +- .../statusbar/phone/NavigationBarView.java | 50 +++--- .../phone/NavigationModeController.java | 146 ++++++++++++++++++ .../phone/NavigationPrototypeController.java | 7 +- .../phone/StatusBarKeyguardViewManager.java | 9 +- .../phone/NavigationBarFragmentTest.java | 3 +- 14 files changed, 256 insertions(+), 114 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java index 405478415bbe7..56aabc2a6064d 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java @@ -21,7 +21,6 @@ import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import android.annotation.IntDef; -import android.content.Context; import android.content.res.Resources; import android.view.WindowManagerPolicyConstants; @@ -89,13 +88,6 @@ public class QuickStepContract { return mode == NAV_BAR_MODE_GESTURAL; } - /** - * @return whether the current nav bar mode is gestural - */ - public static boolean isGesturalMode(Context context) { - return isGesturalMode(getCurrentInteractionMode(context)); - } - /** * @return whether this nav bar mode is swipe up */ @@ -103,13 +95,6 @@ public class QuickStepContract { return mode == NAV_BAR_MODE_2BUTTON; } - /** - * @return whether the current nav bar mode is swipe up - */ - public static boolean isSwipeUpMode(Context context) { - return isSwipeUpMode(getCurrentInteractionMode(context)); - } - /** * @return whether this nav bar mode is 3 button */ @@ -117,37 +102,6 @@ public class QuickStepContract { return mode == NAV_BAR_MODE_3BUTTON; } - /** - * @return whether this nav bar mode is 3 button - */ - public static boolean isLegacyMode(Context context) { - return isLegacyMode(getCurrentInteractionMode(context)); - } - - /** - * @return the current nav bar interaction mode - */ - public static int getCurrentInteractionMode(Context context) { - return context.getResources().getInteger( - com.android.internal.R.integer.config_navBarInteractionMode); - } - - /** - * @return {@code true} if the navbar can be clicked through - */ - public static boolean isNavBarClickThrough(Context context) { - return context.getResources().getBoolean( - com.android.internal.R.bool.config_navBarTapThrough); - } - - /** - * @return the edge sensitivity width in px - */ - public static int getEdgeSensitivityWidth(Context context) { - return context.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.config_backGestureInset); - } - /** * Corner radius that should be used on windows in order to cover the display. * These values are expressed in pixels because they should not respect display or font diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index 4b338f79e9c66..1feb63d884fdb 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -74,6 +74,7 @@ import com.android.systemui.statusbar.phone.KeyguardDismissUtil; import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.phone.LockscreenGestureLogger; import com.android.systemui.statusbar.phone.ManagedProfileController; +import com.android.systemui.statusbar.phone.NavigationModeController; import com.android.systemui.statusbar.phone.NotificationGroupAlertTransferHelper; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.ShadeController; @@ -244,6 +245,7 @@ public class Dependency extends SystemUI { @Inject Lazy mLightBarController; @Inject Lazy mIWindowManager; @Inject Lazy mOverviewProxyService; + @Inject Lazy mNavBarModeController; @Inject Lazy mEnhancedEstimates; @Inject Lazy mVibratorHelper; @Inject Lazy mIStatusBarService; @@ -407,6 +409,8 @@ public class Dependency extends SystemUI { mProviders.put(OverviewProxyService.class, mOverviewProxyService::get); + mProviders.put(NavigationModeController.class, mNavBarModeController::get); + mProviders.put(EnhancedEstimates.class, mEnhancedEstimates::get); mProviders.put(VibratorHelper.class, mVibratorHelper::get); diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 898f64be9e55d..09a5e6fd5036b 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -20,6 +20,7 @@ import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; import static android.view.MotionEvent.ACTION_CANCEL; import static android.view.MotionEvent.ACTION_DOWN; import static android.view.MotionEvent.ACTION_UP; +import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_DISABLE_SWIPE_UP; import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_SHOW_OVERVIEW_BUTTON; @@ -69,6 +70,7 @@ import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags; import com.android.systemui.stackdivider.Divider; import com.android.systemui.statusbar.NavigationBarController; import com.android.systemui.statusbar.phone.NavigationBarFragment; +import com.android.systemui.statusbar.phone.NavigationModeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.CallbackController; import com.android.systemui.statusbar.policy.DeviceProvisionedController; @@ -86,7 +88,8 @@ import javax.inject.Singleton; * Class to send information from overview to launcher with a binder. */ @Singleton -public class OverviewProxyService implements CallbackController, Dumpable { +public class OverviewProxyService implements CallbackController, + NavigationModeController.ModeChangedListener, Dumpable { private static final String ACTION_QUICKSTEP = "android.intent.action.QUICKSTEP_SERVICE"; @@ -123,6 +126,7 @@ public class OverviewProxyService implements CallbackController mNavigationBarView.setLayoutTransitionsEnabled(true), @@ -1019,7 +1029,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback if (Intent.ACTION_SCREEN_ON.equals(action)) { // Enabled and screen is on, start it again if enabled - if (NavBarTintController.isEnabled(getContext())) { + if (NavBarTintController.isEnabled(getContext(), mNavBarMode)) { mNavigationBarView.getTintController().start(); } } else { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java index a522ed1ced74c..404c07b807e5b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java @@ -15,6 +15,7 @@ package com.android.systemui.statusbar.phone; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; +import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; import android.annotation.Nullable; import android.content.Context; @@ -49,7 +50,8 @@ import java.util.List; import java.util.Objects; public class NavigationBarInflaterView extends FrameLayout - implements Tunable, PluginListener { + implements Tunable, PluginListener, + NavigationModeController.ModeChangedListener { private static final String TAG = "NavBarInflater"; @@ -102,11 +104,13 @@ public class NavigationBarInflaterView extends FrameLayout private boolean mUsingCustomLayout; private OverviewProxyService mOverviewProxyService; + private int mNavBarMode = NAV_BAR_MODE_3BUTTON; public NavigationBarInflaterView(Context context, AttributeSet attrs) { super(context, attrs); createInflaters(); mOverviewProxyService = Dependency.get(OverviewProxyService.class); + mNavBarMode = Dependency.get(NavigationModeController.class).addListener(this); } @VisibleForTesting @@ -138,7 +142,7 @@ public class NavigationBarInflaterView extends FrameLayout } protected String getDefaultLayout() { - final int defaultResource = QuickStepContract.isGesturalMode(getContext()) + final int defaultResource = QuickStepContract.isGesturalMode(mNavBarMode) ? R.string.config_navBarLayoutHandle : mOverviewProxyService.shouldShowSwipeUpUI() ? R.string.config_navBarLayoutQuickstep @@ -146,6 +150,12 @@ public class NavigationBarInflaterView extends FrameLayout return getContext().getString(defaultResource); } + @Override + public void onNavigationModeChanged(int mode) { + mNavBarMode = mode; + onLikelyDefaultLayoutChange(); + } + @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); @@ -159,6 +169,7 @@ public class NavigationBarInflaterView extends FrameLayout protected void onDetachedFromWindow() { Dependency.get(TunerService.class).removeTunable(this); Dependency.get(PluginManager.class).removePluginListener(this); + Dependency.get(NavigationModeController.class).removeListener(this); super.onDetachedFromWindow(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java index 8ff6cc9b3d930..4e4a6aec57b5f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.phone; +import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; + import static com.android.systemui.statusbar.phone.NavBarTintController.DEFAULT_COLOR_ADAPT_TRANSITION_TIME; import static com.android.systemui.statusbar.phone.NavBarTintController.MIN_COLOR_ADAPT_TRANSITION_TIME; @@ -46,6 +48,7 @@ public final class NavigationBarTransitions extends BarTransitions implements private boolean mLightsOut; private boolean mAutoDim; private View mNavButtons; + private int mNavBarMode = NAV_BAR_MODE_3BUTTON; private final Handler mHandler = Handler.getMain(); private final IWallpaperVisibilityListener mWallpaperVisibilityListener = @@ -176,9 +179,13 @@ public final class NavigationBarTransitions extends BarTransitions implements @Override public int getTintAnimationDuration() { - if (NavBarTintController.isEnabled(mView.getContext())) { + if (NavBarTintController.isEnabled(mView.getContext(), mNavBarMode)) { return Math.max(DEFAULT_COLOR_ADAPT_TRANSITION_TIME, MIN_COLOR_ADAPT_TRANSITION_TIME); } return LightBarTransitionsController.DEFAULT_TINT_ANIMATION_DURATION; } + + public void onNavigationModeChanged(int mode) { + mNavBarMode = mode; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 411378f1bf078..6f1e161cf2373 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -16,8 +16,8 @@ package com.android.systemui.statusbar.phone; -import static android.content.Intent.ACTION_OVERLAY_CHANGED; import static android.view.WindowManagerPolicyConstants.NAV_BAR_INVALID; +import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_SHOW_OVERVIEW_BUTTON; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED; @@ -31,10 +31,7 @@ import android.animation.TimeInterpolator; import android.animation.ValueAnimator; import android.annotation.DrawableRes; import android.app.StatusBarManager; -import android.content.BroadcastReceiver; import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; import android.content.res.Configuration; import android.graphics.Canvas; import android.graphics.Point; @@ -84,7 +81,8 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.function.Consumer; -public class NavigationBarView extends FrameLayout implements PluginListener { +public class NavigationBarView extends FrameLayout implements PluginListener, + NavigationModeController.ModeChangedListener { final static boolean DEBUG = false; final static String TAG = "StatusBar/NavBarView"; @@ -104,6 +102,7 @@ public class NavigationBarView extends FrameLayout implements PluginListener