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

Commit 0a106426 authored by Josh's avatar Josh Committed by Joshua Mokut
Browse files

Added State to remember app shortcuts modified

Adding a state to recall app shortcuts customized by the user in the
current customization session. This is ground work for custom shortcut
sorting logic in follow-up CLs.

Test: ShortcutCustomizationModeRepositoryTest
Test: ShortcutCustomizationInteractorTest
Flag: com.android.systemui.extended_apps_shortcut_category
Bug: 407506063
Change-Id: Ieb444f5148535f9776abd0dece90bc3be6fcb01e
parent 9702183b
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -53,7 +53,7 @@ class ShortcutCustomizationModeRepositoryTest : SysuiTestCase() {
        testScope.runTest {
            val customizationMode by collectLastValue(repo.isCustomizationModeEnabled)
            helper.showFromActivity()
            repo.toggleCustomizationMode(isCustomizing = true)
            repo.toggleCustomizationMode(isEnabled = true)
            assertThat(customizationMode).isTrue()
        }
    }
@@ -63,8 +63,8 @@ class ShortcutCustomizationModeRepositoryTest : SysuiTestCase() {
        testScope.runTest {
            val customizationMode by collectLastValue(repo.isCustomizationModeEnabled)
            helper.showFromActivity()
            repo.toggleCustomizationMode(isCustomizing = true)
            repo.toggleCustomizationMode(isCustomizing = false)
            repo.toggleCustomizationMode(isEnabled = true)
            repo.toggleCustomizationMode(isEnabled = false)
            assertThat(customizationMode).isFalse()
        }
    }
@@ -74,7 +74,7 @@ class ShortcutCustomizationModeRepositoryTest : SysuiTestCase() {
        testScope.runTest {
            val customizationMode by collectLastValue(repo.isCustomizationModeEnabled)
            helper.showFromActivity()
            repo.toggleCustomizationMode(isCustomizing = true)
            repo.toggleCustomizationMode(isEnabled = true)
            helper.hideFromActivity()
            assertThat(customizationMode).isFalse()
        }
+0 −1
Original line number Diff line number Diff line
@@ -324,7 +324,6 @@ constructor(
        )
    }

    @VisibleForTesting
    fun getShortcutBeingCustomized(): ShortcutCustomizationRequestInfo? {
        return _shortcutBeingCustomized.value
    }
+43 −8
Original line number Diff line number Diff line
@@ -16,23 +16,58 @@

package com.android.systemui.keyboard.shortcut.data.repository

import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.keyboard.shortcut.shared.model.AppShortcutCustomizationState
import com.android.systemui.keyboard.shortcut.shared.model.AppShortcutInfo
import com.android.systemui.keyboard.shortcut.shared.model.ShortcutHelperState
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.stateIn

class ShortcutHelperCustomizationModeRepository
@Inject
constructor(shortcutHelperStateRepository: ShortcutHelperStateRepository) {
    private val _isCustomizationModeEnabled = MutableStateFlow(false)
constructor(
    shortcutHelperStateRepository: ShortcutHelperStateRepository,
    @Background backgroundScope: CoroutineScope,
) {
    private val _isCustomizationModeRequested = MutableStateFlow(false)
    private val appShortcutsPreCustomizationStates =
        hashMapOf<AppShortcutInfo, AppShortcutCustomizationState>()

    val isCustomizationModeEnabled =
        combine(_isCustomizationModeEnabled, shortcutHelperStateRepository.state) {
            isCustomizationModeEnabled,
        combine(_isCustomizationModeRequested, shortcutHelperStateRepository.state) {
                isCustomizationModeRequested,
                shortcutHelperState ->
            isCustomizationModeEnabled && shortcutHelperState is ShortcutHelperState.Active
                isCustomizationModeRequested && shortcutHelperState is ShortcutHelperState.Active
            }
            .stateIn(scope = backgroundScope, started = SharingStarted.Lazily, initialValue = false)

    fun toggleCustomizationMode(isEnabled: Boolean) {
        _isCustomizationModeRequested.value = isEnabled

        if (!isCustomizationModeEnabled.value) {
            appShortcutsPreCustomizationStates.clear()
        }
    }

    fun updateAppShortcutPreCustomizationState(
        appShortcutInfo: AppShortcutInfo,
        previousCustomizationState: AppShortcutCustomizationState,
    ) {
        if (
            isCustomizationModeEnabled.value &&
                !appShortcutsPreCustomizationStates.contains(appShortcutInfo)
        ) {
            appShortcutsPreCustomizationStates[appShortcutInfo] = previousCustomizationState
        }
    }

    fun toggleCustomizationMode(isCustomizing: Boolean) {
        _isCustomizationModeEnabled.value = isCustomizing
    fun getPreCustomizationStateForAppShortcut(
        appShortcutInfo: AppShortcutInfo
    ): AppShortcutCustomizationState? {
        return appShortcutsPreCustomizationStates[appShortcutInfo]
    }
}
+41 −3
Original line number Diff line number Diff line
@@ -17,16 +17,27 @@
package com.android.systemui.keyboard.shortcut.domain.interactor

import com.android.systemui.keyboard.shared.model.ShortcutCustomizationRequestResult
import com.android.systemui.keyboard.shared.model.ShortcutCustomizationRequestResult.SUCCESS
import com.android.systemui.keyboard.shortcut.data.repository.CustomShortcutCategoriesRepository
import com.android.systemui.keyboard.shortcut.data.repository.ShortcutHelperCustomizationModeRepository
import com.android.systemui.keyboard.shortcut.data.repository.ShortcutHelperKeys
import com.android.systemui.keyboard.shortcut.shared.model.AppShortcutCustomizationState
import com.android.systemui.keyboard.shortcut.shared.model.AppShortcutInfo
import com.android.systemui.keyboard.shortcut.shared.model.KeyCombination
import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType.AppCategories
import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCustomizationRequestInfo
import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCustomizationRequestInfo.SingleShortcutCustomization
import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCustomizationRequestInfo.SingleShortcutCustomization.Add
import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCustomizationRequestInfo.SingleShortcutCustomization.Delete
import com.android.systemui.keyboard.shortcut.shared.model.ShortcutKey
import javax.inject.Inject

class ShortcutCustomizationInteractor
@Inject
constructor(private val customShortcutRepository: CustomShortcutCategoriesRepository) {
constructor(
    private val customShortcutRepository: CustomShortcutCategoriesRepository,
    private val customizationModeRepository: ShortcutHelperCustomizationModeRepository,
) {
    val pressedKeys = customShortcutRepository.pressedKeys

    fun updateUserSelectedKeyCombination(keyCombination: KeyCombination?) {
@@ -43,11 +54,15 @@ constructor(private val customShortcutRepository: CustomShortcutCategoriesReposi

    suspend fun confirmAndSetShortcutCurrentlyBeingCustomized():
        ShortcutCustomizationRequestResult {
        return customShortcutRepository.confirmAndSetShortcutCurrentlyBeingCustomized()
        return customShortcutRepository.confirmAndSetShortcutCurrentlyBeingCustomized().also {
            if (it == SUCCESS) updateAppShortcutsModifiedInCurrentCustomizationSession()
        }
    }

    suspend fun deleteShortcutCurrentlyBeingCustomized(): ShortcutCustomizationRequestResult {
        return customShortcutRepository.deleteShortcutCurrentlyBeingCustomized()
        return customShortcutRepository.deleteShortcutCurrentlyBeingCustomized().also {
            if (it == SUCCESS) updateAppShortcutsModifiedInCurrentCustomizationSession()
        }
    }

    suspend fun resetAllCustomShortcuts(): ShortcutCustomizationRequestResult {
@@ -56,4 +71,27 @@ constructor(private val customShortcutRepository: CustomShortcutCategoriesReposi

    suspend fun isSelectedKeyCombinationAvailable(): Boolean =
        customShortcutRepository.isSelectedKeyCombinationAvailable()

    private fun updateAppShortcutsModifiedInCurrentCustomizationSession() {
        val shortcutBeingCustomized =
            customShortcutRepository.getShortcutBeingCustomized() as SingleShortcutCustomization

        with (shortcutBeingCustomized) {
            if (categoryType == AppCategories) {
                customizationModeRepository.updateAppShortcutPreCustomizationState(
                    appShortcutInfo =
                        AppShortcutInfo(
                            label,
                            packageName,
                            className,
                        ),
                    previousCustomizationState =
                        when (this) {
                            is Add -> AppShortcutCustomizationState.NOT_CUSTOMIZED
                            is Delete -> AppShortcutCustomizationState.CUSTOMIZED
                        },
                )
            }
        }
    }
}
+27 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 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.systemui.keyboard.shortcut.shared.model

data class AppShortcutInfo(val label: String, val packageName: String, val className: String)

/**
 * Represents the customization state of a shortcut to open an app - Shortcuts in App Category.
 */
enum class AppShortcutCustomizationState {
    NOT_CUSTOMIZED,
    CUSTOMIZED,
}
Loading