Loading AndroidManifest.xml +9 −9 Original line number Diff line number Diff line Loading @@ -3555,7 +3555,7 @@ <provider android:name="androidx.core.content.FileProvider" android:authorities="com.android.settings.files" android:authorities="${applicationId}.files" android:grantUriPermissions="true" android:exported="false"> <meta-data Loading @@ -3565,13 +3565,13 @@ <provider android:name=".deviceinfo.legal.ModuleLicenseProvider" android:authorities="com.android.settings.module_licenses" android:authorities="${applicationId}.module_licenses" android:grantUriPermissions="true" android:exported="false"/> <provider android:name=".emergency.EmergencyActionContentProvider" android:authorities="com.android.settings.emergency" android:authorities="${applicationId}.emergency" android:permission="android.permission.CALL_PRIVILEGED" android:exported="true"/> Loading Loading @@ -3685,7 +3685,7 @@ <provider android:name=".search.SettingsSearchIndexablesProvider" android:authorities="com.android.settings" android:authorities="${applicationId}" android:multiprocess="false" android:grantUriPermissions="true" android:permission="android.permission.READ_SEARCH_INDEXABLES" Loading @@ -3697,7 +3697,7 @@ <provider android:name=".dashboard.suggestions.SuggestionStateProvider" android:authorities="com.android.settings.suggestions.status" android:authorities="${applicationId}.suggestions.status" android:exported="true"> <intent-filter> <action android:name="com.android.settings.action.SUGGESTION_STATE_PROVIDER" /> Loading Loading @@ -3940,7 +3940,7 @@ <provider android:name=".dashboard.SummaryProvider" android:authorities="com.android.settings.dashboard.SummaryProvider"> android:authorities="${applicationId}.dashboard.SummaryProvider"> </provider> <activity android:name=".backup.UserBackupSettingsActivity" Loading Loading @@ -4327,7 +4327,7 @@ </activity> <provider android:name=".slices.SettingsSliceProvider" android:authorities="com.android.settings.slices;android.settings.slices" android:authorities="${applicationId}.slices;android.settings.slices" android:exported="true" android:grantUriPermissions="true" /> Loading Loading @@ -4369,13 +4369,13 @@ <provider android:name=".homepage.contextualcards.CardContentProvider" android:authorities="com.android.settings.homepage.CardContentProvider" android:authorities="${applicationId}.homepage.CardContentProvider" android:exported="true" android:permission="android.permission.WRITE_SETTINGS_HOMEPAGE_DATA" /> <provider android:name=".homepage.contextualcards.SettingsContextualCardProvider" android:authorities="com.android.settings.homepage.contextualcards" android:authorities="${applicationId}.homepage.contextualcards" android:permission="android.permission.WRITE_SETTINGS_HOMEPAGE_DATA" android:exported="true"> <intent-filter> Loading TEST_MAPPING +5 −0 Original line number Diff line number Diff line { "presubmit": [ { "name": "SettingsSpaUnitTests" } ], "postsubmit": [ { "name": "SettingsUnitTests", Loading src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java +14 −0 Original line number Diff line number Diff line Loading @@ -630,6 +630,20 @@ public class AppInfoDashboardFragment extends DashboardFragment .launch(); } /** Starts app info fragment from SPA pages. */ public static void startAppInfoFragment( Class<?> destination, ApplicationInfo app, Context context, int sourceMetricsCategory) { // start new fragment to display extended information Bundle args = new Bundle(); args.putString(ARG_PACKAGE_NAME, app.packageName); args.putInt(ARG_PACKAGE_UID, app.uid); new SubSettingLauncher(context) .setDestination(destination.getName()) .setArguments(args) .setSourceMetricsCategory(sourceMetricsCategory) .launch(); } private void onPackageRemoved() { getActivity().finishActivity(SUB_INFO_FRAGMENT); getActivity().finishAndRemoveTask(); Loading src/com/android/settings/spa/app/appinfo/AppInfoSettings.kt +1 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,7 @@ private fun AppInfoSettings(packageInfoPresenter: PackageInfoPresenter) { AppButtons(packageInfoPresenter) AppPermissionPreference(app) AppStoragePreference(app) Category(title = stringResource(R.string.advanced_apps)) { DisplayOverOtherAppsAppListProvider.InfoPageEntryItem(app) Loading src/com/android/settings/spa/app/appinfo/AppStoragePreference.kt 0 → 100644 +75 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 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.settings.spa.app.appinfo import android.app.settings.SettingsEnums import android.content.Context import android.content.pm.ApplicationInfo import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import com.android.settings.R import com.android.settings.applications.AppStorageSettings import com.android.settings.applications.appinfo.AppInfoDashboardFragment import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spaprivileged.model.app.hasFlag import com.android.settingslib.spaprivileged.template.app.getStorageSize @Composable fun AppStoragePreference(app: ApplicationInfo) { if (!app.hasFlag(ApplicationInfo.FLAG_INSTALLED)) return val context = LocalContext.current Preference( model = object : PreferenceModel { override val title = stringResource(R.string.storage_settings_for_app) override val summary = getSummary(context, app) override val onClick = { startStorageSettingsActivity(context, app) } }, singleLineSummary = true, ) } @Composable private fun getSummary(context: Context, app: ApplicationInfo): State<String> { val sizeState = app.getStorageSize() return remember { derivedStateOf { val size = sizeState.value if (size.isBlank()) return@derivedStateOf context.getString(R.string.computing_size) val storageType = context.getString( when (app.hasFlag(ApplicationInfo.FLAG_EXTERNAL_STORAGE)) { true -> R.string.storage_type_external false -> R.string.storage_type_internal } ) context.getString(R.string.storage_summary_format, size, storageType) } } } private fun startStorageSettingsActivity(context: Context, app: ApplicationInfo) { AppInfoDashboardFragment.startAppInfoFragment( AppStorageSettings::class.java, app, context, SettingsEnums.APPLICATIONS_INSTALLED_APP_DETAILS, ) } Loading
AndroidManifest.xml +9 −9 Original line number Diff line number Diff line Loading @@ -3555,7 +3555,7 @@ <provider android:name="androidx.core.content.FileProvider" android:authorities="com.android.settings.files" android:authorities="${applicationId}.files" android:grantUriPermissions="true" android:exported="false"> <meta-data Loading @@ -3565,13 +3565,13 @@ <provider android:name=".deviceinfo.legal.ModuleLicenseProvider" android:authorities="com.android.settings.module_licenses" android:authorities="${applicationId}.module_licenses" android:grantUriPermissions="true" android:exported="false"/> <provider android:name=".emergency.EmergencyActionContentProvider" android:authorities="com.android.settings.emergency" android:authorities="${applicationId}.emergency" android:permission="android.permission.CALL_PRIVILEGED" android:exported="true"/> Loading Loading @@ -3685,7 +3685,7 @@ <provider android:name=".search.SettingsSearchIndexablesProvider" android:authorities="com.android.settings" android:authorities="${applicationId}" android:multiprocess="false" android:grantUriPermissions="true" android:permission="android.permission.READ_SEARCH_INDEXABLES" Loading @@ -3697,7 +3697,7 @@ <provider android:name=".dashboard.suggestions.SuggestionStateProvider" android:authorities="com.android.settings.suggestions.status" android:authorities="${applicationId}.suggestions.status" android:exported="true"> <intent-filter> <action android:name="com.android.settings.action.SUGGESTION_STATE_PROVIDER" /> Loading Loading @@ -3940,7 +3940,7 @@ <provider android:name=".dashboard.SummaryProvider" android:authorities="com.android.settings.dashboard.SummaryProvider"> android:authorities="${applicationId}.dashboard.SummaryProvider"> </provider> <activity android:name=".backup.UserBackupSettingsActivity" Loading Loading @@ -4327,7 +4327,7 @@ </activity> <provider android:name=".slices.SettingsSliceProvider" android:authorities="com.android.settings.slices;android.settings.slices" android:authorities="${applicationId}.slices;android.settings.slices" android:exported="true" android:grantUriPermissions="true" /> Loading Loading @@ -4369,13 +4369,13 @@ <provider android:name=".homepage.contextualcards.CardContentProvider" android:authorities="com.android.settings.homepage.CardContentProvider" android:authorities="${applicationId}.homepage.CardContentProvider" android:exported="true" android:permission="android.permission.WRITE_SETTINGS_HOMEPAGE_DATA" /> <provider android:name=".homepage.contextualcards.SettingsContextualCardProvider" android:authorities="com.android.settings.homepage.contextualcards" android:authorities="${applicationId}.homepage.contextualcards" android:permission="android.permission.WRITE_SETTINGS_HOMEPAGE_DATA" android:exported="true"> <intent-filter> Loading
TEST_MAPPING +5 −0 Original line number Diff line number Diff line { "presubmit": [ { "name": "SettingsSpaUnitTests" } ], "postsubmit": [ { "name": "SettingsUnitTests", Loading
src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java +14 −0 Original line number Diff line number Diff line Loading @@ -630,6 +630,20 @@ public class AppInfoDashboardFragment extends DashboardFragment .launch(); } /** Starts app info fragment from SPA pages. */ public static void startAppInfoFragment( Class<?> destination, ApplicationInfo app, Context context, int sourceMetricsCategory) { // start new fragment to display extended information Bundle args = new Bundle(); args.putString(ARG_PACKAGE_NAME, app.packageName); args.putInt(ARG_PACKAGE_UID, app.uid); new SubSettingLauncher(context) .setDestination(destination.getName()) .setArguments(args) .setSourceMetricsCategory(sourceMetricsCategory) .launch(); } private void onPackageRemoved() { getActivity().finishActivity(SUB_INFO_FRAGMENT); getActivity().finishAndRemoveTask(); Loading
src/com/android/settings/spa/app/appinfo/AppInfoSettings.kt +1 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,7 @@ private fun AppInfoSettings(packageInfoPresenter: PackageInfoPresenter) { AppButtons(packageInfoPresenter) AppPermissionPreference(app) AppStoragePreference(app) Category(title = stringResource(R.string.advanced_apps)) { DisplayOverOtherAppsAppListProvider.InfoPageEntryItem(app) Loading
src/com/android/settings/spa/app/appinfo/AppStoragePreference.kt 0 → 100644 +75 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 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.settings.spa.app.appinfo import android.app.settings.SettingsEnums import android.content.Context import android.content.pm.ApplicationInfo import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import com.android.settings.R import com.android.settings.applications.AppStorageSettings import com.android.settings.applications.appinfo.AppInfoDashboardFragment import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spaprivileged.model.app.hasFlag import com.android.settingslib.spaprivileged.template.app.getStorageSize @Composable fun AppStoragePreference(app: ApplicationInfo) { if (!app.hasFlag(ApplicationInfo.FLAG_INSTALLED)) return val context = LocalContext.current Preference( model = object : PreferenceModel { override val title = stringResource(R.string.storage_settings_for_app) override val summary = getSummary(context, app) override val onClick = { startStorageSettingsActivity(context, app) } }, singleLineSummary = true, ) } @Composable private fun getSummary(context: Context, app: ApplicationInfo): State<String> { val sizeState = app.getStorageSize() return remember { derivedStateOf { val size = sizeState.value if (size.isBlank()) return@derivedStateOf context.getString(R.string.computing_size) val storageType = context.getString( when (app.hasFlag(ApplicationInfo.FLAG_EXTERNAL_STORAGE)) { true -> R.string.storage_type_external false -> R.string.storage_type_internal } ) context.getString(R.string.storage_summary_format, size, storageType) } } } private fun startStorageSettingsActivity(context: Context, app: ApplicationInfo) { AppInfoDashboardFragment.startAppInfoFragment( AppStorageSettings::class.java, app, context, SettingsEnums.APPLICATIONS_INSTALLED_APP_DETAILS, ) }