From 291438aaec5841a68ea605e1e0d70cafcab9cfb0 Mon Sep 17 00:00:00 2001 From: Anushree Ganjam Date: Thu, 17 Apr 2025 22:26:08 +0000 Subject: [PATCH] Move StatsLogManager to Dagger Helps us to delete ResourceBasedOverride class. Delete "stats_log_manager_class" resource from config. Delete unused "app_launch_tracker_class" resource from config. Bug: 361850561 Test: Presubmit Flag: EXEMPT dagger Change-Id: I71ed7ffca62e7c74d4ee0d0b4c045ffed9599cfe --- quickstep/res/values/config.xml | 2 -- .../com/android/launcher3/dagger/Modules.kt | 7 +++++ .../logging/SettingsChangeLogger.java | 15 ++-------- .../logging/StatsLogCompatManager.java | 21 +++++++++++++- .../logging/SettingsChangeLoggerTest.kt | 10 ++++--- res/values/config.xml | 2 -- .../dagger/LauncherBaseAppComponent.java | 5 ++-- .../launcher3/logging/StatsLogManager.java | 28 +++++++++++++++---- 8 files changed, 62 insertions(+), 28 deletions(-) diff --git a/quickstep/res/values/config.xml b/quickstep/res/values/config.xml index 7b678ec934..b442264d46 100644 --- a/quickstep/res/values/config.xml +++ b/quickstep/res/values/config.xml @@ -21,9 +21,7 @@ com.android.launcher3/com.android.quickstep.interaction.GestureSandboxActivity - com.android.quickstep.logging.StatsLogCompatManager com.android.quickstep.QuickstepTestInformationHandler - com.android.launcher3.appprediction.PredictionAppTracker com.android.quickstep.QuickstepProcessInitializer com.android.launcher3.secondarydisplay.SecondaryDisplayQuickstepDelegateImpl com.android.launcher3.taskbar.TaskbarModelCallbacksFactory diff --git a/quickstep/src/com/android/launcher3/dagger/Modules.kt b/quickstep/src/com/android/launcher3/dagger/Modules.kt index 7b3504a7cd..2456534020 100644 --- a/quickstep/src/com/android/launcher3/dagger/Modules.kt +++ b/quickstep/src/com/android/launcher3/dagger/Modules.kt @@ -18,6 +18,7 @@ package com.android.launcher3.dagger import com.android.launcher3.icons.LauncherIconProvider import com.android.launcher3.icons.LauncherIconProviderImpl +import com.android.launcher3.logging.StatsLogManager.StatsLogManagerFactory import com.android.launcher3.uioverrides.QuickstepWidgetHolder.QuickstepWidgetHolderFactory import com.android.launcher3.uioverrides.SystemApiWrapper import com.android.launcher3.uioverrides.plugins.PluginManagerWrapperImpl @@ -28,6 +29,7 @@ import com.android.launcher3.util.window.RefreshRateTracker import com.android.launcher3.util.window.WindowManagerProxy import com.android.launcher3.widget.LauncherWidgetHolder.WidgetHolderFactory import com.android.quickstep.InstantAppResolverImpl +import com.android.quickstep.logging.StatsLogCompatManager.StatsLogCompatManagerFactory import com.android.quickstep.util.ChoreographerFrameRateTracker import com.android.quickstep.util.GestureExclusionManager import com.android.quickstep.util.SystemWindowManagerProxy @@ -44,6 +46,11 @@ abstract class WindowManagerProxyModule { @Module abstract class ApiWrapperModule { + @Binds + abstract fun bindStatsLogManagerFactory( + impl: StatsLogCompatManagerFactory + ): StatsLogManagerFactory + @Binds abstract fun bindApiWrapper(systemApiWrapper: SystemApiWrapper): ApiWrapper @Binds diff --git a/quickstep/src/com/android/quickstep/logging/SettingsChangeLogger.java b/quickstep/src/com/android/quickstep/logging/SettingsChangeLogger.java index 190eb5423c..c9d1207a07 100644 --- a/quickstep/src/com/android/quickstep/logging/SettingsChangeLogger.java +++ b/quickstep/src/com/android/quickstep/logging/SettingsChangeLogger.java @@ -107,19 +107,10 @@ public class SettingsChangeLogger implements SettingsChangeLogger(@ApplicationContext Context context, DaggerSingletonTracker tracker, DisplayController displayController, - SettingsCache settingsCache) { - this(context, StatsLogManager.newInstance(context), tracker, displayController, - settingsCache); - } - - @VisibleForTesting - SettingsChangeLogger(@ApplicationContext Context context, - StatsLogManager statsLogManager, - DaggerSingletonTracker tracker, - DisplayController displayController, - SettingsCache settingsCache) { + SettingsCache settingsCache, + StatsLogManager.StatsLogManagerFactory factory) { mContext = context; - mStatsLogManager = statsLogManager; + mStatsLogManager = factory.create(context); mLoggablePrefs = loadPrefKeys(context); displayController.addChangeListener(this); diff --git a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java index 58e54cffbf..5c2aff6585 100644 --- a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java +++ b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java @@ -82,6 +82,8 @@ import java.util.Optional; import java.util.OptionalInt; import java.util.concurrent.CopyOnWriteArrayList; +import javax.inject.Inject; + /** * This class calls StatsLog compile time generated methods. * @@ -121,10 +123,27 @@ public class StatsLogCompatManager extends StatsLogManager { public static final CopyOnWriteArrayList LOGS_CONSUMER = new CopyOnWriteArrayList<>(); - public StatsLogCompatManager(Context context) { + private StatsLogCompatManager(Context context) { super(context); } + /** + * This class is purely used to support dagger bindings to be overridden in launcher variants. + * Very similar to {@link dagger.assisted.AssistedFactory}. But + * {@link dagger.assisted.AssistedFactory} cannot be overridden and this makes dagger binding + * difficult. + */ + public static class StatsLogCompatManagerFactory extends StatsLogManagerFactory { + @Inject + StatsLogCompatManagerFactory() { + super(); + } + + public StatsLogManager create(Context context) { + return new StatsLogCompatManager(context); + } + } + @Override protected StatsLogger createLogger() { return new StatsCompatLogger(mContext, mActivityContext); diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/logging/SettingsChangeLoggerTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/logging/SettingsChangeLoggerTest.kt index 08b1ffaf9a..9c655a70cd 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/logging/SettingsChangeLoggerTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/logging/SettingsChangeLoggerTest.kt @@ -60,6 +60,8 @@ class SettingsChangeLoggerTest { private lateinit var mSystemUnderTest: SettingsChangeLogger + @Mock private lateinit var mStatsLogFactory: StatsLogManager.StatsLogManagerFactory + @Mock private lateinit var mStatsLogManager: StatsLogManager @Mock private lateinit var mMockLogger: StatsLogManager.StatsLogger @@ -78,7 +80,7 @@ class SettingsChangeLoggerTest { @Before fun setUp() { MockitoAnnotations.initMocks(this) - + whenever(mStatsLogFactory.create(mContext)).doReturn(mStatsLogManager) whenever(mStatsLogManager.logger()).doReturn(mMockLogger) whenever(mStatsLogManager.logger().withInstanceId(any())).doReturn(mMockLogger) mDefaultThemedIcons = themeManager.isMonoThemeEnabled @@ -91,10 +93,10 @@ class SettingsChangeLoggerTest { mSystemUnderTest = SettingsChangeLogger( mContext, - mStatsLogManager, mTracker, displayController, settingsCache, + mStatsLogFactory, ) } @@ -109,10 +111,10 @@ class SettingsChangeLoggerTest { val systemUnderTest = SettingsChangeLogger( mContext, - mStatsLogManager, mTracker, displayController, settingsCache, + mStatsLogFactory, ) assertThat(systemUnderTest.loggingPrefs[ALLOW_ROTATION_PREFERENCE_KEY]!!.defaultValue) @@ -139,7 +141,7 @@ class SettingsChangeLoggerTest { LauncherPrefs.get(mContext).put(item = ALLOW_ROTATION, value = true) // This a new object so the values of mLoggablePrefs will be different - SettingsChangeLogger(mContext, mStatsLogManager, mTracker, displayController, settingsCache) + SettingsChangeLogger(mContext, mTracker, displayController, settingsCache, mStatsLogFactory) .logSnapshot(mInstanceId) verify(mMockLogger, atLeastOnce()).log(mEventCaptor.capture()) diff --git a/res/values/config.xml b/res/values/config.xml index 98d3e86388..f8c95ab974 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -62,9 +62,7 @@ - - diff --git a/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java b/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java index 519c2bf8db..a9bad2049d 100644 --- a/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java +++ b/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java @@ -27,6 +27,8 @@ import com.android.launcher3.RemoveAnimationSettingsTracker; import com.android.launcher3.graphics.GridCustomizationsProxy; import com.android.launcher3.graphics.ThemeManager; import com.android.launcher3.icons.LauncherIcons.IconPool; +import com.android.launcher3.logging.DumpManager; +import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.model.ItemInstallQueue; import com.android.launcher3.model.LoaderCursor.LoaderCursorFactory; import com.android.launcher3.pm.InstallSessionHelper; @@ -34,7 +36,6 @@ import com.android.launcher3.pm.UserCache; import com.android.launcher3.util.ApiWrapper; import com.android.launcher3.util.DaggerSingletonTracker; import com.android.launcher3.util.DisplayController; -import com.android.launcher3.logging.DumpManager; import com.android.launcher3.util.DynamicResource; import com.android.launcher3.util.InstantAppResolver; import com.android.launcher3.util.LockedUserState; @@ -93,8 +94,8 @@ public interface LauncherBaseAppComponent { WidgetHolderFactory getWidgetHolderFactory(); RefreshRateTracker getFrameRateProvider(); InstantAppResolver getInstantAppResolver(); - DumpManager getDumpManager(); + StatsLogManager.StatsLogManagerFactory getStatsLogManagerFactory(); /** Builder for LauncherBaseAppComponent. */ interface Builder { diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java index 8e18a76f60..27bc3a3f73 100644 --- a/src/com/android/launcher3/logging/StatsLogManager.java +++ b/src/com/android/launcher3/logging/StatsLogManager.java @@ -28,14 +28,16 @@ import androidx.annotation.Nullable; import androidx.slice.SliceItem; import com.android.launcher3.R; +import com.android.launcher3.dagger.LauncherComponentProvider; import com.android.launcher3.logger.LauncherAtom; import com.android.launcher3.logger.LauncherAtom.ContainerInfo; import com.android.launcher3.logger.LauncherAtom.FromState; import com.android.launcher3.logger.LauncherAtom.ToState; import com.android.launcher3.model.data.ItemInfo; -import com.android.launcher3.util.ResourceBasedOverride; import com.android.launcher3.views.ActivityContext; +import javax.inject.Inject; + /** * Handles the user event logging in R+. * @@ -45,7 +47,7 @@ import com.android.launcher3.views.ActivityContext; * Actual call happens only for Launcher variant that implements QuickStep. * */ -public class StatsLogManager implements ResourceBasedOverride { +public class StatsLogManager { public static final int LAUNCHER_STATE_UNSPECIFIED = 0; public static final int LAUNCHER_STATE_BACKGROUND = 1; @@ -62,11 +64,28 @@ public class StatsLogManager implements ResourceBasedOverride { private KeyboardStateManager mKeyboardStateManager; private InstanceId mInstanceId; - public StatsLogManager(@NonNull Context context) { + + protected StatsLogManager(@NonNull Context context) { mContext = context; mActivityContext = ActivityContext.lookupContextNoThrow(context); } + /** + * This class is purely used to support dagger bindings to be overridden in launcher variants. + * Very similar to {@link dagger.assisted.AssistedFactory}. But + * {@link dagger.assisted.AssistedFactory} cannot be overridden and this makes dagger binding + * difficult. + */ + public static class StatsLogManagerFactory { + @Inject + public StatsLogManagerFactory() { + } + + public StatsLogManager create(Context context) { + return new StatsLogManager(context); + } + } + /** * Returns event enum based on the two state transition information when swipe * gesture happens(to be removed during UserEventDispatcher cleanup). @@ -1356,7 +1375,6 @@ public class StatsLogManager implements ResourceBasedOverride { * Creates a new instance of {@link StatsLogManager} based on provided context. */ public static StatsLogManager newInstance(Context context) { - return Overrides.getObject( - StatsLogManager.class, context, R.string.stats_log_manager_class); + return LauncherComponentProvider.get(context).getStatsLogManagerFactory().create(context); } }