Loading res/xml/accessibility_color_and_motion.xml +6 −4 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ limitations under the License. --> <!-- LINT.IfChange --> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" Loading @@ -40,16 +41,16 @@ settings:controller="com.android.settings.accessibility.ColorInversionPreferenceController"/> <!-- DarkModePreference is searchable in the Display & Touch setting. Therefore, we set searchable = false here to avoid duplicate search results. --> With catalyst, we're reusing the same preference. Will let the SettingsSearch to determine how to resolve multi-entry on same preference. --> <com.android.settings.display.darkmode.DarkModePreference android:key="dark_ui_mode_accessibility" android:key="dark_ui_mode" android:icon="@drawable/ic_dark_ui" android:title="@string/dark_ui_mode" android:fragment="com.android.settings.display.darkmode.DarkModeSettingsFragment" android:widgetLayout="@null" settings:widgetLayout="@null" settings:controller="com.android.settings.display.DarkUIPreferenceController" settings:searchable="false"/> settings:controller="com.android.settings.display.DarkUIPreferenceController" /> <SwitchPreferenceCompat android:icon="@drawable/ic_accessibility_animation" Loading @@ -64,3 +65,4 @@ android:title="@string/experimental_category_title"> </PreferenceCategory> </PreferenceScreen> <!-- LINT.ThenChange(/src/com/android/settings/accessibility/ColorAndMotionScreen.kt:ui_hierarchy) --> src/com/android/settings/accessibility/ColorAndMotionFragment.java +18 −11 Original line number Diff line number Diff line Loading @@ -63,9 +63,10 @@ public class ColorAndMotionFragment extends DashboardFragment { @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); if (!isCatalystEnabled()) { initializeAllPreferences(); updateSystemPreferences(); mShortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED); mShortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED); Loading @@ -73,6 +74,7 @@ public class ColorAndMotionFragment extends DashboardFragment { mSettingsContentObserver.registerKeysToObserverCallback(mShortcutFeatureKeys, key -> updatePreferencesState()); } } private void updatePreferencesState() { final List<AbstractPreferenceController> controllers = new ArrayList<>(); Loading @@ -84,16 +86,18 @@ public class ColorAndMotionFragment extends DashboardFragment { @Override public void onStart() { super.onStart(); if (!isCatalystEnabled()) { mSettingsContentObserver.register(getContentResolver()); } } @Override public void onStop() { super.onStop(); if (!isCatalystEnabled()) { mSettingsContentObserver.unregister(getContentResolver()); } } @Override protected int getPreferenceScreenResId() { Loading @@ -116,9 +120,11 @@ public class ColorAndMotionFragment extends DashboardFragment { /** * Updates preferences related to system configurations. */ // LINT.IfChange(ui_hierarchy) private void updateSystemPreferences() { final PreferenceCategory experimentalCategory = getPreferenceScreen().findPreference( CATEGORY_EXPERIMENTAL); if (ColorDisplayManager.isColorTransformAccelerated(getContext())) { getPreferenceScreen().removePreference(experimentalCategory); } else { Loading @@ -130,6 +136,7 @@ public class ColorAndMotionFragment extends DashboardFragment { experimentalCategory.addPreference(mToggleDisableAnimationsPreference); } } // LINT.ThenChange(/src/com/android/settings/accessibility/ColorAndMotionScreen.kt:ui_hierarchy) @Nullable @Override Loading src/com/android/settings/accessibility/ColorAndMotionScreen.kt +29 −4 Original line number Diff line number Diff line Loading @@ -17,10 +17,15 @@ package com.android.settings.accessibility import android.content.Context import android.hardware.display.ColorDisplayManager import com.android.settings.R import com.android.settings.Settings.ColorAndMotionActivity import com.android.settings.display.darkmode.DarkModeScreen import com.android.settings.flags.Flags import com.android.settings.utils.makeLaunchIntent import com.android.settingslib.metadata.PreferenceCategory import com.android.settingslib.metadata.PreferenceGroup import com.android.settingslib.metadata.PreferenceHierarchy import com.android.settingslib.metadata.PreferenceMetadata import com.android.settingslib.metadata.ProvidePreferenceScreen import com.android.settingslib.metadata.preferenceHierarchy Loading @@ -39,14 +44,34 @@ class ColorAndMotionScreen : PreferenceScreenCreator { override fun isFlagEnabled(context: Context) = Flags.catalystAccessibilityColorAndMotion() override fun hasCompleteHierarchy(): Boolean = false override fun hasCompleteHierarchy(): Boolean = true override fun fragmentClass() = ColorAndMotionFragment::class.java override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(context, this) { override fun getPreferenceHierarchy(context: Context): PreferenceHierarchy { // LINT.IfChange(ui_hierarchy) if (ColorDisplayManager.isColorTransformAccelerated(context)) { return preferenceHierarchy(context, this) { +DaltonizerPreference() +ColorInversionPreference() +DarkModeScreen.KEY +RemoveAnimationsPreference() } } else { return preferenceHierarchy(context, this) { +ColorInversionPreference() +DarkModeScreen.KEY +PreferenceCategory( "experimental_category", R.string.experimental_category_title ) += { +DaltonizerPreference() +RemoveAnimationsPreference() } } } // LINT.ThenChange(/res/xml/accessibility_color_and_motion.xml, /src/com/android/settings/accessibility/ColorAndMotionFragment.java:ui_hierarchy) } override fun getLaunchIntent(context: Context, metadata: PreferenceMetadata?) = makeLaunchIntent(context, ColorAndMotionActivity::class.java, metadata?.key) Loading src/com/android/settings/accessibility/ColorInversionPreference.kt 0 → 100644 +81 −0 Original line number Diff line number Diff line /* * Copyright (C) 2025 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.accessibility import android.app.settings.SettingsEnums import android.content.Context import android.provider.Settings import com.android.settings.R import com.android.settings.core.SubSettingLauncher import com.android.settingslib.datastore.HandlerExecutor import com.android.settingslib.datastore.KeyedObserver import com.android.settingslib.datastore.SettingsSecureStore import com.android.settingslib.metadata.PreferenceLifecycleContext import com.android.settingslib.metadata.PreferenceLifecycleProvider import com.android.settingslib.metadata.PreferenceMetadata import com.android.settingslib.metadata.PreferenceSummaryProvider class ColorInversionPreference : PreferenceMetadata, PreferenceSummaryProvider, PreferenceLifecycleProvider { override val key: String get() = PREFERENCE_KEY override val title: Int get() = R.string.accessibility_display_inversion_preference_title override val icon: Int get() = R.drawable.ic_color_inversion override val keywords: Int get() = R.string.keywords_color_inversion private var mSettingsKeyedObserver: KeyedObserver<String>? = null override fun intent(context: Context) = SubSettingLauncher(context) .setDestination(ToggleColorInversionPreferenceFragment::class.java.name) .setSourceMetricsCategory(SettingsEnums.ACCESSIBILITY_COLOR_AND_MOTION) .toIntent() override fun getSummary(context: Context): CharSequence? { return AccessibilityUtil.getSummary( context, SETTING_KEY, R.string.color_inversion_state_on, R.string.color_inversion_state_off ) } override fun onStart(context: PreferenceLifecycleContext) { val observer = KeyedObserver<String> { _, _ -> context.notifyPreferenceChange(PREFERENCE_KEY) } mSettingsKeyedObserver = observer val storage = SettingsSecureStore.get(context) storage.addObserver(SETTING_KEY, observer, HandlerExecutor.main) } override fun onStop(context: PreferenceLifecycleContext) { mSettingsKeyedObserver?.let { val storage = SettingsSecureStore.get(context) storage.removeObserver(SETTING_KEY, it) mSettingsKeyedObserver = null } } companion object { const val PREFERENCE_KEY = "toggle_inversion_preference" const val SETTING_KEY = Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED } } src/com/android/settings/accessibility/ColorInversionPreferenceController.java +2 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.provider.Settings; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; // LINT.IfChange /** Controller that shows the color inversion summary. */ public class ColorInversionPreferenceController extends BasePreferenceController { Loading @@ -45,3 +46,4 @@ public class ColorInversionPreferenceController extends BasePreferenceController return AVAILABLE; } } // LINT.ThenChange(/src/com/android/settings/accessibility/ColorInversionPreference.kt) Loading
res/xml/accessibility_color_and_motion.xml +6 −4 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ limitations under the License. --> <!-- LINT.IfChange --> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" Loading @@ -40,16 +41,16 @@ settings:controller="com.android.settings.accessibility.ColorInversionPreferenceController"/> <!-- DarkModePreference is searchable in the Display & Touch setting. Therefore, we set searchable = false here to avoid duplicate search results. --> With catalyst, we're reusing the same preference. Will let the SettingsSearch to determine how to resolve multi-entry on same preference. --> <com.android.settings.display.darkmode.DarkModePreference android:key="dark_ui_mode_accessibility" android:key="dark_ui_mode" android:icon="@drawable/ic_dark_ui" android:title="@string/dark_ui_mode" android:fragment="com.android.settings.display.darkmode.DarkModeSettingsFragment" android:widgetLayout="@null" settings:widgetLayout="@null" settings:controller="com.android.settings.display.DarkUIPreferenceController" settings:searchable="false"/> settings:controller="com.android.settings.display.DarkUIPreferenceController" /> <SwitchPreferenceCompat android:icon="@drawable/ic_accessibility_animation" Loading @@ -64,3 +65,4 @@ android:title="@string/experimental_category_title"> </PreferenceCategory> </PreferenceScreen> <!-- LINT.ThenChange(/src/com/android/settings/accessibility/ColorAndMotionScreen.kt:ui_hierarchy) -->
src/com/android/settings/accessibility/ColorAndMotionFragment.java +18 −11 Original line number Diff line number Diff line Loading @@ -63,9 +63,10 @@ public class ColorAndMotionFragment extends DashboardFragment { @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); if (!isCatalystEnabled()) { initializeAllPreferences(); updateSystemPreferences(); mShortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED); mShortcutFeatureKeys.add(Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED); Loading @@ -73,6 +74,7 @@ public class ColorAndMotionFragment extends DashboardFragment { mSettingsContentObserver.registerKeysToObserverCallback(mShortcutFeatureKeys, key -> updatePreferencesState()); } } private void updatePreferencesState() { final List<AbstractPreferenceController> controllers = new ArrayList<>(); Loading @@ -84,16 +86,18 @@ public class ColorAndMotionFragment extends DashboardFragment { @Override public void onStart() { super.onStart(); if (!isCatalystEnabled()) { mSettingsContentObserver.register(getContentResolver()); } } @Override public void onStop() { super.onStop(); if (!isCatalystEnabled()) { mSettingsContentObserver.unregister(getContentResolver()); } } @Override protected int getPreferenceScreenResId() { Loading @@ -116,9 +120,11 @@ public class ColorAndMotionFragment extends DashboardFragment { /** * Updates preferences related to system configurations. */ // LINT.IfChange(ui_hierarchy) private void updateSystemPreferences() { final PreferenceCategory experimentalCategory = getPreferenceScreen().findPreference( CATEGORY_EXPERIMENTAL); if (ColorDisplayManager.isColorTransformAccelerated(getContext())) { getPreferenceScreen().removePreference(experimentalCategory); } else { Loading @@ -130,6 +136,7 @@ public class ColorAndMotionFragment extends DashboardFragment { experimentalCategory.addPreference(mToggleDisableAnimationsPreference); } } // LINT.ThenChange(/src/com/android/settings/accessibility/ColorAndMotionScreen.kt:ui_hierarchy) @Nullable @Override Loading
src/com/android/settings/accessibility/ColorAndMotionScreen.kt +29 −4 Original line number Diff line number Diff line Loading @@ -17,10 +17,15 @@ package com.android.settings.accessibility import android.content.Context import android.hardware.display.ColorDisplayManager import com.android.settings.R import com.android.settings.Settings.ColorAndMotionActivity import com.android.settings.display.darkmode.DarkModeScreen import com.android.settings.flags.Flags import com.android.settings.utils.makeLaunchIntent import com.android.settingslib.metadata.PreferenceCategory import com.android.settingslib.metadata.PreferenceGroup import com.android.settingslib.metadata.PreferenceHierarchy import com.android.settingslib.metadata.PreferenceMetadata import com.android.settingslib.metadata.ProvidePreferenceScreen import com.android.settingslib.metadata.preferenceHierarchy Loading @@ -39,14 +44,34 @@ class ColorAndMotionScreen : PreferenceScreenCreator { override fun isFlagEnabled(context: Context) = Flags.catalystAccessibilityColorAndMotion() override fun hasCompleteHierarchy(): Boolean = false override fun hasCompleteHierarchy(): Boolean = true override fun fragmentClass() = ColorAndMotionFragment::class.java override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(context, this) { override fun getPreferenceHierarchy(context: Context): PreferenceHierarchy { // LINT.IfChange(ui_hierarchy) if (ColorDisplayManager.isColorTransformAccelerated(context)) { return preferenceHierarchy(context, this) { +DaltonizerPreference() +ColorInversionPreference() +DarkModeScreen.KEY +RemoveAnimationsPreference() } } else { return preferenceHierarchy(context, this) { +ColorInversionPreference() +DarkModeScreen.KEY +PreferenceCategory( "experimental_category", R.string.experimental_category_title ) += { +DaltonizerPreference() +RemoveAnimationsPreference() } } } // LINT.ThenChange(/res/xml/accessibility_color_and_motion.xml, /src/com/android/settings/accessibility/ColorAndMotionFragment.java:ui_hierarchy) } override fun getLaunchIntent(context: Context, metadata: PreferenceMetadata?) = makeLaunchIntent(context, ColorAndMotionActivity::class.java, metadata?.key) Loading
src/com/android/settings/accessibility/ColorInversionPreference.kt 0 → 100644 +81 −0 Original line number Diff line number Diff line /* * Copyright (C) 2025 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.accessibility import android.app.settings.SettingsEnums import android.content.Context import android.provider.Settings import com.android.settings.R import com.android.settings.core.SubSettingLauncher import com.android.settingslib.datastore.HandlerExecutor import com.android.settingslib.datastore.KeyedObserver import com.android.settingslib.datastore.SettingsSecureStore import com.android.settingslib.metadata.PreferenceLifecycleContext import com.android.settingslib.metadata.PreferenceLifecycleProvider import com.android.settingslib.metadata.PreferenceMetadata import com.android.settingslib.metadata.PreferenceSummaryProvider class ColorInversionPreference : PreferenceMetadata, PreferenceSummaryProvider, PreferenceLifecycleProvider { override val key: String get() = PREFERENCE_KEY override val title: Int get() = R.string.accessibility_display_inversion_preference_title override val icon: Int get() = R.drawable.ic_color_inversion override val keywords: Int get() = R.string.keywords_color_inversion private var mSettingsKeyedObserver: KeyedObserver<String>? = null override fun intent(context: Context) = SubSettingLauncher(context) .setDestination(ToggleColorInversionPreferenceFragment::class.java.name) .setSourceMetricsCategory(SettingsEnums.ACCESSIBILITY_COLOR_AND_MOTION) .toIntent() override fun getSummary(context: Context): CharSequence? { return AccessibilityUtil.getSummary( context, SETTING_KEY, R.string.color_inversion_state_on, R.string.color_inversion_state_off ) } override fun onStart(context: PreferenceLifecycleContext) { val observer = KeyedObserver<String> { _, _ -> context.notifyPreferenceChange(PREFERENCE_KEY) } mSettingsKeyedObserver = observer val storage = SettingsSecureStore.get(context) storage.addObserver(SETTING_KEY, observer, HandlerExecutor.main) } override fun onStop(context: PreferenceLifecycleContext) { mSettingsKeyedObserver?.let { val storage = SettingsSecureStore.get(context) storage.removeObserver(SETTING_KEY, it) mSettingsKeyedObserver = null } } companion object { const val PREFERENCE_KEY = "toggle_inversion_preference" const val SETTING_KEY = Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED } }
src/com/android/settings/accessibility/ColorInversionPreferenceController.java +2 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.provider.Settings; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; // LINT.IfChange /** Controller that shows the color inversion summary. */ public class ColorInversionPreferenceController extends BasePreferenceController { Loading @@ -45,3 +46,4 @@ public class ColorInversionPreferenceController extends BasePreferenceController return AVAILABLE; } } // LINT.ThenChange(/src/com/android/settings/accessibility/ColorInversionPreference.kt)