diff options
| author | 2024-10-25 14:28:44 +0000 | |
|---|---|---|
| committer | 2024-11-04 06:12:53 +0000 | |
| commit | 35dbd954489a6d13011fdb586fae9f829e9c0649 (patch) | |
| tree | 9e4ae95529fc9dc78a564063bdba7abe3390030f | |
| parent | 3ae978a009ba8f8791b14f02fb0ce97c8296bfca (diff) | |
Make ConfigurationRepository and ConfigurationState display aware
This allows to create different instances of ConfigurationRepository, based on a specific context and configuration controller.
+ creates @ShadeDisplayAware ConfigurationRepository
+ creates @ShadeDisplayAware ConfigurationState
+ Add ConfigurationRepositoryModule to SystemUIModule (it wasn't included anywhere at first)
Configuration Interactor is for a followup cl.
Also: this highlights how many ways we have in sysui to get configuration changes. All those classes related to configuration changes have a lot of duplication, and could be collapsed into a single one. Doing this refactor is out of scope for now (as it would require extensive changes to tests and other classes)
Bug: 362719719
Bug: 374267505
Test: SysUI unit tests
Flag: com.android.systemui.shade_window_goes_around
Change-Id: Iba9c0bc4b2ade1f54ee674d9b178c568b88f41c3
8 files changed, 127 insertions, 61 deletions
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt index 6fc51e4d0f65..66a0908ab72a 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt @@ -53,6 +53,7 @@ import com.android.systemui.notifications.ui.composable.ConstrainedNotificationS import com.android.systemui.notifications.ui.composable.SnoozeableHeadsUpNotificationSpace import com.android.systemui.res.R import com.android.systemui.shade.LargeScreenHeaderHelper +import com.android.systemui.shade.ShadeDisplayAware import com.android.systemui.statusbar.notification.icon.ui.viewbinder.AlwaysOnDisplayNotificationIconViewStore import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerViewBinder import com.android.systemui.statusbar.notification.icon.ui.viewbinder.StatusBarIconViewBindingFailureTracker @@ -84,7 +85,7 @@ constructor( stackScrollLayout: NotificationStackScrollLayout, sharedNotificationContainerBinder: SharedNotificationContainerBinder, private val keyguardRootViewModel: KeyguardRootViewModel, - private val configurationState: ConfigurationState, + @ShadeDisplayAware private val configurationState: ConfigurationState, private val iconBindingFailureTracker: StatusBarIconViewBindingFailureTracker, private val nicAodViewModel: NotificationIconContainerAlwaysOnDisplayViewModel, private val nicAodIconViewStore: AlwaysOnDisplayNotificationIconViewStore, diff --git a/packages/SystemUI/src/com/android/systemui/common/data/CommonDataLayerModule.kt b/packages/SystemUI/src/com/android/systemui/common/data/CommonDataLayerModule.kt index d1c728cd74fa..b0f5e5e4e3de 100644 --- a/packages/SystemUI/src/com/android/systemui/common/data/CommonDataLayerModule.kt +++ b/packages/SystemUI/src/com/android/systemui/common/data/CommonDataLayerModule.kt @@ -26,11 +26,6 @@ import dagger.Module @Module abstract class CommonDataLayerModule { @Binds - abstract fun bindConfigurationRepository( - impl: ConfigurationRepositoryImpl - ): ConfigurationRepository - - @Binds abstract fun bindPackageChangeRepository( impl: PackageChangeRepositoryImpl ): PackageChangeRepository diff --git a/packages/SystemUI/src/com/android/systemui/common/ui/ConfigurationStateModule.kt b/packages/SystemUI/src/com/android/systemui/common/ui/ConfigurationStateModule.kt index b36da3bfcd26..e0756fcc6f16 100644 --- a/packages/SystemUI/src/com/android/systemui/common/ui/ConfigurationStateModule.kt +++ b/packages/SystemUI/src/com/android/systemui/common/ui/ConfigurationStateModule.kt @@ -17,6 +17,7 @@ package com.android.systemui.common.ui import android.content.Context +import com.android.systemui.common.ui.data.repository.ConfigurationRepositoryModule import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.statusbar.policy.ConfigurationController @@ -28,7 +29,7 @@ import javax.inject.Qualifier /** * Annotates elements that provide information from the global configuration. * - * The global configuration is the one associted with the main display. Secondary displays will + * The global configuration is the one associated with the main display. Secondary displays will * apply override to the global configuration. Elements annotated with this shouldn't be used for * secondary displays. */ diff --git a/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt b/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt index 2052c70e740d..31a7fa468873 100644 --- a/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt @@ -23,13 +23,17 @@ import android.view.DisplayInfo import androidx.annotation.DimenRes import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow +import com.android.systemui.common.ui.GlobalConfig import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.util.wrapper.DisplayUtilsWrapper import dagger.Binds import dagger.Module -import javax.inject.Inject +import dagger.Provides +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.awaitClose @@ -57,66 +61,62 @@ interface ConfigurationRepository { fun getDimensionPixelSize(id: Int): Int } -@SysUISingleton class ConfigurationRepositoryImpl -@Inject +@AssistedInject constructor( - private val configurationController: ConfigurationController, - private val context: Context, + @Assisted private val configurationController: ConfigurationController, + @Assisted private val context: Context, @Application private val scope: CoroutineScope, private val displayUtils: DisplayUtilsWrapper, ) : ConfigurationRepository { private val displayInfo = MutableStateFlow(DisplayInfo()) - override val onAnyConfigurationChange: Flow<Unit> = - conflatedCallbackFlow { - val callback = - object : ConfigurationController.ConfigurationListener { - override fun onUiModeChanged() { - sendUpdate("ConfigurationRepository#onUiModeChanged") - } - - override fun onThemeChanged() { - sendUpdate("ConfigurationRepository#onThemeChanged") - } - - override fun onConfigChanged(newConfig: Configuration) { - sendUpdate("ConfigurationRepository#onConfigChanged") - } - - fun sendUpdate(reason: String) { - trySendWithFailureLogging(Unit, reason) - } + override val onAnyConfigurationChange: Flow<Unit> = conflatedCallbackFlow { + val callback = + object : ConfigurationController.ConfigurationListener { + override fun onUiModeChanged() { + sendUpdate("ConfigurationRepository#onUiModeChanged") } - configurationController.addCallback(callback) - awaitClose { configurationController.removeCallback(callback) } - } - override val onConfigurationChange: Flow<Unit> = - conflatedCallbackFlow { - val callback = - object : ConfigurationController.ConfigurationListener { - override fun onConfigChanged(newConfig: Configuration) { - trySendWithFailureLogging(Unit, "ConfigurationRepository#onConfigChanged") - } + override fun onThemeChanged() { + sendUpdate("ConfigurationRepository#onThemeChanged") } - configurationController.addCallback(callback) - awaitClose { configurationController.removeCallback(callback) } - } - override val configurationValues: Flow<Configuration> = - conflatedCallbackFlow { - val callback = - object : ConfigurationController.ConfigurationListener { - override fun onConfigChanged(newConfig: Configuration) { - trySend(newConfig) - } - } - - trySend(context.resources.configuration) - configurationController.addCallback(callback) - awaitClose { configurationController.removeCallback(callback) } + override fun onConfigChanged(newConfig: Configuration) { + sendUpdate("ConfigurationRepository#onConfigChanged") + } + + fun sendUpdate(reason: String) { + trySendWithFailureLogging(Unit, reason) + } + } + configurationController.addCallback(callback) + awaitClose { configurationController.removeCallback(callback) } + } + + override val onConfigurationChange: Flow<Unit> = conflatedCallbackFlow { + val callback = + object : ConfigurationController.ConfigurationListener { + override fun onConfigChanged(newConfig: Configuration) { + trySendWithFailureLogging(Unit, "ConfigurationRepository#onConfigChanged") + } } + configurationController.addCallback(callback) + awaitClose { configurationController.removeCallback(callback) } + } + + override val configurationValues: Flow<Configuration> = conflatedCallbackFlow { + val callback = + object : ConfigurationController.ConfigurationListener { + override fun onConfigChanged(newConfig: Configuration) { + trySend(newConfig) + } + } + + trySend(context.resources.configuration) + configurationController.addCallback(callback) + awaitClose { configurationController.removeCallback(callback) } + } override val scaleForResolution: StateFlow<Float> = onConfigurationChange @@ -134,8 +134,7 @@ constructor( maxDisplayMode.physicalWidth, maxDisplayMode.physicalHeight, displayInfo.value.naturalWidth, - displayInfo.value.naturalHeight - ) + displayInfo.value.naturalHeight) return if (scaleFactor == Float.POSITIVE_INFINITY) 1f else scaleFactor } return 1f @@ -144,9 +143,40 @@ constructor( override fun getDimensionPixelSize(@DimenRes id: Int): Int { return context.resources.getDimensionPixelSize(id) } + + @AssistedFactory + interface Factory { + fun create( + context: Context, + configurationController: ConfigurationController + ): ConfigurationRepositoryImpl + } } @Module -interface ConfigurationRepositoryModule { - @Binds fun bindImpl(impl: ConfigurationRepositoryImpl): ConfigurationRepository +abstract class ConfigurationRepositoryModule { + + /** + * For compatibility reasons. Ideally, only the an annotated [ConfigurationRepository] should be + * injected. + */ + @Binds + @Deprecated("Use the ConfigurationRepository annotated with @GlobalConfig instead.") + @SysUISingleton + abstract fun provideDefaultConfigRepository( + @GlobalConfig configurationRepository: ConfigurationRepository + ): ConfigurationRepository + + companion object { + @Provides + @GlobalConfig + @SysUISingleton + fun provideGlobalConfigRepository( + context: Context, + @GlobalConfig configurationController: ConfigurationController, + factory: ConfigurationRepositoryImpl.Factory + ): ConfigurationRepository { + return factory.create(context, configurationController) + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/common/ui/domain/interactor/ConfigurationInteractor.kt b/packages/SystemUI/src/com/android/systemui/common/ui/domain/interactor/ConfigurationInteractor.kt index adb1ee2b22ee..eb423d69a4eb 100644 --- a/packages/SystemUI/src/com/android/systemui/common/ui/domain/interactor/ConfigurationInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/common/ui/domain/interactor/ConfigurationInteractor.kt @@ -32,6 +32,7 @@ import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.onStart /** Business logic related to configuration changes. */ +// TODO: b/374267505 - Create a @ShadeDisplayWindow annotated version of this. @SysUISingleton class ConfigurationInteractor @Inject constructor(private val repository: ConfigurationRepository) { /** diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java index cb649f28f95b..9138243c642c 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java @@ -49,6 +49,7 @@ import com.android.systemui.classifier.FalsingModule; import com.android.systemui.clipboardoverlay.dagger.ClipboardOverlayModule; import com.android.systemui.common.data.CommonDataLayerModule; import com.android.systemui.common.ui.ConfigurationStateModule; +import com.android.systemui.common.ui.data.repository.ConfigurationRepositoryModule; import com.android.systemui.common.usagestats.data.CommonUsageStatsDataLayerModule; import com.android.systemui.communal.dagger.CommunalModule; import com.android.systemui.complication.dagger.ComplicationComponent; @@ -212,6 +213,7 @@ import javax.inject.Named; CommunalModule.class, CommonDataLayerModule.class, ConfigurationStateModule.class, + ConfigurationRepositoryModule.class, CommonUsageStatsDataLayerModule.class, ConfigurationControllerModule.class, ConnectivityModule.class, diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt index a8026cd61aaf..32255c61044c 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt @@ -20,7 +20,11 @@ import android.content.Context import android.content.res.Resources import android.view.LayoutInflater import android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY +import com.android.systemui.common.ui.ConfigurationState +import com.android.systemui.common.ui.ConfigurationStateImpl import com.android.systemui.common.ui.GlobalConfig +import com.android.systemui.common.ui.data.repository.ConfigurationRepository +import com.android.systemui.common.ui.data.repository.ConfigurationRepositoryImpl import com.android.systemui.dagger.SysUISingleton import com.android.systemui.res.R import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround @@ -97,4 +101,36 @@ object ShadeDisplayAwareModule { ShadeWindowGoesAround.isUnexpectedlyInLegacyMode() return shadeConfigurationController } + + @SysUISingleton + @Provides + @ShadeDisplayAware + fun provideShadeDisplayAwareConfigurationState( + factory: ConfigurationStateImpl.Factory, + @ShadeDisplayAware configurationController: ConfigurationController, + @ShadeDisplayAware context: Context, + @GlobalConfig configurationState: ConfigurationState, + ): ConfigurationState { + return if (ShadeWindowGoesAround.isEnabled) { + factory.create(context, configurationController) + } else { + configurationState + } + } + + @SysUISingleton + @Provides + @ShadeDisplayAware + fun provideShadeDisplayAwareConfigurationRepository( + factory: ConfigurationRepositoryImpl.Factory, + @ShadeDisplayAware configurationController: ConfigurationController, + @ShadeDisplayAware context: Context, + @GlobalConfig globalConfigurationRepository: ConfigurationRepository + ): ConfigurationRepository { + return if (ShadeWindowGoesAround.isEnabled) { + factory.create(context, configurationController) + } else { + globalConfigurationRepository + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt index e5d08a0ac977..a8d616c54e95 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt @@ -51,7 +51,7 @@ constructor( @Application private val applicationScope: CoroutineScope, @ShadeDisplayAware private val context: Context, @ShadeTouchLog private val touchLog: LogBuffer, - private val configurationRepository: ConfigurationRepository, + @ShadeDisplayAware private val configurationRepository: ConfigurationRepository, private val shadeRepository: ShadeRepository, private val splitShadeStateController: SplitShadeStateController, private val scrimShadeTransitionController: ScrimShadeTransitionController, |