[TP] ClockRegistry do not wait for plugin manager connected am: d4daeff162

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/ThemePicker/+/21468441

Change-Id: I8ff49e04816963c4d6b92b0ad1a09412dddcf431
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/src/com/android/customization/module/CustomizationInjector.kt b/src/com/android/customization/module/CustomizationInjector.kt
index 90a213b..c5f0b76 100644
--- a/src/com/android/customization/module/CustomizationInjector.kt
+++ b/src/com/android/customization/module/CustomizationInjector.kt
@@ -21,7 +21,6 @@
 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 @@
         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 @@
         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
 }
diff --git a/src/com/android/customization/module/DefaultCustomizationSections.java b/src/com/android/customization/module/DefaultCustomizationSections.java
index 7653095..482ece01 100644
--- a/src/com/android/customization/module/DefaultCustomizationSections.java
+++ b/src/com/android/customization/module/DefaultCustomizationSections.java
@@ -16,14 +16,13 @@
 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 @@
             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 @@
                     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 @@
                 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 @@
                         wallpaperInfoFactory,
                         wallpaperColorsViewModel,
                         displayUtils,
-                        mClockRegistryProvider,
-                        mClockCarouselViewModelProvider,
-                        mClockViewFactoryProvider,
+                        mClockCarouselViewModel,
+                        mClockViewFactory,
                         sectionNavigationController)
                         : new ScreenPreviewSectionController(
                                 activity,
diff --git a/src/com/android/customization/module/ThemePickerInjector.kt b/src/com/android/customization/module/ThemePickerInjector.kt
index 9a58d70..09466e3 100644
--- a/src/com/android/customization/module/ThemePickerInjector.kt
+++ b/src/com/android/customization/module/ThemePickerInjector.kt
@@ -52,8 +52,6 @@
 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 @@
     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 @@
                         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 @@
                 .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 @@
 
     override fun getClockSettingsViewModelFactory(
         context: Context,
-        registry: ClockRegistry,
     ): ClockSettingsViewModel.Factory {
         return clockSettingsViewModelFactory
             ?: ClockSettingsViewModel.Factory(
                     context,
-                    getClockPickerInteractor(context, registry),
+                    getClockPickerInteractor(context),
                 )
                 .also { clockSettingsViewModelFactory = it }
     }
diff --git a/src/com/android/customization/picker/clock/data/repository/ClockRegistryProvider.kt b/src/com/android/customization/picker/clock/data/repository/ClockRegistryProvider.kt
index f5001f0..bfe87c9 100644
--- a/src/com/android/customization/picker/clock/data/repository/ClockRegistryProvider.kt
+++ b/src/com/android/customization/picker/clock/data/repository/ClockRegistryProvider.kt
@@ -19,9 +19,7 @@
 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 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 @@
             .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 {
diff --git a/src/com/android/customization/picker/clock/ui/fragment/ClockCarouselDemoFragment.kt b/src/com/android/customization/picker/clock/ui/fragment/ClockCarouselDemoFragment.kt
deleted file mode 100644
index d0186b2..0000000
--- a/src/com/android/customization/picker/clock/ui/fragment/ClockCarouselDemoFragment.kt
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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"
-    }
-}
diff --git a/src/com/android/customization/picker/clock/ui/fragment/ClockCustomDemoFragment.kt b/src/com/android/customization/picker/clock/ui/fragment/ClockCustomDemoFragment.kt
index 4aa5de4..7e53ac4 100644
--- a/src/com/android/customization/picker/clock/ui/fragment/ClockCustomDemoFragment.kt
+++ b/src/com/android/customization/picker/clock/ui/fragment/ClockCustomDemoFragment.kt
@@ -13,7 +13,6 @@
 import android.widget.TextView
 import android.widget.Toast
 import androidx.core.view.setPadding
-import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.android.customization.module.ThemePickerInjector
@@ -23,9 +22,6 @@
 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 ClockCustomDemoFragment : AppbarFragment() {
     @VisibleForTesting lateinit var recyclerView: RecyclerView
@@ -38,27 +34,20 @@
     ): View {
         val view = inflater.inflate(R.layout.fragment_clock_custom_picker_demo, container, false)
         setUpToolbar(view)
-        lifecycleScope.launch {
-            clockRegistry =
-                withContext(Dispatchers.IO) {
-                    (InjectorProvider.getInjector() as ThemePickerInjector)
-                        .getClockRegistryProvider(requireContext())
-                        .get()
-                }
-            val listInUse = clockRegistry.getClocks().filter { "NOT_IN_USE" !in it.clockId }
-            recyclerView.adapter =
-                ClockRecyclerAdapter(listInUse, requireContext()) {
-                    clockRegistry.currentClockId = it.clockId
-                    Toast.makeText(context, "${it.name} selected", Toast.LENGTH_SHORT).show()
-                }
-        }
-        return view
-    }
+        clockRegistry =
+            (InjectorProvider.getInjector() as ThemePickerInjector).getClockRegistry(
+                requireContext()
+            )
+        val listInUse = clockRegistry.getClocks().filter { "NOT_IN_USE" !in it.clockId }
 
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         recyclerView = view.requireViewById(R.id.clock_preview_card_list_demo)
         recyclerView.layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
-        super.onViewCreated(view, savedInstanceState)
+        recyclerView.adapter =
+            ClockRecyclerAdapter(listInUse, requireContext()) {
+                clockRegistry.currentClockId = it.clockId
+                Toast.makeText(context, "${it.name} selected", Toast.LENGTH_SHORT).show()
+            }
+        return view
     }
 
     override fun getDefaultTitle(): CharSequence {
diff --git a/src/com/android/customization/picker/clock/ui/fragment/ClockCustomFragment.java b/src/com/android/customization/picker/clock/ui/fragment/ClockCustomFragment.java
deleted file mode 100644
index ea267ab..0000000
--- a/src/com/android/customization/picker/clock/ui/fragment/ClockCustomFragment.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2022 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 static com.android.wallpaper.widget.BottomActionBar.BottomAction.APPLY;
-import static com.android.wallpaper.widget.BottomActionBar.BottomAction.INFORMATION;
-
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.android.customization.model.clock.custom.ClockCustomManager;
-import com.android.customization.model.clock.custom.ClockOption;
-import com.android.customization.widget.OptionSelectorController;
-import com.android.wallpaper.R;
-import com.android.wallpaper.picker.AppbarFragment;
-import com.android.wallpaper.widget.BottomActionBar;
-
-import com.google.common.collect.Lists;
-
-/**
- * Fragment that contains the main UI for selecting and applying a custom clock.
- */
-public class ClockCustomFragment extends AppbarFragment {
-
-    OptionSelectorController<ClockOption> mClockSelectorController;
-
-    @Nullable
-    @Override
-    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
-            @Nullable Bundle savedInstanceState) {
-        View view = inflater.inflate(R.layout.fragment_clock_custom_picker, container, false);
-
-        setUpToolbar(view);
-
-        RecyclerView clockPreviewCardList = view.requireViewById(R.id.clock_preview_card_list);
-
-        mClockSelectorController = new OptionSelectorController<>(clockPreviewCardList,
-                Lists.newArrayList(new ClockOption(), new ClockOption(), new ClockOption(),
-                        new ClockOption(), new ClockOption()), false,
-                OptionSelectorController.CheckmarkStyle.CENTER_CHANGE_COLOR_WHEN_NOT_SELECTED);
-        mClockSelectorController.initOptions(new ClockCustomManager());
-
-        return view;
-    }
-
-    @Override
-    public CharSequence getDefaultTitle() {
-        return getString(R.string.clock_title);
-    }
-
-    @Override
-    protected void onBottomActionBarReady(BottomActionBar bottomActionBar) {
-        super.onBottomActionBarReady(bottomActionBar);
-        bottomActionBar.showActionsOnly(INFORMATION, APPLY);
-        bottomActionBar.show();
-    }
-}
diff --git a/src/com/android/customization/picker/clock/ui/fragment/ClockSettingsFragment.kt b/src/com/android/customization/picker/clock/ui/fragment/ClockSettingsFragment.kt
index 12cef39..976907b 100644
--- a/src/com/android/customization/picker/clock/ui/fragment/ClockSettingsFragment.kt
+++ b/src/com/android/customization/picker/clock/ui/fragment/ClockSettingsFragment.kt
@@ -22,7 +22,6 @@
 import androidx.cardview.widget.CardView
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.get
-import androidx.lifecycle.lifecycleScope
 import com.android.customization.module.ThemePickerInjector
 import com.android.customization.picker.clock.ui.binder.ClockSettingsBinder
 import com.android.wallpaper.R
@@ -32,11 +31,8 @@
 import com.android.wallpaper.picker.customization.ui.binder.ScreenPreviewBinder
 import com.android.wallpaper.picker.customization.ui.viewmodel.ScreenPreviewViewModel
 import com.android.wallpaper.util.PreviewUtils
-import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.launch
 import kotlinx.coroutines.suspendCancellableCoroutine
-import kotlinx.coroutines.withContext
 
 @OptIn(ExperimentalCoroutinesApi::class)
 class ClockSettingsFragment : AppbarFragment() {
@@ -106,22 +102,15 @@
             )
             .show()
 
-        lifecycleScope.launch {
-            val registry =
-                withContext(Dispatchers.IO) { injector.getClockRegistryProvider(context).get() }
-            ClockSettingsBinder.bind(
-                view,
-                ViewModelProvider(
-                        requireActivity(),
-                        injector.getClockSettingsViewModelFactory(
-                            context = context,
-                            registry = registry,
-                        ),
-                    )
-                    .get(),
-                this@ClockSettingsFragment,
-            )
-        }
+        ClockSettingsBinder.bind(
+            view,
+            ViewModelProvider(
+                    requireActivity(),
+                    injector.getClockSettingsViewModelFactory(context),
+                )
+                .get(),
+            this@ClockSettingsFragment,
+        )
 
         return view
     }
diff --git a/src/com/android/customization/picker/clock/ui/section/ClockSectionController.kt b/src/com/android/customization/picker/clock/ui/section/ClockSectionController.kt
index e1982d7..c50fe98 100644
--- a/src/com/android/customization/picker/clock/ui/section/ClockSectionController.kt
+++ b/src/com/android/customization/picker/clock/ui/section/ClockSectionController.kt
@@ -19,26 +19,22 @@
 import android.view.LayoutInflater
 import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.lifecycleScope
-import com.android.customization.module.ThemePickerInjector
-import com.android.customization.picker.clock.data.repository.ClockRegistryProvider
 import com.android.customization.picker.clock.ui.binder.ClockSectionViewBinder
 import com.android.customization.picker.clock.ui.fragment.ClockSettingsFragment
 import com.android.customization.picker.clock.ui.view.ClockSectionView
+import com.android.customization.picker.clock.ui.viewmodel.ClockSectionViewModel
 import com.android.wallpaper.R
 import com.android.wallpaper.config.BaseFlags
 import com.android.wallpaper.model.CustomizationSectionController
 import com.android.wallpaper.model.CustomizationSectionController.CustomizationSectionNavigationController
-import com.android.wallpaper.module.InjectorProvider
-import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
 
 /** A [CustomizationSectionController] for clock customization. */
 class ClockSectionController(
     private val navigationController: CustomizationSectionNavigationController,
     private val lifecycleOwner: LifecycleOwner,
     private val flag: BaseFlags,
-    private val clockRegistryProvider: ClockRegistryProvider,
+    private val viewModel: ClockSectionViewModel,
 ) : CustomizationSectionController<ClockSectionView> {
 
     override fun isAvailable(context: Context): Boolean {
@@ -53,12 +49,9 @@
                     null,
                 ) as ClockSectionView
         lifecycleOwner.lifecycleScope.launch {
-            val registry = withContext(Dispatchers.IO) { clockRegistryProvider.get() }
             ClockSectionViewBinder.bind(
                 view = view,
-                viewModel =
-                    (InjectorProvider.getInjector() as ThemePickerInjector)
-                        .getClockSectionViewModel(context, registry),
+                viewModel = viewModel,
                 lifecycleOwner = lifecycleOwner
             ) { navigationController.navigateTo(ClockSettingsFragment()) }
         }
diff --git a/src/com/android/customization/picker/clock/ui/viewmodel/ClockCarouselViewModel.kt b/src/com/android/customization/picker/clock/ui/viewmodel/ClockCarouselViewModel.kt
index 669c047..751661f 100644
--- a/src/com/android/customization/picker/clock/ui/viewmodel/ClockCarouselViewModel.kt
+++ b/src/com/android/customization/picker/clock/ui/viewmodel/ClockCarouselViewModel.kt
@@ -16,12 +16,10 @@
 package com.android.customization.picker.clock.ui.viewmodel
 
 import com.android.customization.picker.clock.domain.interactor.ClockPickerInteractor
-import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.flatMapLatest
-import kotlinx.coroutines.flow.flowOn
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.mapLatest
 import kotlinx.coroutines.flow.mapNotNull
@@ -32,12 +30,11 @@
 
     @OptIn(ExperimentalCoroutinesApi::class)
     val allClockIds: Flow<List<String>> =
-        interactor.allClocks
-            .mapLatest { clockArray ->
-                // Delay to avoid the case that the full list of clocks is not initiated.
-                delay(CLOCKS_EVENT_UPDATE_DELAY_MILLIS)
-                clockArray.map { it.clockId }
-            }
+        interactor.allClocks.mapLatest { clockArray ->
+            // Delay to avoid the case that the full list of clocks is not initiated.
+            delay(CLOCKS_EVENT_UPDATE_DELAY_MILLIS)
+            clockArray.map { it.clockId }
+        }
 
     @OptIn(ExperimentalCoroutinesApi::class)
     val selectedIndex: Flow<Int> =
diff --git a/src/com/android/customization/picker/preview/ui/section/PreviewWithClockCarouselSectionController.kt b/src/com/android/customization/picker/preview/ui/section/PreviewWithClockCarouselSectionController.kt
index 9a31ae9..f7fa9a5 100644
--- a/src/com/android/customization/picker/preview/ui/section/PreviewWithClockCarouselSectionController.kt
+++ b/src/com/android/customization/picker/preview/ui/section/PreviewWithClockCarouselSectionController.kt
@@ -23,12 +23,10 @@
 import androidx.core.view.isGone
 import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.lifecycleScope
-import com.android.customization.picker.clock.data.repository.ClockRegistryProvider
 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.view.ClockViewFactory
 import com.android.customization.picker.clock.ui.viewmodel.ClockCarouselViewModel
-import com.android.systemui.shared.clocks.ClockRegistry
 import com.android.wallpaper.R
 import com.android.wallpaper.model.CustomizationSectionController
 import com.android.wallpaper.model.WallpaperColorsViewModel
@@ -37,13 +35,9 @@
 import com.android.wallpaper.picker.customization.ui.section.ScreenPreviewSectionController
 import com.android.wallpaper.picker.customization.ui.section.ScreenPreviewView
 import com.android.wallpaper.util.DisplayUtils
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
 
 /** Controls the screen preview section. */
-@OptIn(ExperimentalCoroutinesApi::class)
 class PreviewWithClockCarouselSectionController(
     activity: Activity,
     private val lifecycleOwner: LifecycleOwner,
@@ -51,9 +45,8 @@
     wallpaperInfoFactory: CurrentWallpaperInfoFactory,
     colorViewModel: WallpaperColorsViewModel,
     displayUtils: DisplayUtils,
-    private val clockRegistryProvider: ClockRegistryProvider,
-    private val clockCarouselViewModelProvider: ClockCarouselViewModelProvider,
-    private val clockViewFactoryProvider: ClockViewFactoryProvider,
+    private val clockCarouselViewModel: ClockCarouselViewModel,
+    private val clockViewFactory: ClockViewFactory,
     navigator: CustomizationSectionController.CustomizationSectionNavigationController,
 ) :
     ScreenPreviewSectionController(
@@ -77,12 +70,10 @@
         val carouselView: ClockCarouselView = carouselViewStub.inflate() as ClockCarouselView
         carouselView.isGone = true
         lifecycleOwner.lifecycleScope.launch {
-            val registry = withContext(Dispatchers.IO) { clockRegistryProvider.get() }
-            val clockViewFactory = clockViewFactoryProvider.get(registry)
             clockCarouselBinding =
                 ClockCarouselViewBinder.bind(
                     view = carouselView,
-                    viewModel = clockCarouselViewModelProvider.get(registry),
+                    viewModel = clockCarouselViewModel,
                     clockViewFactory = { clockId -> clockViewFactory.getView(clockId) },
                     lifecycleOwner = lifecycleOwner,
                 )
@@ -101,12 +92,4 @@
             clockCarouselBinding?.hide()
         }
     }
-
-    interface ClockCarouselViewModelProvider {
-        fun get(registry: ClockRegistry): ClockCarouselViewModel
-    }
-
-    interface ClockViewFactoryProvider {
-        fun get(registry: ClockRegistry): ClockViewFactory
-    }
 }
diff --git a/tests/src/com/android/customization/picker/clock/ui/viewmodel/ClockCarouselViewModelTest.kt b/tests/src/com/android/customization/picker/clock/ui/viewmodel/ClockCarouselViewModelTest.kt
index 0ce9714..8d7ec30 100644
--- a/tests/src/com/android/customization/picker/clock/ui/viewmodel/ClockCarouselViewModelTest.kt
+++ b/tests/src/com/android/customization/picker/clock/ui/viewmodel/ClockCarouselViewModelTest.kt
@@ -44,8 +44,7 @@
     fun setUp() {
         val testDispatcher = StandardTestDispatcher()
         Dispatchers.setMain(testDispatcher)
-        underTest =
-            ClockCarouselViewModel(ClockPickerInteractor(FakeClockPickerRepository()))
+        underTest = ClockCarouselViewModel(ClockPickerInteractor(FakeClockPickerRepository()))
     }
 
     @After
diff --git a/tests/src/com/android/customization/testing/TestCustomizationInjector.kt b/tests/src/com/android/customization/testing/TestCustomizationInjector.kt
index 2fe3309..3ab7c84 100644
--- a/tests/src/com/android/customization/testing/TestCustomizationInjector.kt
+++ b/tests/src/com/android/customization/testing/TestCustomizationInjector.kt
@@ -48,7 +48,7 @@
     private var customizationProviderClient: CustomizationProviderClient? = null
     private var keyguardQuickAffordanceSnapshotRestorer: KeyguardQuickAffordanceSnapshotRestorer? =
         null
-    private var clockRegistryProvider: ClockRegistryProvider? = null
+    private var clockRegistry: ClockRegistry? = null
     private var clockPickerInteractor: ClockPickerInteractor? = null
     private var clockSectionViewModel: ClockSectionViewModel? = null
     private var clockViewFactory: ClockViewFactory? = null
@@ -142,29 +142,23 @@
                 .also { keyguardQuickAffordanceSnapshotRestorer = it }
     }
 
-    override fun getClockRegistryProvider(context: Context): ClockRegistryProvider {
-        return clockRegistryProvider
-            ?: ClockRegistryProvider(context, GlobalScope, Dispatchers.Main, Dispatchers.IO).also {
-                clockRegistryProvider = it
-            }
+    override fun getClockRegistry(context: Context): ClockRegistry {
+        return clockRegistry
+            ?: ClockRegistryProvider(context, GlobalScope, Dispatchers.Main, Dispatchers.IO)
+                .get()
+                .also { clockRegistry = it }
     }
 
-    override fun getClockPickerInteractor(
-        context: Context,
-        clockRegistry: ClockRegistry
-    ): ClockPickerInteractor {
+    override fun getClockPickerInteractor(context: Context): ClockPickerInteractor {
         return clockPickerInteractor
             ?: ClockPickerInteractor(FakeClockPickerRepository()).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
             }
     }
@@ -190,31 +184,25 @@
                 .also { colorPickerViewModelFactory = 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 }
     }
 
     override fun getClockSettingsViewModelFactory(
         context: Context,
-        registry: ClockRegistry
     ): ClockSettingsViewModel.Factory {
         return clockSettingsViewModelFactory
             ?: ClockSettingsViewModel.Factory(
                     context,
-                    getClockPickerInteractor(context, registry),
+                    getClockPickerInteractor(context),
                 )
                 .also { clockSettingsViewModelFactory = it }
     }