diff --git a/mobile/lib/presentation/widgets/action_buttons/share_action_button.widget.dart b/mobile/lib/presentation/widgets/action_buttons/share_action_button.widget.dart index 6109b137a1..eef87f299d 100644 --- a/mobile/lib/presentation/widgets/action_buttons/share_action_button.widget.dart +++ b/mobile/lib/presentation/widgets/action_buttons/share_action_button.widget.dart @@ -7,7 +7,6 @@ import 'package:fluttertoast/fluttertoast.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; -import 'package:immich_mobile/domain/models/settings_key.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/generated/translations.g.dart'; import 'package:immich_mobile/presentation/widgets/action_buttons/base_action_button.widget.dart'; @@ -129,12 +128,6 @@ class ShareActionButton extends ConsumerWidget { return; } - await ref.read(settingsProvider).write(SettingsKey.shareFileType, fileType); - - if (!context.mounted) { - return; - } - await _share(context, ref, fileType); } diff --git a/mobile/test/unit/presentation/action_buttons/share_action_button_test.dart b/mobile/test/unit/presentation/action_buttons/share_action_button_test.dart new file mode 100644 index 0000000000..2f4aa3b8c9 --- /dev/null +++ b/mobile/test/unit/presentation/action_buttons/share_action_button_test.dart @@ -0,0 +1,117 @@ +import 'dart:async'; + +import 'package:drift/drift.dart'; +import 'package:drift/native.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:immich_mobile/constants/enums.dart'; +import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; +import 'package:immich_mobile/domain/models/settings_key.dart'; +import 'package:immich_mobile/infrastructure/repositories/db.repository.dart'; +import 'package:immich_mobile/infrastructure/repositories/settings.repository.dart'; +import 'package:immich_mobile/presentation/widgets/action_buttons/base_action_button.widget.dart'; +import 'package:immich_mobile/presentation/widgets/action_buttons/share_action_button.widget.dart'; +import 'package:immich_mobile/providers/asset_viewer/asset_viewer.provider.dart'; +import 'package:immich_mobile/providers/infrastructure/action.provider.dart'; + +import '../../factories/remote_asset_factory.dart'; +import '../presentation_context.dart'; + +class _RecordingActionNotifier extends ActionNotifier { + final List sharedFileTypes = []; + + @override + void build() {} + + @override + Future shareAssets( + ActionSource source, + BuildContext context, { + ShareAssetType fileType = ShareAssetType.original, + Completer? cancelCompleter, + void Function(double progress)? onAssetDownloadProgress, + }) async { + sharedFileTypes.add(fileType); + return const ActionResult(count: 1, success: true); + } +} + +class _FakeAssetViewerNotifier extends AssetViewerStateNotifier { + final BaseAsset asset; + + _FakeAssetViewerNotifier(this.asset); + + @override + AssetViewerState build() => AssetViewerState(currentAsset: asset); +} + +void main() { + late PresentationContext context; + late _RecordingActionNotifier actionNotifier; + + setUpAll(() async { + final db = Drift(DatabaseConnection(NativeDatabase.memory(), closeStreamsSynchronously: true)); + await SettingsRepository.ensureInitialized(db); + }); + + setUp(() async { + context = await PresentationContext.create(); + actionNotifier = _RecordingActionNotifier(); + await SettingsRepository.instance.clear([SettingsKey.shareFileType]); + }); + + tearDown(() { + context.dispose(); + }); + + Future pumpShareButton(WidgetTester tester) async { + final asset = RemoteAssetFactory.create(ownerId: context.currentUser.id); + await tester.pumpTestWidget( + context, + const ShareActionButton(source: ActionSource.viewer), + overrides: [ + actionProvider.overrideWith(() => actionNotifier), + assetViewerProvider.overrideWith(() => _FakeAssetViewerNotifier(asset)), + ], + ); + } + + Future longPressAndPickPreview(WidgetTester tester) async { + await tester.longPress(find.byType(BaseActionButton)); + await tester.pumpAndSettle(); + await tester.tap(find.byIcon(Icons.photo_size_select_large_rounded)); + await tester.pumpAndSettle(); + } + + group('ShareActionButton', () { + testWidgets('single press shares with the configured default quality', (tester) async { + await pumpShareButton(tester); + + await tester.tap(find.byType(BaseActionButton)); + await tester.pumpAndSettle(); + + expect(actionNotifier.sharedFileTypes, [ShareAssetType.original]); + }); + + testWidgets('long press shares with the quality picked in the dialog', (tester) async { + await pumpShareButton(tester); + + await longPressAndPickPreview(tester); + + expect(actionNotifier.sharedFileTypes, [ShareAssetType.preview]); + }); + + testWidgets('quality picked on long press is a one-time choice and does not change the default', (tester) async { + await pumpShareButton(tester); + + await longPressAndPickPreview(tester); + expect(actionNotifier.sharedFileTypes, [ShareAssetType.preview]); + + await tester.tap(find.byType(BaseActionButton)); + await tester.pumpAndSettle(); + + expect(actionNotifier.sharedFileTypes, [ShareAssetType.preview, ShareAssetType.original]); + expect(SettingsRepository.instance.appConfig.share.fileType, ShareAssetType.original); + }); + }); +}