Loading packages/SettingsLib/Graph/src/com/android/settingslib/graph/GetPreferenceGraphApiHandler.kt +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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> { Loading packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGetterFlags.kt +8 −1 Original line number Diff line number Diff line Loading @@ -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 } packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGraphBuilder.kt +25 −3 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading @@ -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) { Loading Loading @@ -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, Loading packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceScreenMetadata.kt +9 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading
packages/SettingsLib/Graph/src/com/android/settingslib/graph/GetPreferenceGraphApiHandler.kt +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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> { Loading
packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGetterFlags.kt +8 −1 Original line number Diff line number Diff line Loading @@ -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 }
packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGraphBuilder.kt +25 −3 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading @@ -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) { Loading Loading @@ -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, Loading
packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceScreenMetadata.kt +9 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading