[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
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 }
}