diff options
author | George Lin <giolin@google.com> | 2023-02-16 23:23:54 +0000 |
---|---|---|
committer | George Lin <giolin@google.com> | 2023-02-21 16:01:36 +0000 |
commit | d4daeff1624e96d8cba1f927b94ad6b6c718c6e3 (patch) | |
tree | 64c3f5e39a42d14672c0f40e726e72dabdbde07d | |
parent | 19878d12c6d70cf747a320728d9466780f5d4c46 (diff) | |
download | ThemePicker-d4daeff1624e96d8cba1f927b94ad6b6c718c6e3.tar.gz |
[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
13 files changed, 83 insertions, 358 deletions
diff --git a/src/com/android/customization/module/CustomizationInjector.kt b/src/com/android/customization/module/CustomizationInjector.kt index 90a213b6..c5f0b761 100644 --- a/src/com/android/customization/module/CustomizationInjector.kt +++ b/src/com/android/customization/module/CustomizationInjector.kt @@ -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 } diff --git a/src/com/android/customization/module/DefaultCustomizationSections.java b/src/com/android/customization/module/DefaultCustomizationSections.java index 7653095b..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.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, diff --git a/src/com/android/customization/module/ThemePickerInjector.kt b/src/com/android/customization/module/ThemePickerInjector.kt index 9a58d703..09466e3c 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.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 } } 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 f5001f09..bfe87c9c 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.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 { 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 d0186b24..00000000 --- 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 4aa5de44..7e53ac44 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.FrameLayout 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.systemui.shared.clocks.ClockRegistry 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 @@ class ClockCustomDemoFragment : AppbarFragment() { ): 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 ea267ab4..00000000 --- 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 12cef396..976907ba 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 android.view.ViewGroup 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.AppbarFragment 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 @@ class ClockSettingsFragment : AppbarFragment() { ) .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 e1982d7f..c50fe98b 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.content.Context 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 @@ class ClockSectionController( 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 669c0473..751661f3 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 @@ class ClockCarouselViewModel( @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 9a31ae95..f7fa9a5d 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 android.view.ViewStub 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.module.CustomizationSections 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 @@ class PreviewWithClockCarouselSectionController( 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 @@ class PreviewWithClockCarouselSectionController( 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 @@ class PreviewWithClockCarouselSectionController( 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 0ce97142..8d7ec30e 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 @@ class ClockCarouselViewModelTest { 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 2fe33092..3ab7c84d 100644 --- a/tests/src/com/android/customization/testing/TestCustomizationInjector.kt +++ b/tests/src/com/android/customization/testing/TestCustomizationInjector.kt @@ -48,7 +48,7 @@ class TestCustomizationInjector : TestInjector(), CustomizationInjector { 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 @@ class TestCustomizationInjector : TestInjector(), CustomizationInjector { .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 @@ class TestCustomizationInjector : TestInjector(), CustomizationInjector { .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 } } |