Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions ios/Runner/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -109,11 +109,6 @@
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>itms-beta</string>
<string>itms</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>CADisableMinimumFrameDurationOnPhone</key>
Expand Down
33 changes: 30 additions & 3 deletions lib/ui/pages/landing_page/components/main_overflow_menu.dart
Original file line number Diff line number Diff line change
@@ -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!'),
Expand All @@ -27,7 +30,8 @@ class MainOverflowMenu extends ConsumerStatefulWidget {
ConsumerState<MainOverflowMenu> createState() => _MainOverFlowMenuState();
}

class _MainOverFlowMenuState extends ConsumerState<MainOverflowMenu> {
class _MainOverFlowMenuState extends ConsumerState<MainOverflowMenu>
with LoggableMixin {
final feedbackUrl = 'mailto:[email protected]';
final iOSAppId = 'org.catrobat.paintroidflutter';
final androidAppId = 'org.catrobat.paintroid';
Expand All @@ -50,12 +54,35 @@ class _MainOverFlowMenuState extends ConsumerState<MainOverflowMenu> {
);
}

Future<void> _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) {
// launchUrl returned false, meaning it failed to open the url
logger.severe('Could not launch app store URL: $url');
}
}
} catch (err, stacktrace) {
logger.severe('Failed to open app store', err, stacktrace);
}
}

Future<void> _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) {
Expand Down
8 changes: 0 additions & 8 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
1 change: 0 additions & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
22 changes: 22 additions & 0 deletions test/widget/landing_page/landing_page_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down