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

Commit ad261b4f authored by Jacky Wang's avatar Jacky Wang Committed by Android (Google) Code Review
Browse files

Merge changes from topic "catalyst" into main

* changes:
  [Catalyst] Check flag when build graph
  [Catalyst] Add PreferenceScreenMetadata.description
parents f00aa1d6 0a08ec6d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -88,6 +88,7 @@ class GetPreferenceGraphApiHandler(
 * @param screens screens of the preference graph
 * @param visitedScreens visited preference screens
 * @param locale locale of the preference graph
 * @param flags flags to instruct return information
 */
data class GetPreferenceGraphRequest
@JvmOverloads
@@ -96,7 +97,6 @@ constructor(
    val visitedScreens: Set<PreferenceScreenCoordinate> = setOf(),
    val locale: Locale? = null,
    val flags: Int = PreferenceGetterFlags.ALL,
    val includeValueDescriptor: Boolean = true,
)

object GetPreferenceGraphRequestCodec : MessageCodec<GetPreferenceGraphRequest> {
+8 −1
Original line number Diff line number Diff line
@@ -18,14 +18,21 @@ package com.android.settingslib.graph

/** Flags for preference getter operation. */
object PreferenceGetterFlags {
    /** Flag to include preference value. */
    const val VALUE = 1 shl 0
    /** Flag to include preference value descriptor. */
    const val VALUE_DESCRIPTOR = 1 shl 1
    /** Flag to include basic metadata information. */
    const val METADATA = 1 shl 2
    const val ALL = (1 shl 3) - 1
    /** Flag to include all preference screens regardless of the `isFlagEnabled()` value. */
    const val FORCE_INCLUDE_ALL_SCREENS = 1 shl 3
    const val ALL = (1 shl 4) - 1

    fun Int.includeValue() = (this and VALUE) != 0

    fun Int.includeValueDescriptor() = (this and VALUE_DESCRIPTOR) != 0

    fun Int.includeMetadata() = (this and METADATA) != 0

    fun Int.forceIncludeAllScreens() = (this and FORCE_INCLUDE_ALL_SCREENS) != 0
}
+25 −3
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import androidx.preference.Preference
import androidx.preference.PreferenceGroup
import androidx.preference.PreferenceScreen
import androidx.preference.TwoStatePreference
import com.android.settingslib.graph.PreferenceGetterFlags.forceIncludeAllScreens
import com.android.settingslib.graph.PreferenceGetterFlags.includeMetadata
import com.android.settingslib.graph.PreferenceGetterFlags.includeValue
import com.android.settingslib.graph.PreferenceGetterFlags.includeValueDescriptor
@@ -59,6 +60,7 @@ 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.PreferenceScreenCreator
import com.android.settingslib.preference.PreferenceScreenFactory
import com.android.settingslib.preference.PreferenceScreenProvider
import java.util.Locale
@@ -81,6 +83,7 @@ private constructor(
    private val builder by lazy { PreferenceGraphProto.newBuilder() }
    private val visitedScreens = request.visitedScreens.toMutableSet()
    private val screens = mutableMapOf<String, PreferenceScreenProto.Builder>()
    private val forceIncludeAllScreens = request.flags.forceIncludeAllScreens()

    private suspend fun init() {
        for (screen in request.screens) {
@@ -202,17 +205,36 @@ private constructor(

    suspend fun addPreferenceScreen(factory: PreferenceScreenMetadataFactory): Boolean {
        if (factory is PreferenceScreenMetadataParameterizedFactory) {
            factory.parameters(context).collect { addPreferenceScreen(factory.create(context, it)) }
            var flagEnabled: Boolean? = null
            factory.parameters(context).collect {
                if (flagEnabled == false) return@collect
                val screenMetadata = factory.create(context, it)
                if (flagEnabled == null) flagEnabled = checkScreenFlag(screenMetadata)
                if (flagEnabled == true) addPreferenceScreen(screenMetadata)
            }
            return true
        }
        return addPreferenceScreen(factory.create(context))
    }

    private suspend fun addPreferenceScreen(metadata: PreferenceScreenMetadata): Boolean =
        addPreferenceScreen(metadata.key, metadata.arguments) {
    private suspend fun addPreferenceScreen(metadata: PreferenceScreenMetadata): Boolean {
        if (!checkScreenFlag(metadata)) return false
        return addPreferenceScreen(metadata.key, metadata.arguments) {
            completeHierarchy = metadata.hasCompleteHierarchy()
            root = metadata.getPreferenceHierarchy(context).toProto(metadata, true)
        }
    }

    private fun checkScreenFlag(metadata: PreferenceScreenMetadata): Boolean {
        if (
            !forceIncludeAllScreens &&
                (metadata as? PreferenceScreenCreator)?.isFlagEnabled(context) == false
        ) {
            Log.w(TAG, "Ignore ${metadata.key} as the flag is disabled")
            return false
        }
        return true
    }

    private suspend fun addPreferenceScreen(
        key: String,
+9 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.annotation.AnyThread
import androidx.annotation.StringRes
import androidx.fragment.app.Fragment
import kotlinx.coroutines.flow.Flow

@@ -46,6 +47,14 @@ interface PreferenceScreenMetadata : PreferenceMetadata {
    val screenTitle: Int
        get() = title

    /**
     * String resource id to briefly describe the screen.
     *
     * Could be used for accessibility, search, etc.
     */
    val description: Int
        @StringRes get() = 0

    /** Returns dynamic screen title, use [screenTitle] whenever possible. */
    fun getScreenTitle(context: Context): CharSequence? = null