Loading quickstep/dagger/LauncherAppComponent.java +2 −1 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.launcher3.dagger; import com.android.quickstep.dagger.QuickStepModule; import com.android.quickstep.dagger.QuickstepBaseAppComponent; import dagger.Component; Loading @@ -26,7 +27,7 @@ import dagger.Component; */ @LauncherAppSingleton @Component(modules = QuickStepModule.class) public interface LauncherAppComponent extends LauncherBaseAppComponent { public interface LauncherAppComponent extends QuickstepBaseAppComponent { /** Builder for quickstep LauncherAppComponent. */ @Component.Builder interface Builder extends LauncherBaseAppComponent.Builder { Loading quickstep/src/com/android/quickstep/dagger/QuickStepModule.java +1 −3 Original line number Diff line number Diff line Loading @@ -15,10 +15,8 @@ */ package com.android.quickstep.dagger; import com.android.quickstep.logging.LoggingModule; import dagger.Module; @Module(includes = {LoggingModule.class}) @Module public class QuickStepModule { } quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java 0 → 100644 +33 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.quickstep.dagger; import com.android.launcher3.dagger.LauncherAppComponent; import com.android.launcher3.dagger.LauncherBaseAppComponent; import com.android.quickstep.logging.SettingsChangeLogger; /** * Launcher Quickstep base component for Dagger injection. * * This class is not actually annotated as a Dagger component, since it is not used directly as one. * Doing so generates unnecessary code bloat. * * See {@link LauncherAppComponent} for the one actually used. */ public interface QuickstepBaseAppComponent extends LauncherBaseAppComponent { SettingsChangeLogger getSettingsChangeLogger(); } quickstep/src/com/android/quickstep/logging/SettingsChangeLogger.java +28 −14 Original line number Diff line number Diff line Loading @@ -43,16 +43,20 @@ import androidx.annotation.VisibleForTesting; import com.android.launcher3.LauncherPrefs; import com.android.launcher3.R; import com.android.launcher3.dagger.ApplicationContext; import com.android.launcher3.logging.InstanceId; import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.logging.StatsLogManager.StatsLogger; import com.android.launcher3.model.DeviceGridState; import com.android.launcher3.util.DaggerSingletonObject; import com.android.launcher3.util.DaggerSingletonTracker; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.DisplayController.Info; import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.ExecutorUtil; import com.android.launcher3.util.NavigationMode; import com.android.launcher3.util.SafeCloseable; import com.android.launcher3.util.SettingsCache; import com.android.quickstep.dagger.QuickstepBaseAppComponent; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; Loading @@ -60,6 +64,8 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.util.Optional; import javax.inject.Inject; /** * Utility class to log launcher settings changes */ Loading @@ -70,8 +76,8 @@ public class SettingsChangeLogger implements /** * Singleton instance */ public static MainThreadInitializedObject<SettingsChangeLogger> INSTANCE = new MainThreadInitializedObject<>(SettingsChangeLogger::new); public static DaggerSingletonObject<SettingsChangeLogger> INSTANCE = new DaggerSingletonObject<>(QuickstepBaseAppComponent::getSettingsChangeLogger); private static final String TAG = "SettingsChangeLogger"; private static final String BOOLEAN_PREF = "SwitchPreference"; Loading @@ -84,25 +90,31 @@ public class SettingsChangeLogger implements private StatsLogManager.LauncherEvent mNotificationDotsEvent; private StatsLogManager.LauncherEvent mHomeScreenSuggestionEvent; private SettingsChangeLogger(Context context) { this(context, StatsLogManager.newInstance(context)); @Inject SettingsChangeLogger(@ApplicationContext Context context, DaggerSingletonTracker tracker) { this(context, StatsLogManager.newInstance(context), tracker); } @VisibleForTesting SettingsChangeLogger(Context context, StatsLogManager statsLogManager) { SettingsChangeLogger(Context context, StatsLogManager statsLogManager, DaggerSingletonTracker tracker) { mContext = context; mStatsLogManager = statsLogManager; mLoggablePrefs = loadPrefKeys(context); ExecutorUtil.executeSyncOnMainOrFail(() -> { DisplayController.INSTANCE.get(context).addChangeListener(this); mNavMode = DisplayController.getNavigationMode(context); getPrefs(context).registerOnSharedPreferenceChangeListener(this); getDevicePrefs(context).registerOnSharedPreferenceChangeListener(this); SettingsCache mSettingsCache = SettingsCache.INSTANCE.get(context); mSettingsCache.register(NOTIFICATION_BADGING_URI, SettingsCache settingsCache = SettingsCache.INSTANCE.get(context); settingsCache.register(NOTIFICATION_BADGING_URI, this::onNotificationDotsChanged); onNotificationDotsChanged(mSettingsCache.getValue(NOTIFICATION_BADGING_URI)); onNotificationDotsChanged(settingsCache.getValue(NOTIFICATION_BADGING_URI)); tracker.addCloseable(this); }); } private static ArrayMap<String, LoggablePref> loadPrefKeys(Context context) { Loading Loading @@ -209,6 +221,8 @@ public class SettingsChangeLogger implements public void close() { getPrefs(mContext).unregisterOnSharedPreferenceChangeListener(this); getDevicePrefs(mContext).unregisterOnSharedPreferenceChangeListener(this); SettingsCache settingsCache = SettingsCache.INSTANCE.get(mContext); settingsCache.unregister(NOTIFICATION_BADGING_URI, this::onNotificationDotsChanged); } @VisibleForTesting Loading quickstep/tests/multivalentTests/src/com/android/quickstep/logging/SettingsChangeLoggerTest.kt +5 −3 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_NAVI import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_NOTIFICATION_DOT_ENABLED import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_THEMED_ICON_DISABLED import com.android.launcher3.states.RotationHelper.ALLOW_ROTATION_PREFERENCE_KEY import com.android.launcher3.util.DaggerSingletonTracker import com.google.common.truth.Truth.assertThat import org.junit.After import org.junit.Before Loading Loading @@ -62,6 +63,7 @@ class SettingsChangeLoggerTest { @Mock private lateinit var mMockLogger: StatsLogManager.StatsLogger @Captor private lateinit var mEventCaptor: ArgumentCaptor<StatsLogManager.EventEnum> @Mock private lateinit var mTracker: DaggerSingletonTracker private var mDefaultThemedIcons = false private var mDefaultAllowRotation = false Loading @@ -79,7 +81,7 @@ class SettingsChangeLoggerTest { // To match the default value of ALLOW_ROTATION LauncherPrefs.get(mContext).put(item = ALLOW_ROTATION, value = false) mSystemUnderTest = SettingsChangeLogger(mContext, mStatsLogManager) mSystemUnderTest = SettingsChangeLogger(mContext, mStatsLogManager, mTracker) } @After Loading @@ -90,7 +92,7 @@ class SettingsChangeLoggerTest { @Test fun loggingPrefs_correctDefaultValue() { val systemUnderTest = SettingsChangeLogger(mContext, mStatsLogManager) val systemUnderTest = SettingsChangeLogger(mContext, mStatsLogManager, mTracker) assertThat(systemUnderTest.loggingPrefs[ALLOW_ROTATION_PREFERENCE_KEY]!!.defaultValue) .isFalse() Loading @@ -117,7 +119,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).logSnapshot(mInstanceId) SettingsChangeLogger(mContext, mStatsLogManager, mTracker).logSnapshot(mInstanceId) verify(mMockLogger, atLeastOnce()).log(mEventCaptor.capture()) val capturedEvents = mEventCaptor.allValues Loading Loading
quickstep/dagger/LauncherAppComponent.java +2 −1 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.launcher3.dagger; import com.android.quickstep.dagger.QuickStepModule; import com.android.quickstep.dagger.QuickstepBaseAppComponent; import dagger.Component; Loading @@ -26,7 +27,7 @@ import dagger.Component; */ @LauncherAppSingleton @Component(modules = QuickStepModule.class) public interface LauncherAppComponent extends LauncherBaseAppComponent { public interface LauncherAppComponent extends QuickstepBaseAppComponent { /** Builder for quickstep LauncherAppComponent. */ @Component.Builder interface Builder extends LauncherBaseAppComponent.Builder { Loading
quickstep/src/com/android/quickstep/dagger/QuickStepModule.java +1 −3 Original line number Diff line number Diff line Loading @@ -15,10 +15,8 @@ */ package com.android.quickstep.dagger; import com.android.quickstep.logging.LoggingModule; import dagger.Module; @Module(includes = {LoggingModule.class}) @Module public class QuickStepModule { }
quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java 0 → 100644 +33 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.quickstep.dagger; import com.android.launcher3.dagger.LauncherAppComponent; import com.android.launcher3.dagger.LauncherBaseAppComponent; import com.android.quickstep.logging.SettingsChangeLogger; /** * Launcher Quickstep base component for Dagger injection. * * This class is not actually annotated as a Dagger component, since it is not used directly as one. * Doing so generates unnecessary code bloat. * * See {@link LauncherAppComponent} for the one actually used. */ public interface QuickstepBaseAppComponent extends LauncherBaseAppComponent { SettingsChangeLogger getSettingsChangeLogger(); }
quickstep/src/com/android/quickstep/logging/SettingsChangeLogger.java +28 −14 Original line number Diff line number Diff line Loading @@ -43,16 +43,20 @@ import androidx.annotation.VisibleForTesting; import com.android.launcher3.LauncherPrefs; import com.android.launcher3.R; import com.android.launcher3.dagger.ApplicationContext; import com.android.launcher3.logging.InstanceId; import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.logging.StatsLogManager.StatsLogger; import com.android.launcher3.model.DeviceGridState; import com.android.launcher3.util.DaggerSingletonObject; import com.android.launcher3.util.DaggerSingletonTracker; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.DisplayController.Info; import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.ExecutorUtil; import com.android.launcher3.util.NavigationMode; import com.android.launcher3.util.SafeCloseable; import com.android.launcher3.util.SettingsCache; import com.android.quickstep.dagger.QuickstepBaseAppComponent; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; Loading @@ -60,6 +64,8 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.util.Optional; import javax.inject.Inject; /** * Utility class to log launcher settings changes */ Loading @@ -70,8 +76,8 @@ public class SettingsChangeLogger implements /** * Singleton instance */ public static MainThreadInitializedObject<SettingsChangeLogger> INSTANCE = new MainThreadInitializedObject<>(SettingsChangeLogger::new); public static DaggerSingletonObject<SettingsChangeLogger> INSTANCE = new DaggerSingletonObject<>(QuickstepBaseAppComponent::getSettingsChangeLogger); private static final String TAG = "SettingsChangeLogger"; private static final String BOOLEAN_PREF = "SwitchPreference"; Loading @@ -84,25 +90,31 @@ public class SettingsChangeLogger implements private StatsLogManager.LauncherEvent mNotificationDotsEvent; private StatsLogManager.LauncherEvent mHomeScreenSuggestionEvent; private SettingsChangeLogger(Context context) { this(context, StatsLogManager.newInstance(context)); @Inject SettingsChangeLogger(@ApplicationContext Context context, DaggerSingletonTracker tracker) { this(context, StatsLogManager.newInstance(context), tracker); } @VisibleForTesting SettingsChangeLogger(Context context, StatsLogManager statsLogManager) { SettingsChangeLogger(Context context, StatsLogManager statsLogManager, DaggerSingletonTracker tracker) { mContext = context; mStatsLogManager = statsLogManager; mLoggablePrefs = loadPrefKeys(context); ExecutorUtil.executeSyncOnMainOrFail(() -> { DisplayController.INSTANCE.get(context).addChangeListener(this); mNavMode = DisplayController.getNavigationMode(context); getPrefs(context).registerOnSharedPreferenceChangeListener(this); getDevicePrefs(context).registerOnSharedPreferenceChangeListener(this); SettingsCache mSettingsCache = SettingsCache.INSTANCE.get(context); mSettingsCache.register(NOTIFICATION_BADGING_URI, SettingsCache settingsCache = SettingsCache.INSTANCE.get(context); settingsCache.register(NOTIFICATION_BADGING_URI, this::onNotificationDotsChanged); onNotificationDotsChanged(mSettingsCache.getValue(NOTIFICATION_BADGING_URI)); onNotificationDotsChanged(settingsCache.getValue(NOTIFICATION_BADGING_URI)); tracker.addCloseable(this); }); } private static ArrayMap<String, LoggablePref> loadPrefKeys(Context context) { Loading Loading @@ -209,6 +221,8 @@ public class SettingsChangeLogger implements public void close() { getPrefs(mContext).unregisterOnSharedPreferenceChangeListener(this); getDevicePrefs(mContext).unregisterOnSharedPreferenceChangeListener(this); SettingsCache settingsCache = SettingsCache.INSTANCE.get(mContext); settingsCache.unregister(NOTIFICATION_BADGING_URI, this::onNotificationDotsChanged); } @VisibleForTesting Loading
quickstep/tests/multivalentTests/src/com/android/quickstep/logging/SettingsChangeLoggerTest.kt +5 −3 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_NAVI import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_NOTIFICATION_DOT_ENABLED import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_THEMED_ICON_DISABLED import com.android.launcher3.states.RotationHelper.ALLOW_ROTATION_PREFERENCE_KEY import com.android.launcher3.util.DaggerSingletonTracker import com.google.common.truth.Truth.assertThat import org.junit.After import org.junit.Before Loading Loading @@ -62,6 +63,7 @@ class SettingsChangeLoggerTest { @Mock private lateinit var mMockLogger: StatsLogManager.StatsLogger @Captor private lateinit var mEventCaptor: ArgumentCaptor<StatsLogManager.EventEnum> @Mock private lateinit var mTracker: DaggerSingletonTracker private var mDefaultThemedIcons = false private var mDefaultAllowRotation = false Loading @@ -79,7 +81,7 @@ class SettingsChangeLoggerTest { // To match the default value of ALLOW_ROTATION LauncherPrefs.get(mContext).put(item = ALLOW_ROTATION, value = false) mSystemUnderTest = SettingsChangeLogger(mContext, mStatsLogManager) mSystemUnderTest = SettingsChangeLogger(mContext, mStatsLogManager, mTracker) } @After Loading @@ -90,7 +92,7 @@ class SettingsChangeLoggerTest { @Test fun loggingPrefs_correctDefaultValue() { val systemUnderTest = SettingsChangeLogger(mContext, mStatsLogManager) val systemUnderTest = SettingsChangeLogger(mContext, mStatsLogManager, mTracker) assertThat(systemUnderTest.loggingPrefs[ALLOW_ROTATION_PREFERENCE_KEY]!!.defaultValue) .isFalse() Loading @@ -117,7 +119,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).logSnapshot(mInstanceId) SettingsChangeLogger(mContext, mStatsLogManager, mTracker).logSnapshot(mInstanceId) verify(mMockLogger, atLeastOnce()).log(mEventCaptor.capture()) val capturedEvents = mEventCaptor.allValues Loading