pref observer and fixator

This commit is contained in:
Fabian Freund
2025-10-19 16:45:56 +02:00
parent 64d588ee3e
commit 73dab11113
16 changed files with 598 additions and 72 deletions
@@ -9,15 +9,17 @@ 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.GeckoPref
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.concept.engine.preferences.BrowserPrefObserverDelegate
import mozilla.components.concept.engine.preferences.BrowserPreference
import mozilla.components.support.ktx.android.org.json.toList
import org.json.JSONObject
import org.json.JSONArray
class GeckoPrefApiImpl : GeckoPrefApi {
class GeckoPrefApiImpl : GeckoPrefApi, BrowserPrefObserverDelegate {
private val components by lazy {
requireNotNull(GlobalComponents.components) { "Components not initialized" }
}
@@ -46,28 +48,32 @@ class GeckoPrefApiImpl : GeckoPrefApi {
}
override fun getPrefList(callback: (Result<List<String>>) -> Unit) {
PrefManagerFeature.scheduleRequest("getPrefList", Unit, object : ResultConsumer<JSONObject> {
override fun success(result: JSONObject) {
callback(Result.success(result.getJSONArray("result").toList()))
}
PrefManagerFeature.scheduleRequest(
"getPrefList",
Unit,
object : ResultConsumer<JSONObject> {
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")))
}
})
override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) {
callback(Result.failure(Exception("$errorCode $errorMessage $errorDetails")))
}
})
}
@OptIn(ExperimentalAndroidComponentsApi::class)
override fun getPrefs(
preferenceFilter: List<String>,
callback: (Result<Map<String, GeckoPrefValue>>) -> Unit
callback: (Result<Map<String, GeckoPref>>) -> Unit
) {
components.core.engine.getBrowserPrefs(
preferenceFilter, onSuccess = {
callback(
Result.success(
it.associate {
it.pref to GeckoPrefValue(
it.pref to GeckoPref(
name = it.pref,
value = it.value,
defaultValue = it.defaultValue,
userValue = it.userValue,
@@ -85,7 +91,7 @@ class GeckoPrefApiImpl : GeckoPrefApi {
@OptIn(ExperimentalAndroidComponentsApi::class)
override fun applyPrefs(
prefs: Map<String, Any>,
callback: (Result<Map<String, GeckoPrefValue>>) -> Unit
callback: (Result<Map<String, GeckoPref>>) -> Unit
) {
var fault: Boolean = false;
@@ -148,7 +154,7 @@ class GeckoPrefApiImpl : GeckoPrefApi {
for (pref in preferenceNames) {
components.core.engine.clearBrowserUserPref(
pref = pref,
onSuccess = {},
onSuccess = { },
onError = {
callback(Result.failure(Exception("${it.message} ${it.cause}")))
fault = true
@@ -159,5 +165,49 @@ class GeckoPrefApiImpl : GeckoPrefApi {
return;
}
}
callback(Result.success(Unit))
}
override fun startObserveChanges() {
components.core.engine.registerPrefObserverDelegate(this);
}
override fun stopObserveChanges() {
components.core.engine.unregisterPrefObserverDelegate();
}
override fun registerPrefForObservation(name: String, callback: (Result<Unit>) -> Unit) {
components.core.engine.registerPrefForObservation(
name,
onSuccess = {
callback(Result.success(Unit))
},
onError = {
callback(Result.failure(Exception("${it.message} ${it.cause}")))
})
}
override fun unregisterPrefForObservation(name: String, callback: (Result<Unit>) -> Unit) {
components.core.engine.unregisterPrefForObservation(
name,
onSuccess = {
callback(Result.success(Unit))
},
onError = {
callback(Result.failure(Exception("${it.message} ${it.cause}")))
})
}
override fun onPreferenceChange(observedPreference: BrowserPreference<*>) {
components.flutterEvents.onPreferenceChange(
System.currentTimeMillis(), GeckoPref(
name = observedPreference.pref,
value = observedPreference.value,
defaultValue = observedPreference.defaultValue,
userValue = observedPreference.userValue,
hasUserChangedValue = observedPreference.hasUserChangedValue,
)
) { _ -> }
}
}
@@ -2196,7 +2196,8 @@ data class AddonCollection (
}
/** Generated class from Pigeon that represents data sent in messages. */
data class GeckoPrefValue (
data class GeckoPref (
val name: String,
val value: Any? = null,
val defaultValue: Any? = null,
val userValue: Any? = null,
@@ -2204,16 +2205,18 @@ data class GeckoPrefValue (
)
{
companion object {
fun fromList(pigeonVar_list: List<Any?>): 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 fromList(pigeonVar_list: List<Any?>): GeckoPref {
val name = pigeonVar_list[0] as String
val value = pigeonVar_list[1]
val defaultValue = pigeonVar_list[2]
val userValue = pigeonVar_list[3]
val hasUserChangedValue = pigeonVar_list[4] as Boolean
return GeckoPref(name, value, defaultValue, userValue, hasUserChangedValue)
}
}
fun toList(): List<Any?> {
return listOf(
name,
value,
defaultValue,
userValue,
@@ -2221,7 +2224,7 @@ data class GeckoPrefValue (
)
}
override fun equals(other: Any?): Boolean {
if (other !is GeckoPrefValue) {
if (other !is GeckoPref) {
return false
}
if (this === other) {
@@ -2546,7 +2549,7 @@ private open class GeckoPigeonCodec : StandardMessageCodec() {
}
191.toByte() -> {
return (readValue(buffer) as? List<Any?>)?.let {
GeckoPrefValue.fromList(it)
GeckoPref.fromList(it)
}
}
else -> super.readValueOfType(type, buffer)
@@ -2802,7 +2805,7 @@ private open class GeckoPigeonCodec : StandardMessageCodec() {
stream.write(190)
writeValue(stream, value.toList())
}
is GeckoPrefValue -> {
is GeckoPref -> {
stream.write(191)
writeValue(stream, value.toList())
}
@@ -3761,9 +3764,13 @@ interface GeckoIconsApi {
/** Generated interface from Pigeon that represents a handler of messages from Flutter. */
interface GeckoPrefApi {
fun getPrefList(callback: (Result<List<String>>) -> Unit)
fun getPrefs(preferenceFilter: List<String>, callback: (Result<Map<String, GeckoPrefValue>>) -> Unit)
fun applyPrefs(prefs: Map<String, Any>, callback: (Result<Map<String, GeckoPrefValue>>) -> Unit)
fun getPrefs(preferenceFilter: List<String>, callback: (Result<Map<String, GeckoPref>>) -> Unit)
fun applyPrefs(prefs: Map<String, Any>, callback: (Result<Map<String, GeckoPref>>) -> Unit)
fun resetPrefs(preferenceNames: List<String>, callback: (Result<Unit>) -> Unit)
fun startObserveChanges()
fun stopObserveChanges()
fun registerPrefForObservation(name: String, callback: (Result<Unit>) -> Unit)
fun unregisterPrefForObservation(name: String, callback: (Result<Unit>) -> Unit)
companion object {
/** The codec used by GeckoPrefApi. */
@@ -3798,7 +3805,7 @@ interface GeckoPrefApi {
channel.setMessageHandler { message, reply ->
val args = message as List<Any?>
val preferenceFilterArg = args[0] as List<String>
api.getPrefs(preferenceFilterArg) { result: Result<Map<String, GeckoPrefValue>> ->
api.getPrefs(preferenceFilterArg) { result: Result<Map<String, GeckoPref>> ->
val error = result.exceptionOrNull()
if (error != null) {
reply.reply(GeckoPigeonUtils.wrapError(error))
@@ -3818,7 +3825,7 @@ interface GeckoPrefApi {
channel.setMessageHandler { message, reply ->
val args = message as List<Any?>
val prefsArg = args[0] as Map<String, Any>
api.applyPrefs(prefsArg) { result: Result<Map<String, GeckoPrefValue>> ->
api.applyPrefs(prefsArg) { result: Result<Map<String, GeckoPref>> ->
val error = result.exceptionOrNull()
if (error != null) {
reply.reply(GeckoPigeonUtils.wrapError(error))
@@ -3851,6 +3858,76 @@ interface GeckoPrefApi {
channel.setMessageHandler(null)
}
}
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.startObserveChanges$separatedMessageChannelSuffix", codec)
if (api != null) {
channel.setMessageHandler { _, reply ->
val wrapped: List<Any?> = try {
api.startObserveChanges()
listOf(null)
} catch (exception: Throwable) {
GeckoPigeonUtils.wrapError(exception)
}
reply.reply(wrapped)
}
} else {
channel.setMessageHandler(null)
}
}
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.stopObserveChanges$separatedMessageChannelSuffix", codec)
if (api != null) {
channel.setMessageHandler { _, reply ->
val wrapped: List<Any?> = try {
api.stopObserveChanges()
listOf(null)
} catch (exception: Throwable) {
GeckoPigeonUtils.wrapError(exception)
}
reply.reply(wrapped)
}
} else {
channel.setMessageHandler(null)
}
}
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.registerPrefForObservation$separatedMessageChannelSuffix", codec)
if (api != null) {
channel.setMessageHandler { message, reply ->
val args = message as List<Any?>
val nameArg = args[0] as String
api.registerPrefForObservation(nameArg) { result: Result<Unit> ->
val error = result.exceptionOrNull()
if (error != null) {
reply.reply(GeckoPigeonUtils.wrapError(error))
} else {
reply.reply(GeckoPigeonUtils.wrapResult(null))
}
}
}
} else {
channel.setMessageHandler(null)
}
}
run {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.unregisterPrefForObservation$separatedMessageChannelSuffix", codec)
if (api != null) {
channel.setMessageHandler { message, reply ->
val args = message as List<Any?>
val nameArg = args[0] as String
api.unregisterPrefForObservation(nameArg) { result: Result<Unit> ->
val error = result.exceptionOrNull()
if (error != null) {
reply.reply(GeckoPigeonUtils.wrapError(error))
} else {
reply.reply(GeckoPigeonUtils.wrapResult(null))
}
}
}
} else {
channel.setMessageHandler(null)
}
}
}
}
}
@@ -4422,6 +4499,23 @@ class GeckoStateEvents(private val binaryMessenger: BinaryMessenger, private val
}
}
}
fun onPreferenceChange(timestampArg: Long, valueArg: GeckoPref, callback: (Result<Unit>) -> Unit)
{
val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else ""
val channelName = "dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onPreferenceChange$separatedMessageChannelSuffix"
val channel = BasicMessageChannel<Any?>(binaryMessenger, channelName, codec)
channel.send(listOf(timestampArg, valueArg)) {
if (it is List<*>) {
if (it.size > 1) {
callback(Result.failure(FlutterError(it[0] as String, it[1] as String, it[2] as String?)))
} else {
callback(Result.success(Unit))
}
} else {
callback(Result.failure(GeckoPigeonUtils.createConnectionError(channelName)))
}
}
}
}
/** Generated class from Pigeon that represents Flutter messages that can be called from Kotlin. */
class GeckoLogging(private val binaryMessenger: BinaryMessenger, private val messageChannelSuffix: String = "") {
@@ -42,7 +42,7 @@ export 'src/pigeons/gecko.g.dart'
DohSettingsMode,
EmailHitResult,
GeckoEngineSettings,
GeckoPrefValue,
GeckoPref,
GeckoSuggestion,
GeckoSuggestionType,
GeoHitResult,
@@ -39,6 +39,7 @@ class GeckoEventService extends GeckoStateEvents {
final _findResultsSubject = PublishSubject<FindResultsEvent>();
final _longPressSubject = PublishSubject<LongPressEvent>();
final _scrollEventSubject = PublishSubject<ScrollEvent>();
final _prefUpdateSubject = PublishSubject<GeckoPref>();
final _tabAddedSubject = PublishSubject<String>();
@@ -59,6 +60,7 @@ class GeckoEventService extends GeckoStateEvents {
Stream<FindResultsEvent> get findResultsEvent => _findResultsSubject.stream;
Stream<LongPressEvent> get longPressEvent => _longPressSubject.stream;
Stream<ScrollEvent> get scrollEvent => _scrollEventSubject.stream;
Stream<GeckoPref> get prefUpdateEvent => _prefUpdateSubject.stream;
Stream<String> get tabAddedStream => _tabAddedSubject.stream;
@@ -177,6 +179,11 @@ class GeckoEventService extends GeckoStateEvents {
));
}
@override
void onPreferenceChange(int timestamp, GeckoPref value) {
_prefUpdateSubject.addWhenMoreRecent(timestamp, value.name, value);
}
GeckoEventService.setUp({
BinaryMessenger? binaryMessenger,
String messageChannelSuffix = '',
@@ -189,6 +196,8 @@ class GeckoEventService extends GeckoStateEvents {
}
void dispose() {
unawaited(_viewStateSubject.close());
unawaited(_engineStateSubject.close());
unawaited(_tabListSubject.close());
unawaited(_selectedTabSubject.close());
unawaited(_tabContentSubject.close());
@@ -196,10 +205,12 @@ class GeckoEventService extends GeckoStateEvents {
unawaited(_readerableSubject.close());
unawaited(_securityInfoSubject.close());
unawaited(_iconChangeSubject.close());
unawaited(_iconUpdateSubject.close());
unawaited(_thumbnailSubject.close());
unawaited(_findResultsSubject.close());
unawaited(_longPressSubject.close());
unawaited(_scrollEventSubject.close());
unawaited(_tabAddedSubject.close());
unawaited(_prefUpdateSubject.close());
}
}
@@ -13,19 +13,35 @@ class GeckoPrefService {
return _apiInstance.getPrefList();
}
Future<Map<String, GeckoPrefValue>> getAllPrefs() async {
Future<Map<String, GeckoPref>> getAllPrefs() async {
return _apiInstance.getPrefs(await getPrefList());
}
Future<Map<String, GeckoPrefValue>> getPrefs(List<String> prefs) {
Future<Map<String, GeckoPref>> getPrefs(List<String> prefs) {
return _apiInstance.getPrefs(prefs);
}
Future<Map<String, GeckoPrefValue>> applyPrefs(Map<String, Object> prefs) {
Future<Map<String, GeckoPref>> applyPrefs(Map<String, Object> prefs) {
return _apiInstance.applyPrefs(prefs);
}
Future<void> resetPrefs(List<String> prefs) {
return _apiInstance.resetPrefs(prefs);
}
Future<void> startObserveChanges() {
return _apiInstance.startObserveChanges();
}
Future<void> stopObserveChanges() {
return _apiInstance.stopObserveChanges();
}
Future<void> registerPrefForObservation(String name) {
return _apiInstance.registerPrefForObservation(name);
}
Future<void> unregisterPrefForObservation(String name) {
return _apiInstance.unregisterPrefForObservation(name);
}
}
@@ -2788,14 +2788,17 @@ class AddonCollection {
;
}
class GeckoPrefValue {
GeckoPrefValue({
class GeckoPref {
GeckoPref({
required this.name,
this.value,
this.defaultValue,
this.userValue,
required this.hasUserChangedValue,
});
String name;
Object? value;
Object? defaultValue;
@@ -2806,6 +2809,7 @@ class GeckoPrefValue {
List<Object?> _toList() {
return <Object?>[
name,
value,
defaultValue,
userValue,
@@ -2816,20 +2820,21 @@ class GeckoPrefValue {
Object encode() {
return _toList(); }
static GeckoPrefValue decode(Object result) {
static GeckoPref decode(Object result) {
result as List<Object?>;
return GeckoPrefValue(
value: result[0],
defaultValue: result[1],
userValue: result[2],
hasUserChangedValue: result[3]! as bool,
return GeckoPref(
name: result[0]! as String,
value: result[1],
defaultValue: result[2],
userValue: result[3],
hasUserChangedValue: result[4]! as bool,
);
}
@override
// ignore: avoid_equals_and_hash_code_on_mutable_classes
bool operator ==(Object other) {
if (other is! GeckoPrefValue || other.runtimeType != runtimeType) {
if (other is! GeckoPref || other.runtimeType != runtimeType) {
return false;
}
if (identical(this, other)) {
@@ -3038,7 +3043,7 @@ class _PigeonCodec extends StandardMessageCodec {
} else if (value is AddonCollection) {
buffer.putUint8(190);
writeValue(buffer, value.encode());
} else if (value is GeckoPrefValue) {
} else if (value is GeckoPref) {
buffer.putUint8(191);
writeValue(buffer, value.encode());
} else {
@@ -3193,7 +3198,7 @@ class _PigeonCodec extends StandardMessageCodec {
case 190:
return AddonCollection.decode(readValue(buffer)!);
case 191:
return GeckoPrefValue.decode(readValue(buffer)!);
return GeckoPref.decode(readValue(buffer)!);
default:
return super.readValueOfType(type, buffer);
}
@@ -4357,7 +4362,7 @@ class GeckoPrefApi {
}
}
Future<Map<String, GeckoPrefValue>> getPrefs(List<String> preferenceFilter) async {
Future<Map<String, GeckoPref>> getPrefs(List<String> preferenceFilter) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.getPrefs$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
@@ -4381,11 +4386,11 @@ class GeckoPrefApi {
message: 'Host platform returned null value for non-null return value.',
);
} else {
return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!.cast<String, GeckoPrefValue>();
return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!.cast<String, GeckoPref>();
}
}
Future<Map<String, GeckoPrefValue>> applyPrefs(Map<String, Object> prefs) async {
Future<Map<String, GeckoPref>> applyPrefs(Map<String, Object> prefs) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.applyPrefs$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
@@ -4409,7 +4414,7 @@ class GeckoPrefApi {
message: 'Host platform returned null value for non-null return value.',
);
} else {
return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!.cast<String, GeckoPrefValue>();
return (pigeonVar_replyList[0] as Map<Object?, Object?>?)!.cast<String, GeckoPref>();
}
}
@@ -4435,6 +4440,98 @@ class GeckoPrefApi {
return;
}
}
Future<void> startObserveChanges() async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.startObserveChanges$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
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 {
return;
}
}
Future<void> stopObserveChanges() async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.stopObserveChanges$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
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 {
return;
}
}
Future<void> registerPrefForObservation(String name) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.registerPrefForObservation$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[name]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
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 {
return;
}
}
Future<void> unregisterPrefForObservation(String name) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoPrefApi.unregisterPrefForObservation$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[name]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
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 {
return;
}
}
}
class GeckoMlApi {
@@ -4809,6 +4906,8 @@ abstract class GeckoStateEvents {
void onScrollChange(int timestamp, String tabId, int scrollY);
void onPreferenceChange(int timestamp, GeckoPref value);
static void setUp(GeckoStateEvents? api, {BinaryMessenger? binaryMessenger, String messageChannelSuffix = '',}) {
messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : '';
{
@@ -5252,6 +5351,34 @@ abstract class GeckoStateEvents {
});
}
}
{
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onPreferenceChange$messageChannelSuffix', pigeonChannelCodec,
binaryMessenger: binaryMessenger);
if (api == null) {
pigeonVar_channel.setMessageHandler(null);
} else {
pigeonVar_channel.setMessageHandler((Object? message) async {
assert(message != null,
'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onPreferenceChange was null.');
final List<Object?> args = (message as List<Object?>?)!;
final int? arg_timestamp = (args[0] as int?);
assert(arg_timestamp != null,
'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onPreferenceChange was null, expected non-null int.');
final GeckoPref? arg_value = (args[1] as GeckoPref?);
assert(arg_value != null,
'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onPreferenceChange was null, expected non-null GeckoPref.');
try {
api.onPreferenceChange(arg_timestamp!, arg_value!);
return wrapResponse(empty: true);
} on PlatformException catch (e) {
return wrapResponse(error: e);
} catch (e) {
return wrapResponse(error: PlatformException(code: 'error', message: e.toString()));
}
});
}
}
}
}
@@ -1075,13 +1075,15 @@ abstract class GeckoIconsApi {
IconResult loadIcon(IconRequest request);
}
class GeckoPrefValue {
class GeckoPref {
final String name;
final Object? value;
final Object? defaultValue;
final Object? userValue;
final bool hasUserChangedValue;
GeckoPrefValue(
GeckoPref(
this.name,
this.value,
this.defaultValue,
this.userValue,
@@ -1094,11 +1096,18 @@ abstract class GeckoPrefApi {
@async
List<String> getPrefList();
@async
Map<String, GeckoPrefValue> getPrefs(List<String> preferenceFilter);
Map<String, GeckoPref> getPrefs(List<String> preferenceFilter);
@async
Map<String, GeckoPrefValue> applyPrefs(Map<String, Object> prefs);
Map<String, GeckoPref> applyPrefs(Map<String, Object> prefs);
@async
void resetPrefs(List<String> preferenceNames);
void startObserveChanges();
void stopObserveChanges();
@async
void registerPrefForObservation(String name);
@async
void unregisterPrefForObservation(String name);
}
@HostApi()
@@ -1198,6 +1207,7 @@ abstract class GeckoStateEvents {
void onLongPress(int timestamp, String id, HitResult hitResult);
void onScrollChange(int timestamp, String tabId, int scrollY);
void onPreferenceChange(int timestamp, GeckoPref value);
}
@FlutterApi()