diff --git a/res/values/strings.xml b/res/values/strings.xml
index 54b7f67b338..6c79d60a2c7 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -10429,6 +10429,10 @@
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.
+ Write system preferences
+ Allow this app to modify system preferences on your behalf
+ This permission allows an app to modify core system preferences.
+
Media management apps
diff --git a/res/xml/special_access.xml b/res/xml/special_access.xml
index d0fe980d82b..f3a5f3216c7 100644
--- a/res/xml/special_access.xml
+++ b/res/xml/special_access.xml
@@ -106,6 +106,11 @@
android:title="@string/full_screen_intent_title"
settings:controller="com.android.settings.spa.app.specialaccess.UseFullScreenIntentPreferenceController" />
+
+
, recordListFlow: Flow>):
+ Flow> {
+ 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)
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/spa/app/specialaccess/WriteSystemPreferencesPreferenceController.kt b/src/com/android/settings/spa/app/specialaccess/WriteSystemPreferencesPreferenceController.kt
new file mode 100644
index 00000000000..fb808fa8199
--- /dev/null
+++ b/src/com/android/settings/spa/app/specialaccess/WriteSystemPreferencesPreferenceController.kt
@@ -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
+ }
+ }
+}
\ No newline at end of file