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

Commit 2a9fba50 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes from topic "catalyst" into main

* changes:
  [Catalyst] Move getPreferenceTitle out of PreferenceMetadata
  [Catalyst] Move getPreferenceIcon out of PreferenceMetadata
  [Catalyst] Move getPreferenceSummary out of PreferenceMetadata
  [Catalyst] Screen binding info may not be provided
parents b8b28829 01e8b209
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ import com.android.settingslib.metadata.PreferenceTitleProvider
import com.android.settingslib.metadata.ReadWritePermit
import com.android.settingslib.metadata.SensitivityLevel.Companion.HIGH_SENSITIVITY
import com.android.settingslib.metadata.SensitivityLevel.Companion.UNKNOWN_SENSITIVITY
import com.android.settingslib.metadata.getPreferenceIcon
import com.android.settingslib.preference.PreferenceScreenFactory
import com.android.settingslib.preference.PreferenceScreenProvider
import java.util.Locale
+0 −38
Original line number Diff line number Diff line
@@ -137,44 +137,6 @@ interface PreferenceMetadata {

    /** Returns preference intent. */
    fun intent(context: Context): Intent? = null

    /**
     * Returns the preference title.
     *
     * Implement [PreferenceTitleProvider] interface if title content is generated dynamically.
     */
    fun getPreferenceTitle(context: Context): CharSequence? =
        when {
            title != 0 -> context.getText(title)
            this is PreferenceTitleProvider -> getTitle(context)
            else -> null
        }

    /**
     * Returns the preference summary.
     *
     * Implement [PreferenceSummaryProvider] interface if summary content is generated dynamically
     * (e.g. summary is provided per preference value).
     */
    fun getPreferenceSummary(context: Context): CharSequence? =
        when {
            summary != 0 -> context.getText(summary)
            this is PreferenceSummaryProvider -> getSummary(context)
            else -> null
        }

    /**
     * Returns the preference icon.
     *
     * Implement [PreferenceIconProvider] interface if icon is provided dynamically (e.g. icon is
     * provided based on flag value).
     */
    fun getPreferenceIcon(context: Context): Int =
        when {
            icon != 0 -> icon
            this is PreferenceIconProvider -> getIcon(context)
            else -> 0
        }
}

/** Metadata of preference group. */
+43 −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.settingslib.metadata

import android.content.Context

/** Returns the preference title. */
fun PreferenceMetadata.getPreferenceTitle(context: Context): CharSequence? =
    when {
        title != 0 -> context.getText(title)
        this is PreferenceTitleProvider -> getTitle(context)
        else -> null
    }

/** Returns the preference summary. */
fun PreferenceMetadata.getPreferenceSummary(context: Context): CharSequence? =
    when {
        summary != 0 -> context.getText(summary)
        this is PreferenceSummaryProvider -> getSummary(context)
        else -> null
    }

/** Returns the preference icon. */
fun PreferenceMetadata.getPreferenceIcon(context: Context): Int =
    when {
        icon != 0 -> icon
        this is PreferenceIconProvider -> getIcon(context)
        else -> 0
    }
+15 −2
Original line number Diff line number Diff line
@@ -25,10 +25,15 @@ import androidx.preference.PreferenceScreen
import androidx.preference.SeekBarPreference
import com.android.settingslib.metadata.DiscreteIntValue
import com.android.settingslib.metadata.DiscreteValue
import com.android.settingslib.metadata.EXTRA_BINDING_SCREEN_ARGS
import com.android.settingslib.metadata.EXTRA_BINDING_SCREEN_KEY
import com.android.settingslib.metadata.IntRangeValuePreference
import com.android.settingslib.metadata.PreferenceAvailabilityProvider
import com.android.settingslib.metadata.PreferenceMetadata
import com.android.settingslib.metadata.PreferenceScreenMetadata
import com.android.settingslib.metadata.getPreferenceIcon
import com.android.settingslib.metadata.getPreferenceSummary
import com.android.settingslib.metadata.getPreferenceTitle

/** Binding of preference widget and preference metadata. */
interface PreferenceBinding {
@@ -72,8 +77,16 @@ interface PreferenceBinding {
                preference.icon = null
            }
            val isPreferenceScreen = preference is PreferenceScreen
            // extras
            preference.peekExtras()?.clear()
            extras(context)?.let { preference.extras.putAll(it) }
            if (!isPreferenceScreen && this is PreferenceScreenMetadata) {
                val extras = preference.extras
                // Pass the preference key to fragment, so that the fragment could find associated
                // preference screen registered in PreferenceScreenRegistry
                extras.putString(EXTRA_BINDING_SCREEN_KEY, preference.key)
                arguments?.let { extras.putBundle(EXTRA_BINDING_SCREEN_ARGS, it) }
            }
            preference.title = getPreferenceTitle(context)
            if (!isPreferenceScreen) {
                preference.summary = getPreferenceSummary(context)
@@ -82,12 +95,12 @@ interface PreferenceBinding {
            preference.isVisible =
                (this as? PreferenceAvailabilityProvider)?.isAvailable(context) != false
            preference.isPersistent = isPersistent(context)
            // PreferenceRegistry will notify dependency change, so we do not need to set
            // PreferenceScreenBindingHelper will notify dependency change, so we do not need to set
            // dependency here. This simplifies dependency management and avoid the
            // IllegalStateException when call Preference.setDependency
            preference.dependency = null
            if (!isPreferenceScreen) { // avoid recursive loop when build graph
                preference.fragment = (this as? PreferenceScreenCreator)?.fragmentClass()?.name
                preference.fragment = (this as? PreferenceScreenMetadata)?.fragmentClass()?.name
                preference.intent = intent(context)
            }
            if (preference is DialogPreference) {
+2 −9
Original line number Diff line number Diff line
@@ -22,8 +22,6 @@ import androidx.preference.PreferenceCategory
import androidx.preference.PreferenceScreen
import androidx.preference.SwitchPreferenceCompat
import androidx.preference.TwoStatePreference
import com.android.settingslib.metadata.EXTRA_BINDING_SCREEN_ARGS
import com.android.settingslib.metadata.EXTRA_BINDING_SCREEN_KEY
import com.android.settingslib.metadata.PreferenceMetadata
import com.android.settingslib.metadata.PreferenceScreenMetadata
import com.android.settingslib.metadata.PreferenceTitleProvider
@@ -34,14 +32,9 @@ interface PreferenceScreenBinding : PreferenceBinding {

    override fun bind(preference: Preference, metadata: PreferenceMetadata) {
        super.bind(preference, metadata)
        if (preference is PreferenceScreen) {
            val context = preference.context
            val screenMetadata = metadata as PreferenceScreenMetadata
        val extras = preference.extras
        // Pass the preference key to fragment, so that the fragment could find associated
        // preference screen registered in PreferenceScreenRegistry
        extras.putString(EXTRA_BINDING_SCREEN_KEY, preference.key)
        screenMetadata.arguments?.let { extras.putBundle(EXTRA_BINDING_SCREEN_ARGS, it) }
        if (preference is PreferenceScreen) {
            val screenTitle = screenMetadata.screenTitle
            preference.title =
                if (screenTitle != 0) {