Skip to content

Commit

Permalink
fix: Better handling of HTTPS links in the app settings.
Browse files Browse the repository at this point in the history
  • Loading branch information
Skyost committed Jan 12, 2025
1 parent ce754f7 commit 78c5cf3
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 39 deletions.
7 changes: 7 additions & 0 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -58,4 +58,11 @@
android:name="flutter_deeplinking_enabled"
android:value="false" />
</application>

<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="https" />
</intent>
</queries>
</manifest>
39 changes: 18 additions & 21 deletions lib/pages/settings/entries/github.dart
Original file line number Diff line number Diff line change
@@ -1,31 +1,28 @@
import 'package:flutter/material.dart';
import 'package:open_authenticator/app.dart';
import 'package:open_authenticator/i18n/translations.g.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:open_authenticator/pages/settings/entries/uri_settings_entry.dart';

/// Takes the user to Github to report bugs, suggest new features, ...
class GithubSettingsEntryWidget extends StatelessWidget {
class GithubSettingsEntryWidget extends UriSettingsEntry {
/// Creates a new Github settings entry widget instance.
const GithubSettingsEntryWidget({
GithubSettingsEntryWidget({
super.key,
});
}) : super(
icon: Icons.bug_report,
title: translations.settings.about.github.title,
subtitle: translations.settings.about.github.subtitle,
uri: Uri.parse(App.githubRepositoryUrl),
);

@override
Widget build(BuildContext context) => ListTile(
leading: const Icon(Icons.bug_report),
title: Text(translations.settings.about.github.title),
subtitle: Text(translations.settings.about.github.subtitle),
onTap: () async {
Uri uri = Uri.parse(App.githubRepositoryUrl);
Uri withFragment = Uri(
scheme: uri.scheme,
host: uri.host,
path: uri.path,
fragment: 'report-bugs-or-suggest-new-features',
);
if (await canLaunchUrl(withFragment)) {
launchUrl(withFragment);
}
},
);
Uri get uri {
Uri uri = super.uri;
return Uri(
scheme: uri.scheme,
host: uri.host,
path: uri.path,
fragment: 'report-bugs-or-suggest-new-features',
);
}
}
25 changes: 9 additions & 16 deletions lib/pages/settings/entries/translate.dart
Original file line number Diff line number Diff line change
@@ -1,25 +1,18 @@
import 'package:flutter/material.dart';
import 'package:open_authenticator/app.dart';
import 'package:open_authenticator/i18n/translations.g.dart';
import 'package:open_authenticator/pages/settings/entries/uri_settings_entry.dart';
import 'package:url_launcher/url_launcher.dart';

/// Takes the user to the app translation page.
class TranslateSettingsEntryWidget extends StatelessWidget {
class TranslateSettingsEntryWidget extends UriSettingsEntry {
/// Creates a new translate settings entry widget instance.
const TranslateSettingsEntryWidget({
TranslateSettingsEntryWidget({
super.key,
});

@override
Widget build(BuildContext context) => ListTile(
leading: const Icon(Icons.translate),
title: Text(translations.settings.about.translate.title),
subtitle: Text(translations.settings.about.translate.subtitle(appName: App.appName)),
onTap: () async {
Uri uri = Uri.parse(App.appTranslationUrl);
if (await canLaunchUrl(uri)) {
launchUrl(uri);
}
},
);
}) : super(
icon: Icons.translate,
title: translations.settings.about.translate.title,
subtitle: translations.settings.about.translate.subtitle(appName: App.appName),
uri: Uri.parse(App.appTranslationUrl),
);
}
41 changes: 41 additions & 0 deletions lib/pages/settings/entries/uri_settings_entry.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';

/// A settings entry that allows to open a specific URI.
class UriSettingsEntry extends StatelessWidget {
/// The entry widget title.
final String title;

/// The entry widget subtitle.
final String? subtitle;

/// The icon.
final IconData? icon;

/// The URI to open.
final Uri uri;

/// Creates a new URI settings entry instance.
const UriSettingsEntry({
super.key,
required this.title,
this.subtitle,
this.icon,
required this.uri,
});

@override
Widget build(BuildContext context) => FutureBuilder(
future: canLaunchUrl(uri),
builder: (context, snapshot) => createListTile(context, snapshot.data),
);

Widget createListTile(BuildContext context, bool? canLaunchUri) => canLaunchUri == null || canLaunchUri == true
? ListTile(
leading: const Icon(Icons.translate),
title: Text(title),
subtitle: subtitle == null ? null : Text(subtitle!),
onTap: canLaunchUri == true ? (() async => await launchUrl(uri)) : null,
)
: SizedBox.shrink();
}
4 changes: 2 additions & 2 deletions lib/pages/settings/page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,8 @@ class SettingsPage extends ConsumerWidget {
const BackupNowSettingsEntryWidget(),
const ManageBackupSettingsEntryWidget(),
_SettingsPageSectionTitle(title: translations.settings.about.title),
const TranslateSettingsEntryWidget(),
const GithubSettingsEntryWidget(),
TranslateSettingsEntryWidget(),
GithubSettingsEntryWidget(),
const AboutSettingsEntryWidget(),
_SettingsPageSectionTitle(title: translations.settings.dangerZone.title),
const DeleteAccountSettingsEntryWidget(),
Expand Down

0 comments on commit 78c5cf3

Please sign in to comment.