From 6bc39ee20e08e60f0b6fe425374ca2775a610961 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Wed, 9 Feb 2022 11:21:15 -0500 Subject: [PATCH] Make LightBarTransitionsController injectable. Give it a factory that allows it be injected, removing its reliance on Dependency#get. More changes to follow this one, as NavigationBarTransitions is still not injectable, so more calls to Dependency#get had to be added to compensate. Bug: 218354102 Test: atest SystemUITests Change-Id: I891467cf0e49f78577533eb8c74fe26816f8d854 --- .../NavigationBarTransitions.java | 8 ++++- .../navigationbar/TaskbarDelegate.java | 36 ++++++++++--------- .../phone/DarkIconDispatcherImpl.java | 5 ++- .../phone/LightBarTransitionsController.java | 36 +++++++++++++++---- .../LightBarTransitionsControllerTest.java | 9 +++-- 5 files changed, 65 insertions(+), 29 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarTransitions.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarTransitions.java index b4f8c10f3fa61..58e07db09c62a 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarTransitions.java @@ -32,9 +32,11 @@ import android.view.View; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.navigationbar.buttons.ButtonDispatcher; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.phone.BarTransitions; import com.android.systemui.statusbar.phone.LightBarTransitionsController; +import com.android.systemui.statusbar.policy.KeyguardStateController; import java.io.PrintWriter; import java.util.ArrayList; @@ -83,7 +85,11 @@ public final class NavigationBarTransitions extends BarTransitions implements super(view, R.drawable.nav_background); mView = view; mLightTransitionsController = new LightBarTransitionsController( - view.getContext(), this, commandQueue); + view.getContext(), + this, + commandQueue, + Dependency.get(KeyguardStateController.class), + Dependency.get(StatusBarStateController.class)); mAllowAutoDimWallpaperNotVisible = view.getContext().getResources() .getBoolean(R.bool.config_navigation_bar_enable_auto_dim_no_visible_wallpaper); mDarkIntensityListeners = new ArrayList(); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java index be147b9fd5858..67de45538f3fb 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java @@ -55,8 +55,8 @@ import android.view.WindowInsetsController.Behavior; import androidx.annotation.NonNull; import com.android.internal.view.AppearanceRegion; -import com.android.systemui.Dependency; import com.android.systemui.Dumpable; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dump.DumpManager; import com.android.systemui.model.SysUiState; import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler; @@ -79,9 +79,9 @@ import java.util.Optional; import java.util.function.Consumer; import javax.inject.Inject; -import javax.inject.Singleton; -@Singleton +/** */ +@SysUISingleton public class TaskbarDelegate implements CommandQueue.Callbacks, OverviewProxyService.OverviewProxyListener, NavigationModeController.ModeChangedListener, ComponentCallbacks, Dumpable { @@ -89,6 +89,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, private final EdgeBackGestureHandler mEdgeBackGestureHandler; private final NavigationBarOverlayController mNavBarOverlayController; + private final LightBarTransitionsController.Factory mLightBarTransitionsControllerFactory; private boolean mInitialized; private CommandQueue mCommandQueue; private OverviewProxyService mOverviewProxyService; @@ -155,10 +156,15 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, private BackAnimation mBackAnimation; @Inject - public TaskbarDelegate(Context context) { - mEdgeBackGestureHandler = Dependency.get(EdgeBackGestureHandler.Factory.class) - .create(context); - mNavBarOverlayController = Dependency.get(NavigationBarOverlayController.class); + public TaskbarDelegate( + Context context, + EdgeBackGestureHandler.Factory edgeBackGestureHandlerFactory, + NavigationBarOverlayController navigationBarOverlayController, + LightBarTransitionsController.Factory lightBarTransitionsControllerFactory + ) { + mLightBarTransitionsControllerFactory = lightBarTransitionsControllerFactory; + mEdgeBackGestureHandler = edgeBackGestureHandlerFactory.create(context); + mNavBarOverlayController = navigationBarOverlayController; if (mNavBarOverlayController.isNavigationBarOverlayEnabled()) { mNavBarOverlayController.init(mNavbarOverlayVisibilityChangeCallback, mEdgeBackGestureHandler::updateNavigationBarOverlayExcludeRegion); @@ -186,14 +192,15 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, dumpManager.registerDumpable(this); mAutoHideController = autoHideController; mLightBarController = lightBarController; - mLightBarTransitionsController = createLightBarTransitionsController(); mPipOptional = pipOptional; mBackAnimation = backAnimation; + mLightBarTransitionsController = createLightBarTransitionsController(); } // Separated into a method to keep setDependencies() clean/readable. private LightBarTransitionsController createLightBarTransitionsController() { - return new LightBarTransitionsController(mContext, + + LightBarTransitionsController controller = mLightBarTransitionsControllerFactory.create( new LightBarTransitionsController.DarkIntensityApplier() { @Override public void applyDarkIntensity(float darkIntensity) { @@ -204,13 +211,10 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, public int getTintAnimationDuration() { return LightBarTransitionsController.DEFAULT_TINT_ANIMATION_DURATION; } - }, mCommandQueue) { - @Override - public boolean supportsIconTintForNavMode(int navigationMode) { - // Always tint taskbar nav buttons (region sampling handles gesture bar separately). - return true; - } - }; + }); + controller.overrideIconTintForNavMode(true); + + return controller; } public void init(int displayId) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java index 150da1687b393..cbf84dc8ea115 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java @@ -26,7 +26,6 @@ import android.widget.ImageView; import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dump.DumpManager; -import com.android.systemui.statusbar.CommandQueue; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -54,12 +53,12 @@ public class DarkIconDispatcherImpl implements SysuiDarkIconDispatcher, @Inject public DarkIconDispatcherImpl( Context context, - CommandQueue commandQueue, + LightBarTransitionsController.Factory lightBarTransitionsControllerFactory, DumpManager dumpManager) { mDarkModeIconColorSingleTone = context.getColor(R.color.dark_mode_icon_color_single_tone); mLightModeIconColorSingleTone = context.getColor(R.color.light_mode_icon_color_single_tone); - mTransitionsController = new LightBarTransitionsController(context, this, commandQueue); + mTransitionsController = lightBarTransitionsControllerFactory.create(this); dumpManager.registerDumpable(getClass().getSimpleName(), this); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java index 415fb92e37ce9..4fd664b3efd35 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java @@ -24,7 +24,6 @@ import android.os.SystemClock; import android.util.MathUtils; import android.util.TimeUtils; -import com.android.systemui.Dependency; import com.android.systemui.Dumpable; import com.android.systemui.animation.Interpolators; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -36,6 +35,10 @@ import com.android.systemui.statusbar.policy.KeyguardStateController; import java.io.FileDescriptor; import java.io.PrintWriter; +import dagger.assisted.Assisted; +import dagger.assisted.AssistedFactory; +import dagger.assisted.AssistedInject; + /** * Class to control all aspects about light bar changes. */ @@ -70,13 +73,19 @@ public class LightBarTransitionsController implements Dumpable, Callbacks, }; private final Context mContext; + private Boolean mOverrideIconTintForNavMode; - public LightBarTransitionsController(Context context, DarkIntensityApplier applier, - CommandQueue commandQueue) { + @AssistedInject + public LightBarTransitionsController( + Context context, + @Assisted DarkIntensityApplier applier, + CommandQueue commandQueue, + KeyguardStateController keyguardStateController, + StatusBarStateController statusBarStateController) { mApplier = applier; mHandler = new Handler(); - mKeyguardStateController = Dependency.get(KeyguardStateController.class); - mStatusBarStateController = Dependency.get(StatusBarStateController.class); + mKeyguardStateController = keyguardStateController; + mStatusBarStateController = statusBarStateController; mCommandQueue = commandQueue; mCommandQueue.addCallback(this); mStatusBarStateController.addCallback(this); @@ -230,12 +239,20 @@ public class LightBarTransitionsController implements Dumpable, Callbacks, dispatchDark(); } + /** + * Specify an override value to return for {@link #overrideIconTintForNavMode(boolean)}. + */ + public void overrideIconTintForNavMode(boolean overrideValue) { + mOverrideIconTintForNavMode = overrideValue; + } /** * Return whether to use the tint calculated in this class for nav icons. */ public boolean supportsIconTintForNavMode(int navigationMode) { // In gesture mode, we already do region sampling to update tint based on content beneath. - return !QuickStepContract.isGesturalMode(navigationMode); + return mOverrideIconTintForNavMode != null + ? mOverrideIconTintForNavMode + : !QuickStepContract.isGesturalMode(navigationMode); } /** @@ -245,4 +262,11 @@ public class LightBarTransitionsController implements Dumpable, Callbacks, void applyDarkIntensity(float darkIntensity); int getTintAnimationDuration(); } + + /** Injectable factory for construction a LightBarTransitionsController. */ + @AssistedFactory + public interface Factory { + /** */ + LightBarTransitionsController create(DarkIntensityApplier darkIntensityApplier); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java index 0bcc3afe027d8..189aa0f99b0fb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarTransitionsControllerTest.java @@ -45,15 +45,18 @@ public class LightBarTransitionsControllerTest extends SysuiTestCase { @Mock private DarkIntensityApplier mApplier; + @Mock + private KeyguardStateController mKeyguardStateController; + @Mock + private StatusBarStateController mStatusBarStateController; + private LightBarTransitionsController mLightBarTransitionsController; @Before public void setup() { MockitoAnnotations.initMocks(this); - mDependency.injectMockDependency(KeyguardStateController.class); - mDependency.injectMockDependency(StatusBarStateController.class); mLightBarTransitionsController = new LightBarTransitionsController(mContext, mApplier, - new CommandQueue(mContext)); + new CommandQueue(mContext), mKeyguardStateController, mStatusBarStateController); } @Test