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

Commit 0f84b652 authored by Chun-Ku Lin's avatar Chun-Ku Lin
Browse files

Make ColorAndMotionFragment fully in Catalyst

Bug: 392190782
Test: manual (verify the navigation and the search still works the same)
Test: atest
Flag: com.android.settings.flags.catalyst_accessibility_color_and_motion

Change-Id: I7717390c70246503aec545991fd9a40be5152373
parent 22e56834
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -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"
@@ -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"
@@ -64,3 +65,4 @@
        android:title="@string/experimental_category_title">
    </PreferenceCategory>
</PreferenceScreen>
<!-- LINT.ThenChange(/src/com/android/settings/accessibility/ColorAndMotionScreen.kt:ui_hierarchy) -->
+18 −11
Original line number Diff line number Diff line
@@ -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);

@@ -73,6 +74,7 @@ public class ColorAndMotionFragment extends DashboardFragment {
            mSettingsContentObserver.registerKeysToObserverCallback(mShortcutFeatureKeys,
                    key -> updatePreferencesState());
        }
    }

    private void updatePreferencesState() {
        final List<AbstractPreferenceController> controllers = new ArrayList<>();
@@ -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() {
@@ -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 {
@@ -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
+29 −4
Original line number Diff line number Diff line
@@ -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
@@ -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)
+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
    }
}
+2 −0
Original line number Diff line number Diff line
@@ -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 {

@@ -45,3 +46,4 @@ public class ColorInversionPreferenceController extends BasePreferenceController
        return AVAILABLE;
    }
}
// LINT.ThenChange(/src/com/android/settings/accessibility/ColorInversionPreference.kt)
Loading