switch to official webview, fix downloads permissions, roundedrect play button and other stuff
This commit is contained in:
parent
8679cf844f
commit
72400aac5c
|
@ -33,7 +33,7 @@ apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
|||
|
||||
android {
|
||||
namespace 'f.f.freezer'
|
||||
compileSdkVersion 33
|
||||
compileSdk 34
|
||||
|
||||
lintOptions {
|
||||
disable 'InvalidPackage'
|
||||
|
@ -82,7 +82,7 @@ dependencies {
|
|||
implementation files('libs/jaudiotagger-2.2.3.jar')
|
||||
implementation files('libs/extension-flac.aar')
|
||||
implementation group: 'org.nanohttpd', name: 'nanohttpd', version: '2.3.1'
|
||||
implementation group: 'androidx.core', name: 'core', version: '1.6.0'
|
||||
implementation group: 'androidx.core', name: 'core', version: '1.12.0'
|
||||
}
|
||||
|
||||
flutter {
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="f.f.freezer">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<!-- Flutter needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<manifest
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="f.f.freezer"
|
||||
>
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
|
||||
<!--
|
||||
io.flutter.app.FlutterApplication is an android.app.Application that
|
||||
|
@ -13,10 +11,24 @@
|
|||
FlutterApplication and put your custom class here.
|
||||
-->
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
||||
|
||||
<!-- Storage permission for Android 12 and lower -->
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
<!--
|
||||
Granular media permissions for Android 13 and newer.
|
||||
See https://developer.android.com/about/versions/13/behavior-changes-13#granular-media-permissions
|
||||
for more information.
|
||||
-->
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
|
||||
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
|
||||
|
||||
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
|
||||
|
||||
<uses-feature
|
||||
android:name="android.software.LEANBACK"
|
||||
|
@ -28,7 +40,7 @@
|
|||
android:label="Freezer"
|
||||
android:requestLegacyExternalStorage="true"
|
||||
android:usesCleartextTraffic="true"
|
||||
>
|
||||
tools:targetApi="m">
|
||||
|
||||
<service
|
||||
android:name=".DownloadService"
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="f.f.freezer">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<!-- Flutter needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
buildscript {
|
||||
ext.kotlin_version = '1.7.10'
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
|
@ -6,6 +7,7 @@ buildscript {
|
|||
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.4.2'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
org.gradle.jvmargs=-Xmx1536M
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
android.defaults.buildfeatures.buildconfig=true
|
||||
android.nonTransitiveRClass=false
|
||||
android.nonFinalResIds=false
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:cookie_jar/cookie_jar.dart';
|
||||
import 'package:crypto/crypto.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:dio_cookie_manager/dio_cookie_manager.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
@ -60,6 +59,11 @@ class DeezerAPI {
|
|||
String? userName;
|
||||
String? favoritesPlaylistId;
|
||||
String? sid;
|
||||
|
||||
// JWT for pipe.deezer.com
|
||||
String? jwt;
|
||||
int jwtExpiration = 0;
|
||||
|
||||
late String licenseToken;
|
||||
late bool canStreamLossless;
|
||||
late bool canStreamHQ;
|
||||
|
@ -207,6 +211,7 @@ class DeezerAPI {
|
|||
|
||||
//Authorize, bool = success
|
||||
Future<bool> rawAuthorize({Function? onError}) async {
|
||||
_logger.fine('rawAuthorize()');
|
||||
try {
|
||||
final data = await callApi('deezer.getUserData');
|
||||
if (data['results']?['USER']?['USER_ID'] == null ||
|
||||
|
@ -241,6 +246,30 @@ class DeezerAPI {
|
|||
}
|
||||
}
|
||||
|
||||
Future<void> authorizePipeAPI() async {
|
||||
// authorize on pipe.deezer.com
|
||||
|
||||
if (DateTime.now().millisecondsSinceEpoch > jwtExpiration) {
|
||||
// only continue if JWT expired!
|
||||
}
|
||||
|
||||
// arl should be contained in cookies, so we should be fine
|
||||
final res =
|
||||
await dio.post('https://auth.deezer.com/login/arl?jo=p&rto=c&i=c');
|
||||
if (res.statusCode != 200 ||
|
||||
res.data['jwt'] == null ||
|
||||
res.data['jwt'] == '') {
|
||||
throw Exception('Pipe authentication failed!');
|
||||
}
|
||||
|
||||
jwt = res.data['jwt'];
|
||||
_logger.fine('got jwt: $jwt');
|
||||
// decode JWT
|
||||
final parts = jwt!.split('.');
|
||||
final data = jsonDecode(utf8.decode(base64Url.decode(parts[1])));
|
||||
jwtExpiration = data['exp'];
|
||||
}
|
||||
|
||||
//URL/Link parser
|
||||
Future<DeezerLinkResponse?> parseLink(String url) async {
|
||||
Uri uri = Uri.parse(url);
|
||||
|
@ -400,7 +429,7 @@ class DeezerAPI {
|
|||
}
|
||||
|
||||
//Get playlist details
|
||||
Future<Playlist> playlist(String? id, {int nb = 100}) async {
|
||||
Future<Playlist> playlist(String? id, {int nb = 5000}) async {
|
||||
Map<dynamic, dynamic> data = await callApi('deezer.pagePlaylist', params: {
|
||||
'playlist_id': id,
|
||||
'lang': settings.deezerLanguage,
|
||||
|
|
|
@ -631,8 +631,21 @@ class DownloadManager {
|
|||
|
||||
//Check storage permission
|
||||
Future<bool> checkPermission() async {
|
||||
if (settings.downloadPath == null) {
|
||||
Fluttertoast.showToast(
|
||||
msg: 'Set download path in settings first!'.i18n,
|
||||
toastLength: Toast.LENGTH_LONG,
|
||||
gravity: ToastGravity.BOTTOM);
|
||||
return false;
|
||||
}
|
||||
if (await Permission.storage.request().isGranted) {
|
||||
return true;
|
||||
} else if ( // android 12 or later
|
||||
await Permission.audio.request().isGranted &&
|
||||
await Permission.photos.request().isGranted &&
|
||||
await Permission.videos.request().isGranted &&
|
||||
await Permission.manageExternalStorage.request().isGranted) {
|
||||
return true;
|
||||
} else {
|
||||
Fluttertoast.showToast(
|
||||
msg: 'Storage permission denied!'.i18n,
|
||||
|
|
|
@ -226,10 +226,10 @@ class AudioPlayerTask extends BaseAudioHandler {
|
|||
});
|
||||
|
||||
//Audio session
|
||||
_audioSessionSubscription =
|
||||
_player.androidAudioSessionIdStream.listen((event) {
|
||||
customEvent.add({'action': 'audioSession', 'id': event});
|
||||
});
|
||||
// _audioSessionSubscription =
|
||||
// _player.androidAudioSessionIdStream.listen((event) {
|
||||
// customEvent.add({'action': 'audioSession', 'id': event});
|
||||
// });
|
||||
|
||||
//Load queue
|
||||
// queue.add(_queue);
|
||||
|
@ -366,7 +366,6 @@ class AudioPlayerTask extends BaseAudioHandler {
|
|||
@override
|
||||
Future<void> seekForward(bool begin) => Future.value();
|
||||
|
||||
@override
|
||||
Future<void> seekBackward(bool begin) async {
|
||||
// (un)favourite action
|
||||
if (cache.libraryTracks.contains(currentMediaItem.id)) {
|
||||
|
@ -465,14 +464,14 @@ class AudioPlayerTask extends BaseAudioHandler {
|
|||
return const MediaControl(
|
||||
androidIcon: 'drawable/ic_heart',
|
||||
label: 'unfavorite',
|
||||
action: MediaAction.seekBackward);
|
||||
action: MediaAction.custom);
|
||||
}
|
||||
|
||||
return const MediaControl(
|
||||
androidIcon: 'drawable/ic_heart_outline',
|
||||
label: 'favourite',
|
||||
action: MediaAction
|
||||
.seekBackward, // this acts as favourite/unfavourite as it's not already used.
|
||||
.custom, // this acts as favourite/unfavourite as it's not already used.
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -484,8 +483,7 @@ class AudioPlayerTask extends BaseAudioHandler {
|
|||
if (queue.value.isNotEmpty) favoriteControl(),
|
||||
/*if (_queueIndex != 0)*/ MediaControl.skipToPrevious,
|
||||
_player.playing ? MediaControl.pause : MediaControl.play,
|
||||
/*if (_queueIndex != _queue!.length - 1)*/ MediaControl
|
||||
.skipToNext,
|
||||
/**/ MediaControl.skipToNext,
|
||||
//Stop -- USELESS.
|
||||
// MediaControl(
|
||||
// androidIcon: 'drawable/ic_action_stop',
|
||||
|
@ -507,11 +505,12 @@ class AudioPlayerTask extends BaseAudioHandler {
|
|||
), // next-30
|
||||
],
|
||||
systemActions: !currentMediaItemIsShow
|
||||
? const {
|
||||
? {
|
||||
MediaAction.seek,
|
||||
MediaAction.seekBackward,
|
||||
MediaAction.skipToNext,
|
||||
MediaAction.skipToPrevious,
|
||||
if (queue.hasValue && _queueIndex != queue.value.length - 1)
|
||||
MediaAction.skipToNext,
|
||||
if (_queueIndex != 0) MediaAction.skipToPrevious,
|
||||
MediaAction.stop
|
||||
}
|
||||
: const {
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import 'dart:async';
|
||||
import 'package:audio_service/audio_service.dart';
|
||||
import 'package:equalizer/equalizer.dart';
|
||||
import 'package:fluttertoast/fluttertoast.dart';
|
||||
import 'package:freezer/api/cache.dart';
|
||||
import 'package:freezer/api/deezer.dart';
|
||||
|
@ -18,8 +17,6 @@ class PlayerHelper {
|
|||
late StreamSubscription _playbackStateStreamSubscription;
|
||||
QueueSource? queueSource;
|
||||
AudioServiceRepeatMode repeatType = AudioServiceRepeatMode.none;
|
||||
int? audioSession;
|
||||
int? _prevAudioSession;
|
||||
bool equalizerOpen = false;
|
||||
bool _shuffleEnabled = false;
|
||||
int _queueIndex = 0;
|
||||
|
@ -95,26 +92,6 @@ class PlayerHelper {
|
|||
repeatType = event['repeatMode'] as AudioServiceRepeatMode;
|
||||
_queueIndex = getQueueIndex();
|
||||
break;
|
||||
case 'audioSession':
|
||||
if (!settings.enableEqualizer) break;
|
||||
//Save
|
||||
_prevAudioSession = audioSession;
|
||||
audioSession = event['id'];
|
||||
if (audioSession == null) break;
|
||||
//Open EQ
|
||||
if (!equalizerOpen) {
|
||||
Equalizer.open(event['id']);
|
||||
equalizerOpen = true;
|
||||
break;
|
||||
}
|
||||
//Change session id
|
||||
if (_prevAudioSession != audioSession) {
|
||||
if (_prevAudioSession != null) {
|
||||
Equalizer.removeAudioSessionId(_prevAudioSession!);
|
||||
}
|
||||
Equalizer.setAudioSessionId(audioSession!);
|
||||
}
|
||||
break;
|
||||
//Visualizer data
|
||||
// case 'visualizer':
|
||||
// _visualizerController.add(event['data']);
|
||||
|
@ -152,11 +129,8 @@ class PlayerHelper {
|
|||
_processingStateSubject.add(playbackState.processingState);
|
||||
}
|
||||
|
||||
print(
|
||||
'now ${playbackState.playing}, previous ${_playingSubject.valueOrNull}');
|
||||
if (!_playingSubject.hasValue ||
|
||||
_playingSubject.value != playbackState.playing) {
|
||||
print('added!');
|
||||
_playingSubject.add(playbackState.playing);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -6,12 +6,13 @@ import 'package:freezer/api/player/audio_handler.dart';
|
|||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:hive_flutter/hive_flutter.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:path/path.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'dart:convert';
|
||||
import 'dart:async';
|
||||
import 'dart:io' show Platform;
|
||||
import 'dart:io' show Directory, Platform;
|
||||
|
||||
part 'settings.g.dart';
|
||||
|
||||
|
@ -253,12 +254,13 @@ class Settings {
|
|||
|
||||
final settings = Settings();
|
||||
if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) {
|
||||
settings.downloadPath =
|
||||
await getDownloadsDirectory().then((path) => path!.path);
|
||||
settings.downloadPath = await getDownloadsDirectory().then((path) async =>
|
||||
(await Directory(join(path!.path, 'Freezer')).create(recursive: true))
|
||||
.path);
|
||||
} else {
|
||||
settings.downloadPath =
|
||||
await getExternalStorageDirectories(type: StorageDirectory.music)
|
||||
.then((paths) => paths![0].path);
|
||||
// settings.downloadPath =
|
||||
// await getExternalStorageDirectories(type: StorageDirectory.music)
|
||||
// .then((paths) => paths![0].path);
|
||||
}
|
||||
|
||||
return settings;
|
||||
|
|
|
@ -789,6 +789,14 @@ class _PlaylistDetailsState extends State<PlaylistDetails> {
|
|||
try {
|
||||
tracks = await deezerAPI.playlistTracksPage(playlist!.id, pos);
|
||||
} catch (e) {
|
||||
setState(() {
|
||||
_error = true;
|
||||
_loading = false;
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (tracks == null || tracks.isEmpty) {
|
||||
setState(() => _error = true);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -1,15 +1,37 @@
|
|||
import 'package:cookie_jar/cookie_jar.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_inappwebview/flutter_inappwebview.dart' as fwv;
|
||||
import 'package:freezer/api/deezer.dart';
|
||||
import 'package:freezer/settings.dart';
|
||||
import 'package:webview_flutter/webview_flutter.dart';
|
||||
|
||||
class ExternalLinkRoute extends StatelessWidget {
|
||||
class ExternalLinkRoute extends StatefulWidget {
|
||||
final String title;
|
||||
final String target;
|
||||
const ExternalLinkRoute(
|
||||
{required this.title, required this.target, super.key});
|
||||
|
||||
@override
|
||||
State<ExternalLinkRoute> createState() => _ExternalLinkRouteState();
|
||||
}
|
||||
|
||||
class _ExternalLinkRouteState extends State<ExternalLinkRoute> {
|
||||
late final WebViewController _controller;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_controller = WebViewController();
|
||||
_initStateAsync();
|
||||
super.initState();
|
||||
}
|
||||
|
||||
void _initStateAsync() async {
|
||||
final uri = _resolveTarget(widget.target);
|
||||
final headers = await _resolveHeaders(uri);
|
||||
|
||||
_controller.addJavaScriptChannel('test', onMessageReceived: print);
|
||||
_controller.loadRequest(uri, headers: headers);
|
||||
}
|
||||
|
||||
Uri _resolveTarget(String target) {
|
||||
print('target: $target');
|
||||
if (target == 'story/mdy' || target == '/story/mdy') {
|
||||
|
@ -30,21 +52,10 @@ class ExternalLinkRoute extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Uri uriTarget = _resolveTarget(target);
|
||||
return Scaffold(
|
||||
appBar: AppBar(title: Text(title)),
|
||||
body: fwv.InAppWebView(
|
||||
onWebViewCreated: (controller) async {
|
||||
final uri = _resolveTarget(target);
|
||||
final headers = await _resolveHeaders(uri);
|
||||
controller.addWebMessageListener(fwv.WebMessageListener(
|
||||
jsObjectName: 'jsObjectName',
|
||||
onPostMessage: (message, sourceOrigin, isMainFrame, replyProxy) =>
|
||||
print('message: $message, sourceOrigin: $sourceOrigin'),
|
||||
));
|
||||
controller.loadUrl(
|
||||
urlRequest: fwv.URLRequest(url: uri, headers: headers));
|
||||
},
|
||||
appBar: AppBar(title: Text(widget.title)),
|
||||
body: WebViewWidget(
|
||||
controller: _controller,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -3,9 +3,9 @@ import 'dart:io';
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:freezer/api/deezer.dart';
|
||||
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
|
||||
import 'package:freezer/translations.i18n.dart';
|
||||
import 'package:url_launcher/url_launcher_string.dart';
|
||||
import 'package:webview_flutter/webview_flutter.dart';
|
||||
|
||||
import '../settings.dart';
|
||||
import '../api/definitions.dart';
|
||||
|
@ -328,40 +328,80 @@ class LoadingWindowWait extends StatelessWidget {
|
|||
}
|
||||
}
|
||||
|
||||
class LoginBrowser extends StatelessWidget {
|
||||
class LoginBrowser extends StatefulWidget {
|
||||
final Function updateParent;
|
||||
const LoginBrowser(this.updateParent, {super.key});
|
||||
|
||||
@override
|
||||
State<LoginBrowser> createState() => _LoginBrowserState();
|
||||
}
|
||||
|
||||
class _LoginBrowserState extends State<LoginBrowser> {
|
||||
late final WebViewController _controller;
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_controller = WebViewController()
|
||||
..clearLocalStorage()
|
||||
..setJavaScriptMode(JavaScriptMode.unrestricted)
|
||||
..setBackgroundColor(const Color(0x00000000))
|
||||
// Chrome on Android 14
|
||||
..setUserAgent(
|
||||
'Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.101 Mobile Safari/537.36')
|
||||
..setNavigationDelegate(
|
||||
NavigationDelegate(
|
||||
onProgress: (int progress) {
|
||||
// Update loading bar.
|
||||
},
|
||||
onPageStarted: (String url) {},
|
||||
onPageFinished: (String url) {},
|
||||
onWebResourceError: (WebResourceError error) {},
|
||||
onNavigationRequest: (NavigationRequest request) {
|
||||
final uri = Uri.parse(request.url);
|
||||
print('uri $uri');
|
||||
|
||||
//Parse arl from url
|
||||
if (uri.host == 'deezer.page.link') {
|
||||
try {
|
||||
//Actual url is in `link` query parameter
|
||||
Uri linkUri = Uri.parse(uri.queryParameters['link']!);
|
||||
String? arl = linkUri.queryParameters['arl'];
|
||||
if (arl != null) {
|
||||
settings.arl = arl;
|
||||
Navigator.of(context).pop();
|
||||
widget.updateParent();
|
||||
return NavigationDecision.prevent;
|
||||
}
|
||||
} catch (e) {
|
||||
print(e);
|
||||
}
|
||||
} else if (!uri.path.contains('/login') &&
|
||||
!uri.path.contains('/register') &&
|
||||
!uri.path.contains('/open_app')) {
|
||||
_controller.loadRequest(Uri.parse(
|
||||
'https://deezer.com/open_app?page=home&source=MF_MenuDownloadApp'));
|
||||
return NavigationDecision.prevent;
|
||||
}
|
||||
|
||||
return NavigationDecision.navigate;
|
||||
},
|
||||
),
|
||||
)
|
||||
..loadRequest(Uri.parse('https://deezer.com/login'));
|
||||
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SafeArea(
|
||||
child: InAppWebView(
|
||||
initialUrlRequest:
|
||||
URLRequest(url: Uri.parse('https://deezer.com/login')),
|
||||
onLoadStart: (InAppWebViewController controller, Uri? uri) async {
|
||||
//Offers URL
|
||||
if (!uri!.path.contains('/login') &&
|
||||
!uri.path.contains('/register')) {
|
||||
controller.evaluateJavascript(
|
||||
source: 'window.location.href = "/open_app"');
|
||||
}
|
||||
print('uri $uri');
|
||||
//Parse arl from url
|
||||
if (uri.scheme == 'intent' && uri.host == 'deezer.page.link') {
|
||||
try {
|
||||
//Actual url is in `link` query parameter
|
||||
Uri linkUri = Uri.parse(uri.queryParameters['link']!);
|
||||
String? arl = linkUri.queryParameters['arl'];
|
||||
if (arl != null) {
|
||||
settings.arl = arl;
|
||||
Navigator.of(context).pop();
|
||||
updateParent();
|
||||
}
|
||||
} catch (e) {
|
||||
print(e);
|
||||
}
|
||||
}
|
||||
},
|
||||
child: WebViewWidget(
|
||||
controller: _controller,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -222,7 +222,6 @@ class _PlayPauseButtonState extends State<PlayPauseButton>
|
|||
_animation = CurvedAnimation(parent: _controller, curve: Curves.easeInOut);
|
||||
|
||||
_stateSubscription = playerHelper.processingState.listen((processingState) {
|
||||
print('yes!');
|
||||
if (processingState == AudioProcessingState.ready ||
|
||||
audioHandler.playbackState.value.processingState ==
|
||||
AudioProcessingState.idle) {
|
||||
|
@ -304,13 +303,13 @@ class _PlayPauseButtonState extends State<PlayPauseButton>
|
|||
builder: (context, snapshot) {
|
||||
return AnimatedContainer(
|
||||
clipBehavior: Clip.antiAlias,
|
||||
width: widget.size,
|
||||
width: widget.size * (snapshot.data == true ? 1.5 : 1),
|
||||
height: widget.size,
|
||||
duration: const Duration(milliseconds: 500),
|
||||
duration: const Duration(milliseconds: 250),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: snapshot.data == true
|
||||
? BorderRadius.circular(24.0)
|
||||
: BorderRadius.circular(36.0),
|
||||
: BorderRadius.circular(widget.size * 0.5),
|
||||
color: widget.color),
|
||||
child: child);
|
||||
});
|
||||
|
|
|
@ -7,6 +7,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:fluttericon/typicons_icons.dart';
|
||||
import 'package:fluttertoast/fluttertoast.dart';
|
||||
import 'package:freezer/api/cache.dart';
|
||||
import 'package:freezer/api/download.dart';
|
||||
import 'package:freezer/api/player/audio_handler.dart';
|
||||
|
@ -40,6 +41,11 @@ FutureOr openScreenByURL(BuildContext context, String url) async {
|
|||
.push(MaterialPageRoute(builder: (context) => ArtistDetails(a)));
|
||||
case DeezerLinkType.PLAYLIST:
|
||||
Playlist p = await deezerAPI.playlist(res.id);
|
||||
if (p.tracks == null || p.tracks!.isEmpty) {
|
||||
ScaffoldMessenger.of(context)
|
||||
.snack('The playlist is empty or private.'.i18n);
|
||||
return;
|
||||
}
|
||||
return Navigator.of(context)
|
||||
.push(MaterialPageRoute(builder: (context) => PlaylistDetails(p)));
|
||||
default:
|
||||
|
|
|
@ -1047,10 +1047,13 @@ class _DownloadsSettingsState extends State<DownloadsSettings> {
|
|||
ListTile(
|
||||
title: Text('Download path'.i18n),
|
||||
leading: const Icon(Icons.folder),
|
||||
subtitle: Text(settings.downloadPath!),
|
||||
subtitle: Text(
|
||||
settings.downloadPath ?? 'Not set, click here to set!'.i18n),
|
||||
onTap: () async {
|
||||
//Check permissions
|
||||
if (!await Permission.storage.request().isGranted) return;
|
||||
if (!await downloadManager.checkPermission()) {
|
||||
return;
|
||||
}
|
||||
DownloadManager.getDirectory('Pick-a-Path'.i18n).then((path) {
|
||||
if (path == null) return; // user canceled
|
||||
setState(() => settings.downloadPath = path);
|
||||
|
@ -1384,23 +1387,22 @@ class _GeneralSettingsState extends State<GeneralSettings> {
|
|||
});
|
||||
return AlertDialog(
|
||||
title: Text('Logging in...'.i18n),
|
||||
content:
|
||||
const Center(child: CircularProgressIndicator()));
|
||||
content: const CircularProgressIndicator());
|
||||
});
|
||||
},
|
||||
),
|
||||
SwitchListTile(
|
||||
title: Text('Enable equalizer'.i18n),
|
||||
subtitle: Text(
|
||||
'Might enable some equalizer apps to work. Requires restart of Freezer'
|
||||
.i18n),
|
||||
secondary: const Icon(Icons.equalizer),
|
||||
value: settings.enableEqualizer,
|
||||
onChanged: (v) async {
|
||||
setState(() => settings.enableEqualizer = v);
|
||||
settings.save();
|
||||
},
|
||||
),
|
||||
// SwitchListTile(
|
||||
// title: Text('Enable equalizer'.i18n),
|
||||
// subtitle: Text(
|
||||
// 'Might enable some equalizer apps to work. Requires restart of Freezer'
|
||||
// .i18n),
|
||||
// secondary: const Icon(Icons.equalizer),
|
||||
// value: settings.enableEqualizer,
|
||||
// onChanged: (v) async {
|
||||
// setState(() => settings.enableEqualizer = v);
|
||||
// settings.save();
|
||||
// },
|
||||
// ),
|
||||
SwitchListTile(
|
||||
title: Text('Ignore interruptions'.i18n),
|
||||
subtitle: Text('Requires app restart to apply!'.i18n),
|
||||
|
|
325
pubspec.lock
325
pubspec.lock
|
@ -21,10 +21,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: archive
|
||||
sha256: "7e0d52067d05f2e0324268097ba723b71cb41ac8a6a2b24d1edf9c536b987b03"
|
||||
sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.4.6"
|
||||
version: "3.4.10"
|
||||
args:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -61,10 +61,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: audio_service_mpris
|
||||
sha256: "31be5de2db0c71b217157afce1974ac6d0ad329bd91deb1f19ad094d29340d8e"
|
||||
sha256: a8d1583f9143d17b2facc994a99bd1ea257cec43adcb8d7349458555c62b570f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.0"
|
||||
version: "0.1.3"
|
||||
audio_service_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -85,10 +85,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: audio_session
|
||||
sha256: "8a2bc5e30520e18f3fb0e366793d78057fb64cd5287862c76af0c8771f2a52ad"
|
||||
sha256: "6fdf255ed3af86535c96452c33ecff1245990bb25a605bfb1958661ccc3d467f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.16"
|
||||
version: "0.1.18"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -117,26 +117,26 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: build_daemon
|
||||
sha256: "5f02d73eb2ba16483e693f80bee4f088563a820e47d1027d4cdfe62b5bb43e65"
|
||||
sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.0"
|
||||
version: "4.0.1"
|
||||
build_resolvers:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_resolvers
|
||||
sha256: "64e12b0521812d1684b1917bc80945625391cb9bdd4312536b1d69dcb6133ed8"
|
||||
sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.1"
|
||||
version: "2.4.2"
|
||||
build_runner:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: build_runner
|
||||
sha256: "10c6bcdbf9d049a0b666702cf1cee4ddfdc38f02a19d35ae392863b47519848b"
|
||||
sha256: "581bacf68f89ec8792f5e5a0b2c4decd1c948e97ce659dc783688c8a88fbec21"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.6"
|
||||
version: "2.4.8"
|
||||
build_runner_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -157,34 +157,34 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: built_value
|
||||
sha256: a8de5955205b4d1dbbbc267daddf2178bd737e4bab8987c04a500478c9651e74
|
||||
sha256: a3ec2e0f967bc47f69f95009bb93db936288d61d5343b9436e378b28a2f830c6
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.6.3"
|
||||
version: "8.9.0"
|
||||
cached_network_image:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: cached_network_image
|
||||
sha256: f98972704692ba679db144261172a8e20feb145636c617af0eb4022132a6797f
|
||||
sha256: "28ea9690a8207179c319965c13cd8df184d5ee721ae2ce60f398ced1219cea1f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.3.0"
|
||||
version: "3.3.1"
|
||||
cached_network_image_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: cached_network_image_platform_interface
|
||||
sha256: "56aa42a7a01e3c9db8456d9f3f999931f1e05535b5a424271e9a38cabf066613"
|
||||
sha256: "9e90e78ae72caa874a323d78fa6301b3fb8fa7ea76a8f96dc5b5bf79f283bf2f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
version: "4.0.0"
|
||||
cached_network_image_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: cached_network_image_web
|
||||
sha256: "759b9a9f8f6ccbb66c185df805fac107f05730b1dab9c64626d1008cca532257"
|
||||
sha256: "42a835caa27c220d1294311ac409a43361088625a4f23c820b006dd9bffb3316"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
version: "1.1.1"
|
||||
characters:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -213,18 +213,18 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: code_builder
|
||||
sha256: "1be9be30396d7e4c0db42c35ea6ccd7cc6a1e19916b5dc64d6ac216b5544d677"
|
||||
sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.7.0"
|
||||
version: "4.10.0"
|
||||
collection:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: collection
|
||||
sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
|
||||
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.17.2"
|
||||
version: "1.18.0"
|
||||
connectivity_plus:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -269,10 +269,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: cross_file
|
||||
sha256: "445db18de832dba8d851e287aff8ccf169bed30d2e94243cb54c7d2f1ed2142c"
|
||||
sha256: "2f9d2cbccb76127ba28528cb3ae2c2326a122446a83de5a056aaa3880d3882c5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.3.3+6"
|
||||
version: "0.3.3+7"
|
||||
crypto:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -318,18 +318,18 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: dbus
|
||||
sha256: "6f07cba3f7b3448d42d015bfd3d53fe12e5b36da2423f23838efc1d5fb31a263"
|
||||
sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.8"
|
||||
version: "0.7.10"
|
||||
dio:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: dio
|
||||
sha256: "417e2a6f9d83ab396ec38ff4ea5da6c254da71e4db765ad737a42af6930140b7"
|
||||
sha256: "797e1e341c3dd2f69f2dad42564a6feff3bfb87187d05abb93b9609e6f1645c3"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.3.3"
|
||||
version: "5.4.0"
|
||||
dio_cookie_manager:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -350,10 +350,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: dynamic_color
|
||||
sha256: "8b8bd1d798bd393e11eddeaa8ae95b12ff028bf7d5998fc5d003488cd5f4ce2f"
|
||||
sha256: a866f1f8947bfdaf674d7928e769eac7230388a2e7a2542824fad4bb5b87be3b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.6.8"
|
||||
version: "1.6.9"
|
||||
encrypt:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -362,15 +362,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.3"
|
||||
equalizer:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
path: "."
|
||||
ref: HEAD
|
||||
resolved-ref: "84c15ca304a8129a1cad5a6891059fb411f0fc55"
|
||||
url: "https://github.com/gladson97/equalizer.git"
|
||||
source: git
|
||||
version: "0.0.2+2"
|
||||
equatable:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -431,10 +422,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: flex_color_picker
|
||||
sha256: f37476ab3e80dcaca94e428e159944d465dd16312fda9ff41e07e86f04bfa51c
|
||||
sha256: "0871edc170153cfc3de316d30625f40a85daecfa76ce541641f3cc0ec7757cbf"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.3.0"
|
||||
version: "3.3.1"
|
||||
flex_seed_scheme:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -452,18 +443,18 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_background_service
|
||||
sha256: "5ec79841c3e9f3bd1885b06c5d7502d6df415cb1665e6717792cc0e51716619f"
|
||||
sha256: "94d9a143852729140e17254a53769383b03738cd92b6e588a8762003e6cd9dd9"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.1"
|
||||
version: "5.0.5"
|
||||
flutter_background_service_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_background_service_android
|
||||
sha256: a295c7604782b3723fa356679e5b14c5e0fb694d77a7299af135364fa851ee1a
|
||||
sha256: "30863ebafd8214b8e76d5e5c9f27887dc5cc303fcf3e89f71534f621fc486782"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.1"
|
||||
version: "6.2.2"
|
||||
flutter_background_service_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -505,22 +496,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.6.0"
|
||||
flutter_inappwebview:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_inappwebview
|
||||
sha256: d198297060d116b94048301ee6749cd2e7d03c1f2689783f52d210a6b7aba350
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.8.0"
|
||||
flutter_isolate:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_isolate
|
||||
sha256: "994ddec596da4ca12ca52154fd59404077584643eb7e3f1008a55fda9fe0b76b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.4"
|
||||
flutter_lints:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
|
@ -533,10 +508,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_local_notifications
|
||||
sha256: "501ed9d54f1c8c0535b7991bade36f9e7e3b45a2346401f03775c1ec7a3c06ae"
|
||||
sha256: "401643a6ea9d8451365f2ec11145335bf130560cfde367bdf8f0be6d60f89479"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "15.1.2"
|
||||
version: "15.1.3"
|
||||
flutter_local_notifications_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -596,10 +571,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: fluttertoast
|
||||
sha256: "474f7d506230897a3cd28c965ec21c5328ae5605fc9c400cd330e9e9d6ac175c"
|
||||
sha256: dfdde255317af381bfc1c486ed968d5a43a2ded9c931e87cbecd88767d6a71c1
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.2.2"
|
||||
version: "8.2.4"
|
||||
frontend_server_client:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -716,10 +691,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: image
|
||||
sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271"
|
||||
sha256: "004a2e90ce080f8627b5a04aecb4cdfac87d2c3f3b520aa291260be5a32c033d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.1.3"
|
||||
version: "4.1.4"
|
||||
infinite_listview:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -796,10 +771,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: just_audio
|
||||
sha256: "5ed0cd723e17dfd8cd4b0253726221e67f6546841ea4553635cf895061fc335b"
|
||||
sha256: b607cd1a43bac03d85c3aaee00448ff4a589ef2a77104e3d409889ff079bf823
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.9.35"
|
||||
version: "0.9.36"
|
||||
just_audio_media_kit:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -813,18 +788,18 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: just_audio_platform_interface
|
||||
sha256: d8409da198bbc59426cd45d4c92fca522a2ec269b576ce29459d6d6fcaeb44df
|
||||
sha256: c3dee0014248c97c91fe6299edb73dc4d6c6930a2f4f713579cd692d9e47f4a1
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.2.1"
|
||||
version: "4.2.2"
|
||||
just_audio_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: just_audio_web
|
||||
sha256: ff62f733f437b25a0ff590f0e295fa5441dcb465f1edbdb33b3dea264705bc13
|
||||
sha256: "134356b0fe3d898293102b33b5fd618831ffdc72bb7a1b726140abdf22772b70"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.4.8"
|
||||
version: "0.4.9"
|
||||
lints:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -869,10 +844,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: media_kit
|
||||
sha256: "3dffc6d0c19117d51fbc42a7f89612e0595665800a596289ab7a80bdd93e0ad1"
|
||||
sha256: "3289062540e3b8b9746e5c50d95bd78a9289826b7227e253dff806d002b9e67a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.9"
|
||||
version: "1.1.10+1"
|
||||
media_kit_libs_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -901,10 +876,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
|
||||
sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.9.1"
|
||||
version: "1.10.0"
|
||||
mime:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1013,26 +988,26 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: path_provider
|
||||
sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa
|
||||
sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
version: "2.1.2"
|
||||
path_provider_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_android
|
||||
sha256: "6b8b19bd80da4f11ce91b2d1fb931f3006911477cec227cce23d3253d80df3f1"
|
||||
sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.0"
|
||||
version: "2.2.2"
|
||||
path_provider_foundation:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_foundation
|
||||
sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d"
|
||||
sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.1"
|
||||
version: "2.3.2"
|
||||
path_provider_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1045,10 +1020,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_platform_interface
|
||||
sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c"
|
||||
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
version: "2.1.2"
|
||||
path_provider_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1069,42 +1044,50 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: permission_handler
|
||||
sha256: bc56bfe9d3f44c3c612d8d393bd9b174eb796d706759f9b495ac254e4294baa5
|
||||
sha256: "45ff3fbcb99040fde55c528d5e3e6ca29171298a85436274d49c6201002087d6"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "10.4.5"
|
||||
version: "11.2.0"
|
||||
permission_handler_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_android
|
||||
sha256: "59c6322171c29df93a22d150ad95f3aa19ed86542eaec409ab2691b8f35f9a47"
|
||||
sha256: "758284a0976772f9c744d6384fc5dc4834aa61e3f7aa40492927f244767374eb"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "10.3.6"
|
||||
version: "12.0.3"
|
||||
permission_handler_apple:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_apple
|
||||
sha256: "99e220bce3f8877c78e4ace901082fb29fa1b4ebde529ad0932d8d664b34f3f5"
|
||||
sha256: c6bf440f80acd2a873d3d91a699e4cc770f86e7e6b576dda98759e8b92b39830
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "9.1.4"
|
||||
version: "9.3.0"
|
||||
permission_handler_html:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_html
|
||||
sha256: "54bf176b90f6eddd4ece307e2c06cf977fb3973719c35a93b85cc7093eb6070d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.1"
|
||||
permission_handler_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_platform_interface
|
||||
sha256: "6760eb5ef34589224771010805bea6054ad28453906936f843a8cc4d3a55c4a4"
|
||||
sha256: "5c43148f2bfb6d14c5a8162c0a712afe891f2d847f35fcff29c406b37da43c3c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.12.0"
|
||||
version: "4.1.0"
|
||||
permission_handler_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_windows
|
||||
sha256: cc074aace208760f1eee6aa4fae766b45d947df85bc831cde77009cdb4720098
|
||||
sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.3"
|
||||
version: "0.2.1"
|
||||
petitparser:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1125,26 +1108,26 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: platform
|
||||
sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59"
|
||||
sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.3"
|
||||
version: "3.1.4"
|
||||
plugin_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: plugin_platform_interface
|
||||
sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d
|
||||
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.6"
|
||||
version: "2.1.8"
|
||||
pointycastle:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pointycastle
|
||||
sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c"
|
||||
sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.7.3"
|
||||
version: "3.7.4"
|
||||
pool:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1157,10 +1140,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: provider
|
||||
sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f
|
||||
sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.5"
|
||||
version: "6.1.1"
|
||||
pub_semver:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1181,34 +1164,34 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: quick_actions
|
||||
sha256: "3930e1cf78a0574495b4ea741ee197323c4a9081321d6ae384b3bfcd84c7ea83"
|
||||
sha256: b17da113df7a7005977f64adfa58ccc49c829d3ccc6e8e770079a8c7fbf2da9e
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.6"
|
||||
version: "1.0.7"
|
||||
quick_actions_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: quick_actions_android
|
||||
sha256: df67c20583e05f5038a24c47bfa1b7b2977703ec2d162663017c5f9ef8707699
|
||||
sha256: adb42f20a46b22fee4caef421c00ff9eb209f9d441010bc5d6e9afa824288cf6
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.9"
|
||||
version: "1.0.10"
|
||||
quick_actions_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: quick_actions_ios
|
||||
sha256: f086cf98884421188c7c5c13f61b62aeb5b6fb88f197a0601db45108b1444ea6
|
||||
sha256: dd355101d0e9fef6176fa2ae2bf738bcafa8df09a1e17057fcb56475719793de
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.7"
|
||||
version: "1.0.10"
|
||||
quick_actions_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: quick_actions_platform_interface
|
||||
sha256: d2a8566b56eec49f93934528b62033906199c60f4ffaef0cba9ef02fcfed8a81
|
||||
sha256: "81a1e40c519bb3cacfec38b3008b13cef665a75bd270da94f40091b57f0f9236"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.5"
|
||||
version: "1.0.6"
|
||||
random_string:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1283,10 +1266,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: source_gen
|
||||
sha256: fc0da689e5302edb6177fdd964efcb7f58912f43c28c2047a808f5bfff643d16
|
||||
sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.0"
|
||||
version: "1.5.0"
|
||||
source_helper:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1323,34 +1306,34 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: sqflite
|
||||
sha256: "591f1602816e9c31377d5f008c2d9ef7b8aca8941c3f89cc5fd9d84da0c38a9a"
|
||||
sha256: a9016f495c927cb90557c909ff26a6d92d9bd54fc42ba92e19d4e79d61e798c6
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.0"
|
||||
version: "2.3.2"
|
||||
sqflite_common:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: sqflite_common
|
||||
sha256: "1b92f368f44b0dee2425bb861cfa17b6f6cf3961f762ff6f941d20b33355660a"
|
||||
sha256: "28d8c66baee4968519fb8bd6cdbedad982d6e53359091f0b74544a9f32ec72d5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.5.0"
|
||||
version: "2.5.3"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stack_trace
|
||||
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
|
||||
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.11.0"
|
||||
version: "1.11.1"
|
||||
stream_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stream_channel
|
||||
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
|
||||
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
version: "2.1.2"
|
||||
stream_transform:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1371,10 +1354,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: synchronized
|
||||
sha256: "5fcbd27688af6082f5abd611af56ee575342c30e87541d0245f7ff99faa02c60"
|
||||
sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.0"
|
||||
version: "3.1.0+1"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1387,18 +1370,18 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
|
||||
sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.6.0"
|
||||
version: "0.6.1"
|
||||
time:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: time
|
||||
sha256: "83427e11d9072e038364a5e4da559e85869b227cf699a541be0da74f14140124"
|
||||
sha256: ad8e018a6c9db36cb917a031853a1aae49467a93e0d464683e029537d848c221
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.3"
|
||||
version: "2.1.4"
|
||||
timezone:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1475,66 +1458,66 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: url_launcher
|
||||
sha256: "47e208a6711459d813ba18af120d9663c20bdf6985d6ad39fe165d2538378d27"
|
||||
sha256: c512655380d241a337521703af62d2c122bf7b77a46ff7dd750092aa9433499c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.1.14"
|
||||
version: "6.2.4"
|
||||
url_launcher_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_android
|
||||
sha256: b04af59516ab45762b2ca6da40fa830d72d0f6045cd97744450b73493fa76330
|
||||
sha256: "507dc655b1d9cb5ebc756032eb785f114e415f91557b73bf60b7e201dfedeb2f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.1.0"
|
||||
version: "6.2.2"
|
||||
url_launcher_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_ios
|
||||
sha256: "7c65021d5dee51813d652357bc65b8dd4a6177082a9966bc8ba6ee477baa795f"
|
||||
sha256: "75bb6fe3f60070407704282a2d295630cab232991eb52542b18347a8a941df03"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.1.5"
|
||||
version: "6.2.4"
|
||||
url_launcher_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_linux
|
||||
sha256: b651aad005e0cb06a01dbd84b428a301916dc75f0e7ea6165f80057fee2d8e8e
|
||||
sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.6"
|
||||
version: "3.1.1"
|
||||
url_launcher_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_macos
|
||||
sha256: b55486791f666e62e0e8ff825e58a023fd6b1f71c49926483f1128d3bbd8fe88
|
||||
sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.7"
|
||||
version: "3.1.0"
|
||||
url_launcher_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_platform_interface
|
||||
sha256: "95465b39f83bfe95fcb9d174829d6476216f2d548b79c38ab2506e0458787618"
|
||||
sha256: a932c3a8082e118f80a475ce692fde89dc20fddb24c57360b96bc56f7035de1f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.5"
|
||||
version: "2.3.1"
|
||||
url_launcher_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_web
|
||||
sha256: "2942294a500b4fa0b918685aff406773ba0a4cd34b7f42198742a94083020ce5"
|
||||
sha256: "7fd2f55fe86cea2897b963e864dc01a7eb0719ecc65fcef4c1cc3d686d718bb2"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.20"
|
||||
version: "2.2.0"
|
||||
url_launcher_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_windows
|
||||
sha256: "95fef3129dc7cfaba2bc3d5ba2e16063bb561fc6d78e63eee16162bc70029069"
|
||||
sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.8"
|
||||
version: "3.1.1"
|
||||
uuid:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1563,10 +1546,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: wakelock_plus
|
||||
sha256: f45a6c03aa3f8322e0a9d7f4a0482721c8789cb41d555407367650b8f9c26018
|
||||
sha256: f268ca2116db22e57577fb99d52515a24bdc1d570f12ac18bb762361d43b043d
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.3"
|
||||
version: "1.1.4"
|
||||
wakelock_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1587,10 +1570,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: web
|
||||
sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10
|
||||
sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.4-beta"
|
||||
version: "0.3.0"
|
||||
web_socket_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1599,22 +1582,54 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.0"
|
||||
webview_flutter:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: webview_flutter
|
||||
sha256: "71e1bfaef41016c8d5954291df5e9f8c6172f1f6ff3af01b5656456ddb11f94c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.4.4"
|
||||
webview_flutter_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: webview_flutter_android
|
||||
sha256: "4ea3c4e1b8ed590162b15b8a61b41b1ef3ff179a314627c16ce40c086d94b8af"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.14.0"
|
||||
webview_flutter_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: webview_flutter_platform_interface
|
||||
sha256: d937581d6e558908d7ae3dc1989c4f87b786891ab47bb9df7de548a151779d8d
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.10.0"
|
||||
webview_flutter_wkwebview:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: webview_flutter_wkwebview
|
||||
sha256: "4d062ad505390ecef1c4bfb6001cd857a51e00912cc9dfb66edb1886a9ebd80c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.10.2"
|
||||
win32:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: win32
|
||||
sha256: "350a11abd2d1d97e0cc7a28a81b781c08002aa2864d9e3f192ca0ffa18b06ed3"
|
||||
sha256: b0f37db61ba2f2e9b7a78a1caece0052564d1bc70668156cf3a29d676fe4e574
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.9"
|
||||
version: "5.1.1"
|
||||
xdg_directories:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: xdg_directories
|
||||
sha256: "589ada45ba9e39405c198fe34eb0f607cddb2108527e658136120892beac46d2"
|
||||
sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.3"
|
||||
version: "1.0.4"
|
||||
xml:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1640,5 +1655,5 @@ packages:
|
|||
source: hosted
|
||||
version: "3.1.2"
|
||||
sdks:
|
||||
dart: ">=3.1.3 <4.0.0"
|
||||
flutter: ">=3.13.0"
|
||||
dart: ">=3.2.0-194.0.dev <4.0.0"
|
||||
flutter: ">=3.16.0"
|
||||
|
|
11
pubspec.yaml
11
pubspec.yaml
|
@ -34,13 +34,12 @@ dependencies:
|
|||
path_provider: ^2.0.15
|
||||
path: ^1.6.4
|
||||
sqflite: ^2.0.0+3
|
||||
permission_handler: ^10.4.3
|
||||
permission_handler: ^11.2.0
|
||||
intl: ^0.18.0
|
||||
filesize: ^2.0.1
|
||||
fluttertoast: ^8.0.8
|
||||
palette_generator: ^0.3.0
|
||||
flutter_material_color_picker: ^1.0.5
|
||||
flutter_inappwebview: ^5.3.2
|
||||
country_pickers: ^2.0.0
|
||||
move_to_background: ^1.0.1
|
||||
flutter_local_notifications: ^15.1.0+1
|
||||
|
@ -67,8 +66,6 @@ dependencies:
|
|||
version: ^3.0.2
|
||||
wakelock_plus: ^1.1.1
|
||||
google_fonts: ^5.1.0
|
||||
equalizer:
|
||||
git: https://github.com/gladson97/equalizer.git
|
||||
audio_session: ^0.1.6
|
||||
audio_service: ^0.18.1
|
||||
provider: ^6.0.0
|
||||
|
@ -88,7 +85,6 @@ dependencies:
|
|||
just_audio_media_kit:
|
||||
git: https://github.com/Pato05/just_audio_media_kit.git
|
||||
rxdart: ^0.27.7
|
||||
flutter_isolate: ^2.0.4
|
||||
isar: ^3.1.0+1
|
||||
isar_flutter_libs: ^3.1.0+1
|
||||
flutter_background_service: ^5.0.1
|
||||
|
@ -97,8 +93,9 @@ dependencies:
|
|||
dio_cookie_manager: ^3.1.1
|
||||
flutter_cache_manager_hive:
|
||||
git: https://github.com/Pato05/flutter_cache_manager_hive.git
|
||||
flex_color_picker:
|
||||
^3.3.0
|
||||
flex_color_picker: ^3.3.0
|
||||
webview_flutter:
|
||||
^4.4.4
|
||||
|
||||
#deezcryptor:
|
||||
#path: deezcryptor/
|
||||
|
|
Loading…
Reference in New Issue