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

Commit 0df3e12b authored by Catherine Liang's avatar Catherine Liang
Browse files

Adjust quick affordance section controller to use base flags (2/3)

The quick affordance section controller currently calls runBlocking when
initializing to query flags and check if the feature is available.
However, fragments and section controllers should be getting System UI
flags using base flags, which queries and caches the flags when a flag
is first needed. In addition, the runBlocking function is suspected to
be the cause of the reported crash within the bug.

In this CL, the quick affordance section controller, interactor &
repository are adjusted to remove the flag querying, and the flag is
read from base flags instead in the section controller.

Bug: 296856318
Bug: 290849013
Test: adjusted unit tests for this change and made sure they still pass,
verified manually that quick affordance section controller remains

Change-Id: Ic469396f4a959a339efebec7cfbaaf37f8b404e3
parent 81d4ddba
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -24,7 +24,6 @@ import com.android.customization.picker.notifications.ui.section.NotificationSec
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.PreviewWithThemeSectionController;
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;
import com.android.customization.picker.settings.ui.section.MoreSettingsSectionController;
@@ -49,7 +48,6 @@ import java.util.List;
public final class DefaultCustomizationSections implements CustomizationSections {

    private final ColorPickerViewModel.Factory mColorPickerViewModelFactory;
    private final KeyguardQuickAffordancePickerInteractor mKeyguardQuickAffordancePickerInteractor;
    private final KeyguardQuickAffordancePickerViewModel.Factory
            mKeyguardQuickAffordancePickerViewModelFactory;
    private final NotificationSectionViewModel.Factory mNotificationSectionViewModelFactory;
@@ -63,7 +61,6 @@ public final class DefaultCustomizationSections implements CustomizationSections

    public DefaultCustomizationSections(
            ColorPickerViewModel.Factory colorPickerViewModelFactory,
            KeyguardQuickAffordancePickerInteractor keyguardQuickAffordancePickerInteractor,
            KeyguardQuickAffordancePickerViewModel.Factory
                    keyguardQuickAffordancePickerViewModelFactory,
            NotificationSectionViewModel.Factory notificationSectionViewModelFactory,
@@ -75,7 +72,6 @@ public final class DefaultCustomizationSections implements CustomizationSections
            ThemedIconInteractor themedIconInteractor,
            ColorPickerInteractor colorPickerInteractor) {
        mColorPickerViewModelFactory = colorPickerViewModelFactory;
        mKeyguardQuickAffordancePickerInteractor = keyguardQuickAffordancePickerInteractor;
        mKeyguardQuickAffordancePickerViewModelFactory =
                keyguardQuickAffordancePickerViewModelFactory;
        mNotificationSectionViewModelFactory = notificationSectionViewModelFactory;
@@ -166,7 +162,6 @@ public final class DefaultCustomizationSections implements CustomizationSections
                sectionControllers.add(
                        new KeyguardQuickAffordanceSectionController(
                                sectionNavigationController,
                                mKeyguardQuickAffordancePickerInteractor,
                                new ViewModelProvider(
                                        activity,
                                        mKeyguardQuickAffordancePickerViewModelFactory)
+1 −2
Original line number Diff line number Diff line
@@ -136,7 +136,6 @@ internal constructor(
                        context = activity,
                        wallpaperColorsRepository = getWallpaperColorsRepository(),
                    ),
                    getKeyguardQuickAffordancePickerInteractor(activity),
                    getKeyguardQuickAffordancePickerViewModelFactory(activity),
                    NotificationSectionViewModel.Factory(
                        interactor = getNotificationsInteractor(activity),
@@ -256,7 +255,7 @@ internal constructor(
        val client = getKeyguardQuickAffordancePickerProviderClient(context)
        val appContext = context.applicationContext
        return KeyguardQuickAffordancePickerInteractor(
            KeyguardQuickAffordancePickerRepository(client, bgDispatcher),
            KeyguardQuickAffordancePickerRepository(client),
            client
        ) {
            getKeyguardQuickAffordanceSnapshotRestorer(appContext)
+0 −20
Original line number Diff line number Diff line
@@ -21,11 +21,8 @@ import com.android.customization.picker.quickaffordance.shared.model.KeyguardQui
import com.android.customization.picker.quickaffordance.shared.model.KeyguardQuickAffordancePickerSelectionModel as SelectionModel
import com.android.customization.picker.quickaffordance.shared.model.KeyguardQuickAffordancePickerSlotModel as SlotModel
import com.android.systemui.shared.customization.data.content.CustomizationProviderClient as Client
import com.android.systemui.shared.customization.data.content.CustomizationProviderContract as Contract
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.withContext

/**
 * Abstracts access to application state related to functionality for selecting, picking, or setting
@@ -33,12 +30,7 @@ import kotlinx.coroutines.withContext
 */
class KeyguardQuickAffordancePickerRepository(
    private val client: Client,
    private val backgroundDispatcher: CoroutineDispatcher,
) {
    /** Whether the feature is enabled. */
    val isFeatureEnabled: Flow<Boolean> =
        client.observeFlags().map { flags -> flags.isFeatureEnabled() }

    /** List of slots available on the device. */
    val slots: Flow<List<SlotModel>> =
        client.observeSlots().map { slots -> slots.map { slot -> slot.toModel() } }
@@ -55,18 +47,6 @@ class KeyguardQuickAffordancePickerRepository(
            selections.map { selection -> selection.toModel() }
        }

    suspend fun isFeatureEnabled(): Boolean {
        return withContext(backgroundDispatcher) { client.queryFlags().isFeatureEnabled() }
    }

    private fun List<Client.Flag>.isFeatureEnabled(): Boolean {
        return find { flag ->
                flag.name ==
                    Contract.FlagsTable.FLAG_NAME_CUSTOM_LOCK_SCREEN_QUICK_AFFORDANCES_ENABLED
            }
            ?.value == true
    }

    private fun Client.Slot.toModel(): SlotModel {
        return SlotModel(
            id = id,
+0 −5
Original line number Diff line number Diff line
@@ -78,9 +78,4 @@ class KeyguardQuickAffordancePickerInteractor(
    ): Drawable {
        return client.getAffordanceIcon(iconResourceId)
    }

    /** Returns `true` if the feature is enabled; `false` otherwise. */
    suspend fun isFeatureEnabled(): Boolean {
        return repository.isFeatureEnabled()
    }
}
+2 −6
Original line number Diff line number Diff line
@@ -20,27 +20,23 @@ package com.android.customization.picker.quickaffordance.ui.section
import android.content.Context
import android.view.LayoutInflater
import androidx.lifecycle.LifecycleOwner
import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor
import com.android.customization.picker.quickaffordance.ui.binder.KeyguardQuickAffordanceSectionViewBinder
import com.android.customization.picker.quickaffordance.ui.fragment.KeyguardQuickAffordancePickerFragment
import com.android.customization.picker.quickaffordance.ui.view.KeyguardQuickAffordanceSectionView
import com.android.customization.picker.quickaffordance.ui.viewmodel.KeyguardQuickAffordancePickerViewModel
import com.android.wallpaper.R
import com.android.wallpaper.config.BaseFlags
import com.android.wallpaper.model.CustomizationSectionController
import com.android.wallpaper.model.CustomizationSectionController.CustomizationSectionNavigationController as NavigationController
import kotlinx.coroutines.runBlocking

class KeyguardQuickAffordanceSectionController(
    private val navigationController: NavigationController,
    private val interactor: KeyguardQuickAffordancePickerInteractor,
    private val viewModel: KeyguardQuickAffordancePickerViewModel,
    private val lifecycleOwner: LifecycleOwner,
) : CustomizationSectionController<KeyguardQuickAffordanceSectionView> {

    private val isFeatureEnabled: Boolean = runBlocking { interactor.isFeatureEnabled() }

    override fun isAvailable(context: Context): Boolean {
        return isFeatureEnabled
        return BaseFlags.get().isKeyguardQuickAffordanceEnabled(context)
    }

    override fun createView(context: Context): KeyguardQuickAffordanceSectionView {
Loading