diff --git a/.gitignore b/.gitignore
index 775807d..e2b0a6b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -69,6 +69,7 @@ app.*.map.json
# Envied
.env
lib/utils/env.g.dart
+lib/.env
# Possible translations remnants
translations/refreezer.zip
diff --git a/README.md b/README.md
index e1a4c10..1eb4bc5 100644
--- a/README.md
+++ b/README.md
@@ -1,13 +1,13 @@
-
+
-[](../../releases/latest)
-[](../../releases/latest)
-[](../../releases)
-[](../../releases)
+[](../../releases/latest)
+[](../../releases/latest)
+[](../../releases)
+[](../../releases)
[](https://docs.flutter.dev/tools/sdk)
[](https://dart.dev/get-dart)
[](https://crowdin.com/project/refreezer)
-[](./LICENSE)
+[](./LICENSE)
[](https://dart.dev/)
[](https://flutter.dev/)
@@ -15,17 +15,26 @@
---
-An alternative Deezer music streaming & downloading client, based on Freezer.
-The entire codebase has been updated/rewritten to be compatible with the latest version of flutter, the dart SDK & android (current build target is API level 34).
+This repo is a MOD of the [ReFreezer](https://github.com/DJDoubleD/ReFreezer) app by @DJDoubleD.
+My goal is to have a style closer to Deezer's original app.
+To apply the Deezer theme, select it under Settings > Appearance > Theme.
## Screenshots
+
Android Auto
@@ -49,6 +57,11 @@ The entire codebase has been updated/rewritten to be compatible with the latest
## Features & changes
+### Not working / On going
+- Offline playlist / titles access
+- Explore / Favorites page
+
+### ReFreezer :
- Restored all features of the old Freezer app, most notably:
- Restored all login options
- Restored Highest quality streaming and download options (premium account required, free accounts limited to MP3 128kbps)
@@ -66,6 +79,13 @@ The entire codebase has been updated/rewritten to be compatible with the latest
- Removed the need of custom just_audio & audio_service plugin versions & refactored source code to use the latest version of the official plugins
- Multiple other fixes
+### MOD :
+- Floating player bar with background color based on title artwork
+- Deezer original icons
+- Deezer original navigation menu (+ settings)
+- Deezer clone player screen
+- Deezer similar info menu
+
## Compile from source
Install the latest flutter SDK:
diff --git a/android/app/src/main/res/drawable-hdpi/ic_logo.png b/android/app/src/main/res/drawable-hdpi/ic_logo.png
index 691dd95..360ef00 100644
Binary files a/android/app/src/main/res/drawable-hdpi/ic_logo.png and b/android/app/src/main/res/drawable-hdpi/ic_logo.png differ
diff --git a/android/app/src/main/res/drawable-mdpi/ic_logo.png b/android/app/src/main/res/drawable-mdpi/ic_logo.png
index 32d0fd5..be8d608 100644
Binary files a/android/app/src/main/res/drawable-mdpi/ic_logo.png and b/android/app/src/main/res/drawable-mdpi/ic_logo.png differ
diff --git a/android/app/src/main/res/drawable-xhdpi/ic_logo.png b/android/app/src/main/res/drawable-xhdpi/ic_logo.png
index 5da585d..ae86f2e 100644
Binary files a/android/app/src/main/res/drawable-xhdpi/ic_logo.png and b/android/app/src/main/res/drawable-xhdpi/ic_logo.png differ
diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_logo.png b/android/app/src/main/res/drawable-xxhdpi/ic_logo.png
index 1611d13..ec0bf82 100644
Binary files a/android/app/src/main/res/drawable-xxhdpi/ic_logo.png and b/android/app/src/main/res/drawable-xxhdpi/ic_logo.png differ
diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_logo.png b/android/app/src/main/res/drawable-xxxhdpi/ic_logo.png
index 78a8ea4..e1fd8c3 100644
Binary files a/android/app/src/main/res/drawable-xxxhdpi/ic_logo.png and b/android/app/src/main/res/drawable-xxxhdpi/ic_logo.png differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
index 80254ed..4b42b70 100644
Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
index 7bfd6f7..b5a2e54 100644
Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
index bb82d93..4b42b70 100644
Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
index 134334d..11ada26 100644
Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
index ba1669c..c79e842 100644
Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
index ce5e2ef..11ada26 100644
Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index 967e08a..d7ff0c0 100644
Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
index 72be683..231914e 100644
Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
index 37abb73..d7ff0c0 100644
Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index 79a2b3d..e9d29c9 100644
Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
index 02a80a5..455ffcd 100644
Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
index 6be04b4..e9d29c9 100644
Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index 801d216..5a6d35c 100644
Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
index 1fc6edf..705648b 100644
Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
index 8d56068..5a6d35c 100644
Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml
index 06952be..0277e8f 100644
--- a/android/app/src/main/res/values-night/styles.xml
+++ b/android/app/src/main/res/values-night/styles.xml
@@ -13,6 +13,6 @@
This Theme is only used starting with V2 of Flutter's Android embedding. -->
diff --git a/android/app/src/main/res/values/ic_favorites_background.xml b/android/app/src/main/res/values/ic_favorites_background.xml
index e5d934a..0069995 100644
--- a/android/app/src/main/res/values/ic_favorites_background.xml
+++ b/android/app/src/main/res/values/ic_favorites_background.xml
@@ -1,4 +1,4 @@
- #3DDC84
+ #0F0D13
\ No newline at end of file
diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml
index e2f223d..2f48864 100644
--- a/android/app/src/main/res/values/ic_launcher_background.xml
+++ b/android/app/src/main/res/values/ic_launcher_background.xml
@@ -1,4 +1,4 @@
- #1C1C14
+ #0F0D13
\ No newline at end of file
diff --git a/assets/DJDoubleD.jpg b/assets/DJDoubleD.jpg
new file mode 100644
index 0000000..86f0c50
Binary files /dev/null and b/assets/DJDoubleD.jpg differ
diff --git a/assets/PetitPrince.png b/assets/PetitPrince.png
new file mode 100644
index 0000000..dd68f76
Binary files /dev/null and b/assets/PetitPrince.png differ
diff --git a/assets/app_icon.png b/assets/app_icon.png
new file mode 100644
index 0000000..05d36de
Binary files /dev/null and b/assets/app_icon.png differ
diff --git a/assets/banner.png b/assets/banner.png
index fac6d23..8bee473 100644
Binary files a/assets/banner.png and b/assets/banner.png differ
diff --git a/assets/fonts/Deezer.ttf b/assets/fonts/Deezer.ttf
new file mode 100644
index 0000000..4992a47
Binary files /dev/null and b/assets/fonts/Deezer.ttf differ
diff --git a/assets/icon.png b/assets/icon.png
index 42ba89e..18debb9 100644
Binary files a/assets/icon.png and b/assets/icon.png differ
diff --git a/assets/screenshots/Mod_home.png b/assets/screenshots/Mod_home.png
new file mode 100644
index 0000000..ced4991
Binary files /dev/null and b/assets/screenshots/Mod_home.png differ
diff --git a/assets/screenshots/Mod_player.png b/assets/screenshots/Mod_player.png
new file mode 100644
index 0000000..69fe856
Binary files /dev/null and b/assets/screenshots/Mod_player.png differ
diff --git a/assets/screenshots/Mod_search.png b/assets/screenshots/Mod_search.png
new file mode 100644
index 0000000..3e168a0
Binary files /dev/null and b/assets/screenshots/Mod_search.png differ
diff --git a/custom_navigator b/custom_navigator
deleted file mode 160000
index bef1bad..0000000
--- a/custom_navigator
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit bef1badfa66f5d1aa265555ef675e65e453bfd5d
diff --git a/equalizer_flutter b/equalizer_flutter
deleted file mode 160000
index 2fd74d8..0000000
--- a/equalizer_flutter
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 2fd74d8a6a95d0e6a07a07210f051c4ead283597
diff --git a/external_path b/external_path
deleted file mode 160000
index c753b1a..0000000
--- a/external_path
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit c753b1a154bbdcac297682ead6c9cae16c6441fd
diff --git a/lib/fonts/deezer_icons.dart b/lib/fonts/deezer_icons.dart
new file mode 100644
index 0000000..c1d6742
--- /dev/null
+++ b/lib/fonts/deezer_icons.dart
@@ -0,0 +1,162 @@
+/// Flutter icons Deezer
+/// Copyright (C) 2024 by original authors @ fluttericon.com, fontello.com
+/// This font was generated by FlutterIcon.com, which is derived from Fontello.
+///
+/// To use this font, place it in your fonts/ directory and include the
+/// following in your pubspec.yaml
+///
+/// flutter:
+/// fonts:
+/// - family: Deezer
+/// fonts:
+/// - asset: fonts/Deezer.ttf
+///
+///
+///
+import 'package:flutter/widgets.dart';
+
+class DeezerIcons {
+ DeezerIcons._();
+
+ static const _kFontFam = 'Deezer';
+ static const String? _kFontPkg = null;
+
+ static const IconData skip_back =
+ IconData(0xe800, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData shuffle_small =
+ IconData(0xe802, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData share_android_small =
+ IconData(0xe803, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData share_android =
+ IconData(0xe804, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData shuffle =
+ IconData(0xe805, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData settings_with_badge =
+ IconData(0xe806, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData settings_small =
+ IconData(0xe807, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData settings =
+ IconData(0xe808, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData search =
+ IconData(0xe809, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData search_small =
+ IconData(0xe80a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData search_fill_small =
+ IconData(0xe80b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData search_fill =
+ IconData(0xe80c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData repeat_small =
+ IconData(0xe80d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData repeat_one_small =
+ IconData(0xe80e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData repeat_one =
+ IconData(0xe80f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData repeat =
+ IconData(0xe810, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData queue_small =
+ IconData(0xe811, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData queue =
+ IconData(0xe812, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData play_before =
+ IconData(0xe813, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData play_before_small =
+ IconData(0xe814, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData pen_small =
+ IconData(0xe815, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData pen =
+ IconData(0xe816, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData offline_small =
+ IconData(0xe817, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData offline =
+ IconData(0xe818, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData microphone_small =
+ IconData(0xe819, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData microphone_show_small =
+ IconData(0xe81a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData microphone_show =
+ IconData(0xe81b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData microphone_show_fill_small =
+ IconData(0xe81c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData microphone_show_fill =
+ IconData(0xe81d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData microphone =
+ IconData(0xe81e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData house =
+ IconData(0xe81f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData house_small =
+ IconData(0xe820, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData house_fill =
+ IconData(0xe821, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData house_fill_small =
+ IconData(0xe822, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData heart_small =
+ IconData(0xe823, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData heart_fill_small =
+ IconData(0xe824, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData heart =
+ IconData(0xe825, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData heart_fill =
+ IconData(0xe826, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData download_small =
+ IconData(0xe827, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData download_fill_small =
+ IconData(0xe828, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData download =
+ IconData(0xe829, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData download_fill =
+ IconData(0xe82a, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData cross_small =
+ IconData(0xe82b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData compass_small =
+ IconData(0xe82c, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData cross =
+ IconData(0xe82d, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData compass =
+ IconData(0xe82e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData compass_fill_small =
+ IconData(0xe82f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData compass_fill =
+ IconData(0xe830, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData angry_face_small =
+ IconData(0xe833, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData angry_face =
+ IconData(0xe834, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData album =
+ IconData(0xe835, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData album_small =
+ IconData(0xe836, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData trash =
+ IconData(0xe837, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData trash_small =
+ IconData(0xe838, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData skip_next_fill =
+ IconData(0xe839, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData queue_1 =
+ IconData(0xe84e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData queue_small_2 =
+ IconData(0xe84f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData play =
+ IconData(0xe850, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData play_small =
+ IconData(0xe851, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData play_fill_small =
+ IconData(0xe852, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData pause_small =
+ IconData(0xe857, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData pause =
+ IconData(0xe858, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData pause_fill_small =
+ IconData(0xe859, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData album_small_1 =
+ IconData(0xe877, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData album_1 =
+ IconData(0xe879, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData queue_small_1 =
+ IconData(0xe890, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData sort_small =
+ IconData(0xe8bf, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData sort =
+ IconData(0xe8c1, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+ static const IconData more_vert =
+ IconData(0xe831, fontFamily: _kFontFam, fontPackage: _kFontPkg);
+}
diff --git a/lib/main.dart b/lib/main.dart
index f1e9684..44913f8 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -2,6 +2,9 @@ import 'dart:async';
import 'package:app_links/app_links.dart';
import 'package:custom_navigator/custom_navigator.dart';
+import 'package:refreezer/fonts/deezer_icons.dart';
+import 'package:refreezer/ui/restartable.dart';
+import 'package:refreezer/ui/settings_screen.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_displaymode/flutter_displaymode.dart';
@@ -12,7 +15,6 @@ import 'package:logging/logging.dart';
import 'package:move_to_background/move_to_background.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:quick_actions/quick_actions.dart';
-import 'package:refreezer/ui/restartable.dart';
//import 'package:restart_app/restart_app.dart';
import 'api/cache.dart';
@@ -97,7 +99,7 @@ class _ReFreezerAppState extends State {
@override
Widget build(BuildContext context) {
return MaterialApp(
- title: 'ReFreezer',
+ title: 'Deezer',
shortcuts: {
...WidgetsApp.defaultShortcuts,
LogicalKeySet(LogicalKeyboardKey.select):
@@ -202,8 +204,10 @@ class _MainScreenState extends State
late final AppLifecycleListener _lifeCycleListener;
final List _screens = [
const HomeScreen(),
+ const LibraryScreen(),
+ const LibraryPlaylists(),
const SearchScreen(),
- const LibraryScreen()
+ const SettingsScreen()
];
Future? _initialization;
int _selected = 0;
@@ -427,15 +431,26 @@ class _MainScreenState extends State
onKeyEvent: (event) =>
_handleKey(event, navigationBarFocusNode, screenFocusNode),
child: Scaffold(
+ backgroundColor: Theme.of(context).scaffoldBackgroundColor,
+ floatingActionButtonLocation:
+ FloatingActionButtonLocation.centerFloat,
+ floatingActionButton: Container(
+ margin: EdgeInsets.fromLTRB(6, 0, 6, 0),
+ decoration: BoxDecoration(
+ color: Colors.transparent,
+ ),
+ child: const PlayerBar(),
+ ),
bottomNavigationBar: FocusScope(
node: navigationBarFocusNode,
- child: Column(
- mainAxisSize: MainAxisSize.min,
- children: [
- const PlayerBar(),
- BottomNavigationBar(
- backgroundColor:
- Theme.of(context).bottomAppBarTheme.color,
+ child: Theme(
+ data: Theme.of(context).copyWith(
+ canvasColor:
+ Theme.of(context).scaffoldBackgroundColor),
+ child: BottomNavigationBar(
+ type: BottomNavigationBarType.fixed,
+ unselectedItemColor:
+ Theme.of(context).unselectedWidgetColor,
currentIndex: _selected,
onTap: (int index) async {
//Pop all routes until home screen
@@ -448,29 +463,44 @@ class _MainScreenState extends State
setState(() {
_selected = index;
});
-
//Fix statusbar
SystemChrome.setSystemUIOverlayStyle(
const SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
));
},
- selectedItemColor: Theme.of(context).primaryColor,
+ selectedItemColor:
+ settings.primaryColor.withOpacity(0.8),
+ showUnselectedLabels: true,
+ selectedLabelStyle:
+ TextStyle(color: settings.primaryColor),
+ unselectedLabelStyle:
+ TextStyle(color: Settings.secondaryText),
items: [
BottomNavigationBarItem(
- icon: const Icon(Icons.home),
+ activeIcon: const Icon(DeezerIcons.house_fill),
+ icon: const Icon(DeezerIcons.house),
label: 'Home'.i18n),
BottomNavigationBarItem(
- icon: const Icon(Icons.search),
+ activeIcon:
+ const Icon(DeezerIcons.compass_fill),
+ icon: const Icon(DeezerIcons.compass),
+ label: 'Explore'.i18n),
+ BottomNavigationBarItem(
+ activeIcon: const Icon(DeezerIcons.heart_fill),
+ icon: const Icon(DeezerIcons.heart),
+ label: 'Favorites'.i18n),
+ BottomNavigationBarItem(
+ activeIcon: const Icon(DeezerIcons.search_fill),
+ icon: const Icon(DeezerIcons.search),
label: 'Search'.i18n,
),
BottomNavigationBarItem(
- icon: const Icon(Icons.library_music),
- label: 'Library'.i18n)
+ activeIcon: const Icon(DeezerIcons.settings),
+ icon: const Icon(DeezerIcons.settings),
+ label: 'Settings'.i18n)
],
- )
- ],
- )),
+ ))),
body: CustomNavigator(
navigatorKey: customNavigatorKey,
home: Focus(
@@ -482,9 +512,11 @@ class _MainScreenState extends State
));
} else {
// While audio_service is initializing
- return const Scaffold(
+ return Scaffold(
body: Center(
- child: CircularProgressIndicator(),
+ child: CircularProgressIndicator(
+ color: Theme.of(context).primaryColor,
+ ),
),
);
}
diff --git a/lib/settings.dart b/lib/settings.dart
index fb9f1a3..7caa425 100644
--- a/lib/settings.dart
+++ b/lib/settings.dart
@@ -117,10 +117,13 @@ class Settings {
//Colors
@JsonKey(toJson: _colorToJson, fromJson: _colorFromJson)
- Color primaryColor = Colors.blue;
+ Color primaryColor = Color(0xFFA238FF);
+ static const deezerBg = Color(0xFF0F0D13);
+ static const deezerBottom = Color(0xFF1B191F);
+ static const secondaryText = Color(0xFFA9A6AA);
static _colorToJson(Color c) => c.value;
- static _colorFromJson(int? v) => v == null ? Colors.blue : Color(v);
+ static _colorFromJson(int? v) => v == null ? Color(0xFFA238FF) : Color(v);
@JsonKey(defaultValue: false)
bool useArtColor = false;
@@ -195,9 +198,13 @@ class Settings {
}
SliderThemeData get _sliderTheme => SliderThemeData(
- thumbColor: primaryColor,
activeTrackColor: primaryColor,
- inactiveTrackColor: primaryColor.withOpacity(0.2));
+ inactiveTrackColor: primaryColor.withOpacity(0.2),
+ trackHeight: 0.5,
+ thumbShape: RoundSliderThumbShape(enabledThumbRadius: 1),
+ thumbColor: primaryColor,
+ overlayShape: RoundSliderOverlayShape(overlayRadius: 4),
+ overlayColor: primaryColor.withOpacity(0.2));
//Load settings/init
Future loadSettings() async {
@@ -255,8 +262,6 @@ class Settings {
return true;
}
- static const deezerBg = Color(0xFF1F1A16);
- static const deezerBottom = Color(0xFF1b1714);
TextTheme? get textTheme => (font == 'Deezer')
? null
: GoogleFonts.getTextTheme(font,
@@ -394,18 +399,24 @@ class Settings {
}),
),
bottomAppBarTheme:
- const BottomAppBarTheme(color: Color(0xff424242))),
+ const BottomAppBarTheme(color: Color(0xFF0F0D13))),
Themes.Deezer: ThemeData(
useMaterial3: false,
brightness: Brightness.dark,
textTheme: textTheme,
fontFamily: _fontFamily,
primaryColor: primaryColor,
+ unselectedWidgetColor: secondaryText,
sliderTheme: _sliderTheme,
scaffoldBackgroundColor: deezerBg,
- dialogBackgroundColor: deezerBottom,
+ dialogBackgroundColor: deezerBg,
+ hintColor: secondaryText,
+ inputDecorationTheme: const InputDecorationTheme(
+ hintStyle: TextStyle(color: secondaryText),
+ labelStyle: TextStyle(color: secondaryText),
+ ),
bottomSheetTheme:
- const BottomSheetThemeData(backgroundColor: deezerBottom),
+ const BottomSheetThemeData(backgroundColor: deezerBg),
cardColor: deezerBg,
outlinedButtonTheme: outlinedButtonTheme,
textButtonTheme: textButtonTheme,
@@ -459,15 +470,15 @@ class Settings {
return null;
}),
),
- bottomAppBarTheme: const BottomAppBarTheme(color: deezerBottom)),
+ bottomAppBarTheme: const BottomAppBarTheme(color: deezerBg)),
Themes.Black: ThemeData(
useMaterial3: false,
brightness: Brightness.dark,
textTheme: textTheme,
fontFamily: _fontFamily,
primaryColor: primaryColor,
- scaffoldBackgroundColor: Colors.black,
- dialogBackgroundColor: Colors.black,
+ scaffoldBackgroundColor: deezerBg,
+ dialogBackgroundColor: deezerBg,
sliderTheme: _sliderTheme,
bottomSheetTheme: const BottomSheetThemeData(
backgroundColor: Colors.black,
diff --git a/lib/ui/elements.dart b/lib/ui/elements.dart
index 03028b0..da84d06 100644
--- a/lib/ui/elements.dart
+++ b/lib/ui/elements.dart
@@ -13,8 +13,9 @@ class LeadingIcon extends StatelessWidget {
return Container(
width: 42.0,
height: 42.0,
- decoration:
- BoxDecoration(color: (color ?? Theme.of(context).primaryColor).withOpacity(1.0), shape: BoxShape.circle),
+ decoration: BoxDecoration(
+ color: (color ?? Theme.of(context).primaryColor).withOpacity(1.0),
+ shape: BoxShape.circle),
child: Icon(
icon,
color: Colors.white,
@@ -40,7 +41,8 @@ class FreezerAppBar extends StatelessWidget implements PreferredSizeWidget {
//Should be specified if bottom is specified
final double height;
- const FreezerAppBar(this.title, {super.key, this.actions = const [], this.bottom, this.height = 56.0});
+ const FreezerAppBar(this.title,
+ {super.key, this.actions = const [], this.bottom, this.height = 64.0});
@override
Size get preferredSize => Size.fromHeight(height);
@@ -48,18 +50,26 @@ class FreezerAppBar extends StatelessWidget implements PreferredSizeWidget {
@override
Widget build(BuildContext context) {
return Theme(
- data: ThemeData(primaryColor: (Theme.of(context).brightness == Brightness.light) ? Colors.white : Colors.black),
+ data: ThemeData(
+ primaryColor: (Theme.of(context).brightness == Brightness.light)
+ ? Colors.white
+ : Colors.black),
child: AppBar(
- systemOverlayStyle: SystemUiOverlayStyle(statusBarBrightness: Theme.of(context).brightness),
+ systemOverlayStyle: SystemUiOverlayStyle(
+ statusBarBrightness: Theme.of(context).brightness),
elevation: 0.0,
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
- foregroundColor: (Theme.of(context).brightness == Brightness.light) ? Colors.black : Colors.white,
- title: Text(
+ foregroundColor: (Theme.of(context).brightness == Brightness.light)
+ ? Colors.black
+ : Colors.white,
+ title: Container(
+ child: Text(
title,
style: const TextStyle(
fontWeight: FontWeight.w900,
+ fontSize: 48,
),
- ),
+ )),
actions: actions,
bottom: bottom as PreferredSizeWidget?,
),
diff --git a/lib/ui/home_screen.dart b/lib/ui/home_screen.dart
index c2b1434..13bdad9 100644
--- a/lib/ui/home_screen.dart
+++ b/lib/ui/home_screen.dart
@@ -1,6 +1,7 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
+import 'package:refreezer/fonts/deezer_icons.dart';
import '../api/deezer.dart';
import '../api/definitions.dart';
@@ -23,6 +24,8 @@ class HomeScreen extends StatelessWidget {
return Scaffold(
appBar: const HomeAppBar(),
body: SingleChildScrollView(
+ child: Container(
+ padding: EdgeInsets.only(bottom: 80.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
@@ -32,7 +35,7 @@ class HomeScreen extends StatelessWidget {
)
],
),
- ));
+ )));
}
}
@@ -49,7 +52,7 @@ class HomeAppBar extends StatelessWidget implements PreferredSizeWidget {
actions: [
IconButton(
icon: Icon(
- Icons.file_download,
+ DeezerIcons.download,
semanticLabel: 'Download'.i18n,
),
onPressed: () {
@@ -59,7 +62,7 @@ class HomeAppBar extends StatelessWidget implements PreferredSizeWidget {
),
IconButton(
icon: Icon(
- Icons.settings,
+ DeezerIcons.settings,
semanticLabel: 'Settings'.i18n,
),
onPressed: () {
@@ -88,7 +91,7 @@ class FreezerTitle extends StatelessWidget {
children: [
Image.asset('assets/icon.png', width: 64, height: 64),
const Text(
- 'ReFreezer',
+ 'Deezer',
style: TextStyle(fontSize: 56, fontWeight: FontWeight.w900),
)
],
diff --git a/lib/ui/library.dart b/lib/ui/library.dart
index 4d5b7e1..37a01b9 100644
--- a/lib/ui/library.dart
+++ b/lib/ui/library.dart
@@ -6,6 +6,7 @@ import 'package:fluttericon/font_awesome5_icons.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:get_it/get_it.dart';
import 'package:logging/logging.dart';
+import 'package:refreezer/fonts/deezer_icons.dart';
import '../api/cache.dart';
import '../api/deezer.dart';
@@ -37,7 +38,7 @@ class LibraryAppBar extends StatelessWidget implements PreferredSizeWidget {
actions: [
IconButton(
icon: Icon(
- Icons.file_download,
+ DeezerIcons.download,
semanticLabel: 'Download'.i18n,
),
onPressed: () {
@@ -47,7 +48,7 @@ class LibraryAppBar extends StatelessWidget implements PreferredSizeWidget {
),
IconButton(
icon: Icon(
- Icons.settings,
+ DeezerIcons.settings,
semanticLabel: 'Settings'.i18n,
),
onPressed: () {
@@ -76,7 +77,7 @@ class LibraryScreen extends StatelessWidget {
ListTile(
title: Text('Downloads'.i18n),
leading:
- const LeadingIcon(Icons.file_download, color: Colors.grey),
+ const LeadingIcon(DeezerIcons.download, color: Colors.grey),
subtitle: Text(
'Downloading is currently stopped, click here to resume.'
.i18n),
@@ -88,7 +89,8 @@ class LibraryScreen extends StatelessWidget {
),
ListTile(
title: Text('Shuffle'.i18n),
- leading: const LeadingIcon(Icons.shuffle, color: Color(0xffeca704)),
+ leading: const LeadingIcon(DeezerIcons.shuffle,
+ color: Color(0xffeca704)),
onTap: () async {
List