Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 35dbd954 authored by Nicolo' Mazzucato's avatar Nicolo' Mazzucato
Browse files

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
parent 3ae978a0
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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,
+0 −5
Original line number Diff line number Diff line
@@ -25,11 +25,6 @@ import dagger.Module

@Module
abstract class CommonDataLayerModule {
    @Binds
    abstract fun bindConfigurationRepository(
        impl: ConfigurationRepositoryImpl
    ): ConfigurationRepository

    @Binds
    abstract fun bindPackageChangeRepository(
        impl: PackageChangeRepositoryImpl
+2 −1
Original line number Diff line number Diff line
@@ -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.
 */
+83 −53
Original line number Diff line number Diff line
@@ -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,19 +61,17 @@ 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 {
    override val onAnyConfigurationChange: Flow<Unit> = conflatedCallbackFlow {
        val callback =
            object : ConfigurationController.ConfigurationListener {
                override fun onUiModeChanged() {
@@ -92,8 +94,7 @@ constructor(
        awaitClose { configurationController.removeCallback(callback) }
    }

    override val onConfigurationChange: Flow<Unit> =
        conflatedCallbackFlow {
    override val onConfigurationChange: Flow<Unit> = conflatedCallbackFlow {
        val callback =
            object : ConfigurationController.ConfigurationListener {
                override fun onConfigChanged(newConfig: Configuration) {
@@ -104,8 +105,7 @@ constructor(
        awaitClose { configurationController.removeCallback(callback) }
    }

    override val configurationValues: Flow<Configuration> =
            conflatedCallbackFlow {
    override val configurationValues: Flow<Configuration> = conflatedCallbackFlow {
        val callback =
            object : ConfigurationController.ConfigurationListener {
                override fun onConfigChanged(newConfig: Configuration) {
@@ -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)
        }
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -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) {
    /**
Loading