chore(browsers): remove support for setting browser (rely on iOS 15 native functionality)

[skip ci]
This commit is contained in:
Jagandeep Brar
2022-05-10 21:16:46 -04:00
parent c2ac10bdf2
commit efd20249a9
28 changed files with 97 additions and 262 deletions

View File

@@ -9,7 +9,6 @@ enum LunaDatabaseValue {
THEME_AMOLED,
THEME_AMOLED_BORDER,
THEME_IMAGE_BACKGROUND_OPACITY,
SELECTED_BROWSER,
QUICK_ACTIONS_LIDARR,
QUICK_ACTIONS_RADARR,
QUICK_ACTIONS_SONARR,
@@ -26,11 +25,13 @@ enum LunaDatabaseValue {
class LunaDatabase extends LunaModuleDatabase {
@override
void registerAdapters() {
// Deprecated
Hive.registerAdapter(DeprecatedLunaBrowserAdapter());
// Active
Hive.registerAdapter(ExternalModuleHiveObjectAdapter());
Hive.registerAdapter(IndexerHiveObjectAdapter());
Hive.registerAdapter(ProfileHiveObjectAdapter());
Hive.registerAdapter(LunaLogHiveObjectAdapter());
Hive.registerAdapter(LunaBrowserAdapter());
Hive.registerAdapter(LunaIndexerIconAdapter());
Hive.registerAdapter(LunaLogTypeAdapter());
Hive.registerAdapter(LunaModuleAdapter());
@@ -43,10 +44,6 @@ class LunaDatabase extends LunaModuleDatabase {
for (LunaDatabaseValue value in LunaDatabaseValue.values) {
switch (value) {
// Non-primitive values
case LunaDatabaseValue.SELECTED_BROWSER:
data[value.key] =
(LunaDatabaseValue.SELECTED_BROWSER.data as LunaBrowser?).key;
break;
case LunaDatabaseValue.DEFAULT_LAUNCH_MODULE:
data[value.key] =
(LunaDatabaseValue.DEFAULT_LAUNCH_MODULE.data as LunaModule).key;
@@ -72,9 +69,6 @@ class LunaDatabase extends LunaModuleDatabase {
if (value != null)
switch (value) {
// Non-primitive values
case LunaDatabaseValue.SELECTED_BROWSER:
value.put(LunaBrowser.APPLE_SAFARI.fromKey(config[key]));
break;
case LunaDatabaseValue.DEFAULT_LAUNCH_MODULE:
value.put(LunaModule.DASHBOARD.fromKey(config[key]));
break;
@@ -149,8 +143,6 @@ extension LunaDatabaseValueExtension on LunaDatabaseValue {
return value is bool;
case LunaDatabaseValue.THEME_IMAGE_BACKGROUND_OPACITY:
return value is int;
case LunaDatabaseValue.SELECTED_BROWSER:
return value is LunaBrowser;
case LunaDatabaseValue.QUICK_ACTIONS_LIDARR:
return value is bool;
case LunaDatabaseValue.QUICK_ACTIONS_RADARR:
@@ -186,8 +178,6 @@ extension LunaDatabaseValueExtension on LunaDatabaseValue {
return true;
case LunaDatabaseValue.DRAWER_MANUAL_ORDER:
return null;
case LunaDatabaseValue.SELECTED_BROWSER:
return LunaBrowser.APPLE_SAFARI;
case LunaDatabaseValue.THEME_AMOLED:
return false;
case LunaDatabaseValue.THEME_AMOLED_BORDER:

View File

@@ -7,4 +7,3 @@ export 'extensions/int.dart';
export 'extensions/navigator_state.dart';
export 'extensions/page_controller.dart';
export 'extensions/scroll_controller.dart';
export 'extensions/string.dart';

View File

@@ -1,59 +0,0 @@
import 'package:lunasea/core.dart';
import 'package:url_launcher/url_launcher.dart';
extension StringLinksExtension on String {
Future<void> _openLink(String url, {Map<String, String>? headers}) async {
try {
//Attempt to launch the link forced as a universal link
if (await _launchUniversalLink(url)) return;
//If that fails and we're using a custom browser, format the link for the correct browser and attempt to launch
LunaBrowser? _browser = LunaDatabaseValue.SELECTED_BROWSER.data;
if (_browser != LunaBrowser.APPLE_SAFARI &&
await _launchCustomBrowser(_browser.formatted(url))) return;
//If all else fails, just launch it in Safari/stock browser
await _launch(url, headers: headers ?? {});
} catch (error, stack) {
LunaLogger().error('Unable to open link: $url', error, stack);
}
}
Future<bool> _launchUniversalLink(String url) async =>
await launch(url, forceSafariVC: false, universalLinksOnly: true);
Future<bool> _launchCustomBrowser(String url) async =>
await launch(url, forceSafariVC: false);
Future<bool> _launch(String url,
{required Map<String, String> headers}) async =>
await launch(url, headers: headers);
/// Attempt to open this string as a URL in a browser.
Future<void> lunaOpenGenericLink({Map<dynamic, dynamic>? headers}) async =>
await _openLink(this, headers: headers?.cast<String, String>());
/// Attach this string as an ID/title to IMDB and attempt to launch it as a URL.
Future<void> lunaOpenIMDB() async =>
await _openLink('https://www.imdb.com/title/$this');
/// Attach this string as a movie ID to TheMovieDB and attempt to launch it as a URL.
Future<void> lunaOpenTheMovieDBMovie() async =>
await _openLink('https://www.themoviedb.org/movie/$this');
/// Attach this string as a person ID to TheMovieDB and attempt to launch it as a URL.
Future<void> lunaOpenTheMovieDBCredits() async =>
await _openLink('https://www.themoviedb.org/person/$this');
/// Attach this string as a series ID to TheTVDB and attempt to launch it as a URL.
Future<void> lunaOpenTheTVDB() async =>
await _openLink('https://www.thetvdb.com/?id=$this&tab=series');
/// Attach this string as a TVDB ID to Trakt and attempt to launch it as a URL.
Future<void> lunaOpenTraktSeries() async =>
await _openLink('http://trakt.tv/search/tvdb/$this?id_type=show');
/// Attach this string as a TMDB ID to Trakt and attempt to launch it as a URL.
Future<void> lunaOpenTraktMovie() async =>
await _openLink('https://trakt.tv/search/tmdb/$this?id_type=movie');
/// Attach this string as a series ID to TVMaze and attempt to launch it as a URL.
Future<void> lunaOpenTVMaze() async =>
await _openLink('https://www.tvmaze.com/shows/$this');
}

View File

@@ -1,10 +1,9 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
part 'browser.g.dart';
@HiveType(typeId: 11, adapterName: 'LunaBrowserAdapter')
enum LunaBrowser {
@HiveType(typeId: 11, adapterName: 'DeprecatedLunaBrowserAdapter')
enum DeprecatedLunaBrowser {
@HiveField(0)
APPLE_SAFARI,
@HiveField(1)
@@ -16,94 +15,3 @@ enum LunaBrowser {
@HiveField(4)
MOZILLA_FIREFOX,
}
extension LunaBrowserExtension on LunaBrowser? {
String? get name {
switch (this) {
case LunaBrowser.APPLE_SAFARI:
return 'Apple Safari';
case LunaBrowser.BRAVE_BROWSER:
return 'Brave Browser';
case LunaBrowser.GOOGLE_CHROME:
return 'Google Chrome';
case LunaBrowser.MICROSOFT_EDGE:
return 'Microsoft Edge';
case LunaBrowser.MOZILLA_FIREFOX:
return 'Mozilla Firefox';
default:
return null;
}
}
String? get key {
switch (this) {
case LunaBrowser.APPLE_SAFARI:
return 'applesafari';
case LunaBrowser.BRAVE_BROWSER:
return 'bravebrowser';
case LunaBrowser.GOOGLE_CHROME:
return 'googlechrome';
case LunaBrowser.MICROSOFT_EDGE:
return 'microsoftedge';
case LunaBrowser.MOZILLA_FIREFOX:
return 'mozillafirefox';
default:
return null;
}
}
LunaBrowser? fromKey(String? key) {
switch (key) {
case 'applesafari':
return LunaBrowser.APPLE_SAFARI;
case 'bravebrowser':
return LunaBrowser.BRAVE_BROWSER;
case 'googlechrome':
return LunaBrowser.GOOGLE_CHROME;
case 'microsoftedge':
return LunaBrowser.MICROSOFT_EDGE;
case 'mozillafirefox':
return LunaBrowser.MOZILLA_FIREFOX;
default:
return null;
}
}
IconData? get icon {
switch (this) {
case LunaBrowser.APPLE_SAFARI:
return LunaBrandIcons.safari;
case LunaBrowser.BRAVE_BROWSER:
return LunaBrandIcons.bravebrowser;
case LunaBrowser.GOOGLE_CHROME:
return LunaBrandIcons.chrome;
case LunaBrowser.MICROSOFT_EDGE:
return LunaBrandIcons.microsoftedge;
case LunaBrowser.MOZILLA_FIREFOX:
return LunaBrandIcons.firefox;
default:
return null;
}
}
String formatted(String url) {
bool isHttps = url.substring(0, min(8, url.length)) == 'https://';
switch (this) {
case LunaBrowser.BRAVE_BROWSER:
return 'brave://open-url?url=$url';
case LunaBrowser.GOOGLE_CHROME:
return isHttps
? url.replaceFirst('https://', 'googlechromes://')
: url.replaceFirst('http://', 'googlechrome://');
case LunaBrowser.MICROSOFT_EDGE:
return isHttps
? url.replaceFirst('https://', 'microsoft-edge-https://')
: url.replaceFirst('http://', 'microsoft-edge-http://');
case LunaBrowser.MOZILLA_FIREFOX:
return 'firefox://open-url?url=$url';
case LunaBrowser.APPLE_SAFARI:
default:
return url;
}
}
}

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:lunasea/extensions/string_links.dart';
import 'package:quick_actions/quick_actions.dart';
import 'package:lunasea/core.dart';
@@ -621,13 +622,13 @@ extension LunaModuleExtension on LunaModule {
LunaButton.text(
text: 'GitHub',
icon: LunaBrandIcons.github,
onTap: this.github!.lunaOpenGenericLink,
onTap: this.github!.openLink,
),
if (this.website != null)
LunaButton.text(
text: 'lunasea.Website'.tr(),
icon: Icons.home_rounded,
onTap: this.website!.lunaOpenGenericLink,
onTap: this.website!.openLink,
),
],
);

View File

@@ -2,17 +2,27 @@ import 'package:lunasea/system/logger.dart';
import 'package:url_launcher/url_launcher.dart';
extension StringAsLinksExtension on String {
Future<bool> _launchUniversal(Uri uri, Map<String, String>? headers) async {
print(await canLaunchUrl(uri));
return await launchUrl(uri, mode: LaunchMode.externalNonBrowserApplication);
Future<bool> _launchUniversal(uri) async {
return await launchUrl(
uri,
webOnlyWindowName: '_blank',
mode: LaunchMode.externalNonBrowserApplication,
);
}
Future<void> openLink({
Map<String, String>? headers,
}) async {
Future<bool> _launchDefault(uri) async {
return await launchUrl(
uri,
webOnlyWindowName: '_blank',
mode: LaunchMode.platformDefault,
);
}
Future<void> openLink() async {
try {
Uri uri = Uri.parse(this);
if (await _launchUniversal(uri, headers)) return;
if (await _launchUniversal(uri)) return;
await _launchDefault(uri);
} catch (error, stack) {
LunaLogger().error(
'Unable to open URL',
@@ -22,6 +32,33 @@ extension StringAsLinksExtension on String {
}
}
Future<void> openImdb() async =>
await 'https://www.imdb.com/title/$this'.openLink();
Future<void> openTmdbMovie() async {
await 'https://www.themoviedb.org/movie/$this'.openLink();
}
Future<void> openTmdbPerson() async {
await 'https://www.themoviedb.org/person/$this'.openLink();
}
Future<void> openTraktMovie() async {
await 'https://trakt.tv/search/tmdb/$this?id_type=movie'.openLink();
}
Future<void> openTraktSeries() async {
await 'http://trakt.tv/search/tvdb/$this?id_type=show'.openLink();
}
Future<void> openTvMaze() async {
await 'https://www.tvmaze.com/shows/$this'.openLink();
}
Future<void> openTvdbSeries() async {
await 'https://www.thetvdb.com/?id=$this&tab=series'.openLink();
}
Future<void> openYouTube() async {
await 'https://www.youtube.com/watch?v=$this'.openLink();
}

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/extensions/string_links.dart';
class ExternalModulesModuleTile extends StatelessWidget {
final ExternalModuleHiveObject? module;
@@ -15,7 +16,7 @@ class ExternalModulesModuleTile extends StatelessWidget {
title: module!.displayName,
body: [TextSpan(text: module!.host)],
trailing: const LunaIconButton.arrow(),
onTap: () async => module!.host!.lunaOpenGenericLink(),
onTap: module!.host!.openLink,
);
}
}

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/extensions/string_links.dart';
import 'package:lunasea/modules/lidarr.dart';
class LidarrAddDetailsArguments {
@@ -161,7 +162,7 @@ class _State extends State<LidarrAddDetails> with LunaScrollControllerMixin {
title: 'No Discogs Page Available',
message: 'No Discogs URL is available',
);
_arguments!.data.discogsLink!.lunaOpenGenericLink();
_arguments!.data.discogsLink!.openLink();
},
),
ValueListenableBuilder(

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/extensions/string_links.dart';
import 'package:lunasea/modules/lidarr.dart';
class Lidarr extends StatefulWidget {
@@ -144,8 +145,7 @@ class _State extends State<Lidarr> {
switch (values[1]) {
case 'web_gui':
ProfileHiveObject profile = LunaProfile.current;
await profile.lidarrHost
?.lunaOpenGenericLink(headers: profile.lidarrHeaders);
await profile.lidarrHost?.openLink();
break;
case 'update_library':
await _api

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/extensions/string_links.dart';
import 'package:lunasea/modules/lidarr.dart';
class LidarrAddSearchResultTile extends StatelessWidget {
@@ -32,7 +33,7 @@ class LidarrAddSearchResultTile extends StatelessWidget {
title: 'No Discogs Page Available',
message: 'No Discogs URL is available',
);
data.discogsLink!.lunaOpenGenericLink();
data.discogsLink!.openLink();
},
);

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/extensions/string_links.dart';
import 'package:lunasea/modules/lidarr.dart';
class LidarrDetailsOverview extends StatefulWidget {
@@ -46,8 +47,7 @@ class _State extends State<LidarrDetailsOverview>
padding: const EdgeInsets.all(12.0),
),
borderRadius: BorderRadius.circular(LunaUI.BORDER_RADIUS),
onTap: () async =>
widget.data.bandsintownURI!.lunaOpenGenericLink(),
onTap: () async => widget.data.bandsintownURI!.openLink(),
),
height: 50.0,
margin:
@@ -62,8 +62,7 @@ class _State extends State<LidarrDetailsOverview>
padding: const EdgeInsets.all(12.0),
),
borderRadius: BorderRadius.circular(LunaUI.BORDER_RADIUS),
onTap: () async =>
widget.data.discogsURI!.lunaOpenGenericLink(),
onTap: () async => widget.data.discogsURI!.openLink(),
),
height: 50.0,
margin:
@@ -78,8 +77,7 @@ class _State extends State<LidarrDetailsOverview>
padding: const EdgeInsets.all(12.0),
),
borderRadius: BorderRadius.circular(LunaUI.BORDER_RADIUS),
onTap: () async =>
widget.data.lastfmURI!.lunaOpenGenericLink(),
onTap: () async => widget.data.lastfmURI!.openLink(),
),
height: 50.0,
margin:

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/extensions/string_links.dart';
import 'package:lunasea/modules/nzbget.dart';
import 'package:lunasea/system/filesystem/file.dart';
@@ -113,8 +114,7 @@ class _State extends State<NZBGet> {
switch (values[1]) {
case 'web_gui':
ProfileHiveObject profile = LunaProfile.current;
await profile.nzbgetHost
?.lunaOpenGenericLink(headers: profile.nzbgetHeaders);
await profile.nzbgetHost?.openLink();
break;
case 'add_nzb':
_addNZB();

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/extensions/string_links.dart';
import 'package:lunasea/modules/radarr.dart';
enum RadarrGlobalSettingsType {
@@ -57,10 +58,7 @@ extension RadarrGlobalSettingsTypeExtension on RadarrGlobalSettingsType {
}
Future<void> _webGUI(BuildContext context) async {
context
.read<RadarrState>()
.host
.lunaOpenGenericLink(headers: context.read<RadarrState>().headers);
context.read<RadarrState>().host.openLink();
}
Future<void> _backupDatabase(BuildContext context) async {

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/extensions/string.dart';
import 'package:lunasea/extensions/string_links.dart';
import 'package:lunasea/modules/radarr.dart';
class RadarrAddMovieDiscoveryResultTile extends StatefulWidget {
@@ -82,5 +83,5 @@ class _State extends State<RadarrAddMovieDiscoveryResultTile> {
}
Future<void>? _onLongPress() async =>
widget.movie.tmdbId.toString().lunaOpenTheMovieDBMovie();
widget.movie.tmdbId.toString().openTmdbMovie();
}

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/extensions/string.dart';
import 'package:lunasea/extensions/string_links.dart';
import 'package:lunasea/modules/radarr.dart';
class RadarrAddMovieSearchResultTile extends StatefulWidget {
@@ -90,5 +91,5 @@ class _State extends State<RadarrAddMovieSearchResultTile> {
}
Future<void>? _onLongPress() async =>
widget.movie.tmdbId?.toString().lunaOpenTheMovieDBMovie();
widget.movie.tmdbId?.toString().openTmdbMovie();
}

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/extensions/string_links.dart';
import 'package:lunasea/modules/radarr.dart';
class RadarrMovieDetailsCastCrewTile extends StatelessWidget {
@@ -28,7 +29,7 @@ class RadarrMovieDetailsCastCrewTile extends StatelessWidget {
),
),
],
onTap: credits.personTmdbId?.toString().lunaOpenTheMovieDBCredits,
onTap: credits.personTmdbId?.toString().openTmdbPerson,
);
}

View File

@@ -25,7 +25,7 @@ class RadarrMovieDetailsOverviewLinksSection extends StatelessWidget {
padding: const EdgeInsets.all(12.0),
),
borderRadius: BorderRadius.circular(LunaUI.BORDER_RADIUS),
onTap: () async => await movie?.imdbId?.lunaOpenIMDB(),
onTap: () async => await movie?.imdbId?.openImdb(),
),
height: 50.0,
margin: const EdgeInsets.symmetric(horizontal: 6.0, vertical: 6.0),
@@ -40,7 +40,7 @@ class RadarrMovieDetailsOverviewLinksSection extends StatelessWidget {
),
borderRadius: BorderRadius.circular(LunaUI.BORDER_RADIUS),
onTap: () async =>
await movie?.tmdbId?.toString().lunaOpenTheMovieDBMovie(),
await movie?.tmdbId?.toString().openTmdbMovie(),
),
height: 50.0,
margin: const EdgeInsets.symmetric(horizontal: 6.0, vertical: 6.0),
@@ -55,7 +55,7 @@ class RadarrMovieDetailsOverviewLinksSection extends StatelessWidget {
),
borderRadius: BorderRadius.circular(LunaUI.BORDER_RADIUS),
onTap: () async =>
await movie?.tmdbId?.toString().lunaOpenTraktMovie(),
await movie?.tmdbId?.toString().openTraktMovie(),
),
height: 50.0,
margin: const EdgeInsets.symmetric(horizontal: 6.0, vertical: 6.0),

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/extensions/string_links.dart';
import 'package:lunasea/modules/radarr.dart';
class RadarrHealthCheckTile extends StatelessWidget {
@@ -20,7 +21,7 @@ class RadarrHealthCheckTile extends StatelessWidget {
],
expandedTableContent: expandedTable(),
expandedHighlightedNodes: highlightedNodes(),
onLongPress: healthCheck.wikiUrl!.lunaOpenGenericLink,
onLongPress: healthCheck.wikiUrl!.openLink,
);
}

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/extensions/string_links.dart';
import 'package:lunasea/modules/sabnzbd.dart';
import 'package:lunasea/system/filesystem/file.dart';
import 'package:lunasea/system/filesystem/filesystem.dart';
@@ -112,8 +113,7 @@ class _State extends State<SABnzbd> {
switch (values[1]) {
case 'web_gui':
ProfileHiveObject profile = LunaProfile.current;
await profile.sabnzbdHost
?.lunaOpenGenericLink(headers: profile.sabnzbdHeaders);
await profile.sabnzbdHost?.openLink();
break;
case 'add_nzb':
_addNZB();

View File

@@ -861,33 +861,6 @@ class SettingsDialogs {
return Tuple2(_flag, _profile);
}
Future<Tuple2<bool, LunaBrowser?>> changeBrowser(BuildContext context) async {
bool _flag = false;
LunaBrowser? _browser;
void _setValues(bool flag, LunaBrowser browser) {
_flag = flag;
_browser = browser;
Navigator.of(context).pop();
}
await LunaDialog.dialog(
context: context,
title: 'settings.OpenLinksIn'.tr(),
content: List.generate(
LunaBrowser.values.length,
(index) => LunaDialog.tile(
icon: LunaBrowser.values[index].icon,
iconColor: LunaColours().byListIndex(index),
text: LunaBrowser.values[index].name!,
onTap: () => _setValues(true, LunaBrowser.values[index]),
),
),
contentPadding: LunaDialog.listDialogContentPadding(),
);
return Tuple2(_flag, _browser);
}
Future<Tuple2<bool, LunaLanguage?>> changeLanguage(
BuildContext context,
) async {

View File

@@ -89,22 +89,6 @@ class _State extends State<_Widget> with LunaScrollControllerMixin {
onTap: () async =>
SettingsConfigurationNetworkRouter().navigateTo(context),
),
if (LunaPlatform().isIOS)
LunaDatabaseValue.SELECTED_BROWSER.listen(
builder: (context, box, widget) {
LunaDatabaseValue _db = LunaDatabaseValue.SELECTED_BROWSER;
return LunaBlock(
title: 'settings.OpenLinksIn'.tr(),
body: [TextSpan(text: (_db.data as LunaBrowser?).name)],
trailing: LunaIconButton(icon: (_db.data as LunaBrowser?).icon),
onTap: () async {
Tuple2<bool, LunaBrowser?> result =
await SettingsDialogs().changeBrowser(context);
if (result.item1) _db.put(result.item2);
},
);
},
),
if (LunaQuickActions.isSupported)
LunaBlock(
title: 'settings.QuickActions'.tr(),

View File

@@ -61,8 +61,7 @@ class _State extends State<_Widget> with LunaScrollControllerMixin {
title: 'Getting Started',
body: const [TextSpan(text: 'Information & Setup Instructions')],
trailing: const LunaIconButton.arrow(),
onTap:
LunaLinks.NOTIFICATIONS_GETTING_STARTED.url.lunaOpenGenericLink,
onTap: LunaLinks.NOTIFICATIONS_GETTING_STARTED.launch,
),
LunaDivider(),
..._modules(),

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/extensions/string_links.dart';
import 'package:lunasea/modules/sonarr.dart';
enum SonarrGlobalSettingsType {
@@ -57,9 +58,7 @@ extension SonarrGlobalSettingsTypeExtension on SonarrGlobalSettingsType {
}
Future<void> _webGUI(BuildContext context) async =>
context.read<SonarrState>().host.lunaOpenGenericLink(
headers: context.read<SonarrState>().headers,
);
context.read<SonarrState>().host.openLink();
Future<void> _backupDatabase(BuildContext context) async =>
SonarrAPIController().backupDatabase(context: context);
Future<void> _searchAllMissing(BuildContext context) async {

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/extensions/string.dart';
import 'package:lunasea/extensions/string_links.dart';
import 'package:lunasea/modules/sonarr.dart';
class SonarrSeriesAddSearchResultTile extends StatefulWidget {
@@ -94,5 +95,5 @@ class _State extends State<SonarrSeriesAddSearchResultTile> {
}
Future<void>? _onLongPress() async =>
widget.series.tvdbId?.toString().lunaOpenTheTVDB();
widget.series.tvdbId?.toString().openTvdbSeries();
}

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/extensions/string_links.dart';
import 'package:lunasea/modules/sonarr.dart';
class SonarrSeriesDetailsOverviewLinksSection extends StatelessWidget {
@@ -24,7 +25,7 @@ class SonarrSeriesDetailsOverviewLinksSection extends StatelessWidget {
padding: const EdgeInsets.all(12.0),
),
borderRadius: BorderRadius.circular(LunaUI.BORDER_RADIUS),
onTap: () async => await series.imdbId!.lunaOpenIMDB(),
onTap: () async => await series.imdbId!.openImdb(),
),
height: 50.0,
margin: const EdgeInsets.symmetric(horizontal: 6.0, vertical: 6.0),
@@ -39,7 +40,7 @@ class SonarrSeriesDetailsOverviewLinksSection extends StatelessWidget {
),
borderRadius: BorderRadius.circular(LunaUI.BORDER_RADIUS),
onTap: () async =>
await series.tvdbId!.toString().lunaOpenTraktSeries(),
await series.tvdbId!.toString().openTraktSeries(),
),
height: 50.0,
margin: const EdgeInsets.symmetric(horizontal: 6.0, vertical: 6.0),
@@ -54,7 +55,7 @@ class SonarrSeriesDetailsOverviewLinksSection extends StatelessWidget {
),
borderRadius: BorderRadius.circular(LunaUI.BORDER_RADIUS),
onTap: () async =>
await series.tvdbId!.toString().lunaOpenTheTVDB(),
await series.tvdbId!.toString().openTvdbSeries(),
),
height: 50.0,
margin: const EdgeInsets.symmetric(horizontal: 6.0, vertical: 6.0),
@@ -68,8 +69,7 @@ class SonarrSeriesDetailsOverviewLinksSection extends StatelessWidget {
padding: const EdgeInsets.all(12.0),
),
borderRadius: BorderRadius.circular(LunaUI.BORDER_RADIUS),
onTap: () async =>
await series.tvMazeId!.toString().lunaOpenTVMaze(),
onTap: () async => await series.tvMazeId!.toString().openTvMaze(),
),
height: 50.0,
margin: const EdgeInsets.symmetric(horizontal: 6.0, vertical: 6.0),

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/extensions/string_links.dart';
import 'package:lunasea/modules/tautulli.dart';
enum TautulliGlobalSettingsType {
@@ -64,9 +65,7 @@ extension TautulliGlobalSettingsTypeExtension on TautulliGlobalSettingsType {
}
Future<void> _webGUI(BuildContext context) async =>
context.read<TautulliState>().host!.lunaOpenGenericLink(
headers: context.read<TautulliState>().headers,
);
context.read<TautulliState>().host!.openLink();
Future<void> _backupConfig(BuildContext context) async =>
TautulliAPIHelper().backupConfiguration(context: context);
Future<void> _backupDatabase(BuildContext context) async =>

View File

@@ -1,5 +1,5 @@
import 'package:envify/envify.dart';
import 'package:lunasea/core/extensions.dart';
import 'package:lunasea/extensions/string_links.dart';
import 'package:lunasea/vendor.dart';
import 'package:lunasea/system/flavor.dart';
@@ -16,7 +16,7 @@ class LunaEnvironment {
Future<void> openCommitHistory() async {
String _base = 'https://github.com/JagandeepBrar/LunaSea/commits';
return '$_base/$commit'.lunaOpenGenericLink();
return '$_base/$commit'.openLink();
}
/// Returns if the given flavor is "lower" than the given environment.

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:lunasea/extensions/string.dart';
import 'package:lunasea/extensions/string_links.dart';
enum _Type {
CONTENT,
@@ -114,7 +115,7 @@ class LunaTableContent extends StatelessWidget {
left: LunaUI.DEFAULT_MARGIN_SIZE / 2,
),
),
onTap: !bodyIsUrl ? null : body!.lunaOpenGenericLink,
onTap: !bodyIsUrl ? null : body!.openLink,
onLongPress: !bodyIsUrl ? null : () => body!.copyToClipboard(),
borderRadius: BorderRadius.circular(LunaUI.BORDER_RADIUS),
),