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

Commit 59a09884 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 9635238 from d4daeff1 to tm-qpr3-release

Change-Id: Ifb2611f0cbe8134de127935511d4456912c71046
parents 2f934405 d4daeff1
Loading
Loading
Loading
Loading
+6 −22
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import androidx.fragment.app.FragmentActivity
import com.android.customization.model.theme.OverlayManagerCompat
import com.android.customization.model.theme.ThemeBundleProvider
import com.android.customization.model.theme.ThemeManager
import com.android.customization.picker.clock.data.repository.ClockRegistryProvider
import com.android.customization.picker.clock.domain.interactor.ClockPickerInteractor
import com.android.customization.picker.clock.ui.view.ClockViewFactory
import com.android.customization.picker.clock.ui.viewmodel.ClockCarouselViewModel
@@ -48,17 +47,11 @@ interface CustomizationInjector : Injector {
        context: Context,
    ): KeyguardQuickAffordancePickerInteractor

    fun getClockRegistryProvider(context: Context): ClockRegistryProvider
    fun getClockRegistry(context: Context): ClockRegistry

    fun getClockPickerInteractor(
        context: Context,
        clockRegistry: ClockRegistry,
    ): ClockPickerInteractor
    fun getClockPickerInteractor(context: Context): ClockPickerInteractor

    fun getClockSectionViewModel(
        context: Context,
        clockRegistry: ClockRegistry,
    ): ClockSectionViewModel
    fun getClockSectionViewModel(context: Context): ClockSectionViewModel

    fun getColorPickerInteractor(
        context: Context,
@@ -70,18 +63,9 @@ interface CustomizationInjector : Injector {
        wallpaperColorsViewModel: WallpaperColorsViewModel,
    ): ColorPickerViewModel.Factory

    fun getClockCarouselViewModel(
        context: Context,
        clockRegistry: ClockRegistry,
    ): ClockCarouselViewModel
    fun getClockCarouselViewModel(context: Context): ClockCarouselViewModel

    fun getClockViewFactory(
        activity: Activity,
        registry: ClockRegistry,
    ): ClockViewFactory
    fun getClockViewFactory(activity: Activity): ClockViewFactory

    fun getClockSettingsViewModelFactory(
        context: Context,
        registry: ClockRegistry,
    ): ClockSettingsViewModel.Factory
    fun getClockSettingsViewModelFactory(context: Context): ClockSettingsViewModel.Factory
}
+10 −17
Original line number Diff line number Diff line
@@ -16,14 +16,13 @@ import com.android.customization.model.themedicon.ThemedIconSectionController;
import com.android.customization.model.themedicon.ThemedIconSwitchProvider;
import com.android.customization.model.themedicon.domain.interactor.ThemedIconInteractor;
import com.android.customization.model.themedicon.domain.interactor.ThemedIconSnapshotRestorer;
import com.android.customization.picker.clock.data.repository.ClockRegistryProvider;
import com.android.customization.picker.clock.ui.view.ClockViewFactory;
import com.android.customization.picker.clock.ui.viewmodel.ClockCarouselViewModel;
import com.android.customization.picker.color.ui.section.ColorSectionController2;
import com.android.customization.picker.color.ui.viewmodel.ColorPickerViewModel;
import com.android.customization.picker.notifications.ui.section.NotificationSectionController;
import com.android.customization.picker.notifications.ui.viewmodel.NotificationSectionViewModel;
import com.android.customization.picker.preview.ui.section.PreviewWithClockCarouselSectionController;
import com.android.customization.picker.preview.ui.section.PreviewWithClockCarouselSectionController.ClockCarouselViewModelProvider;
import com.android.customization.picker.preview.ui.section.PreviewWithClockCarouselSectionController.ClockViewFactoryProvider;
import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor;
import com.android.customization.picker.quickaffordance.ui.section.KeyguardQuickAffordanceSectionController;
import com.android.customization.picker.quickaffordance.ui.viewmodel.KeyguardQuickAffordancePickerViewModel;
@@ -55,11 +54,8 @@ public final class DefaultCustomizationSections implements CustomizationSections
            mKeyguardQuickAffordancePickerViewModelFactory;
    private final NotificationSectionViewModel.Factory mNotificationSectionViewModelFactory;
    private final BaseFlags mFlags;
    private final ClockRegistryProvider mClockRegistryProvider;
    private final PreviewWithClockCarouselSectionController.ClockCarouselViewModelProvider
            mClockCarouselViewModelProvider;
    private final PreviewWithClockCarouselSectionController.ClockViewFactoryProvider
            mClockViewFactoryProvider;
    private final ClockCarouselViewModel mClockCarouselViewModel;
    private final ClockViewFactory mClockViewFactory;
    private final DarkModeSnapshotRestorer mDarkModeSnapshotRestorer;
    private final ThemedIconSnapshotRestorer mThemedIconSnapshotRestorer;
    private final ThemedIconInteractor mThemedIconInteractor;
@@ -71,9 +67,8 @@ public final class DefaultCustomizationSections implements CustomizationSections
                    keyguardQuickAffordancePickerViewModelFactory,
            NotificationSectionViewModel.Factory notificationSectionViewModelFactory,
            BaseFlags flags,
            ClockRegistryProvider clockRegistryProvider,
            ClockCarouselViewModelProvider clockCarouselViewModelProvider,
            ClockViewFactoryProvider clockViewFactoryProvider,
            ClockCarouselViewModel clockCarouselViewModel,
            ClockViewFactory clockViewFactory,
            DarkModeSnapshotRestorer darkModeSnapshotRestorer,
            ThemedIconSnapshotRestorer themedIconSnapshotRestorer,
            ThemedIconInteractor themedIconInteractor) {
@@ -83,9 +78,8 @@ public final class DefaultCustomizationSections implements CustomizationSections
                keyguardQuickAffordancePickerViewModelFactory;
        mNotificationSectionViewModelFactory = notificationSectionViewModelFactory;
        mFlags = flags;
        mClockRegistryProvider = clockRegistryProvider;
        mClockCarouselViewModelProvider = clockCarouselViewModelProvider;
        mClockViewFactoryProvider = clockViewFactoryProvider;
        mClockCarouselViewModel = clockCarouselViewModel;
        mClockViewFactory = clockViewFactory;
        mDarkModeSnapshotRestorer = darkModeSnapshotRestorer;
        mThemedIconSnapshotRestorer = themedIconSnapshotRestorer;
        mThemedIconInteractor = themedIconInteractor;
@@ -116,9 +110,8 @@ public final class DefaultCustomizationSections implements CustomizationSections
                        wallpaperInfoFactory,
                        wallpaperColorsViewModel,
                        displayUtils,
                        mClockRegistryProvider,
                        mClockCarouselViewModelProvider,
                        mClockViewFactoryProvider,
                        mClockCarouselViewModel,
                        mClockViewFactory,
                        sectionNavigationController)
                        : new ScreenPreviewSectionController(
                                activity,
+15 −43
Original line number Diff line number Diff line
@@ -52,8 +52,6 @@ import com.android.customization.picker.notifications.data.repository.Notificati
import com.android.customization.picker.notifications.domain.interactor.NotificationsInteractor
import com.android.customization.picker.notifications.domain.interactor.NotificationsSnapshotRestorer
import com.android.customization.picker.notifications.ui.viewmodel.NotificationSectionViewModel
import com.android.customization.picker.preview.ui.section.PreviewWithClockCarouselSectionController.ClockCarouselViewModelProvider
import com.android.customization.picker.preview.ui.section.PreviewWithClockCarouselSectionController.ClockViewFactoryProvider
import com.android.customization.picker.quickaffordance.data.repository.KeyguardQuickAffordancePickerRepository
import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor
import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordanceSnapshotRestorer
@@ -93,7 +91,7 @@ open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInject
    private var keyguardQuickAffordanceSnapshotRestorer: KeyguardQuickAffordanceSnapshotRestorer? =
        null
    private var notificationsSnapshotRestorer: NotificationsSnapshotRestorer? = null
    private var clockRegistryProvider: ClockRegistryProvider? = null
    private var clockRegistry: ClockRegistry? = null
    private var clockPickerInteractor: ClockPickerInteractor? = null
    private var clockSectionViewModel: ClockSectionViewModel? = null
    private var clockCarouselViewModel: ClockCarouselViewModel? = null
@@ -124,23 +122,8 @@ open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInject
                        interactor = getNotificationsInteractor(activity),
                    ),
                    getFlags(),
                    getClockRegistryProvider(activity),
                    object : ClockCarouselViewModelProvider {
                        override fun get(registry: ClockRegistry): ClockCarouselViewModel {
                            return getClockCarouselViewModel(
                                context = activity,
                                clockRegistry = registry,
                            )
                        }
                    },
                    object : ClockViewFactoryProvider {
                        override fun get(registry: ClockRegistry): ClockViewFactory {
                            return getClockViewFactory(
                                activity = activity,
                                registry = registry,
                            )
                        }
                    },
                    getClockCarouselViewModel(activity),
                    getClockViewFactory(activity),
                    getDarkModeSnapshotRestorer(activity),
                    getThemedIconSnapshotRestorer(activity),
                    getThemedIconInteractor(),
@@ -297,59 +280,49 @@ open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInject
                .also { notificationsSnapshotRestorer = it }
    }

    override fun getClockRegistryProvider(context: Context): ClockRegistryProvider {
        return clockRegistryProvider
    override fun getClockRegistry(context: Context): ClockRegistry {
        return clockRegistry
            ?: ClockRegistryProvider(
                    context = context,
                    coroutineScope = GlobalScope,
                    mainDispatcher = Dispatchers.Main,
                    backgroundDispatcher = Dispatchers.IO,
                )
                .also { clockRegistryProvider = it }
                .get()
                .also { clockRegistry = it }
    }

    override fun getClockPickerInteractor(
        context: Context,
        clockRegistry: ClockRegistry,
    ): ClockPickerInteractor {
        return clockPickerInteractor
            ?: ClockPickerInteractor(
                    ClockPickerRepositoryImpl(
                        secureSettingsRepository = getSecureSettingsRepository(context),
                        registry = clockRegistry,
                        registry = getClockRegistry(context),
                        scope = GlobalScope,
                        backgroundDispatcher = Dispatchers.IO,
                    ),
                )
                .also { clockPickerInteractor = it }
    }

    override fun getClockSectionViewModel(
        context: Context,
        clockRegistry: ClockRegistry,
    ): ClockSectionViewModel {
    override fun getClockSectionViewModel(context: Context): ClockSectionViewModel {
        return clockSectionViewModel
            ?: ClockSectionViewModel(getClockPickerInteractor(context, clockRegistry)).also {
            ?: ClockSectionViewModel(getClockPickerInteractor(context)).also {
                clockSectionViewModel = it
            }
    }

    override fun getClockCarouselViewModel(
        context: Context,
        clockRegistry: ClockRegistry
    ): ClockCarouselViewModel {
    override fun getClockCarouselViewModel(context: Context): ClockCarouselViewModel {
        return clockCarouselViewModel
            ?: ClockCarouselViewModel(getClockPickerInteractor(context, clockRegistry)).also {
            ?: ClockCarouselViewModel(getClockPickerInteractor(context)).also {
                clockCarouselViewModel = it
            }
    }

    override fun getClockViewFactory(
        activity: Activity,
        registry: ClockRegistry,
    ): ClockViewFactory {
    override fun getClockViewFactory(activity: Activity): ClockViewFactory {
        return clockViewFactory
            ?: ClockViewFactory(activity, registry).also { clockViewFactory = it }
            ?: ClockViewFactory(activity, getClockRegistry(activity)).also { clockViewFactory = it }
    }

    protected fun getNotificationsInteractor(
@@ -426,12 +399,11 @@ open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInject

    override fun getClockSettingsViewModelFactory(
        context: Context,
        registry: ClockRegistry,
    ): ClockSettingsViewModel.Factory {
        return clockSettingsViewModelFactory
            ?: ClockSettingsViewModel.Factory(
                    context,
                    getClockPickerInteractor(context, registry),
                    getClockPickerInteractor(context),
                )
                .also { clockSettingsViewModelFactory = it }
    }
+1 −1
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ import kotlinx.coroutines.flow.Flow
 * clocks.
 */
interface ClockPickerRepository {
    val allClocks: Array<ClockMetadataModel>
    val allClocks: Flow<List<ClockMetadataModel>>

    val selectedClock: Flow<ClockMetadataModel>

+46 −32
Original line number Diff line number Diff line
@@ -17,64 +17,84 @@
package com.android.customization.picker.clock.data.repository

import android.provider.Settings
import android.util.Log
import com.android.customization.picker.clock.shared.ClockSize
import com.android.customization.picker.clock.shared.model.ClockMetadataModel
import com.android.systemui.plugins.ClockMetadata
import com.android.systemui.shared.clocks.ClockRegistry
import com.android.wallpaper.settings.data.repository.SecureSettingsRepository
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.flow.shareIn
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

/** Implementation of [ClockPickerRepository], using [ClockRegistry]. */
class ClockPickerRepositoryImpl(
    private val secureSettingsRepository: SecureSettingsRepository,
    private val registry: ClockRegistry,
    private val scope: CoroutineScope,
    private val backgroundDispatcher: CoroutineDispatcher,
    scope: CoroutineScope,
) : ClockPickerRepository {

    override val allClocks: Array<ClockMetadataModel> =
    @OptIn(ExperimentalCoroutinesApi::class)
    override val allClocks: Flow<List<ClockMetadataModel>> =
        callbackFlow {
                fun send() {
                    val allClocks =
                        registry
                            .getClocks()
                            .filter { "NOT_IN_USE" !in it.clockId }
                            .map { it.toModel(null) }
            .toTypedArray()
                    trySend(allClocks)
                }

                val listener =
                    object : ClockRegistry.ClockChangeListener {
                        override fun onAvailableClocksChanged() {
                            send()
                        }
                    }
                registry.registerClockChangeListener(listener)
                send()
                awaitClose { registry.unregisterClockChangeListener(listener) }
            }
            .mapLatest { allClocks ->
                // Loading list of clock plugins can cause many consecutive calls of
                // onAvailableClocksChanged(). We only care about the final fully-initiated clock
                // list. Delay to avoid unnecessary too many emits.
                delay(100)
                allClocks
            }

    /** The currently-selected clock. */
    override val selectedClock: Flow<ClockMetadataModel> =
        callbackFlow {
                suspend fun send() {
                    val currentClockId =
                        withContext(backgroundDispatcher) { registry.currentClockId }
                fun send() {
                    val currentClockId = registry.currentClockId
                    // It is possible that the model can be null since the full clock list is not
                    // initiated.
                    val model =
                        registry
                            .getClocks()
                            .find { clockMetadata -> clockMetadata.clockId == currentClockId }
                            ?.toModel(registry.seedColor)
                    if (model == null) {
                        Log.w(
                            TAG,
                            "Clock with ID \"$currentClockId\" not found!",
                        )
                    }
                    trySend(model)
                }

                val listener =
                    object : ClockRegistry.ClockChangeListener {
                        override fun onCurrentClockChanged() {
                            scope.launch { send() }
                            send()
                        }

                        override fun onAvailableClocksChanged() {
                            send()
                        }
                    }
                registry.registerClockChangeListener(listener)
@@ -105,19 +125,13 @@ class ClockPickerRepositoryImpl(
            )

    override suspend fun setClockSize(size: ClockSize) {
        withContext(backgroundDispatcher) {
        secureSettingsRepository.set(
            name = Settings.Secure.LOCKSCREEN_USE_DOUBLE_LINE_CLOCK,
            value = if (size == ClockSize.DYNAMIC) 1 else 0,
        )
    }
    }

    private fun ClockMetadata.toModel(color: Int?): ClockMetadataModel {
        return ClockMetadataModel(clockId = clockId, name = name, color = color)
    }

    companion object {
        private const val TAG = "ClockPickerRepositoryImpl"
    }
}
Loading