diff --git a/lib/game/components/backbox/backbox.dart b/lib/game/components/backbox/backbox.dart index 5789f2bf..b9a6cc0e 100644 --- a/lib/game/components/backbox/backbox.dart +++ b/lib/game/components/backbox/backbox.dart @@ -87,7 +87,10 @@ class Backbox extends PositionComponent with ZIndex { ), ); }, - onNavigate: () => launchUrl(Uri.parse(ShareRepository.openSourceUrl)), + onNavigate: () { + print("OPEN ${ShareRepository.openSourceUrl}"); + openLink(ShareRepository.openSourceUrl); + }, ), ); } else if (state is InitialsFailureState) { diff --git a/lib/game/components/backbox/displays/game_over_info_display.dart b/lib/game/components/backbox/displays/game_over_info_display.dart index 0b401023..2b2ba8ac 100644 --- a/lib/game/components/backbox/displays/game_over_info_display.dart +++ b/lib/game/components/backbox/displays/game_over_info_display.dart @@ -71,7 +71,7 @@ class GameOverInfoDisplay extends Component with HasGameRef { @override Future onLoad() async { await super.onLoad(); - gameRef.overlays.add(PinballGame.replayButtonOverlay); + //gameRef.overlays.add(PinballGame.replayButtonOverlay); } } diff --git a/packages/share_repository/lib/src/share_repository.dart b/packages/share_repository/lib/src/share_repository.dart index a7c7dc7d..12d6c04c 100644 --- a/packages/share_repository/lib/src/share_repository.dart +++ b/packages/share_repository/lib/src/share_repository.dart @@ -11,6 +11,7 @@ class ShareRepository { final String _appUrl; + /// Url to the Github Open Source Pinball project. static const openSourceUrl = 'https://github.com/VGVentures/pinball'; /// Returns a url to share the [value] on the given [platform]. diff --git a/test/game/components/backbox/backbox_test.dart b/test/game/components/backbox/backbox_test.dart index 6ab0c32e..ecd8dc00 100644 --- a/test/game/components/backbox/backbox_test.dart +++ b/test/game/components/backbox/backbox_test.dart @@ -20,6 +20,9 @@ import 'package:pinball/l10n/l10n.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; import 'package:pinball_theme/pinball_theme.dart' as theme; +import 'package:pinball_ui/pinball_ui.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'package:share_repository/share_repository.dart'; class _TestGame extends Forge2DGame with HasKeyboardHandlerComponents, HasTappables { @@ -74,6 +77,10 @@ class _MockLeaderboardRepository extends Mock implements LeaderboardRepository { class _MockTapDownInfo extends Mock implements TapDownInfo {} +class _MockUrlLauncher extends Mock + with MockPlatformInterfaceMixin + implements UrlLauncherPlatform {} + class _MockAppLocalizations extends Mock implements AppLocalizations { @override String get score => ''; @@ -228,60 +235,119 @@ void main() { }, ); - flameTester.test( - 'adds GameOverInfoDisplay on InitialsSuccessState', - (game) async { - final state = InitialsSuccessState( - score: 100, - initials: 'AAA', - character: theme.AndroidTheme(), - ); - whenListen( - bloc, - const Stream.empty(), - initialState: state, - ); - final backbox = Backbox.test(bloc: bloc); - await game.pump(backbox); - - expect( - game.descendants().whereType().length, - equals(1), - ); - }, - ); - - flameTester.test( - 'adds ShareScoreRequested event when sharing on GameOverInfoDisplay', - (game) async { - final state = InitialsSuccessState( - score: 100, - initials: 'AAA', - character: theme.AndroidTheme(), - ); - whenListen( - bloc, - Stream.value(state), - initialState: state, - ); - final backbox = Backbox.test(bloc: bloc); - await game.pump(backbox); - - final shareLink = - game.descendants().whereType().first; - shareLink.onTapDown(_MockTapDownInfo()); - - verify( - () => bloc.add( - ShareScoreRequested( - score: state.score, - initials: state.initials, - character: state.character, + group('GameOverInfoDisplay', () { + late UrlLauncherPlatform urlLauncher; + + setUp(() async { + urlLauncher = _MockUrlLauncher(); + UrlLauncherPlatform.instance = urlLauncher; + }); + + flameTester.test( + 'added on InitialsSuccessState', + (game) async { + final state = InitialsSuccessState( + score: 100, + initials: 'AAA', + character: theme.AndroidTheme(), + ); + whenListen( + bloc, + const Stream.empty(), + initialState: state, + ); + final backbox = Backbox.test(bloc: bloc); + await game.pump(backbox); + + expect( + game.descendants().whereType().length, + equals(1), + ); + }, + ); + + flameTester.test( + 'adds ShareScoreRequested event when sharing', + (game) async { + final state = InitialsSuccessState( + score: 100, + initials: 'AAA', + character: theme.AndroidTheme(), + ); + whenListen( + bloc, + Stream.value(state), + initialState: state, + ); + final backbox = Backbox.test(bloc: bloc); + await game.pump(backbox); + + final shareLink = + game.descendants().whereType().first; + shareLink.onTapDown(_MockTapDownInfo()); + + verify( + () => bloc.add( + ShareScoreRequested( + score: state.score, + initials: state.initials, + character: state.character, + ), ), - ), - ).called(1); - }, - ); + ).called(1); + }, + ); + + flameTester.test( + 'open OpenSource url when navigating', + (game) async { + when(() => urlLauncher.canLaunch(any())) + .thenAnswer((_) async => true); + when( + () => urlLauncher.launch( + any(), + useSafariVC: any(named: 'useSafariVC'), + useWebView: any(named: 'useWebView'), + enableJavaScript: any(named: 'enableJavaScript'), + enableDomStorage: any(named: 'enableDomStorage'), + universalLinksOnly: any(named: 'universalLinksOnly'), + headers: any(named: 'headers'), + ), + ).thenAnswer((_) async => true); + + final state = InitialsSuccessState( + score: 100, + initials: 'AAA', + character: theme.AndroidTheme(), + ); + whenListen( + bloc, + Stream.value(state), + initialState: state, + ); + final backbox = Backbox.test(bloc: bloc); + await game.pump(backbox); + + final shareLink = + game.descendants().whereType().first; + shareLink.onTapDown(_MockTapDownInfo()); + + await game.ready(); + + verify( + () => urlLauncher.launch( + ShareRepository.openSourceUrl, + useSafariVC: any(named: 'useSafariVC'), + useWebView: any(named: 'useWebView'), + enableJavaScript: any(named: 'enableJavaScript'), + enableDomStorage: any(named: 'enableDomStorage'), + universalLinksOnly: any(named: 'universalLinksOnly'), + headers: any(named: 'headers'), + ), + ); + }, + ); + }); flameTester.test( 'adds InitialsSubmissionFailureDisplay on InitialsFailureState', diff --git a/test/game/components/backbox/displays/game_over_info_display_test.dart b/test/game/components/backbox/displays/game_over_info_display_test.dart index 450fd386..9d4fd0bc 100644 --- a/test/game/components/backbox/displays/game_over_info_display_test.dart +++ b/test/game/components/backbox/displays/game_over_info_display_test.dart @@ -98,7 +98,7 @@ void main() { ); flameTester.testGameWidget( - 'calls onNavigate when go to IO link is tapped', + 'calls onNavigate when go to Google IO link is tapped', setUp: (game, tester) async { var tapped = false;