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

Commit 8df2445f authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[Catalyst] Simplify DeviceStateAppFunctionService" into main

parents f14d0656 149908ae
Loading
Loading
Loading
Loading
+21 −88
Original line number Diff line number Diff line
@@ -38,11 +38,10 @@ import com.android.settingslib.metadata.PersistentPreference
import com.android.settingslib.metadata.PreferenceHierarchy
import com.android.settingslib.metadata.PreferenceScreenCoordinate
import com.android.settingslib.metadata.PreferenceHierarchyGenerator
import com.android.settingslib.metadata.PreferenceMetadata
import com.android.settingslib.metadata.PreferenceScreenMetadata
import com.android.settingslib.metadata.PreferenceScreenRegistry
import com.android.settingslib.metadata.PreferenceSummaryProvider
import com.android.settingslib.metadata.PreferenceTitleProvider
import com.android.settingslib.metadata.getPreferenceScreenTitle
import com.android.settingslib.metadata.getPreferenceSummary
import com.google.android.appfunctions.schema.common.v1.devicestate.DeviceStateItem
import com.google.android.appfunctions.schema.common.v1.devicestate.DeviceStateResponse
import com.google.android.appfunctions.schema.common.v1.devicestate.LocalizedString
@@ -136,44 +135,23 @@ class DeviceStateAppFunctionService : AppFunctionService() {
        val screenMetaData =
            PreferenceScreenRegistry.create(
                applicationContext,
                PreferenceScreenCoordinate(screenKey, null)
            )
        if (screenMetaData == null) {
            return null
        }
                PreferenceScreenCoordinate(screenKey, null),
            ) ?: return null
        val deviceStateItemList: MutableList<DeviceStateItem> = ArrayList()
        val hierarchy = (screenMetaData as? PreferenceHierarchyGenerator<*>)
            ?.asyncHierarchy(perScreenConfig)
            ?: screenMetaData.getPreferenceHierarchy(applicationContext)
        hierarchy.forEachRecursively {
        screenMetaData.getPreferenceHierarchy().forEachRecursively {
            val metadata = it.metadata
            val config = settingConfigMap[metadata.key]
            // skip over explicitly disabled preferences
            if (!(config?.enabled ?: true)) {
                return@forEachRecursively
            }
            val jsonValue = (metadata as? PersistentPreference<*>)?.let {
                when (metadata.valueType) {
                    Int::class.javaObjectType -> metadata.storage(applicationContext)
                        .getInt("")
            if (config?.enabled == false) return@forEachRecursively
            val jsonValue =
                when (metadata) {
                    is PersistentPreference<*> ->
                        metadata
                            .storage(applicationContext)
                            .getValue(metadata.key, metadata.valueType as Class<Any>)
                            .toString()

                    Boolean::class.javaObjectType -> metadata.storage(applicationContext)
                        .getBoolean("").toString()

                    Long::class.javaObjectType -> metadata.storage(applicationContext)
                        .getLong("")
                        .toString()

                    Float::class.javaObjectType -> metadata.storage(applicationContext)
                        .getLong("")
                        .toString()

                    String::class.javaObjectType -> metadata.storage(applicationContext)
                        .getString("")
                    else -> getSummary(applicationContext, metadata)
                    else -> metadata.getPreferenceSummary(applicationContext)?.toString()
                }
            } ?: getSummary(applicationContext, metadata)
            deviceStateItemList.add(
                DeviceStateItem(
                    key = metadata.key,
@@ -187,63 +165,18 @@ class DeviceStateAppFunctionService : AppFunctionService() {

        val launchingIntent = screenMetaData.getLaunchIntent(applicationContext, null)
        return PerScreenDeviceStates(
            description = getScreenTitle(screenMetaData) ?: "",
            description = screenMetaData.getPreferenceScreenTitle(applicationContext)?.toString()
                ?: "",
            deviceStateItems = deviceStateItemList,
            intentUri = launchingIntent?.toUri(Intent.URI_INTENT_SCHEME)
        )
    }

    private suspend fun PreferenceHierarchyGenerator<*>.asyncHierarchy(
        config: PerScreenConfig
    ): PreferenceHierarchy {
        return when (config.defaultType) {
            Boolean::class.java -> (this as PreferenceHierarchyGenerator<Boolean>)
                .generatePreferenceHierarchy(
                    applicationContext,
                    config.defaultTypeValue as Boolean
                )
            Int::class.java -> (this as PreferenceHierarchyGenerator<Int>)
                .generatePreferenceHierarchy(
                    applicationContext,
                    config.defaultTypeValue as Int
                )
            else -> generatePreferenceHierarchy(applicationContext)
        }
    }

    private fun getScreenTitle(metadata: PreferenceScreenMetadata): String? {
        val screenTitleRes = metadata.screenTitle
        if (screenTitleRes != 0) {
            return tryGetStringRes(screenTitleRes)
        }
        metadata.getScreenTitle(applicationContext)?.let {
            return it.toString()
        }
        val dynamicTitle = (metadata as? PreferenceTitleProvider)?.getTitle(applicationContext)
        if (dynamicTitle != null) {
            return dynamicTitle.toString()
        }
        val titleRes = metadata.title
        if (titleRes != 0) {
            return tryGetStringRes(titleRes)
        }
        return null
    }

    private fun getSummary(context: Context, metadata: PreferenceMetadata): String? {
        return if (metadata.summary != 0) {
            tryGetStringRes(metadata.summary)
        } else {
            (metadata as? PreferenceSummaryProvider)?.getSummary(context).toString()
        }
    }

    private fun tryGetStringRes(resId: Int): String {
        return try {
            applicationContext.getString(resId)
        } catch (_: Resources.NotFoundException) {
            ""
        }
    private suspend fun PreferenceScreenMetadata.getPreferenceHierarchy(): PreferenceHierarchy =
        when (this) {
            is PreferenceHierarchyGenerator<*> ->
                generatePreferenceHierarchy(applicationContext, defaultType)
            else -> getPreferenceHierarchy(applicationContext)
        }

    private fun getLocalizedString(resId: Int): LocalizedString? {
+0 −6
Original line number Diff line number Diff line
@@ -83,16 +83,12 @@ data class DeviceStateItemConfig(
 * @param enabled whether expose device states on this screen to App Functions.
 * @param screenKey the unique ID for the screen.
 * @param category the device state category of the screen. The default is UNCATEGORIZED.
 * @param defaultType class type associated with [PreferenceHierarchyGenerator] for PreferenceScreen
 * @param defaultTypeValue value to pass in to [PreferenceHierarchyGenerator.generatePreferenceHierarchy]
 */
data class PerScreenConfig(
    val enabled: Boolean,
    val screenKey: String,
    // TODO(b/405344827): map categories to PreferenceMetadata#tags
    val category: Set<DeviceStateCategory> = setOf(DeviceStateCategory.UNCATEGORIZED),
    val defaultType: Class<*>? = null,
    val defaultTypeValue: Any? = null
)

fun getScreenConfigs() = listOf(
@@ -223,8 +219,6 @@ fun getScreenConfigs() = listOf(
        enabled = true,
        screenKey = AppStorageAppListScreen.KEY,
        category = setOf(DeviceStateCategory.STORAGE),
        defaultType = Boolean::class.java,
        defaultTypeValue = false, // do not include system apps
    ),
    PerScreenConfig(
        enabled = true,
+3 −6
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ import com.android.settings.spa.app.storage.StorageType
import com.android.settingslib.applications.StorageStatsSource
import com.android.settingslib.datastore.KeyValueStore
import com.android.settingslib.datastore.NoOpKeyedObservable
import com.android.settingslib.metadata.PersistentPreference
import com.android.settingslib.metadata.LongValuePreference
import com.android.settingslib.metadata.PreferenceHierarchy
import com.android.settingslib.metadata.PreferenceHierarchyGenerator
import com.android.settingslib.metadata.PreferenceMetadata
@@ -54,10 +54,10 @@ class AppInfoStorageScreen(
    private val context: Context,
    override val arguments: Bundle
) : PreferenceScreenCreator,
    LongValuePreference,
    PreferenceHierarchyGenerator<Int>,
    PreferenceSummaryProvider,
    PreferenceTitleProvider,
    PersistentPreference<Long> {
    PreferenceTitleProvider {


    private val appInfo by lazy {
@@ -67,9 +67,6 @@ class AppInfoStorageScreen(
    override val key: String
        get() = KEY

    override val valueType: Class<Long>
        get() = Long::class.javaObjectType

    override val sensitivityLevel: @SensitivityLevel Int
        get() = SensitivityLevel.NO_SENSITIVITY

+1 −1
Original line number Diff line number Diff line
@@ -59,7 +59,7 @@ class AppStorageAppListScreen : PreferenceScreenCreator, PreferenceHierarchyGene
    override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(context, this) {}

    override val defaultType: Boolean
        get() = true // include system apps
        get() = false // do not include system apps

    override suspend fun generatePreferenceHierarchy(
        context: Context,