summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Lin <giolin@google.com>2023-02-16 23:23:54 +0000
committerGeorge Lin <giolin@google.com>2023-02-21 16:01:36 +0000
commitd4daeff1624e96d8cba1f927b94ad6b6c718c6e3 (patch)
tree64c3f5e39a42d14672c0f40e726e72dabdbde07d
parent19878d12c6d70cf747a320728d9466780f5d4c46 (diff)
downloadThemePicker-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
-rw-r--r--src/com/android/customization/module/CustomizationInjector.kt28
-rw-r--r--src/com/android/customization/module/DefaultCustomizationSections.java27
-rw-r--r--src/com/android/customization/module/ThemePickerInjector.kt60
-rw-r--r--src/com/android/customization/picker/clock/data/repository/ClockRegistryProvider.kt24
-rw-r--r--src/com/android/customization/picker/clock/ui/fragment/ClockCarouselDemoFragment.kt68
-rw-r--r--src/com/android/customization/picker/clock/ui/fragment/ClockCustomDemoFragment.kt33
-rw-r--r--src/com/android/customization/picker/clock/ui/fragment/ClockCustomFragment.java76
-rw-r--r--src/com/android/customization/picker/clock/ui/fragment/ClockSettingsFragment.kt29
-rw-r--r--src/com/android/customization/picker/clock/ui/section/ClockSectionController.kt13
-rw-r--r--src/com/android/customization/picker/clock/ui/viewmodel/ClockCarouselViewModel.kt13
-rw-r--r--src/com/android/customization/picker/preview/ui/section/PreviewWithClockCarouselSectionController.kt23
-rw-r--r--tests/src/com/android/customization/picker/clock/ui/viewmodel/ClockCarouselViewModelTest.kt3
-rw-r--r--tests/src/com/android/customization/testing/TestCustomizationInjector.kt44
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 }
}