Merge "Move StatsLogManager to Dagger" into main

This commit is contained in:
Anushree Ganjam
2025-04-21 18:48:56 -07:00
committed by Android (Google) Code Review
8 changed files with 62 additions and 28 deletions
-2
View File
@@ -21,9 +21,7 @@
<item>com.android.launcher3/com.android.quickstep.interaction.GestureSandboxActivity</item>
</string-array>
<string name="stats_log_manager_class" translatable="false">com.android.quickstep.logging.StatsLogCompatManager</string>
<string name="test_information_handler_class" translatable="false">com.android.quickstep.QuickstepTestInformationHandler</string>
<string name="app_launch_tracker_class" translatable="false">com.android.launcher3.appprediction.PredictionAppTracker</string>
<string name="main_process_initializer_class" translatable="false">com.android.quickstep.QuickstepProcessInitializer</string>
<string name="secondary_display_quickstep_delegate_class" translatable="false">com.android.launcher3.secondarydisplay.SecondaryDisplayQuickstepDelegateImpl</string>
<string name="taskbar_model_callbacks_factory_class" translatable="false">com.android.launcher3.taskbar.TaskbarModelCallbacksFactory</string>
@@ -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
@@ -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);
@@ -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<StatsLogConsumer> 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);
@@ -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())
-2
View File
@@ -62,9 +62,7 @@
<!-- Various classes overriden by projects/build flavors. -->
<string name="folder_name_provider_class" translatable="false"></string>
<string name="stats_log_manager_class" translatable="false"></string>
<string name="main_process_initializer_class" translatable="false"></string>
<string name="app_launch_tracker_class" translatable="false"></string>
<string name="test_information_handler_class" translatable="false"></string>
<string name="secondary_display_quickstep_delegate_class" translatable="false"></string>
<string name="taskbar_search_session_controller_class" translatable="false"></string>
@@ -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 {
@@ -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.
* </pre>
*/
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);
}
}