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

Commit 61e9d75d authored by Anton Potapov's avatar Anton Potapov Committed by Android (Google) Code Review
Browse files

Merge "Allow removing the last app from home controls" into tm-qpr-dev

parents 7f05e1a9 c5ab56c5
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -172,12 +172,6 @@ interface ControlsController : UserAwareController {
     */
    fun removeFavorites(componentName: ComponentName): Boolean

    /**
     * Checks if the favorites can be removed. You can't remove components from the preferred list.
     * @param componentName the name of the service that provides the [Control]
     */
    fun canRemoveFavorites(componentName: ComponentName): Boolean

    /**
     * Replaces the favorites for the given structure.
     *
+18 −17
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import com.android.systemui.controls.ControlStatus
import com.android.systemui.controls.ControlsServiceInfo
import com.android.systemui.controls.management.ControlsListingController
import com.android.systemui.controls.panels.AuthorizedPanelsRepository
import com.android.systemui.controls.panels.SelectedComponentRepository
import com.android.systemui.controls.ui.ControlsUiController
import com.android.systemui.controls.ui.SelectedItem
import com.android.systemui.dagger.SysUISingleton
@@ -58,6 +59,7 @@ class ControlsControllerImpl @Inject constructor (
        private val context: Context,
        @Background private val executor: DelayableExecutor,
        private val uiController: ControlsUiController,
        private val selectedComponentRepository: SelectedComponentRepository,
        private val bindingController: ControlsBindingController,
        private val listingController: ControlsListingController,
        private val userFileManager: UserFileManager,
@@ -497,18 +499,15 @@ class ControlsControllerImpl @Inject constructor (
        }
    }

    override fun canRemoveFavorites(componentName: ComponentName): Boolean =
            !authorizedPanelsRepository.getPreferredPackages().contains(componentName.packageName)

    override fun removeFavorites(componentName: ComponentName): Boolean {
        if (!confirmAvailability()) return false
        if (!canRemoveFavorites(componentName)) return false

        executor.execute {
            Favorites.removeStructures(componentName)
            authorizedPanelsRepository.removeAuthorizedPanels(setOf(componentName.packageName))
            if (Favorites.removeStructures(componentName)) {
                persistenceWrapper.storeFavorites(Favorites.getAllStructures())
            }
            authorizedPanelsRepository.removeAuthorizedPanels(setOf(componentName.packageName))
        }
        return true
    }

@@ -574,7 +573,9 @@ class ControlsControllerImpl @Inject constructor (
    }

    override fun setPreferredSelection(selectedItem: SelectedItem) {
        uiController.updatePreferences(selectedItem)
        selectedComponentRepository.setSelectedComponent(
                SelectedComponentRepository.SelectedComponent(selectedItem)
        )
    }

    override fun dump(pw: PrintWriter, args: Array<out String>) {
+7 −0
Original line number Diff line number Diff line
@@ -36,6 +36,8 @@ import com.android.systemui.controls.management.ControlsProviderSelectorActivity
import com.android.systemui.controls.management.ControlsRequestDialog
import com.android.systemui.controls.panels.AuthorizedPanelsRepository
import com.android.systemui.controls.panels.AuthorizedPanelsRepositoryImpl
import com.android.systemui.controls.panels.SelectedComponentRepository
import com.android.systemui.controls.panels.SelectedComponentRepositoryImpl
import com.android.systemui.controls.settings.ControlsSettingsDialogManager
import com.android.systemui.controls.settings.ControlsSettingsDialogManagerImpl
import com.android.systemui.controls.ui.ControlActionCoordinator
@@ -114,6 +116,11 @@ abstract class ControlsModule {
        repository: AuthorizedPanelsRepositoryImpl
    ): AuthorizedPanelsRepository

    @Binds
    abstract fun providePreferredPanelRepository(
        repository: SelectedComponentRepositoryImpl
    ): SelectedComponentRepository

    @BindsOptionalOf
    abstract fun optionalPersistenceWrapper(): ControlsFavoritePersistenceWrapper

+16 −3
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ package com.android.systemui.controls.panels
import android.content.Context
import android.content.SharedPreferences
import com.android.systemui.R
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.settings.UserFileManager
import com.android.systemui.settings.UserTracker
import com.android.systemui.statusbar.policy.DeviceControlsControllerImpl
@@ -30,7 +32,8 @@ class AuthorizedPanelsRepositoryImpl
constructor(
    private val context: Context,
    private val userFileManager: UserFileManager,
    private val userTracker: UserTracker
    private val userTracker: UserTracker,
    private val featureFlags: FeatureFlags,
) : AuthorizedPanelsRepository {

    override fun getAuthorizedPanels(): Set<String> {
@@ -71,8 +74,18 @@ constructor(
                userTracker.userId,
            )

        // If we've never run this (i.e., the key doesn't exist), add the default packages
        if (sharedPref.getStringSet(KEY, null) == null) {
        // We should add default packages in two cases:
        // 1) We've never run this
        // 2) APP_PANELS_REMOVE_APPS_ALLOWED got disabled after user removed all apps
        val needToSetup =
            if (featureFlags.isEnabled(Flags.APP_PANELS_REMOVE_APPS_ALLOWED)) {
                sharedPref.getStringSet(KEY, null) == null
            } else {
                // There might be an empty set that need to be overridden after the feature has been
                // turned off after being turned on
                sharedPref.getStringSet(KEY, null).isNullOrEmpty()
            }
        if (needToSetup) {
            sharedPref.edit().putStringSet(KEY, getPreferredPackages()).apply()
        }
        return sharedPref
+64 −0
Original line number Diff line number Diff line
/*
 * 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.systemui.controls.panels

import android.content.ComponentName
import com.android.systemui.controls.ui.ControlsUiController
import com.android.systemui.controls.ui.SelectedItem
import com.android.systemui.flags.Flags

/** Stores user-selected preferred component. */
interface SelectedComponentRepository {

    /**
     * Returns currently set preferred component, or null when nothing is set. Consider using
     * [ControlsUiController.getPreferredSelectedItem] to get domain specific data
     */
    fun getSelectedComponent(): SelectedComponent?

    /** Sets preferred component. Use [getSelectedComponent] to get current one */
    fun setSelectedComponent(selectedComponent: SelectedComponent)

    /** Clears current preferred component. [getSelectedComponent] will return null afterwards */
    fun removeSelectedComponent()

    /**
     * Return true when default preferred component should be set up and false the otherwise. This
     * is always true when [Flags.APP_PANELS_REMOVE_APPS_ALLOWED] is disabled
     */
    fun shouldAddDefaultComponent(): Boolean

    /**
     * Sets if default component should be added. This is ignored when
     * [Flags.APP_PANELS_REMOVE_APPS_ALLOWED] is disabled
     */
    fun setShouldAddDefaultComponent(shouldAdd: Boolean)

    data class SelectedComponent(
        val name: String,
        val componentName: ComponentName?,
        val isPanel: Boolean,
    ) {
        constructor(
            selectedItem: SelectedItem
        ) : this(
            name = selectedItem.name.toString(),
            componentName = selectedItem.componentName,
            isPanel = selectedItem is SelectedItem.PanelItem,
        )
    }
}
Loading