finish switch to event sequence

This commit is contained in:
Fabian Freund
2026-02-10 16:53:16 +01:00
parent 188dfdd003
commit 83673227f3
4 changed files with 33 additions and 12 deletions
@@ -186,13 +186,13 @@ class KeyboardVisibilityFeature(
lastKeyboardHeight = heightPx lastKeyboardHeight = heightPx
lastKeyboardVisible = isVisible lastKeyboardVisible = isVisible
val timestamp = EventSequence.next() val sequence = EventSequence.next()
logger.debug("$TAG: Keyboard change - height=$heightPx, visible=$isVisible, animating=$isAnimating") logger.debug("$TAG: Keyboard change - height=$heightPx, visible=$isVisible, animating=$isAnimating")
runOnUiThread { runOnUiThread {
flutterEvents.onKeyboardVisibilityChanged( flutterEvents.onKeyboardVisibilityChanged(
timestamp, sequence,
heightPx.toLong(), heightPx.toLong(),
isVisible, isVisible,
isAnimating isAnimating
@@ -67,7 +67,7 @@ class WebExtensionToolbarFeature(
.filter { !store.state.extensions.containsKey(it) || store.state.extensions[it]?.enabled == false } .filter { !store.state.extensions.containsKey(it) || store.state.extensions[it]?.enabled == false }
.forEach { extensionId -> .forEach { extensionId ->
addonEvents.onRemoveWebExtensionAction( addonEvents.onRemoveWebExtensionAction(
timestampArg = EventSequence.next(), sequenceArg = EventSequence.next(),
extensionIdArg = extensionId, extensionIdArg = extensionId,
actionTypeArg = WebExtensionActionType.BROWSER, actionTypeArg = WebExtensionActionType.BROWSER,
) {} ) {}
@@ -78,7 +78,7 @@ class WebExtensionToolbarFeature(
.filter { !store.state.extensions.containsKey(it) || store.state.extensions[it]?.enabled == false } .filter { !store.state.extensions.containsKey(it) || store.state.extensions[it]?.enabled == false }
.forEach { extensionId -> .forEach { extensionId ->
addonEvents.onRemoveWebExtensionAction( addonEvents.onRemoveWebExtensionAction(
timestampArg = EventSequence.next(), sequenceArg = EventSequence.next(),
extensionIdArg = extensionId, extensionIdArg = extensionId,
actionTypeArg = WebExtensionActionType.PAGE, actionTypeArg = WebExtensionActionType.PAGE,
) {} ) {}
@@ -107,7 +107,7 @@ class WebExtensionToolbarFeature(
webExtensionBrowserActions.keys.toList().forEach { extensionId -> webExtensionBrowserActions.keys.toList().forEach { extensionId ->
if (extensionId !in enabledExtensionIds) { if (extensionId !in enabledExtensionIds) {
addonEvents.onRemoveWebExtensionAction( addonEvents.onRemoveWebExtensionAction(
timestampArg = EventSequence.next(), sequenceArg = EventSequence.next(),
extensionIdArg = extensionId, extensionIdArg = extensionId,
actionTypeArg = WebExtensionActionType.BROWSER, actionTypeArg = WebExtensionActionType.BROWSER,
) {} ) {}
@@ -118,7 +118,7 @@ class WebExtensionToolbarFeature(
webExtensionPageActions.keys.toList().forEach { extensionId -> webExtensionPageActions.keys.toList().forEach { extensionId ->
if (extensionId !in enabledExtensionIds) { if (extensionId !in enabledExtensionIds) {
addonEvents.onRemoveWebExtensionAction( addonEvents.onRemoveWebExtensionAction(
timestampArg = EventSequence.next(), sequenceArg = EventSequence.next(),
extensionIdArg = extensionId, extensionIdArg = extensionId,
actionTypeArg = WebExtensionActionType.PAGE, actionTypeArg = WebExtensionActionType.PAGE,
) {} ) {}
@@ -131,7 +131,7 @@ class WebExtensionToolbarFeature(
if (extensionNotAllowedInTab(extension, tab)) { if (extensionNotAllowedInTab(extension, tab)) {
webExtensionPageActions[extension.id]?.let { webExtensionPageActions[extension.id]?.let {
addonEvents.onRemoveWebExtensionAction( addonEvents.onRemoveWebExtensionAction(
timestampArg = EventSequence.next(), sequenceArg = EventSequence.next(),
extensionIdArg = extension.id, extensionIdArg = extension.id,
actionTypeArg = WebExtensionActionType.PAGE, actionTypeArg = WebExtensionActionType.PAGE,
) {} ) {}
@@ -139,7 +139,7 @@ class WebExtensionToolbarFeature(
} }
webExtensionBrowserActions[extension.id]?.let { webExtensionBrowserActions[extension.id]?.let {
addonEvents.onRemoveWebExtensionAction( addonEvents.onRemoveWebExtensionAction(
timestampArg = EventSequence.next(), sequenceArg = EventSequence.next(),
extensionIdArg = extension.id, extensionIdArg = extension.id,
actionTypeArg = WebExtensionActionType.BROWSER, actionTypeArg = WebExtensionActionType.BROWSER,
) {} ) {}
@@ -221,7 +221,7 @@ class WebExtensionToolbarFeature(
) )
addonEvents.onUpsertWebExtensionAction( addonEvents.onUpsertWebExtensionAction(
timestampArg = EventSequence.next(), sequenceArg = EventSequence.next(),
extensionIdArg = extension.id, extensionIdArg = extension.id,
actionTypeArg = if (isPageAction) WebExtensionActionType.PAGE else WebExtensionActionType.BROWSER, actionTypeArg = if (isPageAction) WebExtensionActionType.PAGE else WebExtensionActionType.BROWSER,
extensionDataArg = data extensionDataArg = data
@@ -236,7 +236,7 @@ class WebExtensionToolbarFeature(
val imageBytes = icon.toWebPBytes() val imageBytes = icon.toWebPBytes()
runOnUiThread { runOnUiThread {
addonEvents.onUpdateWebExtensionIcon( addonEvents.onUpdateWebExtensionIcon(
timestampArg = EventSequence.next(), sequenceArg = EventSequence.next(),
extensionIdArg = extensionId, extensionIdArg = extensionId,
actionTypeArg = if (isPageAction) WebExtensionActionType.PAGE else WebExtensionActionType.BROWSER, actionTypeArg = if (isPageAction) WebExtensionActionType.PAGE else WebExtensionActionType.BROWSER,
iconArg = imageBytes iconArg = imageBytes
@@ -22,7 +22,7 @@ package eu.weblibre.simple_intent_receiver
import io.flutter.plugin.common.BinaryMessenger import io.flutter.plugin.common.BinaryMessenger
import eu.weblibre.simple_intent_receiver.pigeons.IntentEvents import eu.weblibre.simple_intent_receiver.pigeons.IntentEvents
import eu.weblibre.simple_intent_receiver.pigeons.Intent as PigeonIntent import eu.weblibre.simple_intent_receiver.pigeons.Intent as PigeonIntent
import eu.weblibre.flutter_mozilla_components.ext.EventSequence import eu.weblibre.simple_intent_receiver.ext.EventSequence
class IntentReceiver(messenger: BinaryMessenger) { class IntentReceiver(messenger: BinaryMessenger) {
private val intentEvents: IntentEvents = IntentEvents(messenger) private val intentEvents: IntentEvents = IntentEvents(messenger)
@@ -31,4 +31,3 @@ class IntentReceiver(messenger: BinaryMessenger) {
intentEvents.onIntentReceived(EventSequence.next(), intent) { } intentEvents.onIntentReceived(EventSequence.next(), intent) { }
} }
} }
}
@@ -0,0 +1,22 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package eu.weblibre.simple_intent_receiver.ext
import java.util.concurrent.atomic.AtomicLong
/**
* Thread-safe monotonic sequence counter for event ordering.
*
* Replaces System.currentTimeMillis() for event timestamps sent to Flutter,
* guaranteeing strictly increasing values regardless of wall-clock changes
* and eliminating same-millisecond collisions.
*/
object EventSequence {
private val counter = AtomicLong(0)
fun next(): Long = counter.incrementAndGet()
}