diff --git a/.gitignore b/.gitignore index 54bd5ed..9ee2fe8 100644 --- a/.gitignore +++ b/.gitignore @@ -71,3 +71,7 @@ testfiles/ translations/crowdin.zip translations/freezer.json translations/exp + +# Ignore flatpak builds +flatpak/build-dir +flatpak/.flatpak-builder \ No newline at end of file diff --git a/flatpak/build-flatpak.sh b/flatpak/build-flatpak.sh index 062e1f0..dc6691a 100644 --- a/flatpak/build-flatpak.sh +++ b/flatpak/build-flatpak.sh @@ -14,9 +14,10 @@ executableName=freezer # ------------------------------- Build Flatpak ----------------------------- # -# Extract portable Flutter build. +# Find and extract portable build mkdir -p $projectName -tar -xf $projectName-linux.tar.gz -C $projectName +EXTRACT_DIR=`pwd`"/$projectName" +tar -xf "../build/linux/x64/release/$projectName-linux-*.tar.gz" -C "$EXTRACT_DIR" # Copy the portable app to the Flatpak-based location. cp -r $projectName /app/ diff --git a/lib/api/audio_sources/deezer_audio_source.dart b/lib/api/audio_sources/deezer_audio_source.dart index 2b46ab4..8885ced 100644 --- a/lib/api/audio_sources/deezer_audio_source.dart +++ b/lib/api/audio_sources/deezer_audio_source.dart @@ -88,6 +88,7 @@ class DeezerAudioSource extends StreamAudioSource { if (_downloadUrl != null && quality != newQuality) { // update currentUrl to get tracks with new quality + _deezerAudio.quality = newQuality; _downloadUrl = null; } diff --git a/lib/api/player/audio_handler.dart b/lib/api/player/audio_handler.dart index a184818..80dc403 100644 --- a/lib/api/player/audio_handler.dart +++ b/lib/api/player/audio_handler.dart @@ -658,6 +658,7 @@ class AudioPlayerTask extends BaseAudioHandler { Future customAction(String name, [Map? extras]) async { switch (name) { case 'updateQuality': + _logger.fine('updateQuality($extras)'); //Pass wifi & mobile quality by custom action //Isolate can't access globals wifiQuality = extras!['wifiQuality'] as AudioQuality; diff --git a/lib/settings.dart b/lib/settings.dart index 702f6fb..681a21f 100644 --- a/lib/settings.dart +++ b/lib/settings.dart @@ -108,7 +108,7 @@ class Settings { @HiveField(26) bool colorGradientBackground = false; @HiveField(27) - bool blurPlayerBackground = false; + bool blurPlayerBackground = true; @HiveField(28) String font = 'System'; @HiveField(29) @@ -117,8 +117,8 @@ class Settings { int? displayMode; @HiveField(31, defaultValue: true) bool enableFilledPlayButton = true; - @HiveField(32, defaultValue: false) - bool playerBackgroundOnLyrics = false; + @HiveField(32, defaultValue: true) + bool playerBackgroundOnLyrics = true; @HiveField(33, defaultValue: NavigatorRouteType.material) NavigatorRouteType navigatorRouteType = NavigatorRouteType.material; @@ -161,8 +161,8 @@ class Settings { @HiveField(45, defaultValue: false) bool materialYouAccent = false; - @HiveField(46, defaultValue: true) - bool playerAlbumArtDropShadow = true; + @HiveField(46, defaultValue: false) + bool playerAlbumArtDropShadow = false; @HiveField(47, defaultValue: false) bool seekAsSkip = false; diff --git a/lib/ui/lyrics_screen.dart b/lib/ui/lyrics_screen.dart index e4d05c0..bbb1ece 100644 --- a/lib/ui/lyrics_screen.dart +++ b/lib/ui/lyrics_screen.dart @@ -282,12 +282,11 @@ class _LyricsWidgetState extends State if (_showTranslation) Text(_lyrics!.lyrics![i].translated!, textAlign: TextAlign.start, - style: TextStyle( - color: Color.lerp( - Theme.of(context).colorScheme.onBackground, - Colors.black, - 0.12), - fontSize: 20.0)), + style: lyricsStyle.getTextStyle( + isActive, + Color.lerp(textColor, Colors.black, 0.25)! + .withOpacity(isActive ? 1.0 : 0.25), + 20.0)), ], ), ))); @@ -296,6 +295,7 @@ class _LyricsWidgetState extends State @override Widget build(BuildContext context) { final lyricsStyle = LyricsStyle.fromIndex(settings.lyricsStyle); + var extentBefore = 0.0; return Stack( children: [ _error != null @@ -305,45 +305,63 @@ class _LyricsWidgetState extends State _loading ? const Center(child: CircularProgressIndicator()) : LayoutBuilder(builder: (context, constraints) { - return NotificationListener( + return NotificationListener( onNotification: (notification) { if (!_syncedLyrics) return false; - final extentDelta = - (notification.metrics.extentBefore - - notification.metrics.extentAfter) - .abs(); // avoid accidental clicks - const extentThreshold = 9000.0; - print('delta: $extentDelta'); - if (extentDelta >= extentThreshold && - !_animatedScroll && + final extentDelta = + (notification.metrics.pixels - extentBefore) + .abs(); + extentBefore = notification.metrics.pixels; + const extentThreshold = 20.0; + if (!_animatedScroll && + !_freeScroll && !_loading && - !_freeScroll) { + extentDelta >= extentThreshold) { setState(() => _freeScroll = true); } return false; }, child: ScrollConfiguration( behavior: _scrollBehavior, - child: FadingEdgeScrollView.fromScrollView( - gradientFractionOnStart: 0.25, - gradientFractionOnEnd: 0.25, - child: ListView.builder( - padding: EdgeInsets.symmetric( - horizontal: 8.0, - vertical: constraints.maxHeight / 2 - - height / 2), - controller: _controller, - itemCount: _lyrics!.lyrics!.length + 1, - itemBuilder: (BuildContext context, int i) { - return AutoScrollTag( - key: ValueKey(i), - controller: _controller, - index: i, - child: - _buildLyricWidget(i, lyricsStyle)); - }, - )))); + child: _syncedLyrics + ? FadingEdgeScrollView.fromScrollView( + gradientFractionOnStart: 0.25, + gradientFractionOnEnd: 0.25, + child: ListView.builder( + padding: EdgeInsets.symmetric( + horizontal: 8.0, + vertical: !_syncedLyrics + ? 4.0 + : constraints.maxHeight / 2 - + height / 2), + controller: _controller, + itemCount: _lyrics!.lyrics!.length + 1, + itemBuilder: + (BuildContext context, int i) { + return AutoScrollTag( + key: ValueKey(i), + controller: _controller, + index: i, + child: _buildLyricWidget( + i, lyricsStyle)); + }, + )) + : FadingEdgeScrollView + .fromSingleChildScrollView( + gradientFractionOnStart: 0.25, + gradientFractionOnEnd: 0.25, + child: SingleChildScrollView( + controller: _controller, + child: Padding( + padding: + const EdgeInsets.all(8.0), + child: Text( + _lyrics!.lyrics![0].text!, + style: + TextStyle(fontSize: 20.0), + ), + ))))); }), if (_availableTranslation) Positioned(