diff options
author | 2024-11-13 18:23:37 +0800 | |
---|---|---|
committer | 2024-11-14 07:06:37 +0800 | |
commit | b5bc3cbe923d33fe241a780833f3c6c06048a0a8 (patch) | |
tree | e6a2500db8a4be222f65674e5cde452d5fab0b62 | |
parent | d7becd047d7751f06bb818b6a5ca845113cb0ec4 (diff) |
[Catalyst] Sync libraries
Bug: 378795106
Flag: EXEMPT library
Test: manual
Change-Id: I0ae7904337e9825ffeee3f0ddac3a4d1d81b264f
6 files changed, 62 insertions, 27 deletions
diff --git a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/GetPreferenceGraphApiHandler.kt b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/GetPreferenceGraphApiHandler.kt index 5ceee6d09978..088bef230374 100644 --- a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/GetPreferenceGraphApiHandler.kt +++ b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/GetPreferenceGraphApiHandler.kt @@ -22,11 +22,13 @@ import com.android.settingslib.graph.proto.PreferenceGraphProto import com.android.settingslib.ipc.ApiHandler import com.android.settingslib.ipc.MessageCodec import com.android.settingslib.metadata.PreferenceScreenRegistry +import com.android.settingslib.preference.PreferenceScreenProvider import java.util.Locale /** API to get preference graph. */ -abstract class GetPreferenceGraphApiHandler : - ApiHandler<GetPreferenceGraphRequest, PreferenceGraphProto> { +abstract class GetPreferenceGraphApiHandler( + private val preferenceScreenProviders: Set<Class<out PreferenceScreenProvider>> +) : ApiHandler<GetPreferenceGraphRequest, PreferenceGraphProto> { override val requestCodec: MessageCodec<GetPreferenceGraphRequest> get() = GetPreferenceGraphRequestCodec @@ -40,14 +42,16 @@ abstract class GetPreferenceGraphApiHandler : callingUid: Int, request: GetPreferenceGraphRequest, ): PreferenceGraphProto { - val builderRequest = - if (request.screenKeys.isEmpty()) { - val keys = PreferenceScreenRegistry.preferenceScreens.keys - GetPreferenceGraphRequest(keys, request.visitedScreens, request.locale) - } else { - request + val builder = PreferenceGraphBuilder.of(application, request) + if (request.screenKeys.isEmpty()) { + for (key in PreferenceScreenRegistry.preferenceScreens.keys) { + builder.addPreferenceScreenFromRegistry(key) } - return PreferenceGraphBuilder.of(application, builderRequest).build() + for (provider in preferenceScreenProviders) { + builder.addPreferenceScreenProvider(provider) + } + } + return builder.build() } } diff --git a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGraphBuilder.kt b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGraphBuilder.kt index 2256bb38dd2c..6760e72be4a6 100644 --- a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGraphBuilder.kt +++ b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/PreferenceGraphBuilder.kt @@ -133,7 +133,7 @@ private constructor(private val context: Context, private val request: GetPrefer null } - private suspend fun addPreferenceScreenFromRegistry(key: String): Boolean { + suspend fun addPreferenceScreenFromRegistry(key: String): Boolean { val metadata = PreferenceScreenRegistry[key] ?: return false return addPreferenceScreenMetadata(metadata) } @@ -146,7 +146,7 @@ private constructor(private val context: Context, private val request: GetPrefer } } - private suspend fun addPreferenceScreenProvider(activityClass: Class<*>) { + suspend fun addPreferenceScreenProvider(activityClass: Class<*>) { Log.d(TAG, "add $activityClass") createPreferenceScreen { activityClass.newInstance() } ?.let { diff --git a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/ProtoConverters.kt b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/ProtoConverters.kt index d9b9590f60e2..1bda277f2018 100644 --- a/packages/SettingsLib/Graph/src/com/android/settingslib/graph/ProtoConverters.kt +++ b/packages/SettingsLib/Graph/src/com/android/settingslib/graph/ProtoConverters.kt @@ -16,8 +16,10 @@ package com.android.settingslib.graph +import android.content.ComponentName import android.content.Context import android.content.Intent +import android.net.Uri import android.os.Bundle import com.android.settingslib.graph.proto.BundleProto import com.android.settingslib.graph.proto.BundleProto.BundleValue @@ -42,6 +44,20 @@ fun Intent.toProto(): IntentProto = intentProto { this@toProto.type?.let { mimeType = it } } +fun IntentProto.toIntent(): Intent? { + if (!hasComponent()) return null + val componentName = ComponentName.unflattenFromString(component) ?: return null + val intent = Intent() + intent.component = componentName + if (hasAction()) intent.action = action + if (hasData()) intent.data = Uri.parse(data) + if (hasPkg()) intent.`package` = pkg + if (hasFlags()) intent.flags = flags + if (hasExtras()) intent.putExtras(extras.toBundle()) + if (hasMimeType()) intent.setType(mimeType) + return intent +} + fun Bundle.toProto(): BundleProto = bundleProto { fun toProto(value: Any): BundleValue = bundleValueProto { when (value) { @@ -61,14 +77,18 @@ fun Bundle.toProto(): BundleProto = bundleProto { } } -fun BundleValue.stringify(): String = - when { - hasBooleanValue() -> "$valueCase" - hasBytesValue() -> "$bytesValue" - hasIntValue() -> "$intValue" - hasLongValue() -> "$longValue" - hasStringValue() -> stringValue - hasDoubleValue() -> "$doubleValue" - hasBundleValue() -> "$bundleValue" - else -> "Unknown" +fun BundleProto.toBundle(): Bundle = + Bundle().apply { + for ((key, value) in valuesMap) { + when { + value.hasBooleanValue() -> putBoolean(key, value.booleanValue) + value.hasBytesValue() -> putByteArray(key, value.bytesValue.toByteArray()) + value.hasIntValue() -> putInt(key, value.intValue) + value.hasLongValue() -> putLong(key, value.longValue) + value.hasStringValue() -> putString(key, value.stringValue) + value.hasDoubleValue() -> putDouble(key, value.doubleValue) + value.hasBundleValue() -> putBundle(key, value.bundleValue.toBundle()) + else -> throw IllegalArgumentException("Unknown type: ${value.javaClass} $value") + } + } } diff --git a/packages/SettingsLib/Ipc/src/com/android/settingslib/ipc/MessengerServiceClient.kt b/packages/SettingsLib/Ipc/src/com/android/settingslib/ipc/MessengerServiceClient.kt index 7ffefed239a4..ef907e17d824 100644 --- a/packages/SettingsLib/Ipc/src/com/android/settingslib/ipc/MessengerServiceClient.kt +++ b/packages/SettingsLib/Ipc/src/com/android/settingslib/ipc/MessengerServiceClient.kt @@ -320,6 +320,11 @@ constructor( } } + override fun onNullBinding(name: ComponentName) { + Log.i(TAG, "onNullBinding $name") + close(ClientBindServiceException(null)) + } + internal open fun drainPendingRequests() { disposableHandle = null if (pendingRequests.isEmpty()) { diff --git a/packages/SettingsLib/Service/src/com/android/settingslib/service/PreferenceGraphApi.kt b/packages/SettingsLib/Service/src/com/android/settingslib/service/PreferenceGraphApi.kt index 6e38df11156f..12c15b538f98 100644 --- a/packages/SettingsLib/Service/src/com/android/settingslib/service/PreferenceGraphApi.kt +++ b/packages/SettingsLib/Service/src/com/android/settingslib/service/PreferenceGraphApi.kt @@ -19,9 +19,12 @@ package com.android.settingslib.service import android.app.Application import com.android.settingslib.graph.GetPreferenceGraphApiHandler import com.android.settingslib.graph.GetPreferenceGraphRequest +import com.android.settingslib.preference.PreferenceScreenProvider /** Api to get preference graph. */ -internal class PreferenceGraphApi : GetPreferenceGraphApiHandler() { +internal class PreferenceGraphApi( + preferenceScreenProviders: Set<Class<out PreferenceScreenProvider>> +) : GetPreferenceGraphApiHandler(preferenceScreenProviders) { override val id: Int get() = API_GET_PREFERENCE_GRAPH diff --git a/packages/SettingsLib/Service/src/com/android/settingslib/service/PreferenceService.kt b/packages/SettingsLib/Service/src/com/android/settingslib/service/PreferenceService.kt index 8ebb14522c3d..63b5c5aaa35d 100644 --- a/packages/SettingsLib/Service/src/com/android/settingslib/service/PreferenceService.kt +++ b/packages/SettingsLib/Service/src/com/android/settingslib/service/PreferenceService.kt @@ -20,6 +20,7 @@ import com.android.settingslib.graph.PreferenceSetterApiHandler import com.android.settingslib.ipc.ApiHandler import com.android.settingslib.ipc.MessengerService import com.android.settingslib.ipc.PermissionChecker +import com.android.settingslib.preference.PreferenceScreenProvider /** * Preference service providing a bunch of APIs. @@ -28,14 +29,16 @@ import com.android.settingslib.ipc.PermissionChecker * [PREFERENCE_SERVICE_ACTION]. */ open class PreferenceService( - permissionChecker: PermissionChecker, + permissionChecker: PermissionChecker = PermissionChecker { _, _, _ -> true }, + preferenceScreenProviders: Set<Class<out PreferenceScreenProvider>> = setOf(), + enablePreferenceSetterApi: Boolean = false, name: String = "PreferenceService", ) : MessengerService( - listOf<ApiHandler<*, *>>( - PreferenceGraphApi(), - PreferenceSetterApiHandler(API_PREFERENCE_SETTER), - ), + mutableListOf<ApiHandler<*, *>>().apply { + add(PreferenceGraphApi(preferenceScreenProviders)) + if (enablePreferenceSetterApi) add(PreferenceSetterApiHandler(API_PREFERENCE_SETTER)) + }, permissionChecker, name, ) |