mainly refactoring & addons

This commit is contained in:
Fabian Freund
2024-10-29 10:03:24 +01:00
parent 91a4319b28
commit 0710116feb
127 changed files with 4234 additions and 1815 deletions
@@ -21,4 +21,4 @@ final selectedTabProvider = NotifierProvider<SelectedTab, String?>.internal(
typedef _$SelectedTab = Notifier<String?>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
// 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
@@ -13,6 +13,7 @@ part 'tab_list.g.dart';
class TabList extends _$TabList {
late TabDatabase _db;
@override
List<String> build() {
final eventService = ref.watch(eventServiceProvider);
@@ -6,7 +6,7 @@ part of 'tab_list.dart';
// RiverpodGenerator
// **************************************************************************
String _$tabListHash() => r'fd97d4692b1c74e91c5ebd4a75e6ff45ceb82ef9';
String _$tabListHash() => r'3c17372cc467736ce1cfba937999acf4de7345ef';
/// See also [TabList].
@ProviderFor(TabList)
@@ -21,4 +21,4 @@ final tabListProvider = NotifierProvider<TabList, List<String>>.internal(
typedef _$TabList = Notifier<List<String>>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
// 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
@@ -37,8 +37,8 @@ class TabSession extends _$TabSession {
return _sessionService.exitFullscreen();
}
Future<Uint8List?> requestScreenshot() {
return _sessionService.requestScreenshot();
Future<Uint8List?> requestScreenshot({bool requireImageResult = true}) {
return _sessionService.requestScreenshot(requireImageResult);
}
@override
@@ -6,7 +6,7 @@ part of 'tab_session.dart';
// RiverpodGenerator
// **************************************************************************
String _$tabSessionHash() => r'29b20f40af01e599ef80e198aec5f093d74efc6a';
String _$tabSessionHash() => r'42b44a4d47b9a551d002fdbc6337c14b2c327dde';
/// Copied from Dart SDK
class _SystemHash {
@@ -155,6 +155,8 @@ class TabSessionProvider
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin TabSessionRef on AutoDisposeNotifierProviderRef<void> {
/// The parameter `tabId` of this provider.
String? get tabId;
@@ -169,4 +171,4 @@ class _TabSessionProviderElement
String? get tabId => (origin as TabSessionProvider).tabId;
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
// 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
@@ -10,6 +10,7 @@ import 'package:lensai/features/geckoview/domain/entities/tab_state.dart';
import 'package:lensai/features/geckoview/domain/providers.dart';
import 'package:lensai/features/geckoview/domain/providers/selected_tab.dart';
import 'package:lensai/features/geckoview/utils/image_helper.dart';
import 'package:riverpod/riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:synchronized/synchronized.dart';
@@ -190,7 +191,7 @@ class TabStates extends _$TabStates {
}
@Riverpod()
TabState? tabState(TabStateRef ref, String? tabId) {
TabState? tabState(Ref ref, String? tabId) {
if (tabId == null) {
return null;
}
@@ -201,7 +202,7 @@ TabState? tabState(TabStateRef ref, String? tabId) {
}
@Riverpod()
TabState? selectedTabState(SelectedTabStateRef ref) {
TabState? selectedTabState(Ref ref) {
final tabId = ref.watch(selectedTabProvider);
return ref.watch(tabStateProvider(tabId));
}
@@ -6,7 +6,7 @@ part of 'tab_state.dart';
// RiverpodGenerator
// **************************************************************************
String _$tabStateHash() => r'9fd7990804643fac180dd4fd50803bc7c9fa2827';
String _$tabStateHash() => r'f57b2353acc99ca73670d504b45ea5ff19df38c7';
/// Copied from Dart SDK
class _SystemHash {
@@ -141,6 +141,8 @@ class TabStateProvider extends AutoDisposeProvider<TabState?> {
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin TabStateRef on AutoDisposeProviderRef<TabState?> {
/// The parameter `tabId` of this provider.
String? get tabId;
@@ -154,7 +156,7 @@ class _TabStateProviderElement extends AutoDisposeProviderElement<TabState?>
String? get tabId => (origin as TabStateProvider).tabId;
}
String _$selectedTabStateHash() => r'22172913554e14e67f692eff0777ea015175906e';
String _$selectedTabStateHash() => r'dbd36af7af286bd9d079f30e8e11bbda23bf7728';
/// See also [selectedTabState].
@ProviderFor(selectedTabState)
@@ -168,6 +170,8 @@ final selectedTabStateProvider = AutoDisposeProvider<TabState?>.internal(
allTransitiveDependencies: null,
);
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
typedef SelectedTabStateRef = AutoDisposeProviderRef<TabState?>;
String _$tabStatesHash() => r'dcd293279a901eeaab7728979e39e5ca3bee8c66';
@@ -185,4 +189,4 @@ final tabStatesProvider =
typedef _$TabStates = Notifier<Map<String, TabState>>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
// 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
@@ -0,0 +1,107 @@
import 'dart:async';
import 'dart:ui';
import 'package:flutter_mozilla_components/flutter_mozilla_components.dart';
import 'package:lensai/domain/entities/equatable_image.dart';
import 'package:lensai/extensions/image.dart';
import 'package:lensai/features/geckoview/domain/entities/web_extension_state.dart';
import 'package:lensai/features/geckoview/domain/providers.dart';
import 'package:lensai/features/geckoview/utils/image_helper.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:synchronized/synchronized.dart';
part 'web_extensions_state.g.dart';
@Riverpod(keepAlive: true)
class WebExtensionsState extends _$WebExtensionsState {
final _imageCache = <String, EquatableImage>{};
final _lock = Lock();
void _onExtensionUpdate(ExtensionDataEvent event) {
final ExtensionDataEvent(:extensionId, :data) = event;
if (data != null) {
final current = state[extensionId] ??
WebExtensionState(
extensionId: extensionId,
icon: _imageCache[extensionId],
enabled: false,
);
state = {...state}..[extensionId] = current.copyWith(
title: data.title,
enabled: data.enabled,
badgeText: data.badgeText,
badgeTextColor: (data.badgeTextColor != null)
? Color(data.badgeTextColor!)
: null,
badgeBackgroundColor: (data.badgeBackgroundColor != null)
? Color(data.badgeBackgroundColor!)
: null,
);
} else {
if (state.containsKey(extensionId)) {
state = {...state}..remove(extensionId);
}
}
}
Future<void> _onIconChange(ExtensionIconEvent event) async {
final ExtensionIconEvent(:extensionId, :bytes) = event;
final image =
await tryDecodeImage(bytes).then((image) async => image?.toEquatable());
if (image != null) {
if (_imageCache[extensionId] != image) {
_imageCache[extensionId] = image;
if (state.containsKey(extensionId)) {
state = {...state}..[extensionId] =
state[extensionId]!.copyWith.icon(image);
}
}
}
}
@override
Map<String, WebExtensionState> build(WebExtensionActionType actionType) {
final addonService = ref.watch(addonServiceProvider);
final subscriptions = switch (actionType) {
WebExtensionActionType.browser => [
addonService.browserExtensionStream.listen(
(event) async {
await _lock.synchronized(() => _onExtensionUpdate(event));
},
),
addonService.browserIconStream.listen(
(event) async {
await _lock.synchronized(() => _onIconChange(event));
},
),
],
WebExtensionActionType.page => [
addonService.pageExtensionStream.listen(
(event) async {
await _lock.synchronized(() => _onExtensionUpdate(event));
},
),
addonService.pageIconStream.listen(
(event) async {
await _lock.synchronized(() => _onIconChange(event));
},
),
],
};
ref.onDispose(() {
for (final sub in subscriptions) {
unawaited(sub.cancel());
}
});
return {};
}
}
@@ -0,0 +1,180 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'web_extensions_state.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$webExtensionsStateHash() =>
r'9ac102b1d1740d69f9b0de590f08ff0774064845';
/// Copied from Dart SDK
class _SystemHash {
_SystemHash._();
static int combine(int hash, int value) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + value);
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
static int finish(int hash) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
// ignore: parameter_assignments
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
}
abstract class _$WebExtensionsState
extends BuildlessNotifier<Map<String, WebExtensionState>> {
late final WebExtensionActionType actionType;
Map<String, WebExtensionState> build(
WebExtensionActionType actionType,
);
}
/// See also [WebExtensionsState].
@ProviderFor(WebExtensionsState)
const webExtensionsStateProvider = WebExtensionsStateFamily();
/// See also [WebExtensionsState].
class WebExtensionsStateFamily extends Family<Map<String, WebExtensionState>> {
/// See also [WebExtensionsState].
const WebExtensionsStateFamily();
/// See also [WebExtensionsState].
WebExtensionsStateProvider call(
WebExtensionActionType actionType,
) {
return WebExtensionsStateProvider(
actionType,
);
}
@override
WebExtensionsStateProvider getProviderOverride(
covariant WebExtensionsStateProvider provider,
) {
return call(
provider.actionType,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'webExtensionsStateProvider';
}
/// See also [WebExtensionsState].
class WebExtensionsStateProvider extends NotifierProviderImpl<
WebExtensionsState, Map<String, WebExtensionState>> {
/// See also [WebExtensionsState].
WebExtensionsStateProvider(
WebExtensionActionType actionType,
) : this._internal(
() => WebExtensionsState()..actionType = actionType,
from: webExtensionsStateProvider,
name: r'webExtensionsStateProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$webExtensionsStateHash,
dependencies: WebExtensionsStateFamily._dependencies,
allTransitiveDependencies:
WebExtensionsStateFamily._allTransitiveDependencies,
actionType: actionType,
);
WebExtensionsStateProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.actionType,
}) : super.internal();
final WebExtensionActionType actionType;
@override
Map<String, WebExtensionState> runNotifierBuild(
covariant WebExtensionsState notifier,
) {
return notifier.build(
actionType,
);
}
@override
Override overrideWith(WebExtensionsState Function() create) {
return ProviderOverride(
origin: this,
override: WebExtensionsStateProvider._internal(
() => create()..actionType = actionType,
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
actionType: actionType,
),
);
}
@override
NotifierProviderElement<WebExtensionsState, Map<String, WebExtensionState>>
createElement() {
return _WebExtensionsStateProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is WebExtensionsStateProvider &&
other.actionType == actionType;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, actionType.hashCode);
return _SystemHash.finish(hash);
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin WebExtensionsStateRef
on NotifierProviderRef<Map<String, WebExtensionState>> {
/// The parameter `actionType` of this provider.
WebExtensionActionType get actionType;
}
class _WebExtensionsStateProviderElement extends NotifierProviderElement<
WebExtensionsState,
Map<String, WebExtensionState>> with WebExtensionsStateRef {
_WebExtensionsStateProviderElement(super.provider);
@override
WebExtensionActionType get actionType =>
(origin as WebExtensionsStateProvider).actionType;
}
// 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