diff --git a/mobile/lib/generated/intl/messages_en.dart b/mobile/lib/generated/intl/messages_en.dart index eef309aa5d207f65826eae9a328f2af978c70978..4de38ce120b5f8b2d644e7bf4fbf97c2e6b7164e 100644 --- a/mobile/lib/generated/intl/messages_en.dart +++ b/mobile/lib/generated/intl/messages_en.dart @@ -357,6 +357,7 @@ class MessageLookup extends MessageLookupByLibrary { "Authentication failed, please try again"), "authenticationSuccessful": MessageLookupByLibrary.simpleMessage("Authentication successful!"), + "autoPair": MessageLookupByLibrary.simpleMessage("Auto pair"), "available": MessageLookupByLibrary.simpleMessage("Available"), "backedUpFolders": MessageLookupByLibrary.simpleMessage("Backed up folders"), @@ -982,6 +983,7 @@ class MessageLookup extends MessageLookupByLibrary { "orPickAnExistingOne": MessageLookupByLibrary.simpleMessage("Or pick an existing one"), "pair": MessageLookupByLibrary.simpleMessage("Pair"), + "pairWithPin": MessageLookupByLibrary.simpleMessage("Pair with PIN"), "passkey": MessageLookupByLibrary.simpleMessage("Passkey"), "passkeyAuthTitle": MessageLookupByLibrary.simpleMessage("Passkey verification"), diff --git a/mobile/lib/generated/l10n.dart b/mobile/lib/generated/l10n.dart index 3fa9c2209ac6a5911e0df85d911e45454bb2c9dc..7f5dc9614496e286537df29f936e9dbcf97e9727 100644 --- a/mobile/lib/generated/l10n.dart +++ b/mobile/lib/generated/l10n.dart @@ -8378,6 +8378,26 @@ class S { ); } + /// `Auto pair` + String get autoPair { + return Intl.message( + 'Auto pair', + name: 'autoPair', + desc: '', + args: [], + ); + } + + /// `Pair with PIN` + String get pairWithPin { + return Intl.message( + 'Pair with PIN', + name: 'pairWithPin', + desc: '', + args: [], + ); + } + /// `Device not found` String get deviceNotFound { return Intl.message( diff --git a/mobile/lib/l10n/intl_en.arb b/mobile/lib/l10n/intl_en.arb index 7115c69508e07093af15c1ddb94f8aa12f9a2e8f..ee00499357a98ed7901e30d5c86ad1b2c4f67c87 100644 --- a/mobile/lib/l10n/intl_en.arb +++ b/mobile/lib/l10n/intl_en.arb @@ -1195,6 +1195,8 @@ "verifyPasskey": "Verify passkey", "playOnTv": "Play album on TV", "pair": "Pair", + "autoPair": "Auto pair", + "pairWithPin": "Pair with PIN", "deviceNotFound": "Device not found", "castInstruction": "Visit cast.ente.io on the device you want to pair.\n\nEnter the code below to play the album on your TV.", "deviceCodeHint": "Enter the code", diff --git a/mobile/lib/ui/viewer/gallery/gallery_app_bar_widget.dart b/mobile/lib/ui/viewer/gallery/gallery_app_bar_widget.dart index a33fc9628b21e7008f3b0c5873964104c282bede..35933272de4836f36a4b536e47716b1ca440cda7 100644 --- a/mobile/lib/ui/viewer/gallery/gallery_app_bar_widget.dart +++ b/mobile/lib/ui/viewer/gallery/gallery_app_bar_widget.dart @@ -26,6 +26,7 @@ import 'package:photos/services/update_service.dart'; import 'package:photos/ui/actions/collection/collection_sharing_actions.dart'; import 'package:photos/ui/components/action_sheet_widget.dart'; import 'package:photos/ui/components/buttons/button_widget.dart'; +import "package:photos/ui/components/dialog_widget.dart"; import 'package:photos/ui/components/models/button_type.dart'; import "package:photos/ui/map/enable_map.dart"; import "package:photos/ui/map/map_screen.dart"; @@ -892,6 +893,59 @@ class _GalleryAppBarWidgetState extends State { final gw = CastGateway(NetworkClient.instance.enteDio); // stop any existing cast session gw.revokeAllTokens().ignore(); + final result = await showDialogWidget( + context: context, + title: S.of(context).playOnTv, + body: + "Auto Pair requires connecting to Google servers and only works with Chromecast supported devices. Google will not receive sensitive data, such as your photos.\n\nPair with PIN works for any large screen device you want to play your album on.", + buttons: [ + ButtonWidget( + labelText: S.of(context).autoPair, + icon: Icons.cast_outlined, + buttonType: ButtonType.trailingIconPrimary, + buttonSize: ButtonSize.large, + shouldStickToDarkTheme: true, + buttonAction: ButtonAction.first, + shouldSurfaceExecutionStates: true, + isInAlert: true, + onTap: () async { + showToast(context, "Coming soon"); + // await _castAlbum(gw); + }, + ), + ButtonWidget( + labelText: S.of(context).pairWithPin, + buttonType: ButtonType.trailingIconPrimary, + // icon for pairing with TV manually + icon: Icons.tv_outlined, + buttonSize: ButtonSize.large, + isInAlert: true, + shouldStickToDarkTheme: true, + buttonAction: ButtonAction.second, + shouldSurfaceExecutionStates: false, + ), + // cancel button + ], + ); + _logger.info("Cast result: $result"); + if (result == null) { + return; + } + if (result.action == ButtonAction.error) { + await showGenericErrorDialog( + context: context, + error: result.exception, + ); + } + if (result.action == ButtonAction.first) { + showToast(context, "Coming soon"); + } + if (result.action == ButtonAction.second) { + await _pairWithPin(gw); + } + } + + Future _pairWithPin(CastGateway gw) async { await showTextInputDialog( context, title: context.l10n.playOnTv,