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

Commit 96cd3f68 authored by Jacky Wang's avatar Jacky Wang Committed by Android (Google) Code Review
Browse files

Merge "[Catalyst] Fix AppsStorageScreen" into main

parents 6c611e37 c348513f
Loading
Loading
Loading
Loading
+31 −36
Original line number Diff line number Diff line
@@ -19,23 +19,22 @@ package com.android.settings.spa.app.catalyst
import android.content.Context
import android.content.Intent
import android.os.Bundle
import com.android.settings.Settings.StorageUseActivity
import com.android.settings.flags.Flags
import com.android.settings.spa.app.storage.StorageType
import com.android.settingslib.metadata.PreferenceHierarchy
import com.android.settingslib.metadata.PreferenceHierarchyGenerator
import com.android.settingslib.metadata.PreferenceMetadata
import com.android.settingslib.metadata.ProvidePreferenceScreen
import com.android.settingslib.metadata.asyncPreferenceHierarchy
import com.android.settingslib.metadata.preferenceHierarchy
import com.android.settingslib.preference.PreferenceFragment
import com.android.settingslib.preference.PreferenceScreenCreator
import com.android.settingslib.spaprivileged.model.app.AppListRepositoryImpl
import com.android.settings.flags.Flags
import com.android.settings.spa.app.storage.StorageType
import com.android.settingslib.metadata.PreferenceMetadata
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.runBlocking

// future improvement = parameterize this to support apps (default) and games
@ProvidePreferenceScreen(AppStorageAppListScreen.KEY, parameterized = true)
class AppStorageAppListScreen(
    override val arguments: Bundle
) : PreferenceScreenCreator {
@ProvidePreferenceScreen(AppStorageAppListScreen.KEY)
class AppStorageAppListScreen : PreferenceScreenCreator, PreferenceHierarchyGenerator<Boolean> {

    override val key: String
        get() = KEY

@@ -48,35 +47,31 @@ class AppStorageAppListScreen(

    override fun fragmentClass() = PreferenceFragment::class.java

    override fun getLaunchIntent(context: Context, metadata: PreferenceMetadata?): Intent? {
        return Intent("com.android.settings.APP_STORAGE_SETTINGS")
            .setPackage(context.packageName)
    override fun getLaunchIntent(context: Context, metadata: PreferenceMetadata?): Intent? =
        when (metadata) {
            null -> Intent(context, StorageUseActivity::class.java)
            else -> null // not yet support highlight on specific app
        }

    override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(context, this) {
        val repo = AppListRepositoryImpl(context)
        val apps = runBlocking {
            repo.loadAndFilterApps(
                context.userId,
                arguments.getBoolean(KEY_INCLUDE_SYSTEM_APPS)
            )
        }.filter { app -> StorageType.Apps.filter(app) }
        for (app in apps) {
            addParameterizedScreen(
                AppInfoStorageScreen.KEY,
                Bundle(1).apply { putString("app", app.packageName) }
            )
    override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(context, this) {}

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

    override suspend fun generatePreferenceHierarchy(
        context: Context,
        type: Boolean, // whether to include system apps
    ): PreferenceHierarchy =
        asyncPreferenceHierarchy(context, this) {
            AppListRepositoryImpl(context).loadAndFilterApps(context.userId, type).forEach { app ->
                if (StorageType.Apps.filter(app)) {
                    val arguments = Bundle(1).apply { putString("app", app.packageName) }
                    +(AppInfoStorageScreen.KEY args arguments)
                }
            }
        }

    companion object {
        const val KEY = "app_storage_app_list"

        const val KEY_INCLUDE_SYSTEM_APPS = "include_system"

        @JvmStatic
        fun parameters(context: Context): Flow<Bundle> {
            return flowOf(Bundle(1).apply { putBoolean(KEY_INCLUDE_SYSTEM_APPS, true) })
        }
        const val KEY = "device_state_apps_storage"
    }
}