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

Commit d4daeff1 authored by George Lin's avatar George Lin
Browse files

[TP] ClockRegistry do not wait for plugin manager connected

We no longer need to wait for plugin connected to  use the clock
registry since we can now directly listen to clock list updates from the
clock registry.

1. Remove the suspend func in ClockRegistryProvider
2. Remove all the related providers that wait for the clock registry to
   be ready

Test: Manually test that the clock carousel shows as expected
Bug: 269656371
Change-Id: I73fe5e4222105916cee2a4c489ad915d40459373
parent 19878d12
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,
+17 −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,57 +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,
                    ),
                )
                .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 = it }
            ?: 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(
@@ -424,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 }
    }
+2 −22
Original line number Diff line number Diff line
@@ -19,9 +19,7 @@ import android.app.NotificationManager
import android.content.ComponentName
import android.content.Context
import android.view.LayoutInflater
import com.android.systemui.plugins.ClockProviderPlugin
import com.android.systemui.plugins.Plugin
import com.android.systemui.plugins.PluginListener
import com.android.systemui.plugins.PluginManager
import com.android.systemui.shared.clocks.ClockRegistry
import com.android.systemui.shared.clocks.DefaultClockProvider
@@ -34,7 +32,6 @@ import com.android.systemui.shared.system.UncaughtExceptionPreHandlerManager_Fac
import java.util.concurrent.Executors
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.suspendCancellableCoroutine

/**
 * Provide the [ClockRegistry] singleton. Note that we need to make sure that the [PluginManager]
@@ -61,25 +58,8 @@ class ClockRegistryProvider(
            .apply { registerListeners() }
    }

    suspend fun get(): ClockRegistry {
        return suspendCancellableCoroutine { continuation ->
            val pluginListener =
                object : PluginListener<ClockProviderPlugin> {
                    var hasConnected = false
                    override fun onPluginConnected(
                        plugin: ClockProviderPlugin?,
                        pluginContext: Context?
                    ) {
                        if (!hasConnected) {
                            pluginManager.removePluginListener(this)
                            hasConnected = true
                            continuation.resumeWith(Result.success(clockRegistry))
                        }
                    }
                }
            pluginManager.addPluginListener(pluginListener, ClockProviderPlugin::class.java, true)
            continuation.invokeOnCancellation { pluginManager.removePluginListener(pluginListener) }
        }
    fun get(): ClockRegistry {
        return clockRegistry
    }

    private fun createPluginManager(context: Context): PluginManager {
+0 −68
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 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.customization.picker.clock.ui.fragment

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.lifecycleScope
import com.android.customization.module.ThemePickerInjector
import com.android.customization.picker.clock.ui.binder.ClockCarouselViewBinder
import com.android.customization.picker.clock.ui.view.ClockCarouselView
import com.android.customization.picker.clock.ui.viewmodel.ClockCarouselViewModel
import com.android.wallpaper.R
import com.android.wallpaper.module.InjectorProvider
import com.android.wallpaper.picker.AppbarFragment
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

class ClockCarouselDemoFragment : AppbarFragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        val injector = InjectorProvider.getInjector() as ThemePickerInjector
        val view = inflater.inflate(R.layout.fragment_clock_carousel_demo, container, false)
        setUpToolbar(view)
        val carouselView = view.requireViewById<ClockCarouselView>(R.id.image_carousel_view)
        lifecycleScope.launch {
            val registry =
                withContext(Dispatchers.IO) {
                    injector.getClockRegistryProvider(requireContext()).get()
                }
            ClockCarouselViewBinder.bind(
                view = carouselView,
                viewModel = ClockCarouselViewModel(
                    injector.getClockPickerInteractor(requireContext(), registry),
                ),
                clockViewFactory = { clockId ->
                    registry.createExampleClock(clockId)?.largeClock?.view!!
                },
                lifecycleOwner = this@ClockCarouselDemoFragment,
            )
        }

        return view
    }

    override fun getDefaultTitle(): CharSequence {
        return "Clock H-scroll Demo"
    }
}
Loading