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 {