Add Special App Access page for WRITE_SYSTEM_PREFERENCES permission
Bug: 374848822 Flag: com.android.settingslib.flags.write_system_preference_permission_enabled Flag: com.android.settingslib.flags.settings_catalyst Test: in-app test Change-Id: I8116e40108175d2606b0c24655d457c1f04afc35
This commit is contained in:
@@ -10429,6 +10429,10 @@
|
||||
<!-- Description for setting that allows apps to send full screen intents. [CHAR LIMIT=NONE] -->
|
||||
<string name="footer_description_full_screen_intent">Allow this app to show notifications that take up the full screen when the device is locked. Apps may use these to highlight alarms, incoming calls, or other urgent notifications.</string>
|
||||
|
||||
<string name="write_system_preferences_page_title">Write system preferences</string>
|
||||
<string name="write_system_preferences_switch_title">Allow this app to modify system preferences on your behalf</string>
|
||||
<string name="write_system_preferences_footer_description">This permission allows an app to modify core system preferences.</string>
|
||||
|
||||
<!-- Media management apps settings title [CHAR LIMIT=40] -->
|
||||
<string name="media_management_apps_title">Media management apps</string>
|
||||
<!-- Label for a setting which controls whether an app can manage media files [CHAR LIMIT=45] -->
|
||||
|
@@ -106,6 +106,11 @@
|
||||
android:title="@string/full_screen_intent_title"
|
||||
settings:controller="com.android.settings.spa.app.specialaccess.UseFullScreenIntentPreferenceController" />
|
||||
|
||||
<Preference
|
||||
android:key="write_system_preferences"
|
||||
android:title="@string/write_system_preferences_page_title"
|
||||
settings:controller="com.android.settings.spa.app.specialaccess.WriteSystemPreferencesPreferenceController" />
|
||||
|
||||
<Preference
|
||||
android:key="picture_in_picture"
|
||||
android:title="@string/picture_in_picture_title"
|
||||
|
@@ -42,6 +42,7 @@ import com.android.settings.spa.app.specialaccess.SpecialAppAccessPageProvider
|
||||
import com.android.settings.spa.app.specialaccess.TurnScreenOnAppsAppListProvider
|
||||
import com.android.settings.spa.app.specialaccess.UseFullScreenIntentAppListProvider
|
||||
import com.android.settings.spa.app.specialaccess.WifiControlAppListProvider
|
||||
import com.android.settings.spa.app.specialaccess.WriteSystemPreferencesAppListProvider
|
||||
import com.android.settings.spa.app.storage.StorageAppListPageProvider
|
||||
import com.android.settings.spa.core.instrumentation.SpaLogMetricsProvider
|
||||
import com.android.settings.spa.core.instrumentation.SpaLogProvider
|
||||
@@ -80,6 +81,7 @@ open class SettingsSpaEnvironment(context: Context) : SpaEnvironment(context) {
|
||||
NfcTagAppsSettingsProvider,
|
||||
LongBackgroundTasksAppListProvider,
|
||||
TurnScreenOnAppsAppListProvider,
|
||||
WriteSystemPreferencesAppListProvider,
|
||||
)
|
||||
}
|
||||
|
||||
|
@@ -42,6 +42,7 @@ import com.android.settings.spa.app.specialaccess.DisplayOverOtherAppsAppListPro
|
||||
import com.android.settings.spa.app.specialaccess.InstallUnknownAppsListProvider
|
||||
import com.android.settings.spa.app.specialaccess.ModifySystemSettingsAppListProvider
|
||||
import com.android.settings.spa.app.specialaccess.PictureInPictureListProvider
|
||||
import com.android.settings.spa.app.specialaccess.WriteSystemPreferencesAppListProvider
|
||||
import com.android.settingslib.spa.framework.common.SettingsPageProvider
|
||||
import com.android.settingslib.spa.framework.compose.navigator
|
||||
import com.android.settingslib.spa.widget.scaffold.RegularScaffold
|
||||
@@ -167,6 +168,7 @@ private fun AppInfoSettings(packageInfoPresenter: PackageInfoPresenter) {
|
||||
InstallUnknownAppsListProvider.InfoPageEntryItem(app)
|
||||
InteractAcrossProfilesDetailsPreference(app)
|
||||
AlarmsAndRemindersAppListProvider.InfoPageEntryItem(app)
|
||||
WriteSystemPreferencesAppListProvider.InfoPageEntryItem(app)
|
||||
}
|
||||
|
||||
Category(title = stringResource(R.string.app_install_details_group_title)) {
|
||||
|
@@ -70,6 +70,7 @@ object SpecialAppAccessPageProvider : SettingsPageProvider {
|
||||
WifiControlAppListProvider,
|
||||
LongBackgroundTasksAppListProvider,
|
||||
TurnScreenOnAppsAppListProvider,
|
||||
WriteSystemPreferencesAppListProvider,
|
||||
)
|
||||
.map { it.buildAppListInjectEntry().setLink(fromPage = owner).build() }
|
||||
}
|
||||
|
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright (C) 2024 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.specialaccess
|
||||
|
||||
import android.Manifest
|
||||
import android.app.AppOpsManager
|
||||
import android.content.Context
|
||||
import com.android.settings.R
|
||||
import com.android.settingslib.spaprivileged.model.app.AppOps
|
||||
import com.android.settingslib.spaprivileged.model.app.PackageManagers
|
||||
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionListModel
|
||||
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionRecord
|
||||
import com.android.settingslib.spaprivileged.template.app.TogglePermissionAppListProvider
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.map
|
||||
|
||||
object WriteSystemPreferencesAppListProvider : TogglePermissionAppListProvider {
|
||||
override val permissionType = "WriteSystemPreferences"
|
||||
override fun createModel(context: Context) = WriteSystemPreferencesAppListModel(context)
|
||||
}
|
||||
|
||||
class WriteSystemPreferencesAppListModel(context: Context) : AppOpPermissionListModel(context) {
|
||||
override val pageTitleResId = R.string.write_system_preferences_page_title
|
||||
override val switchTitleResId = R.string.write_system_preferences_switch_title
|
||||
override val footerResId = R.string.write_system_preferences_footer_description
|
||||
override val appOps = AppOps(
|
||||
op = AppOpsManager.OP_WRITE_SYSTEM_PREFERENCES,
|
||||
setModeByUid = true,
|
||||
)
|
||||
override val permission = Manifest.permission.WRITE_SYSTEM_PREFERENCES
|
||||
|
||||
override fun filter(userIdFlow: Flow<Int>, recordListFlow: Flow<List<AppOpPermissionRecord>>):
|
||||
Flow<List<AppOpPermissionRecord>> {
|
||||
return super.filter(userIdFlow, recordListFlow).map { recordList ->
|
||||
recordList.filter { app ->
|
||||
// Only apps that have READ_SYSTEM_PREFERENCES can utilize WRITE_SYSTEM_PREFERENCES.
|
||||
// This write permission is (currently) non-functionality without the corresponding
|
||||
// read permission, and the read permission can only be granted via pre-grant or
|
||||
// role. As such, we don't show apps that are "requesting" this permission without
|
||||
// holding the read permission, as it would create confusion and not provide them
|
||||
// any functionality.
|
||||
with (PackageManagers) {
|
||||
app.app.hasGrantPermission(Manifest.permission.READ_SYSTEM_PREFERENCES)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (C) 2024 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.specialaccess
|
||||
|
||||
import android.content.Context
|
||||
import androidx.preference.Preference
|
||||
import com.android.settings.core.BasePreferenceController
|
||||
import com.android.settings.spa.SpaActivity.Companion.startSpaActivity
|
||||
import com.android.settingslib.flags.Flags
|
||||
|
||||
class WriteSystemPreferencesPreferenceController(
|
||||
context: Context, key: String
|
||||
) : BasePreferenceController(context, key) {
|
||||
override fun getAvailabilityStatus(): Int {
|
||||
return if (Flags.settingsCatalyst() && Flags.writeSystemPreferencePermissionEnabled()) {
|
||||
AVAILABLE
|
||||
} else {
|
||||
UNSUPPORTED_ON_DEVICE
|
||||
}
|
||||
}
|
||||
|
||||
override fun handlePreferenceTreeClick(preference: Preference?): Boolean {
|
||||
return if (preference?.key == mPreferenceKey) {
|
||||
mContext.startSpaActivity(WriteSystemPreferencesAppListProvider.getAppListRoute())
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user