Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 506760c3 authored by George Lin's avatar George Lin
Browse files

[TP] Fix set clock id not working

Root cause is that the ViewModel's lifecycle should be with the
activity, but we accidentally make it as long as CustomizationSections
which is cached in the Injector that may outlive an activity.

Fixed by getting the view model in the section controller, which lives
with the activity lifecycle.

Test: tested that set clock id actually works
Bug: 281082328
Change-Id: I4a17434a170f3521c9d6b345792280defc254928
parent 7a7175d0
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@ public final class DefaultCustomizationSections implements CustomizationSections
            mKeyguardQuickAffordancePickerViewModelFactory;
    private final NotificationSectionViewModel.Factory mNotificationSectionViewModelFactory;
    private final BaseFlags mFlags;
    private final ClockCarouselViewModel mClockCarouselViewModel;
    private final ClockCarouselViewModel.Factory mClockCarouselViewModelFactory;
    private final ClockViewFactory mClockViewFactory;
    private final DarkModeSnapshotRestorer mDarkModeSnapshotRestorer;
    private final ThemedIconSnapshotRestorer mThemedIconSnapshotRestorer;
@@ -68,7 +68,7 @@ public final class DefaultCustomizationSections implements CustomizationSections
                    keyguardQuickAffordancePickerViewModelFactory,
            NotificationSectionViewModel.Factory notificationSectionViewModelFactory,
            BaseFlags flags,
            ClockCarouselViewModel clockCarouselViewModel,
            ClockCarouselViewModel.Factory clockCarouselViewModelFactory,
            ClockViewFactory clockViewFactory,
            DarkModeSnapshotRestorer darkModeSnapshotRestorer,
            ThemedIconSnapshotRestorer themedIconSnapshotRestorer,
@@ -79,7 +79,7 @@ public final class DefaultCustomizationSections implements CustomizationSections
                keyguardQuickAffordancePickerViewModelFactory;
        mNotificationSectionViewModelFactory = notificationSectionViewModelFactory;
        mFlags = flags;
        mClockCarouselViewModel = clockCarouselViewModel;
        mClockCarouselViewModelFactory = clockCarouselViewModelFactory;
        mClockViewFactory = clockViewFactory;
        mDarkModeSnapshotRestorer = darkModeSnapshotRestorer;
        mThemedIconSnapshotRestorer = themedIconSnapshotRestorer;
@@ -112,7 +112,7 @@ public final class DefaultCustomizationSections implements CustomizationSections
                        wallpaperInfoFactory,
                        wallpaperColorsViewModel,
                        displayUtils,
                        mClockCarouselViewModel,
                        mClockCarouselViewModelFactory,
                        mClockViewFactory,
                        wallpaperPreviewNavigator,
                        sectionNavigationController,
+3 −9
Original line number Diff line number Diff line
@@ -117,14 +117,6 @@ open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInject
    private var gridScreenViewModelFactory: GridScreenViewModel.Factory? = null

    override fun getCustomizationSections(activity: ComponentActivity): CustomizationSections {
        val clockCarouselViewModel =
            ViewModelProvider(
                    activity,
                    getClockCarouselViewModelFactory(
                        getClockPickerInteractor(activity.applicationContext),
                    ),
                )
                .get() as ClockCarouselViewModel
        return customizationSections
            ?: DefaultCustomizationSections(
                    getColorPickerViewModelFactory(
@@ -137,7 +129,9 @@ open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInject
                        interactor = getNotificationsInteractor(activity),
                    ),
                    getFlags(),
                    clockCarouselViewModel,
                    getClockCarouselViewModelFactory(
                        getClockPickerInteractor(activity.applicationContext),
                    ),
                    getClockViewFactory(activity),
                    getDarkModeSnapshotRestorer(activity),
                    getThemedIconSnapshotRestorer(activity),
+13 −4
Original line number Diff line number Diff line
@@ -17,15 +17,17 @@

package com.android.customization.picker.preview.ui.section

import android.app.Activity
import android.content.Context
import android.os.Bundle
import android.view.View
import android.view.View.OnAttachStateChangeListener
import android.view.ViewGroup
import android.view.ViewStub
import androidx.activity.ComponentActivity
import androidx.constraintlayout.helper.widget.Carousel
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.get
import androidx.lifecycle.lifecycleScope
import com.android.customization.picker.clock.ui.binder.ClockCarouselViewBinder
import com.android.customization.picker.clock.ui.fragment.ClockSettingsFragment
@@ -48,13 +50,13 @@ import kotlinx.coroutines.launch

/** Controls the screen preview section. */
class PreviewWithClockCarouselSectionController(
    activity: Activity,
    activity: ComponentActivity,
    private val lifecycleOwner: LifecycleOwner,
    private val screen: CustomizationSections.Screen,
    wallpaperInfoFactory: CurrentWallpaperInfoFactory,
    colorViewModel: WallpaperColorsViewModel,
    displayUtils: DisplayUtils,
    private val clockCarouselViewModel: ClockCarouselViewModel,
    clockCarouselViewModelFactory: ClockCarouselViewModel.Factory,
    private val clockViewFactory: ClockViewFactory,
    wallpaperPreviewNavigator: WallpaperPreviewNavigator,
    private val navigationController: CustomizationSectionNavigationController,
@@ -71,6 +73,13 @@ class PreviewWithClockCarouselSectionController(
        wallpaperInteractor,
    ) {

    private val viewModel =
        ViewModelProvider(
                activity,
                clockCarouselViewModelFactory,
            )
            .get() as ClockCarouselViewModel

    private var clockColorAndSizeButton: View? = null

    override val hideLockScreenClockPreview = true
@@ -111,7 +120,7 @@ class PreviewWithClockCarouselSectionController(
                                ClockCarouselViewBinder.bind(
                                    carouselView = carouselView,
                                    singleClockView = singleClockView,
                                    viewModel = clockCarouselViewModel,
                                    viewModel = viewModel,
                                    clockViewFactory = clockViewFactory,
                                    lifecycleOwner = lifecycleOwner,
                                    hideSmartspace = ::hideSmartspace,