diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 83a9271b..57476ad2 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -109,11 +109,6 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - LSApplicationQueriesSchemes - - itms-beta - itms - UIViewControllerBasedStatusBarAppearance CADisableMinimumFrameDurationOnPhone diff --git a/lib/ui/pages/landing_page/components/main_overflow_menu.dart b/lib/ui/pages/landing_page/components/main_overflow_menu.dart index 5544f4c9..f55f9116 100644 --- a/lib/ui/pages/landing_page/components/main_overflow_menu.dart +++ b/lib/ui/pages/landing_page/components/main_overflow_menu.dart @@ -1,13 +1,16 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:package_info_plus/package_info_plus.dart'; -import 'package:launch_review_latest/launch_review_latest.dart'; +import 'package:paintroid/core/models/loggable_mixin.dart'; import 'package:paintroid/core/utils/open_url.dart'; import 'package:paintroid/ui/shared/dialogs/about_dialog.dart'; import 'package:paintroid/ui/shared/pop_menu_button.dart'; import 'package:paintroid/ui/theme/theme.dart'; +import 'package:url_launcher/url_launcher.dart'; enum MainOverflowMenuOption { rate('Rate us!'), @@ -27,7 +30,8 @@ class MainOverflowMenu extends ConsumerStatefulWidget { ConsumerState createState() => _MainOverFlowMenuState(); } -class _MainOverFlowMenuState extends ConsumerState { +class _MainOverFlowMenuState extends ConsumerState + with LoggableMixin { final feedbackUrl = 'mailto:support-paintroid@catrobat.org'; final iOSAppId = 'org.catrobat.paintroidflutter'; final androidAppId = 'org.catrobat.paintroid'; @@ -50,12 +54,34 @@ class _MainOverFlowMenuState extends ConsumerState { ); } + Future _openStore() async { + try { + if (Platform.isAndroid || Platform.isIOS) { + final appId = Platform.isAndroid ? androidAppId : iOSAppId; + final url = Uri.parse( + Platform.isAndroid + ? 'market://details?id=$appId' + : 'https://apps.apple.com/app/$appId', + ); + final launched = await launchUrl( + url, + mode: LaunchMode.externalApplication, + ); + if (!launched) { + logger.severe('Could not launch app store URL: $url'); + } + } + } catch (err, stacktrace) { + logger.severe('Failed to open app store', err, stacktrace); + } + } + Future _handleSelectedOption(MainOverflowMenuOption option) async { PackageInfo packageInfo = await PackageInfo.fromPlatform(); String version = packageInfo.version; switch (option) { case MainOverflowMenuOption.rate: - LaunchReviewLatest.launch(androidAppId: androidAppId, iOSAppId: iOSAppId); + await _openStore(); break; case MainOverflowMenuOption.help: if (mounted) { diff --git a/pubspec.lock b/pubspec.lock index b831864b..9f3bd8d3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -672,14 +672,6 @@ packages: url: "https://pub.dev" source: hosted version: "6.9.0" - launch_review_latest: - dependency: "direct main" - description: - name: launch_review_latest - sha256: dd0f28a8612b10e550e44d45a0caa9559cf7a3b96a56249aaf3f24ee765ddbe9 - url: "https://pub.dev" - source: hosted - version: "1.0.0" leak_tracker: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 6e060f09..4e9aecca 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -28,7 +28,6 @@ dependencies: toast: ^0.3.0 oxidized: ^5.2.0 flutter_svg: ^1.1.0 - launch_review_latest: ^1.0.0 package_info_plus: ^8.3.0 filesize: ^2.0.1 smooth_page_indicator: ^1.0.0+2 diff --git a/test/widget/landing_page/landing_page_test.dart b/test/widget/landing_page/landing_page_test.dart index 91b910dd..3f1f18e6 100644 --- a/test/widget/landing_page/landing_page_test.dart +++ b/test/widget/landing_page/landing_page_test.dart @@ -133,6 +133,28 @@ void main() { }, ); + testWidgets( + 'Should tap Rate us! option and handle it without crashing', + (tester) async { + when(database.projectDAO).thenReturn(dao); + when(dao.getProjects()).thenAnswer((_) => Future.value([])); + + await tester.pumpWidget(sut); + await tester.pumpAndSettle(); + + final mainOverflowMenu = find.byType(MainOverflowMenu); + expect(mainOverflowMenu, findsOneWidget); + + await tester.tap(mainOverflowMenu); + await tester.pumpAndSettle(); + + await tester.tap(find.text('Rate us!')); + await tester.pumpAndSettle(); + + expect(mainOverflowMenu, findsOneWidget); + }, + ); + testWidgets( 'Should have the two FABs', (tester) async {