diff --git a/src/com/android/customization/module/ThemePickerInjector.kt b/src/com/android/customization/module/ThemePickerInjector.kt index 89f023329ecfb59ead710129b5af97f2d2437217..3c85afbce36cd507c7e09daa3a3b32af172ff356 100644 --- a/src/com/android/customization/module/ThemePickerInjector.kt +++ b/src/com/android/customization/module/ThemePickerInjector.kt @@ -99,11 +99,6 @@ open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInject private var keyguardQuickAffordanceSnapshotRestorer: KeyguardQuickAffordanceSnapshotRestorer? = null private var notificationsSnapshotRestorer: NotificationsSnapshotRestorer? = null - /** - * Mapping from LifeCycleOwner's hashcode to ClockRegistry as we need to keep different - * ClockRegistries per LifeCycle to ensure proper cleanup - */ - private var clockRegistries: MutableMap = HashMap() private var clockPickerInteractor: ClockPickerInteractor? = null private var clockSectionViewModel: ClockSectionViewModel? = null private var clockCarouselViewModelFactory: ClockCarouselViewModel.Factory? = null @@ -122,6 +117,7 @@ open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInject private var gridInteractor: GridInteractor? = null private var gridSnapshotRestorer: GridSnapshotRestorer? = null private var gridScreenViewModelFactory: GridScreenViewModel.Factory? = null + private var clockRegistryProvider: ClockRegistryProvider? = null override fun getCustomizationSections(activity: ComponentActivity): CustomizationSections { return customizationSections @@ -344,26 +340,15 @@ open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInject } override fun getClockRegistry(context: Context, lifecycleOwner: LifecycleOwner): ClockRegistry { - return clockRegistries[lifecycleOwner.hashCode()] - ?: ClockRegistryProvider( - context = context, - coroutineScope = getApplicationCoroutineScope(), - mainDispatcher = Dispatchers.Main, - backgroundDispatcher = Dispatchers.IO, - ) - .get() - .also { - clockRegistries[lifecycleOwner.hashCode()] = it - lifecycleOwner.lifecycle.addObserver( - object : DefaultLifecycleObserver { - override fun onDestroy(owner: LifecycleOwner) { - super.onDestroy(owner) - clockRegistries[lifecycleOwner.hashCode()]?.unregisterListeners() - clockRegistries.remove(lifecycleOwner.hashCode()) - } - } + return (clockRegistryProvider + ?: ClockRegistryProvider( + context = context, + coroutineScope = getApplicationCoroutineScope(), + mainDispatcher = Dispatchers.Main, + backgroundDispatcher = Dispatchers.IO, ) - } + .also { clockRegistryProvider = it }) + .getForOwner(lifecycleOwner) } override fun getClockPickerInteractor( 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 e35911745df2f526a93e384f65868a315578bb96..52c3c4e38d74aaddecf2158b57222959ab71a81f 100644 --- a/src/com/android/customization/picker/clock/data/repository/ClockRegistryProvider.kt +++ b/src/com/android/customization/picker/clock/data/repository/ClockRegistryProvider.kt @@ -19,6 +19,8 @@ import android.app.NotificationManager import android.content.ComponentName import android.content.Context import android.view.LayoutInflater +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner import com.android.systemui.plugins.Plugin import com.android.systemui.plugins.PluginManager import com.android.systemui.shared.clocks.ClockRegistry @@ -43,6 +45,7 @@ class ClockRegistryProvider( private val mainDispatcher: CoroutineDispatcher, private val backgroundDispatcher: CoroutineDispatcher, ) { + private val lifecycleOwners = mutableSetOf() private val pluginManager: PluginManager by lazy { createPluginManager(context) } private val clockRegistry: ClockRegistry by lazy { ClockRegistry( @@ -60,10 +63,32 @@ class ClockRegistryProvider( .apply { registerListeners() } } - fun get(): ClockRegistry { + fun getForOwner(lifecycleOwner: LifecycleOwner): ClockRegistry { + registerLifecycleOwner(lifecycleOwner) return clockRegistry } + private fun registerLifecycleOwner(lifecycleOwner: LifecycleOwner) { + lifecycleOwners.add(lifecycleOwner.hashCode()) + + lifecycleOwner.lifecycle.addObserver( + object : DefaultLifecycleObserver { + override fun onDestroy(owner: LifecycleOwner) { + super.onDestroy(owner) + unregisterLifecycleOwner(owner) + } + } + ) + } + + private fun unregisterLifecycleOwner(lifecycleOwner: LifecycleOwner) { + lifecycleOwners.remove(lifecycleOwner.hashCode()) + + if (lifecycleOwners.isEmpty()) { + clockRegistry.unregisterListeners() + } + } + private fun createPluginManager(context: Context): PluginManager { val privilegedPlugins = listOf() val isDebugDevice = true