From 641d3c7d649fb36651bb89a3749bc7b6f8938fc8 Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Sat, 18 Oct 2025 10:03:50 +0200 Subject: [PATCH] switch to new gecko pref api --- .../browser/domain/providers/intent.g.dart | 2 +- .../data/models/preference_setting.dart | 9 +- .../data/models/preference_setting.g.dart | 15 +- .../repositories/preference_settings.dart | 14 +- .../repositories/preference_settings.g.dart | 29 ++-- .../repositories/gecko_inference.g.dart | 6 +- .../repositories/engine_settings.g.dart | 2 +- .../assets/extensions/pref_manager/api.js | 88 +---------- .../extensions/pref_manager/background.js | 15 +- .../extensions/pref_manager/schema.json | 68 +-------- .../api/GeckoPrefApiImpl.kt | 138 ++++++++++++++---- .../pigeons/Gecko.g.kt | 81 +++++++++- .../lib/flutter_mozilla_components.dart | 1 + .../lib/src/domain/services/gecko_pref.dart | 27 ++-- .../lib/src/pigeons/gecko.g.dart | 101 ++++++++++++- .../pigeons/gecko.dart | 22 ++- 16 files changed, 355 insertions(+), 263 deletions(-) diff --git a/app/lib/features/geckoview/features/browser/domain/providers/intent.g.dart b/app/lib/features/geckoview/features/browser/domain/providers/intent.g.dart index dc643010..eeb2157d 100644 --- a/app/lib/features/geckoview/features/browser/domain/providers/intent.g.dart +++ b/app/lib/features/geckoview/features/browser/domain/providers/intent.g.dart @@ -34,7 +34,7 @@ final class EngineBoundIntentStreamProvider } String _$engineBoundIntentStreamHash() => - r'd47f50ee8f548fe0416b8ed01bb02adbd79b3386'; + r'fa7c3e0277b25e8129a12feaadf39db6b65a1cd5'; abstract class _$EngineBoundIntentStream extends $StreamNotifier { diff --git a/app/lib/features/geckoview/features/preferences/data/models/preference_setting.dart b/app/lib/features/geckoview/features/preferences/data/models/preference_setting.dart index 6b2ba5a8..9dd07dde 100644 --- a/app/lib/features/geckoview/features/preferences/data/models/preference_setting.dart +++ b/app/lib/features/geckoview/features/preferences/data/models/preference_setting.dart @@ -19,6 +19,7 @@ */ import 'package:copy_with_extension/copy_with_extension.dart'; import 'package:fast_equatable/fast_equatable.dart'; +import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; import 'package:json_annotation/json_annotation.dart'; part 'preference_setting.g.dart'; @@ -55,9 +56,9 @@ class PreferenceSetting with FastEquatable { final Object value; @JsonKey(includeFromJson: false, includeToJson: false) - final Object? actualValue; + final GeckoPrefValue? current; - bool get isActive => value == actualValue; + bool get isActive => value == current?.value; final String? title; final String? description; @@ -69,7 +70,7 @@ class PreferenceSetting with FastEquatable { required this.value, required this.title, required this.description, - this.actualValue, + this.current, this.requireUserOptIn = false, this.shouldBeDefault = false, }); @@ -82,7 +83,7 @@ class PreferenceSetting with FastEquatable { @override List get hashParameters => [ value, - actualValue, + current, title, description, requireUserOptIn, diff --git a/app/lib/features/geckoview/features/preferences/data/models/preference_setting.g.dart b/app/lib/features/geckoview/features/preferences/data/models/preference_setting.g.dart index 6b33f5a0..92bfcb71 100644 --- a/app/lib/features/geckoview/features/preferences/data/models/preference_setting.g.dart +++ b/app/lib/features/geckoview/features/preferences/data/models/preference_setting.g.dart @@ -80,7 +80,7 @@ abstract class _$PreferenceSettingCWProxy { PreferenceSetting description(String? description); - PreferenceSetting actualValue(Object? actualValue); + PreferenceSetting current(GeckoPrefValue? current); PreferenceSetting requireUserOptIn(bool requireUserOptIn); @@ -97,7 +97,7 @@ abstract class _$PreferenceSettingCWProxy { Object value, String? title, String? description, - Object? actualValue, + GeckoPrefValue? current, bool requireUserOptIn, bool shouldBeDefault, }); @@ -121,8 +121,7 @@ class _$PreferenceSettingCWProxyImpl implements _$PreferenceSettingCWProxy { call(description: description); @override - PreferenceSetting actualValue(Object? actualValue) => - call(actualValue: actualValue); + PreferenceSetting current(GeckoPrefValue? current) => call(current: current); @override PreferenceSetting requireUserOptIn(bool requireUserOptIn) => @@ -144,7 +143,7 @@ class _$PreferenceSettingCWProxyImpl implements _$PreferenceSettingCWProxy { Object? value = const $CopyWithPlaceholder(), Object? title = const $CopyWithPlaceholder(), Object? description = const $CopyWithPlaceholder(), - Object? actualValue = const $CopyWithPlaceholder(), + Object? current = const $CopyWithPlaceholder(), Object? requireUserOptIn = const $CopyWithPlaceholder(), Object? shouldBeDefault = const $CopyWithPlaceholder(), }) { @@ -161,10 +160,10 @@ class _$PreferenceSettingCWProxyImpl implements _$PreferenceSettingCWProxy { ? _value.description // ignore: cast_nullable_to_non_nullable : description as String?, - actualValue: actualValue == const $CopyWithPlaceholder() - ? _value.actualValue + current: current == const $CopyWithPlaceholder() + ? _value.current // ignore: cast_nullable_to_non_nullable - : actualValue as Object?, + : current as GeckoPrefValue?, requireUserOptIn: requireUserOptIn == const $CopyWithPlaceholder() || requireUserOptIn == null diff --git a/app/lib/features/geckoview/features/preferences/data/repositories/preference_settings.dart b/app/lib/features/geckoview/features/preferences/data/repositories/preference_settings.dart index 9bdfdc8b..14e637b0 100644 --- a/app/lib/features/geckoview/features/preferences/data/repositories/preference_settings.dart +++ b/app/lib/features/geckoview/features/preferences/data/repositories/preference_settings.dart @@ -65,7 +65,7 @@ Future _preferenceSettingGroup( class _PreferenceRepository extends _$PreferenceRepository { final _prefManager = GeckoPrefService(); // Use BehaviorSubject instead of StreamController - late BehaviorSubject> _prefSubject; + late BehaviorSubject> _prefSubject; Future _updatePrefs() async { final prefs = await _prefManager.getAllPrefs(); @@ -83,8 +83,8 @@ class _PreferenceRepository extends _$PreferenceRepository { } @override - Raw>> build() { - _prefSubject = BehaviorSubject>(); + Raw>> build() { + _prefSubject = BehaviorSubject>(); ref.onDispose(() async { await _prefSubject.close(); @@ -157,10 +157,8 @@ class UnifiedPreferenceSettingsRepository groupName, group.copyWith.settings( group.settings.map( - (prefName, setting) => MapEntry( - prefName, - setting.copyWith.actualValue(prefs[prefName]), - ), + (prefName, setting) => + MapEntry(prefName, setting.copyWith.current(prefs[prefName])), ), ), ), @@ -234,7 +232,7 @@ class PreferenceSettingsGroupRepository yield* prefStream.map( (prefs) => _statelessSettingGroup!.copyWith.settings( _statelessSettingGroup!.settings.map( - (key, value) => MapEntry(key, value.copyWith.actualValue(prefs[key])), + (key, value) => MapEntry(key, value.copyWith.current(prefs[key])), ), ), ); diff --git a/app/lib/features/geckoview/features/preferences/data/repositories/preference_settings.g.dart b/app/lib/features/geckoview/features/preferences/data/repositories/preference_settings.g.dart index ceab515b..35696dce 100644 --- a/app/lib/features/geckoview/features/preferences/data/repositories/preference_settings.g.dart +++ b/app/lib/features/geckoview/features/preferences/data/repositories/preference_settings.g.dart @@ -229,7 +229,7 @@ final class _PreferenceRepositoryProvider extends $NotifierProvider< _PreferenceRepository, - Raw>> + Raw>> > { const _PreferenceRepositoryProvider._() : super( @@ -250,22 +250,21 @@ final class _PreferenceRepositoryProvider _PreferenceRepository create() => _PreferenceRepository(); /// {@macro riverpod.override_with_value} - Override overrideWithValue(Raw>> value) { + Override overrideWithValue(Raw>> value) { return $ProviderOverride( origin: this, - providerOverride: $SyncValueProvider>>>( - value, - ), + providerOverride: + $SyncValueProvider>>>(value), ); } } String _$_preferenceRepositoryHash() => - r'b2b7f75b3d30842b3006bb18af89f7ff90ba4ce7'; + r'9a98b95677d4070def531ea1e5b900892045a1ef'; abstract class _$PreferenceRepository - extends $Notifier>>> { - Raw>> build(); + extends $Notifier>>> { + Raw>> build(); @$mustCallSuper @override void runBuild() { @@ -273,17 +272,17 @@ abstract class _$PreferenceRepository final ref = this.ref as $Ref< - Raw>>, - Raw>> + Raw>>, + Raw>> >; final element = ref.element as $ClassProviderElement< AnyNotifier< - Raw>>, - Raw>> + Raw>>, + Raw>> >, - Raw>>, + Raw>>, Object?, Object? >; @@ -341,7 +340,7 @@ final class UnifiedPreferenceSettingsRepositoryProvider } String _$unifiedPreferenceSettingsRepositoryHash() => - r'23c0da1fdc975bbfb88b3cf82f242dbe0d50cd87'; + r'800e74a051113b4ebc3631b6ade55d66cb7e1af1'; final class UnifiedPreferenceSettingsRepositoryFamily extends $Family with @@ -455,7 +454,7 @@ final class PreferenceSettingsGroupRepositoryProvider } String _$preferenceSettingsGroupRepositoryHash() => - r'05db908036ffa999886f4e9dc4429aa85f8957f9'; + r'8e025cdea5cef8a6ea029db6f9ebcd86abf906d8'; final class PreferenceSettingsGroupRepositoryFamily extends $Family with diff --git a/app/lib/features/geckoview/features/tabs/domain/repositories/gecko_inference.g.dart b/app/lib/features/geckoview/features/tabs/domain/repositories/gecko_inference.g.dart index 43c691a1..cc9fc25f 100644 --- a/app/lib/features/geckoview/features/tabs/domain/repositories/gecko_inference.g.dart +++ b/app/lib/features/geckoview/features/tabs/domain/repositories/gecko_inference.g.dart @@ -42,7 +42,7 @@ final class GeckoInferenceRepositoryProvider } String _$geckoInferenceRepositoryHash() => - r'5f99fd1e46a8ae291b63df044fe11917cd5d415c'; + r'c4f52d2edfb8c5763577a17697202016645177da'; abstract class _$GeckoInferenceRepository extends $Notifier { void build(); @@ -268,7 +268,7 @@ final class TopicSuggestionProvider } } -String _$topicSuggestionHash() => r'5401b1cd91e53be6ad1b4c7a39a5253d380e05d4'; +String _$topicSuggestionHash() => r'97480102ecfe9458d25cb4666cf4577333e26d66'; final class TopicSuggestionFamily extends $Family with @@ -390,7 +390,7 @@ final class ContainerTabSuggestionsProvider } String _$containerTabSuggestionsHash() => - r'9e7e9b9d245959fcf8c87cb8822313ded801ebc0'; + r'1b681736215826886241aea834f99ebfb9761197'; final class ContainerTabSuggestionsFamily extends $Family with $FunctionalFamilyOverride?>, String?> { diff --git a/app/lib/features/user/domain/repositories/engine_settings.g.dart b/app/lib/features/user/domain/repositories/engine_settings.g.dart index cf6a42c4..862db30e 100644 --- a/app/lib/features/user/domain/repositories/engine_settings.g.dart +++ b/app/lib/features/user/domain/repositories/engine_settings.g.dart @@ -34,7 +34,7 @@ final class EngineSettingsRepositoryProvider } String _$engineSettingsRepositoryHash() => - r'33acd89e783d8d91b9b56e86411fdfcab24a2c54'; + r'17a4e505320e92a90ed8b62db263c283c5eaa839'; abstract class _$EngineSettingsRepository extends $StreamNotifier { diff --git a/packages/flutter_mozilla_components/android/src/main/assets/extensions/pref_manager/api.js b/packages/flutter_mozilla_components/android/src/main/assets/extensions/pref_manager/api.js index 295f5de6..756fc0da 100644 --- a/packages/flutter_mozilla_components/android/src/main/assets/extensions/pref_manager/api.js +++ b/packages/flutter_mozilla_components/android/src/main/assets/extensions/pref_manager/api.js @@ -25,92 +25,8 @@ var prefmanager = class extends ExtensionAPI { return { experiments: { prefmanager: { - async resetPrefs(prefNames) { - if (prefNames && prefNames.length > 0) { - for (const prefName of prefNames) { - Services.prefs.clearUserPref(prefName); - } - } else { - Services.prefs.resetPrefs(); - } - }, - async getPrefs(prefNames) { - const prefs = (prefNames && prefNames.length > 0) - ? prefNames - : Services.prefs.getChildList(""); - - const result = {}; - - for (const prefName of prefs) { - try { - switch (Services.prefs.getPrefType(prefName)) { - case Services.prefs.PREF_BOOL: - result[prefName] = Services.prefs.getBoolPref(prefName); - break; - case Services.prefs.PREF_INT: - result[prefName] = Services.prefs.getIntPref(prefName); - break; - case Services.prefs.PREF_STRING: - result[prefName] = Services.prefs.getCharPref(prefName); - break; - default: - // Skip complex values or invalid preferences - continue; - } - } catch (e) { - lazy.log.error(`Error reading preference ${prefName}: ${e}`); - continue; - } - } - - lazy.log.debug(`getAll: retrieved ${Object.keys(result).length} preferences`); - return result; - }, - async parsePrefsAndApply(prefsFileContent, predicate = null) { - let prefs = {}; - let addPref = (kind, name, value) => { - if (predicate && !predicate(name)) { - return; - } - prefs[name] = value; - }; - - Services.prefs.parsePrefsFromBuffer( - prefsFileContent, - { - onStringPref: addPref, - onIntPref: addPref, - onBoolPref: addPref, - onError(message) { - throw new Error( - `Error parsing preferences "${message}"` - ); - }, - }, - ); - - await BackgroundTasksUtils.withProfileLock(profileLock => { - for (let [name, value] of Object.entries(prefs)) { - switch (typeof value) { - case "boolean": - Services.prefs.setBoolPref(name, value); - break; - case "number": - Services.prefs.setIntPref(name, value); - break; - case "string": - Services.prefs.setCharPref(name, value); - break; - default: - throw new Error( - `Pref from default profile with name "${name}" has unrecognized type` - ); - } - } - }); - - lazy.log.debug(`applyPreferences: parsed prefs from buffer`, prefs); - return prefs; + async getPrefList() { + return Services.prefs.getChildList(""); } } } diff --git a/packages/flutter_mozilla_components/android/src/main/assets/extensions/pref_manager/background.js b/packages/flutter_mozilla_components/android/src/main/assets/extensions/pref_manager/background.js index a8cf37e2..a741a9d1 100644 --- a/packages/flutter_mozilla_components/android/src/main/assets/extensions/pref_manager/background.js +++ b/packages/flutter_mozilla_components/android/src/main/assets/extensions/pref_manager/background.js @@ -28,20 +28,9 @@ function sendErrorForRequest(id) { port.onMessage.addListener(message => { let requestId = message["id"] switch (message["action"]) { - case "parsePrefsAndApply": - browser.experiments.prefmanager.parsePrefsAndApply(encoder.encode(message["args"]), null) + case "getPrefList": + browser.experiments.prefmanager.getPrefList() .then(sendJsonResultForRequest(requestId)) .catch(sendErrorForRequest(requestId)) - break - case "getPrefs": - browser.experiments.prefmanager.getPrefs(message["args"]) - .then(sendJsonResultForRequest(requestId)) - .catch(sendErrorForRequest(requestId)) - break - case "resetPrefs": - browser.experiments.prefmanager.resetPrefs(message["args"]) - .then(sendJsonResultForRequest(requestId)) - .catch(sendErrorForRequest(requestId)) - break } }); diff --git a/packages/flutter_mozilla_components/android/src/main/assets/extensions/pref_manager/schema.json b/packages/flutter_mozilla_components/android/src/main/assets/extensions/pref_manager/schema.json index 6b2a279f..1d062c32 100644 --- a/packages/flutter_mozilla_components/android/src/main/assets/extensions/pref_manager/schema.json +++ b/packages/flutter_mozilla_components/android/src/main/assets/extensions/pref_manager/schema.json @@ -4,74 +4,18 @@ "description": "Experimental API for updating Geckoview preferences", "functions": [ { - "name": "getPrefs", + "name": "getPrefList", "type": "function", - "description": "Retrieves preferences and their values", + "description": "Retrieves list of all preferences", "async": true, - "parameters": [ - { - "name": "prefNames", - "type": "array", - "optional": true, - "description": "Array of preference names to retrieve. If empty or null, retrieves all preferences", - "items": { - "type": "string" - } - } - ], + "parameters": [], "returns": { - "type": "object", + "array": "object", "description": "Object containing the preferences as key-value pairs", - "additionalProperties": { - "type": "any", - "description": "Preference values can be boolean, number, or string" + "items": { + "type": "string" } } - }, - { - "name": "parsePrefsAndApply", - "type": "function", - "description": "Reads and sets preferences from an encoded preferences file content", - "async": true, - "parameters": [ - { - "name": "prefsFileContent", - "type": "object", - "isInstanceOf": "Uint8Array", - "description": "Encoded content of the preferences file to parse (Uint8Array)" - }, - { - "name": "predicate", - "type": "function", - "optional": true, - "description": "Optional filter function to determine which preferences to include" - } - ], - "returns": { - "type": "object", - "description": "Object containing the parsed preferences as key-value pairs", - "additionalProperties": { - "type": "any", - "description": "Preference values can be boolean, number, or string" - } - } - }, - { - "name": "resetPrefs", - "type": "function", - "description": "Resets multiple or all preferences to their default values", - "async": true, - "parameters": [ - { - "name": "prefNames", - "type": "array", - "optional": true, - "description": "Array of preference names to reset. If empty or null, resets all preferences", - "items": { - "type": "string" - } - } - ] } ] } diff --git a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/api/GeckoPrefApiImpl.kt b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/api/GeckoPrefApiImpl.kt index b692ed6e..1a2286e8 100644 --- a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/api/GeckoPrefApiImpl.kt +++ b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/api/GeckoPrefApiImpl.kt @@ -6,13 +6,22 @@ package eu.weblibre.flutter_mozilla_components.api +import eu.weblibre.flutter_mozilla_components.GlobalComponents import eu.weblibre.flutter_mozilla_components.feature.PrefManagerFeature import eu.weblibre.flutter_mozilla_components.feature.ResultConsumer import eu.weblibre.flutter_mozilla_components.pigeons.GeckoPrefApi +import eu.weblibre.flutter_mozilla_components.pigeons.GeckoPrefValue +import mozilla.components.ExperimentalAndroidComponentsApi +import mozilla.components.concept.engine.preferences.Branch +import mozilla.components.support.ktx.android.org.json.toList import org.json.JSONObject import org.json.JSONArray class GeckoPrefApiImpl : GeckoPrefApi { + private val components by lazy { + requireNotNull(GlobalComponents.components) { "Components not initialized" } + } + private fun List?.toJson(): JSONArray { return JSONArray().apply { this@toJson?.forEach { put(it) } @@ -36,44 +45,119 @@ class GeckoPrefApiImpl : GeckoPrefApi { return map } + override fun getPrefList(callback: (Result>) -> Unit) { + PrefManagerFeature.scheduleRequest("getPrefList", Unit, object : ResultConsumer { + override fun success(result: JSONObject) { + callback(Result.success(result.getJSONArray("result").toList())) + } + + override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) { + callback(Result.failure(Exception("$errorCode $errorMessage $errorDetails"))) + } + }) + } + + @OptIn(ExperimentalAndroidComponentsApi::class) override fun getPrefs( - preferenceFilter: List?, - callback: (Result>) -> Unit + preferenceFilter: List, + callback: (Result>) -> Unit ) { - PrefManagerFeature.scheduleRequest("getPrefs", preferenceFilter.toJson(), object : ResultConsumer { - override fun success(result: JSONObject) { - callback(Result.success(result.getJSONObject("result").toMap())) + components.core.engine.getBrowserPrefs( + preferenceFilter, onSuccess = { + callback( + Result.success( + it.associate { + it.pref to GeckoPrefValue( + value = it.value, + defaultValue = it.defaultValue, + userValue = it.userValue, + hasUserChangedValue = it.hasUserChangedValue, + ) + }) + ) + }, + onError = { + callback(Result.failure(Exception("${it.message} ${it.cause}"))) } - - override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) { - callback(Result.failure(Exception("$errorCode $errorMessage $errorDetails"))) - } - }) + ) } - override fun applyPrefs(prefBuffer: String, callback: (Result>) -> Unit) { - PrefManagerFeature.scheduleRequest("parsePrefsAndApply", prefBuffer, object : ResultConsumer { - override fun success(result: JSONObject) { - callback(Result.success(result.getJSONObject("result").toMap())) + @OptIn(ExperimentalAndroidComponentsApi::class) + override fun applyPrefs( + prefs: Map, + callback: (Result>) -> Unit + ) { + var fault: Boolean = false; + + for (pref in prefs) { + when (pref.value) { + is String -> components.core.engine.setBrowserPref( + pref.key, + pref.value as String, + Branch.USER, + onSuccess = {}, + onError = { + callback(Result.failure(Exception("${it.message} ${it.cause}"))) + fault = true + } + ) + + is Boolean -> components.core.engine.setBrowserPref( + pref.key, + pref.value as Boolean, + Branch.USER, + onSuccess = {}, + onError = { + callback(Result.failure(Exception("${it.message} ${it.cause}"))) + fault = true + } + ) + + is Long -> components.core.engine.setBrowserPref( + pref.key, + (pref.value as Long).toInt(), + Branch.USER, + onSuccess = {}, + onError = { + callback(Result.failure(Exception("${it.message} ${it.cause}"))) + fault = true + } + ) + + else -> { + callback(Result.failure(Exception("Unsupported value type: ${pref.value::class.simpleName}"))) + fault = true + } } - override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) { - callback(Result.failure(Exception("$errorCode $errorMessage $errorDetails"))) + if (fault) { + return; } - }) + } + + getPrefs( + prefs.keys.toList(), + callback = callback + ) } - override fun resetPrefs(preferenceNames: List?, callback: (Result) -> Unit) { - PrefManagerFeature.scheduleRequest("resetPrefs", preferenceNames.toJson(), object : ResultConsumer { - override fun success(result: JSONObject) { - callback(Result.success(Unit)) - } + @OptIn(ExperimentalAndroidComponentsApi::class) + override fun resetPrefs(preferenceNames: List, callback: (Result) -> Unit) { + var fault: Boolean = false; - override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) { - callback(Result.failure(Exception("$errorCode $errorMessage $errorDetails"))) + for (pref in preferenceNames) { + components.core.engine.clearBrowserUserPref( + pref = pref, + onSuccess = {}, + onError = { + callback(Result.failure(Exception("${it.message} ${it.cause}"))) + fault = true + } + ) + + if (fault) { + return; } - }) + } } - - } \ No newline at end of file diff --git a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/pigeons/Gecko.g.kt b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/pigeons/Gecko.g.kt index a4a1e45b..44de38bb 100644 --- a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/pigeons/Gecko.g.kt +++ b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/pigeons/Gecko.g.kt @@ -2194,6 +2194,43 @@ data class AddonCollection ( override fun hashCode(): Int = toList().hashCode() } + +/** Generated class from Pigeon that represents data sent in messages. */ +data class GeckoPrefValue ( + val value: Any? = null, + val defaultValue: Any? = null, + val userValue: Any? = null, + val hasUserChangedValue: Boolean +) + { + companion object { + fun fromList(pigeonVar_list: List): GeckoPrefValue { + val value = pigeonVar_list[0] + val defaultValue = pigeonVar_list[1] + val userValue = pigeonVar_list[2] + val hasUserChangedValue = pigeonVar_list[3] as Boolean + return GeckoPrefValue(value, defaultValue, userValue, hasUserChangedValue) + } + } + fun toList(): List { + return listOf( + value, + defaultValue, + userValue, + hasUserChangedValue, + ) + } + override fun equals(other: Any?): Boolean { + if (other !is GeckoPrefValue) { + return false + } + if (this === other) { + return true + } + return GeckoPigeonUtils.deepEquals(toList(), other.toList()) } + + override fun hashCode(): Int = toList().hashCode() +} private open class GeckoPigeonCodec : StandardMessageCodec() { override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? { return when (type) { @@ -2507,6 +2544,11 @@ private open class GeckoPigeonCodec : StandardMessageCodec() { AddonCollection.fromList(it) } } + 191.toByte() -> { + return (readValue(buffer) as? List)?.let { + GeckoPrefValue.fromList(it) + } + } else -> super.readValueOfType(type, buffer) } } @@ -2760,6 +2802,10 @@ private open class GeckoPigeonCodec : StandardMessageCodec() { stream.write(190) writeValue(stream, value.toList()) } + is GeckoPrefValue -> { + stream.write(191) + writeValue(stream, value.toList()) + } else -> super.writeValue(stream, value) } } @@ -3714,9 +3760,10 @@ interface GeckoIconsApi { } /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ interface GeckoPrefApi { - fun getPrefs(preferenceFilter: List?, callback: (Result>) -> Unit) - fun applyPrefs(prefBuffer: String, callback: (Result>) -> Unit) - fun resetPrefs(preferenceNames: List?, callback: (Result) -> Unit) + fun getPrefList(callback: (Result>) -> Unit) + fun getPrefs(preferenceFilter: List, callback: (Result>) -> Unit) + fun applyPrefs(prefs: Map, callback: (Result>) -> Unit) + fun resetPrefs(preferenceNames: List, callback: (Result) -> Unit) companion object { /** The codec used by GeckoPrefApi. */ @@ -3727,13 +3774,31 @@ interface GeckoPrefApi { @JvmOverloads fun setUp(binaryMessenger: BinaryMessenger, api: GeckoPrefApi?, messageChannelSuffix: String = "") { val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.getPrefList$separatedMessageChannelSuffix", codec) + if (api != null) { + channel.setMessageHandler { _, reply -> + api.getPrefList{ result: Result> -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(GeckoPigeonUtils.wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(GeckoPigeonUtils.wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } run { val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.getPrefs$separatedMessageChannelSuffix", codec) if (api != null) { channel.setMessageHandler { message, reply -> val args = message as List - val preferenceFilterArg = args[0] as List? - api.getPrefs(preferenceFilterArg) { result: Result> -> + val preferenceFilterArg = args[0] as List + api.getPrefs(preferenceFilterArg) { result: Result> -> val error = result.exceptionOrNull() if (error != null) { reply.reply(GeckoPigeonUtils.wrapError(error)) @@ -3752,8 +3817,8 @@ interface GeckoPrefApi { if (api != null) { channel.setMessageHandler { message, reply -> val args = message as List - val prefBufferArg = args[0] as String - api.applyPrefs(prefBufferArg) { result: Result> -> + val prefsArg = args[0] as Map + api.applyPrefs(prefsArg) { result: Result> -> val error = result.exceptionOrNull() if (error != null) { reply.reply(GeckoPigeonUtils.wrapError(error)) @@ -3772,7 +3837,7 @@ interface GeckoPrefApi { if (api != null) { channel.setMessageHandler { message, reply -> val args = message as List - val preferenceNamesArg = args[0] as List? + val preferenceNamesArg = args[0] as List api.resetPrefs(preferenceNamesArg) { result: Result -> val error = result.exceptionOrNull() if (error != null) { diff --git a/packages/flutter_mozilla_components/lib/flutter_mozilla_components.dart b/packages/flutter_mozilla_components/lib/flutter_mozilla_components.dart index 73924e14..236fa4a4 100644 --- a/packages/flutter_mozilla_components/lib/flutter_mozilla_components.dart +++ b/packages/flutter_mozilla_components/lib/flutter_mozilla_components.dart @@ -42,6 +42,7 @@ export 'src/pigeons/gecko.g.dart' DohSettingsMode, EmailHitResult, GeckoEngineSettings, + GeckoPrefValue, GeckoSuggestion, GeckoSuggestionType, GeoHitResult, diff --git a/packages/flutter_mozilla_components/lib/src/domain/services/gecko_pref.dart b/packages/flutter_mozilla_components/lib/src/domain/services/gecko_pref.dart index 3d8de8d5..4ccc0625 100644 --- a/packages/flutter_mozilla_components/lib/src/domain/services/gecko_pref.dart +++ b/packages/flutter_mozilla_components/lib/src/domain/services/gecko_pref.dart @@ -4,34 +4,25 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import 'dart:convert'; - import 'package:flutter_mozilla_components/src/pigeons/gecko.g.dart'; final _apiInstance = GeckoPrefApi(); class GeckoPrefService { - Future> getAllPrefs() { - return _apiInstance.getPrefs(null); + Future> getPrefList() { + return _apiInstance.getPrefList(); } - Future> getPrefs(List prefs) { + Future> getAllPrefs() async { + return _apiInstance.getPrefs(await getPrefList()); + } + + Future> getPrefs(List prefs) { return _apiInstance.getPrefs(prefs); } - Future> applyPrefs(Map prefs) { - final buffer = prefs.entries.map((pref) { - final value = switch (pref.value) { - final bool x => '$x', - final int x => '$x', - final String x => jsonEncode(x), - _ => throw Exception('Unknow pref type'), - }; - - return 'user_pref("${pref.key}", $value);'; - }).join(); - - return _apiInstance.applyPrefs(buffer); + Future> applyPrefs(Map prefs) { + return _apiInstance.applyPrefs(prefs); } Future resetPrefs(List prefs) { diff --git a/packages/flutter_mozilla_components/lib/src/pigeons/gecko.g.dart b/packages/flutter_mozilla_components/lib/src/pigeons/gecko.g.dart index 0185d6bd..1d30c813 100644 --- a/packages/flutter_mozilla_components/lib/src/pigeons/gecko.g.dart +++ b/packages/flutter_mozilla_components/lib/src/pigeons/gecko.g.dart @@ -2788,6 +2788,62 @@ class AddonCollection { ; } +class GeckoPrefValue { + GeckoPrefValue({ + this.value, + this.defaultValue, + this.userValue, + required this.hasUserChangedValue, + }); + + Object? value; + + Object? defaultValue; + + Object? userValue; + + bool hasUserChangedValue; + + List _toList() { + return [ + value, + defaultValue, + userValue, + hasUserChangedValue, + ]; + } + + Object encode() { + return _toList(); } + + static GeckoPrefValue decode(Object result) { + result as List; + return GeckoPrefValue( + value: result[0], + defaultValue: result[1], + userValue: result[2], + hasUserChangedValue: result[3]! as bool, + ); + } + + @override + // ignore: avoid_equals_and_hash_code_on_mutable_classes + bool operator ==(Object other) { + if (other is! GeckoPrefValue || other.runtimeType != runtimeType) { + return false; + } + if (identical(this, other)) { + return true; + } + return _deepEquals(encode(), other.encode()); + } + + @override + // ignore: avoid_equals_and_hash_code_on_mutable_classes + int get hashCode => Object.hashAll(_toList()) +; +} + class _PigeonCodec extends StandardMessageCodec { const _PigeonCodec(); @@ -2982,6 +3038,9 @@ class _PigeonCodec extends StandardMessageCodec { } else if (value is AddonCollection) { buffer.putUint8(190); writeValue(buffer, value.encode()); + } else if (value is GeckoPrefValue) { + buffer.putUint8(191); + writeValue(buffer, value.encode()); } else { super.writeValue(buffer, value); } @@ -3133,6 +3192,8 @@ class _PigeonCodec extends StandardMessageCodec { return ShareInternetResourceState.decode(readValue(buffer)!); case 190: return AddonCollection.decode(readValue(buffer)!); + case 191: + return GeckoPrefValue.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); } @@ -4268,7 +4329,35 @@ class GeckoPrefApi { final String pigeonVar_messageChannelSuffix; - Future> getPrefs(List? preferenceFilter) async { + Future> getPrefList() async { + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.getPrefList$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send(null); + final List? pigeonVar_replyList = + await pigeonVar_sendFuture as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else if (pigeonVar_replyList[0] == null) { + throw PlatformException( + code: 'null-error', + message: 'Host platform returned null value for non-null return value.', + ); + } else { + return (pigeonVar_replyList[0] as List?)!.cast(); + } + } + + Future> getPrefs(List preferenceFilter) async { final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.getPrefs$pigeonVar_messageChannelSuffix'; final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, @@ -4292,18 +4381,18 @@ class GeckoPrefApi { message: 'Host platform returned null value for non-null return value.', ); } else { - return (pigeonVar_replyList[0] as Map?)!.cast(); + return (pigeonVar_replyList[0] as Map?)!.cast(); } } - Future> applyPrefs(String prefBuffer) async { + Future> applyPrefs(Map prefs) async { final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.applyPrefs$pigeonVar_messageChannelSuffix'; final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([prefBuffer]); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([prefs]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { @@ -4320,11 +4409,11 @@ class GeckoPrefApi { message: 'Host platform returned null value for non-null return value.', ); } else { - return (pigeonVar_replyList[0] as Map?)!.cast(); + return (pigeonVar_replyList[0] as Map?)!.cast(); } } - Future resetPrefs(List? preferenceNames) async { + Future resetPrefs(List preferenceNames) async { final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.resetPrefs$pigeonVar_messageChannelSuffix'; final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, diff --git a/packages/flutter_mozilla_components/pigeons/gecko.dart b/packages/flutter_mozilla_components/pigeons/gecko.dart index fe7e782f..66b812d1 100644 --- a/packages/flutter_mozilla_components/pigeons/gecko.dart +++ b/packages/flutter_mozilla_components/pigeons/gecko.dart @@ -1075,14 +1075,30 @@ abstract class GeckoIconsApi { IconResult loadIcon(IconRequest request); } +class GeckoPrefValue { + final Object? value; + final Object? defaultValue; + final Object? userValue; + final bool hasUserChangedValue; + + GeckoPrefValue( + this.value, + this.defaultValue, + this.userValue, + this.hasUserChangedValue, + ); +} + @HostApi() abstract class GeckoPrefApi { @async - Map getPrefs(List? preferenceFilter); + List getPrefList(); @async - Map applyPrefs(String prefBuffer); + Map getPrefs(List preferenceFilter); @async - void resetPrefs(List? preferenceNames); + Map applyPrefs(Map prefs); + @async + void resetPrefs(List preferenceNames); } @HostApi()