diff --git a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/api/GeckoHistoryApiImpl.kt b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/api/GeckoHistoryApiImpl.kt index 2d57ed86..356e4e80 100644 --- a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/api/GeckoHistoryApiImpl.kt +++ b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/api/GeckoHistoryApiImpl.kt @@ -26,8 +26,9 @@ class GeckoHistoryApiImpl() : GeckoHistoryApi { endMillis: Long, ): List = values - .filter { isDisplayableItem(it.status) && - it.createdTime >= startMillis && it.createdTime <= endMillis + .filter { + isDisplayableItem(it.status) && + it.createdTime >= startMillis && it.createdTime <= endMillis } .distinctBy { Pair(it.fileName, it.status) } .sortedByDescending { it.createdTime } // sort from newest to oldest @@ -92,11 +93,75 @@ class GeckoHistoryApiImpl() : GeckoHistoryApi { } if (!excludeTypes.contains(VisitType.DOWNLOAD)) { - visits = visits + components.core.store.state.downloads.toVisitInfoList(startMillis, endMillis) + visits = visits + components.core.store.state.downloads.toVisitInfoList( + startMillis, + endMillis + ) } - callback(Result.success(visits - )) + callback( + Result.success( + visits + ) + ) + } + } + } + + override fun getVisitsPaginated( + offset: Long, + count: Long, + excludeTypes: List, + callback: (Result>) -> Unit + ) { + coroutineScope.launch { + withContext(Dispatchers.Main) { + var visits = components.core.historyStorage.getVisitsPaginated( + offset, + count, + excludeTypes.map { + when (it) { + VisitType.LINK -> mozilla.components.concept.storage.VisitType.LINK + VisitType.TYPED -> mozilla.components.concept.storage.VisitType.TYPED + VisitType.BOOKMARK -> mozilla.components.concept.storage.VisitType.BOOKMARK + VisitType.EMBED -> mozilla.components.concept.storage.VisitType.EMBED + VisitType.REDIRECT_PERMANENT -> mozilla.components.concept.storage.VisitType.REDIRECT_PERMANENT + VisitType.REDIRECT_TEMPORARY -> mozilla.components.concept.storage.VisitType.REDIRECT_TEMPORARY + VisitType.DOWNLOAD -> mozilla.components.concept.storage.VisitType.DOWNLOAD + VisitType.FRAMED_LINK -> mozilla.components.concept.storage.VisitType.FRAMED_LINK + VisitType.RELOAD -> mozilla.components.concept.storage.VisitType.RELOAD + } + }).map { + VisitInfo( + url = it.url, + title = it.title, + visitTime = it.visitTime, + visitType = when (it.visitType) { + mozilla.components.concept.storage.VisitType.LINK -> VisitType.LINK + mozilla.components.concept.storage.VisitType.TYPED -> VisitType.TYPED + mozilla.components.concept.storage.VisitType.BOOKMARK -> VisitType.BOOKMARK + mozilla.components.concept.storage.VisitType.EMBED -> VisitType.EMBED + mozilla.components.concept.storage.VisitType.REDIRECT_PERMANENT -> VisitType.REDIRECT_PERMANENT + mozilla.components.concept.storage.VisitType.REDIRECT_TEMPORARY -> VisitType.REDIRECT_TEMPORARY + mozilla.components.concept.storage.VisitType.DOWNLOAD -> VisitType.DOWNLOAD + mozilla.components.concept.storage.VisitType.FRAMED_LINK -> VisitType.FRAMED_LINK + mozilla.components.concept.storage.VisitType.RELOAD -> VisitType.RELOAD + }, + previewImageUrl = it.previewImageUrl, + isRemote = it.isRemote + ) + } + + if (!excludeTypes.contains(VisitType.DOWNLOAD)) { + callback(Result.failure(Throwable("Downloads not supported yet"))) +// visits = visits + components.core.store.state.downloads.toVisitInfoList(startMillis, endMillis) + } + + callback( + Result.success( + visits + ) + ) } } } diff --git a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/middleware/FlutterEventMiddleware.kt b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/middleware/FlutterEventMiddleware.kt index 4878ce44..6ddf30a5 100644 --- a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/middleware/FlutterEventMiddleware.kt +++ b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/middleware/FlutterEventMiddleware.kt @@ -133,15 +133,15 @@ class FlutterEventMiddleware(private val flutterEvents: GeckoStateEvents) : Midd ) { _ -> } } } - is ReaderAction.UpdateReaderScrollYAction -> { - runOnUiThread { - flutterEvents.onScrollChange( - System.currentTimeMillis(), - action.tabId, - action.scrollY.toLong() - ) { _ -> } - } - } +// is ReaderAction.UpdateReaderScrollYAction -> { +// runOnUiThread { +// flutterEvents.onScrollChange( +// System.currentTimeMillis(), +// action.tabId, +// action.scrollY.toLong() +// ) { _ -> } +// } +// } else -> { //logger.debug("Event fired: " + action.javaClass.name) } 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 53f0d20c..d84cef4a 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 @@ -4911,23 +4911,6 @@ class GeckoStateEvents(private val binaryMessenger: BinaryMessenger, private val } } } - fun onScrollChange(timestampArg: Long, tabIdArg: String, scrollYArg: Long, callback: (Result) -> Unit) -{ - val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" - val channelName = "dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onScrollChange$separatedMessageChannelSuffix" - val channel = BasicMessageChannel(binaryMessenger, channelName, codec) - channel.send(listOf(timestampArg, tabIdArg, scrollYArg)) { - 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))) - } - } - } fun onPreferenceChange(timestampArg: Long, valueArg: GeckoPref, callback: (Result) -> Unit) { val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" @@ -5492,6 +5475,7 @@ interface GeckoDeleteBrowsingDataController { /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ interface GeckoHistoryApi { fun getDetailedVisits(startMillis: Long, endMillis: Long, excludeTypes: List, callback: (Result>) -> Unit) + fun getVisitsPaginated(offset: Long, count: Long, excludeTypes: List, callback: (Result>) -> Unit) fun deleteVisit(url: String, timestamp: Long, callback: (Result) -> Unit) fun deleteDownload(id: String, callback: (Result) -> Unit) fun deleteVisitsBetween(startMillis: Long, endMillis: Long, callback: (Result) -> Unit) @@ -5527,6 +5511,28 @@ interface GeckoHistoryApi { channel.setMessageHandler(null) } } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_mozilla_components.GeckoHistoryApi.getVisitsPaginated$separatedMessageChannelSuffix", codec) + if (api != null) { + channel.setMessageHandler { message, reply -> + val args = message as List + val offsetArg = args[0] as Long + val countArg = args[1] as Long + val excludeTypesArg = args[2] as List + api.getVisitsPaginated(offsetArg, countArg, excludeTypesArg) { 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.GeckoHistoryApi.deleteVisit$separatedMessageChannelSuffix", codec) if (api != null) { diff --git a/packages/flutter_mozilla_components/lib/src/domain/services/gecko_event.dart b/packages/flutter_mozilla_components/lib/src/domain/services/gecko_event.dart index 8619e8dd..46fa9e83 100644 --- a/packages/flutter_mozilla_components/lib/src/domain/services/gecko_event.dart +++ b/packages/flutter_mozilla_components/lib/src/domain/services/gecko_event.dart @@ -38,7 +38,7 @@ class GeckoEventService extends GeckoStateEvents { final _thumbnailSubject = PublishSubject(); final _findResultsSubject = PublishSubject(); final _longPressSubject = PublishSubject(); - final _scrollEventSubject = PublishSubject(); + // final _scrollEventSubject = PublishSubject(); final _prefUpdateSubject = PublishSubject(); final _siteAssignementSubject = PublishSubject(); @@ -60,7 +60,7 @@ class GeckoEventService extends GeckoStateEvents { Stream get thumbnailEvents => _thumbnailSubject.stream; Stream get findResultsEvent => _findResultsSubject.stream; Stream get longPressEvent => _longPressSubject.stream; - Stream get scrollEvent => _scrollEventSubject.stream; + // Stream get scrollEvent => _scrollEventSubject.stream; Stream get prefUpdateEvent => _prefUpdateSubject.stream; Stream get siteAssignementEvent => _siteAssignementSubject.stream; @@ -174,13 +174,13 @@ class GeckoEventService extends GeckoStateEvents { _tabAddedSubject.addWhenMoreRecent(timestamp, null, tabId); } - @override - void onScrollChange(int timestamp, String tabId, int scrollY) { - _scrollEventSubject.addWhenMoreRecent(timestamp, tabId, ( - tabId: tabId, - scrollY: scrollY, - )); - } + // @override + // void onScrollChange(int timestamp, String tabId, int scrollY) { + // _scrollEventSubject.addWhenMoreRecent(timestamp, tabId, ( + // tabId: tabId, + // scrollY: scrollY, + // )); + // } @override void onPreferenceChange(int timestamp, GeckoPref value) { @@ -224,7 +224,7 @@ class GeckoEventService extends GeckoStateEvents { await _thumbnailSubject.close(); await _findResultsSubject.close(); await _longPressSubject.close(); - await _scrollEventSubject.close(); + // await _scrollEventSubject.close(); await _tabAddedSubject.close(); await _prefUpdateSubject.close(); await _siteAssignementSubject.close(); diff --git a/packages/flutter_mozilla_components/lib/src/domain/services/gecko_history.dart b/packages/flutter_mozilla_components/lib/src/domain/services/gecko_history.dart index f1cb372f..22438ac6 100644 --- a/packages/flutter_mozilla_components/lib/src/domain/services/gecko_history.dart +++ b/packages/flutter_mozilla_components/lib/src/domain/services/gecko_history.dart @@ -25,6 +25,18 @@ class GeckoHistoryService { ); } + Future> getVisitsPaginated( + int offset, + int count, + Set types, + ) { + return _api.getVisitsPaginated( + offset, + count, + VisitType.values.toSet().difference(types).toList(), + ); + } + Future deleteVisit(VisitInfo info) { switch (info.visitType) { case VisitType.link: 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 00f2f1fd..8da0adae 100644 --- a/packages/flutter_mozilla_components/lib/src/pigeons/gecko.g.dart +++ b/packages/flutter_mozilla_components/lib/src/pigeons/gecko.g.dart @@ -5352,8 +5352,6 @@ 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); void onContainerSiteAssignment(int timestamp, ContainerSiteAssignment details); @@ -5770,37 +5768,6 @@ abstract class GeckoStateEvents { }); } } - { - final pigeonVar_channel = BasicMessageChannel( - 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onScrollChange$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.onScrollChange was null.'); - final List args = (message as List?)!; - final int? arg_timestamp = (args[0] as int?); - assert(arg_timestamp != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onScrollChange was null, expected non-null int.'); - final String? arg_tabId = (args[1] as String?); - assert(arg_tabId != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onScrollChange was null, expected non-null String.'); - final int? arg_scrollY = (args[2] as int?); - assert(arg_scrollY != null, - 'Argument for dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onScrollChange was null, expected non-null int.'); - try { - api.onScrollChange(arg_timestamp!, arg_tabId!, arg_scrollY!); - return wrapResponse(empty: true); - } on PlatformException catch (e) { - return wrapResponse(error: e); - } catch (e) { - return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); - } - }); - } - } { final pigeonVar_channel = BasicMessageChannel( 'dev.flutter.pigeon.flutter_mozilla_components.GeckoStateEvents.onPreferenceChange$messageChannelSuffix', pigeonChannelCodec, @@ -6584,6 +6551,33 @@ class GeckoHistoryApi { } } + Future> getVisitsPaginated(int offset, int count, List excludeTypes) async { + final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoHistoryApi.getVisitsPaginated$pigeonVar_messageChannelSuffix'; + final pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final Future pigeonVar_sendFuture = pigeonVar_channel.send([offset, count, excludeTypes]); + final 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 deleteVisit(String url, int timestamp) async { final pigeonVar_channelName = 'dev.flutter.pigeon.flutter_mozilla_components.GeckoHistoryApi.deleteVisit$pigeonVar_messageChannelSuffix'; final pigeonVar_channel = BasicMessageChannel( diff --git a/packages/flutter_mozilla_components/pigeons/gecko.dart b/packages/flutter_mozilla_components/pigeons/gecko.dart index 0b927dd7..863bc47b 100644 --- a/packages/flutter_mozilla_components/pigeons/gecko.dart +++ b/packages/flutter_mozilla_components/pigeons/gecko.dart @@ -1226,7 +1226,7 @@ abstract class GeckoStateEvents { void onFindResults(int timestamp, String id, List results); void onLongPress(int timestamp, String id, HitResult hitResult); - void onScrollChange(int timestamp, String tabId, int scrollY); + // void onScrollChange(int timestamp, String tabId, int scrollY); void onPreferenceChange(int timestamp, GeckoPref value); void onContainerSiteAssignment( @@ -1340,6 +1340,13 @@ abstract class GeckoHistoryApi { List excludeTypes, ); + @async + List getVisitsPaginated( + int offset, + int count, + List excludeTypes, + ); + @async void deleteVisit(String url, int timestamp);