From 9ad5f485b9b2d70583c3a684c4143d10fab5bd10 Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Tue, 25 Mar 2025 19:48:10 +0100 Subject: [PATCH] small optimizations --- app/lib/extensions/nullable.dart | 18 ++++++---- .../features/geckoview/domain/providers.dart | 2 +- .../geckoview/domain/providers.g.dart | 2 +- .../geckoview/domain/repositories/tab.dart | 2 +- .../geckoview/domain/repositories/tab.g.dart | 2 +- .../browser/domain/providers/intent.dart | 8 ++++- .../browser/domain/providers/intent.g.dart | 33 ++++++++++--------- .../utils/markdown_document_splitter.dart | 4 +-- 8 files changed, 42 insertions(+), 29 deletions(-) diff --git a/app/lib/extensions/nullable.dart b/app/lib/extensions/nullable.dart index 3190170b..7048c1f6 100644 --- a/app/lib/extensions/nullable.dart +++ b/app/lib/extensions/nullable.dart @@ -1,26 +1,30 @@ extension NullableX on T? { @pragma('vm:prefer-inline') R? mapNotNull(R? Function(T) callback) { - // We can simplify this by using the null-aware operator - return this != null ? callback(this as T) : null; + // Already optimized, but can simplify further + return this == null ? null : callback(this as T); } } extension NullableStringX on String? { @pragma('vm:prefer-inline') - String? get whenNotEmpty => (this?.isNotEmpty ?? false) ? this : null; + String? get whenNotEmpty { + // Avoid double null check + final value = this; + return value != null && value.isNotEmpty ? value : null; + } @pragma('vm:prefer-inline') - bool get isNotEmpty => this?.isNotEmpty ?? false; + bool get isNotEmpty => this != null && this!.isNotEmpty; @pragma('vm:prefer-inline') - bool get isEmpty => this?.isEmpty ?? true; + bool get isEmpty => this == null || this!.isEmpty; } extension NullableIterable on Iterable? { @pragma('vm:prefer-inline') - bool get isNotEmpty => this?.isNotEmpty ?? false; + bool get isNotEmpty => this != null && this!.isNotEmpty; @pragma('vm:prefer-inline') - bool get isEmpty => this?.isEmpty ?? true; + bool get isEmpty => this == null || this!.isEmpty; } diff --git a/app/lib/features/geckoview/domain/providers.dart b/app/lib/features/geckoview/domain/providers.dart index 0c0efdc4..5f90e185 100644 --- a/app/lib/features/geckoview/domain/providers.dart +++ b/app/lib/features/geckoview/domain/providers.dart @@ -136,7 +136,7 @@ class EngineReadyState extends _$EngineReadyState { eventService.engineReadyStateEvents .firstWhere((value) => value == true) .timeout( - const Duration(seconds: 5), + const Duration(seconds: 3), onTimeout: () { logger.w('Waiting for engine ready state timed out'); return true; diff --git a/app/lib/features/geckoview/domain/providers.g.dart b/app/lib/features/geckoview/domain/providers.g.dart index 12db7e86..079094f3 100644 --- a/app/lib/features/geckoview/domain/providers.g.dart +++ b/app/lib/features/geckoview/domain/providers.g.dart @@ -96,7 +96,7 @@ final engineSuggestionsServiceProvider = @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element typedef EngineSuggestionsServiceRef = ProviderRef; -String _$engineReadyStateHash() => r'c682333e2e07cf0635aa7ae793a2088ca648c950'; +String _$engineReadyStateHash() => r'a892c48ffc29e3414de12e66d9bfec522e4f40a8'; /// See also [EngineReadyState]. @ProviderFor(EngineReadyState) diff --git a/app/lib/features/geckoview/domain/repositories/tab.dart b/app/lib/features/geckoview/domain/repositories/tab.dart index 681bd52b..25521991 100644 --- a/app/lib/features/geckoview/domain/repositories/tab.dart +++ b/app/lib/features/geckoview/domain/repositories/tab.dart @@ -268,7 +268,7 @@ class TabRepository extends _$TabRepository { }); }); - ref.listen(intentStreamProvider, (previous, next) { + ref.listen(engineBoundIntentStreamProvider, (previous, next) { next.whenData((value) async { switch (value) { case SharedUrl(): diff --git a/app/lib/features/geckoview/domain/repositories/tab.g.dart b/app/lib/features/geckoview/domain/repositories/tab.g.dart index 6bee138f..25db9b29 100644 --- a/app/lib/features/geckoview/domain/repositories/tab.g.dart +++ b/app/lib/features/geckoview/domain/repositories/tab.g.dart @@ -6,7 +6,7 @@ part of 'tab.dart'; // RiverpodGenerator // ************************************************************************** -String _$tabRepositoryHash() => r'9bdd6ddc0254c830b783eb2a987d98d4f1d313fb'; +String _$tabRepositoryHash() => r'a7f1112a2404b0be96be44b6c1763aa5cc931e5b'; /// See also [TabRepository]. @ProviderFor(TabRepository) diff --git a/app/lib/features/geckoview/features/browser/domain/providers/intent.dart b/app/lib/features/geckoview/features/browser/domain/providers/intent.dart index 09af8e33..d655cac9 100644 --- a/app/lib/features/geckoview/features/browser/domain/providers/intent.dart +++ b/app/lib/features/geckoview/features/browser/domain/providers/intent.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:lensai/data/models/received_intent_parameter.dart'; import 'package:lensai/extensions/nullable.dart'; import 'package:lensai/features/app_widget/domain/services/home_widget.dart'; +import 'package:lensai/features/geckoview/domain/providers.dart'; import 'package:lensai/features/share_intent/domain/entities/shared_content.dart'; import 'package:lensai/features/share_intent/domain/services/sharing_intent.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; @@ -24,7 +25,7 @@ final _contentParserTransformer = ); @Riverpod() -class IntentStream extends _$IntentStream { +class EngineBoundIntentStream extends _$EngineBoundIntentStream { late StreamController _streamController; @override @@ -34,6 +35,11 @@ class IntentStream extends _$IntentStream { await _streamController.close(); }); + final engineReady = ref.watch(engineReadyStateProvider); + if (!engineReady) { + return const Stream.empty(); + } + final sharingItentStream = ref.watch(sharingIntentStreamProvider); final appWidgetLaunchStream = ref.watch(appWidgetLaunchStreamProvider); 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 789d5ed6..7ba4c61c 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 @@ -6,22 +6,25 @@ part of 'intent.dart'; // RiverpodGenerator // ************************************************************************** -String _$intentStreamHash() => r'e78268ec703cd0d1f08d41b9e10a487e6000b7da'; +String _$engineBoundIntentStreamHash() => + r'860e39a7b608d579f7383e2199719067ad26f268'; -/// See also [IntentStream]. -@ProviderFor(IntentStream) -final intentStreamProvider = - AutoDisposeStreamNotifierProvider.internal( - IntentStream.new, - name: r'intentStreamProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$intentStreamHash, - dependencies: null, - allTransitiveDependencies: null, - ); +/// See also [EngineBoundIntentStream]. +@ProviderFor(EngineBoundIntentStream) +final engineBoundIntentStreamProvider = AutoDisposeStreamNotifierProvider< + EngineBoundIntentStream, + SharedContent +>.internal( + EngineBoundIntentStream.new, + name: r'engineBoundIntentStreamProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$engineBoundIntentStreamHash, + dependencies: null, + allTransitiveDependencies: null, +); -typedef _$IntentStream = AutoDisposeStreamNotifier; +typedef _$EngineBoundIntentStream = AutoDisposeStreamNotifier; // ignore_for_file: type=lint // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/app/lib/features/geckoview/features/tabs/features/vector_store/utils/markdown_document_splitter.dart b/app/lib/features/geckoview/features/tabs/features/vector_store/utils/markdown_document_splitter.dart index 7aa82cfb..2b376a17 100644 --- a/app/lib/features/geckoview/features/tabs/features/vector_store/utils/markdown_document_splitter.dart +++ b/app/lib/features/geckoview/features/tabs/features/vector_store/utils/markdown_document_splitter.dart @@ -5,7 +5,7 @@ import 'package:lensai/features/geckoview/features/tabs/features/vector_store/ut typedef DocumentParts = ({String mainDocumentId, List parts}); -List mergeShortDocuments( +List _mergeShortDocuments( List documents, int maxLength, { String separator = '\n', @@ -69,7 +69,7 @@ DocumentParts? splitMarkdownDocument( } final headerKeys = headersToSplitOn.map((header) => header.$2).toSet(); - final mergedDocChunks = mergeShortDocuments( + final mergedDocChunks = _mergeShortDocuments( docChunks, chunkSize, doMerge: (a, b) {