From ed087bc583d6f6ae0d25141f63add49ac9aae412 Mon Sep 17 00:00:00 2001 From: exttex Date: Tue, 23 Jun 2020 21:23:12 +0200 Subject: [PATCH] Initial commit --- .gitignore | 50 ++ .gradle/5.2.1/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/5.2.1/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .gradle/5.2.1/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 + .gradle/vcs-1/gc.properties | 0 .metadata | 10 + README.md | 39 + android/.gitignore | 8 + android/app/build.gradle | 76 ++ android/app/src/debug/AndroidManifest.xml | 7 + android/app/src/main/AndroidManifest.xml | 68 ++ .../main/java/f/f/freezer/MainActivity.java | 167 ++++ .../src/main/res/drawable-hdpi/ic_logo.png | Bin 0 -> 1447 bytes .../src/main/res/drawable-hdpi/ic_pause.png | Bin 0 -> 196 bytes .../main/res/drawable-hdpi/ic_play_arrow.png | Bin 0 -> 390 bytes .../main/res/drawable-hdpi/ic_skip_next.png | Bin 0 -> 415 bytes .../res/drawable-hdpi/ic_skip_previous.png | Bin 0 -> 401 bytes .../src/main/res/drawable-hdpi/ic_stop.png | Bin 0 -> 137 bytes .../src/main/res/drawable-mdpi/ic_logo.png | Bin 0 -> 1173 bytes .../src/main/res/drawable-mdpi/ic_pause.png | Bin 0 -> 144 bytes .../main/res/drawable-mdpi/ic_play_arrow.png | Bin 0 -> 220 bytes .../main/res/drawable-mdpi/ic_skip_next.png | Bin 0 -> 251 bytes .../res/drawable-mdpi/ic_skip_previous.png | Bin 0 -> 250 bytes .../src/main/res/drawable-mdpi/ic_stop.png | Bin 0 -> 122 bytes .../src/main/res/drawable-xhdpi/ic_logo.png | Bin 0 -> 1740 bytes .../src/main/res/drawable-xhdpi/ic_pause.png | Bin 0 -> 220 bytes .../main/res/drawable-xhdpi/ic_play_arrow.png | Bin 0 -> 410 bytes .../main/res/drawable-xhdpi/ic_skip_next.png | Bin 0 -> 456 bytes .../res/drawable-xhdpi/ic_skip_previous.png | Bin 0 -> 440 bytes .../src/main/res/drawable-xhdpi/ic_stop.png | Bin 0 -> 181 bytes .../src/main/res/drawable-xxhdpi/ic_logo.png | Bin 0 -> 2189 bytes .../src/main/res/drawable-xxhdpi/ic_pause.png | Bin 0 -> 302 bytes .../res/drawable-xxhdpi/ic_play_arrow.png | Bin 0 -> 683 bytes .../main/res/drawable-xxhdpi/ic_skip_next.png | Bin 0 -> 734 bytes .../res/drawable-xxhdpi/ic_skip_previous.png | Bin 0 -> 723 bytes .../src/main/res/drawable-xxhdpi/ic_stop.png | Bin 0 -> 228 bytes .../src/main/res/drawable-xxxhdpi/ic_logo.png | Bin 0 -> 2644 bytes .../main/res/drawable-xxxhdpi/ic_pause.png | Bin 0 -> 316 bytes .../res/drawable-xxxhdpi/ic_play_arrow.png | Bin 0 -> 807 bytes .../res/drawable-xxxhdpi/ic_skip_next.png | Bin 0 -> 983 bytes .../res/drawable-xxxhdpi/ic_skip_previous.png | Bin 0 -> 953 bytes .../src/main/res/drawable-xxxhdpi/ic_stop.png | Bin 0 -> 304 bytes .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3232 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1803 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3589 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 5549 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 5806 bytes android/app/src/main/res/values/styles.xml | 18 + android/app/src/profile/AndroidManifest.xml | 7 + android/build.gradle | 29 + android/gradle.properties | 4 + .../gradle/wrapper/gradle-wrapper.properties | 6 + android/settings.gradle | 15 + android/settings_aar.gradle | 1 + assets/cover.jpg | Bin 0 -> 20785 bytes assets/fonts/Jost-Italic.ttf | Bin 0 -> 73232 bytes assets/fonts/Montserrat-Bold.ttf | Bin 0 -> 244468 bytes assets/fonts/Montserrat-Italic.ttf | Bin 0 -> 249088 bytes assets/fonts/Montserrat-Regular.ttf | Bin 0 -> 245708 bytes ios/.gitignore | 32 + ios/Flutter/AppFrameworkInfo.plist | 26 + ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + ios/Runner.xcodeproj/project.pbxproj | 506 +++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 +++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + ios/Runner/Base.lproj/LaunchScreen.storyboard | 37 + ios/Runner/Base.lproj/Main.storyboard | 26 + ios/Runner/Info.plist | 45 + ios/Runner/Runner-Bridging-Header.h | 1 + lib/api/deezer.dart | 356 ++++++++ lib/api/definitions.dart | 676 +++++++++++++++ lib/api/definitions.g.dart | 338 ++++++++ lib/api/download.dart | 577 +++++++++++++ lib/api/player.dart | 657 ++++++++++++++ lib/main.dart | 175 ++++ lib/settings.dart | 194 +++++ lib/settings.g.dart | 103 +++ lib/ui/cached_image.dart | 203 +++++ lib/ui/details_screens.dart | 697 +++++++++++++++ lib/ui/downloads_screen.dart | 113 +++ lib/ui/error.dart | 26 + lib/ui/home_screen.dart | 224 +++++ lib/ui/library.dart | 610 +++++++++++++ lib/ui/login_screen.dart | 254 ++++++ lib/ui/menu.dart | 615 +++++++++++++ lib/ui/player_bar.dart | 160 ++++ lib/ui/player_screen.dart | 581 +++++++++++++ lib/ui/search.dart | 387 +++++++++ lib/ui/settings_screen.dart | 655 ++++++++++++++ lib/ui/tiles.dart | 363 ++++++++ pubspec.lock | 805 ++++++++++++++++++ pubspec.yaml | 127 +++ 123 files changed, 10390 insertions(+) create mode 100644 .gitignore create mode 100644 .gradle/5.2.1/fileChanges/last-build.bin create mode 100644 .gradle/5.2.1/fileHashes/fileHashes.lock create mode 100644 .gradle/5.2.1/gc.properties create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/vcs-1/gc.properties create mode 100644 .metadata create mode 100644 README.md create mode 100644 android/.gitignore create mode 100644 android/app/build.gradle create mode 100644 android/app/src/debug/AndroidManifest.xml create mode 100644 android/app/src/main/AndroidManifest.xml create mode 100644 android/app/src/main/java/f/f/freezer/MainActivity.java create mode 100644 android/app/src/main/res/drawable-hdpi/ic_logo.png create mode 100644 android/app/src/main/res/drawable-hdpi/ic_pause.png create mode 100644 android/app/src/main/res/drawable-hdpi/ic_play_arrow.png create mode 100644 android/app/src/main/res/drawable-hdpi/ic_skip_next.png create mode 100644 android/app/src/main/res/drawable-hdpi/ic_skip_previous.png create mode 100644 android/app/src/main/res/drawable-hdpi/ic_stop.png create mode 100644 android/app/src/main/res/drawable-mdpi/ic_logo.png create mode 100644 android/app/src/main/res/drawable-mdpi/ic_pause.png create mode 100644 android/app/src/main/res/drawable-mdpi/ic_play_arrow.png create mode 100644 android/app/src/main/res/drawable-mdpi/ic_skip_next.png create mode 100644 android/app/src/main/res/drawable-mdpi/ic_skip_previous.png create mode 100644 android/app/src/main/res/drawable-mdpi/ic_stop.png create mode 100644 android/app/src/main/res/drawable-xhdpi/ic_logo.png create mode 100644 android/app/src/main/res/drawable-xhdpi/ic_pause.png create mode 100644 android/app/src/main/res/drawable-xhdpi/ic_play_arrow.png create mode 100644 android/app/src/main/res/drawable-xhdpi/ic_skip_next.png create mode 100644 android/app/src/main/res/drawable-xhdpi/ic_skip_previous.png create mode 100644 android/app/src/main/res/drawable-xhdpi/ic_stop.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/ic_logo.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/ic_pause.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/ic_play_arrow.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/ic_skip_next.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/ic_skip_previous.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/ic_stop.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/ic_logo.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/ic_pause.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/ic_play_arrow.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/ic_skip_next.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/ic_skip_previous.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/ic_stop.png create mode 100644 android/app/src/main/res/drawable/launch_background.xml create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/values/styles.xml create mode 100644 android/app/src/profile/AndroidManifest.xml create mode 100644 android/build.gradle create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/settings.gradle create mode 100644 android/settings_aar.gradle create mode 100644 assets/cover.jpg create mode 100644 assets/fonts/Jost-Italic.ttf create mode 100644 assets/fonts/Montserrat-Bold.ttf create mode 100644 assets/fonts/Montserrat-Italic.ttf create mode 100644 assets/fonts/Montserrat-Regular.ttf create mode 100644 ios/.gitignore create mode 100644 ios/Flutter/AppFrameworkInfo.plist create mode 100644 ios/Flutter/Debug.xcconfig create mode 100644 ios/Flutter/Release.xcconfig create mode 100644 ios/Runner.xcodeproj/project.pbxproj create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner/AppDelegate.swift create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/Main.storyboard create mode 100644 ios/Runner/Info.plist create mode 100644 ios/Runner/Runner-Bridging-Header.h create mode 100644 lib/api/deezer.dart create mode 100644 lib/api/definitions.dart create mode 100644 lib/api/definitions.g.dart create mode 100644 lib/api/download.dart create mode 100644 lib/api/player.dart create mode 100644 lib/main.dart create mode 100644 lib/settings.dart create mode 100644 lib/settings.g.dart create mode 100644 lib/ui/cached_image.dart create mode 100644 lib/ui/details_screens.dart create mode 100644 lib/ui/downloads_screen.dart create mode 100644 lib/ui/error.dart create mode 100644 lib/ui/home_screen.dart create mode 100644 lib/ui/library.dart create mode 100644 lib/ui/login_screen.dart create mode 100644 lib/ui/menu.dart create mode 100644 lib/ui/player_bar.dart create mode 100644 lib/ui/player_screen.dart create mode 100644 lib/ui/search.dart create mode 100644 lib/ui/settings_screen.dart create mode 100644 lib/ui/tiles.dart create mode 100644 pubspec.lock create mode 100644 pubspec.yaml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7f66c9d --- /dev/null +++ b/.gitignore @@ -0,0 +1,50 @@ +#Key stuff +freezerkey.jsk +android/key.properties + +just_audio/ + +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ +android/.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Web related +lib/generated_plugin_registrant.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Exceptions to above rules. +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/.gradle/5.2.1/fileChanges/last-build.bin b/.gradle/5.2.1/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/.gradle/5.2.1/fileHashes/fileHashes.lock b/.gradle/5.2.1/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..fec4da32f3db0b3af50ebfce67be3fb7fe0adf56 GIT binary patch literal 17 TcmZRU;%Yp<@tM060~7!NDd_`n literal 0 HcmV?d00001 diff --git a/.gradle/5.2.1/gc.properties b/.gradle/5.2.1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..7d86389d7147c2cfb4e19c5a2a13d95e484f93e1 GIT binary patch literal 17 UcmZP$*|Ph@0-=;R1_)pT05k6d1ONa4 literal 0 HcmV?d00001 diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..6e471d7 --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Tue May 26 10:01:04 CEST 2020 +gradle.version=5.2.1 diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..6ac2303 --- /dev/null +++ b/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: f7a6a7906be96d2288f5d63a5a54c515a6e987fe + channel: stable + +project_type: app diff --git a/README.md b/README.md new file mode 100644 index 0000000..99b7b88 --- /dev/null +++ b/README.md @@ -0,0 +1,39 @@ +# freezer + +A music streaming app written from scratch, which uses Deezer as backend. +This app is still in BETA, so it is missing features and contains bugs. +If you want to report bug or request feature, please open an issue. + +## Downloads: +Under releases tab +**You might get Play Protect warning - just select install anyway or disable Play Protect** - it is because the keys used for signing this app are new. + +## Compile from source + +Install flutter SDK: https://flutter.dev/docs/get-started/install +(Optional) Generate keys for release build: https://flutter.dev/docs/deployment/android +Compile: +``` +flutter pub get +flutter build apk +``` + +## just_audio +This app depends on modified just_audio plugin with Deezer support. Repo: https://notabug.org/exttex/just_audio + + +## Disclaimer +``` +Freezer was not developed for piracy, but educational and private usage. +It may be illegal to use this in your country! +I am not responsible in any way for the usage of this app. +``` + +## Credits +Tobs: Beta tester +Deemix: https://notabug.org/RemixDev/deemix +just_audio: https://github.com/ryanheise/just_audio + +## Support me +BTC: `14hcr4PGbgqeXd3SoXY9QyJFNpyurgrL9y` +ETH: `0xb4D1893195404E1F4b45e5BDA77F202Ac4012288` \ No newline at end of file diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..54f92d6 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,8 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java +key.properties \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 0000000..9d6c556 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,76 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def keystoreProperties = new Properties() +def keystorePropertiesFile = rootProject.file('key.properties') +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) +} + + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 28 + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "f.f.freezer" + minSdkVersion 20 + targetSdkVersion 28 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + signingConfigs { + release { + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null + storePassword keystoreProperties['storePassword'] + } + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.release + shrinkResources false + minifyEnabled false + } + } +} + +dependencies { + implementation group: 'org', name: 'jaudiotagger', version: '2.0.3' +} + +flutter { + source '../..' +} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..5cad113 --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..c6b0906 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/java/f/f/freezer/MainActivity.java b/android/app/src/main/java/f/f/freezer/MainActivity.java new file mode 100644 index 0000000..a6e1005 --- /dev/null +++ b/android/app/src/main/java/f/f/freezer/MainActivity.java @@ -0,0 +1,167 @@ +package f.f.freezer; + +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.jaudiotagger.audio.AudioFile; +import org.jaudiotagger.audio.AudioFileIO; +import org.jaudiotagger.tag.FieldKey; +import org.jaudiotagger.tag.Tag; +import org.jaudiotagger.tag.TagOptionSingleton; +import org.jaudiotagger.tag.datatype.Artwork; +import org.jaudiotagger.tag.flac.FlacTag; +import org.jaudiotagger.tag.id3.ID3v23Tag; +import org.jaudiotagger.tag.id3.valuepair.ImageFormats; +import org.jaudiotagger.tag.reference.PictureTypes; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.RandomAccessFile; +import java.security.MessageDigest; +import java.util.function.Function; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; + +import io.flutter.embedding.android.FlutterActivity; +import io.flutter.embedding.engine.FlutterEngine; +import io.flutter.plugin.common.MethodChannel; + +public class MainActivity extends FlutterActivity { + private static final String CHANNEL = "f.f.freezer/native"; + + @Override + public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) { + super.configureFlutterEngine(flutterEngine); + new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL) + .setMethodCallHandler(((call, result) -> { + //Decrypt track + if (call.method.equals("decryptTrack")) { + String tid = call.argument("id").toString(); + String path = call.argument("path"); + decryptTrack(path, tid); + result.success(0); + } + //Add tags to track + if (call.method.equals("tagTrack")) { + try { + //Tag + TagOptionSingleton.getInstance().setAndroid(true); + AudioFile f = AudioFileIO.read(new File(call.argument("path").toString())); + boolean isFlac = true; + if (f.getAudioHeader().getFormat().contains("MPEG")) { + f.setTag(new ID3v23Tag()); + isFlac = false; + } + + Tag tag = f.getTag(); + tag.setField(FieldKey.TITLE, call.argument("title").toString()); + tag.setField(FieldKey.ALBUM, call.argument("album").toString()); + tag.setField(FieldKey.ARTIST, call.argument("artists").toString()); + tag.setField(FieldKey.TRACK, call.argument("trackNumber").toString()); + + //Album art + String cover = call.argument("cover").toString(); + if (isFlac) { + //FLAC requires different cover adding + RandomAccessFile imageFile = new RandomAccessFile(new File(cover), "r"); + byte[] imageData = new byte[(int) imageFile.length()]; + imageFile.read(imageData); + tag.setField(((FlacTag) tag).createArtworkField( + imageData, + PictureTypes.DEFAULT_ID, + ImageFormats.MIME_TYPE_JPG, + "cover", + 1400, + 1400, + 24, + 0 + )); + } else { + //MP3 + Artwork art = Artwork.createArtworkFromFile(new File(cover)); + tag.addField(art); + } + //Save + AudioFileIO.write(f); + + } catch (Exception e) { + e.printStackTrace(); + } + result.success(null); + } + + })); + } + + public static void decryptTrack(String path, String tid) { + try { + //Load file + File inputFile = new File(path + ".ENC"); + BufferedInputStream buffin = new BufferedInputStream(new FileInputStream(inputFile)); + ByteArrayOutputStream buf = new ByteArrayOutputStream(); + byte[] key = getKey(tid); + for (int i=0; i>> 4]; + hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F]; + } + return new String(hexChars); + } + + //Calculate decryption key from track id + public static byte[] getKey(String id) { + String secret = "g4el58wc0zvf9na1"; + String key = ""; + try { + MessageDigest md5 = MessageDigest.getInstance("MD5"); + //md5.update(id.getBytes()); + byte[] md5id = md5.digest(id.getBytes()); + String idmd5 = bytesToHex(md5id).toLowerCase(); + + for(int i=0; i<16; i++) { + int s0 = idmd5.charAt(i); + int s1 = idmd5.charAt(i+16); + int s2 = secret.charAt(i); + key += (char)(s0^s1^s2); + } + } catch (Exception e) { + } + return key.getBytes(); + } + + //Decrypt 2048b chunk + public static byte[] decryptChunk(byte[] key, byte[] data) throws Exception{ + byte[] IV = {00, 01, 02, 03, 04, 05, 06, 07}; + SecretKeySpec Skey = new SecretKeySpec(key, "Blowfish"); + Cipher cipher = Cipher.getInstance("Blowfish/CBC/NoPadding"); + cipher.init(Cipher.DECRYPT_MODE, Skey, new javax.crypto.spec.IvParameterSpec(IV)); + return cipher.doFinal(data); + } +} diff --git a/android/app/src/main/res/drawable-hdpi/ic_logo.png b/android/app/src/main/res/drawable-hdpi/ic_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe557ea5bb9012e9b362a0a355cdb3759f9490c GIT binary patch literal 1447 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U~I{Bb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJZt&2q2xw|Y}R``jzxXNtha$O;i)fy)2qxZK-jn}iQd+~#)f)B|X zUp;uVW_9yw1&+D~3rj1_T^^nPy}5LgY%Sg$-(B6mySyPl*XV4PG`q=NGvSRZW_Ydd zY78$~Ab(fDP{;W6jLAzZqWacX|M*cQ{xEXw`M;J`S9*>z%=fT4&2w4pp2EC)TX@g? zKB72ndg!C#M~0L2JpP<0J^I-EoaJ=Zd6GtxJ1ZXvY@Csuw6rtw-j$B!9fwyf3*I;3 zQ^eCfM{NC2JxdZqGU^NG^b0C%;J%{O_qq0s#a7`1|9N6w^4729 zI#V+#E;Hky@`7^d9Xs+ePRSMQWahDv+@!gC()?u;&N97E|Kgju;Jw(3sLxfa-#`As z=n)kDQTo9H0g1DL->SOH%gw%jdq1O>_%)p?h48n{ROYO^mg6t)pzOL*~*u;6*%qEvEItdh#EOCt}an8@pP0cG|a4t$s zEJ;mKD9Ku7SLu}H9uv5QHQ+5T*IrqAsH&=hD>lX#H@F_yr_kLv^MF@E^#of+G3MJ1R~@hA_53wuE)p`}ogvZF>leRV z`gXsEy?66OUQhlNQ+b)%{wirNDU#x0WJvB=Gh?5h!KUw(GAo+$nErONcr>tZa86)Q zWE4_RabRiz@+UBG3J3*=?mPDE?1XSdGS!YOh$TrS;O%du(tfp;2OSHFoe>`{pJ%wxFDWM{T5o-f9i-{FMK z1LFX*O>C2%ZkXPa6Jhm!^-@^l2B<7lCW}j;NsvcYKGP!g{YF zb^{ZM-4A8%Rht3*d%LmUVX@(L;|0&fBh5XhN~ZNaS*@2Z9r^zJzND1=Ur`NOC$&~? z^(tCh$Qn~}?(X+{`6lZcHam!KI5*>6iOAHrS7KkP-yB_`viCXTO(}s%uRbUjoH+3= zA$)2T2RD|8hBzg}J+AgZ;img#KQ35)n5Ud_y~9>Dvh7OFnXjwnv96f3W>VB@6>pXM z%)c&+255-vdSnsjux-*F_n>vrr-g4XTJdFH-1>$+d5+5sv`$)l(>+j`{QF+$B=Mdc zxeKfC#h3i#aQO>dJ-o+uUA~^3qJ8rEf$&LFyA|cNrh4s{Ut!T#y6uYceFpQGs|HtN SuE+uND}$%2pUXO@geCx4Qgdzq literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-hdpi/ic_pause.png b/android/app/src/main/res/drawable-hdpi/ic_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..4e6adca90e4d65b79ed115a9df980d5f2b1385ca GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUtZci7-kc`H+Hw?L&0|eL}26}sH z$2qh(ta9MWmcIO)XJwI~|J*|+joV!#d=x()oVI^YCadQpmA|W4*Byx2VI07^Tk*yn zyZe7;^HnfqKa_J2e)I0&GuAJ^?S9T?l$emr!1hFgrx=I3;4>C lH_U9fyw87{il@~)^NOy84<~hM~?si literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-hdpi/ic_play_arrow.png b/android/app/src/main/res/drawable-hdpi/ic_play_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e356235a2fb087cbf0f88e6a8c7a43711a7f600c GIT binary patch literal 390 zcmV;10eSw3P)6KjmH(T4i(xLXyz{t@WKR~8=-rFX3nvNhbo@rp?`s9e&8kUjW>D`ZeQRK zuW^68(Ti}qPv|`sRot0EzXC^CHDy2X0Kf4OPsSg0xX`Y^8NMj@qp3Q`2Fk_mo$_9o zIAL^w&v>TN4%0>$Uf>iP^4nmM)6VzqNrq55Y$2h3kwS+O_me^Ns&~66hROR1yKYAZy+19`&V1c4z3}) zjPAmm!S8|7zH^>)`Q|$WK@bE%5CpGb4nqUVs^Jsr?XfSOeuhbEG#0hp~Ke&HOYSIGt_=z=)b;(Lnpot4v zpFgX2TalbV1BbH4Zn8jDG6GH9;VTvtZ>^IM_=_`aDYojJlrHc`c2O5~?{|7ps=&Rh zJWhD~Bfm6(Q+!m>M}19ytKP{nzQ`uNkBtFj20;)6K@hwfo&ZDql>n=LPH6xD002ov JPDHLkV1gg;v5Eiy literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-hdpi/ic_skip_previous.png b/android/app/src/main/res/drawable-hdpi/ic_skip_previous.png new file mode 100644 index 0000000000000000000000000000000000000000..8621bb61c51a8b7149a79fb3e4d8d06087c32d0a GIT binary patch literal 401 zcmV;C0dD?@P)XHN1d9}ckRnJ3L=dr45D7;7+P^x*?6Mc) z%F5nihMWg(`|>`QnK_3b2!bF8g5WtUV!QKg;eCzSQ#EGwWgG3z_Xit8<~5|^Kk<3U ztbwRgpotGS#{>3;ZZ`mR2sAK>ubqr;UJ(Kt_5oIrEFlo&qUq&Vt4gm#+1_l_T!T+!AsvE^h d3=9v%q<>tNt4Uk0VF5Io!PC{xWt~$(698%+CXN6A literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-mdpi/ic_logo.png b/android/app/src/main/res/drawable-mdpi/ic_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d5bb07aab6e855acafad395a7be7fc67f626b239 GIT binary patch literal 1173 zcmV;G1Zw+EX>4Tx04R}tkv&MmKpe$iQ?;TM2MdZgM5s;{L`5963Pq?8YK2xEOfLO`CJjl7 zi=*ILaPVWX>fqw6tAnc`2!4P#IXWr2NQwVT3N2ziIPS;0dyl(!fKV+m&1xG5G~G56 zv8b3zuZn?Jbf6#I5HTz>%b1g-I9iUcd-(Wz7vWj0&;2=i)QrUdpGZ8*4AUmwAfDc| z4bJ<-A(od_;&b9LlP*a7$aTfzH_kbi1)do)lZkoa5V4qRVx@^$-qeVvh{LL;Q@)V$ zSmnIMSu2)V{hs`V!HmAL%ypVWh+z>+kfteDHam6A8p|ubo~;!6mk{7 z$gzMDG{~+W{11M2Yh@=Vyrf_hXn%2>j}aiS3)Cu(^L^|%wG+Vq3|#3Af2j)0e3D*i zXyGHEcN@64ZfMFLaJd5vJQ=bnyON)#kj(<`XY@^JpzjvwTJw6V@8k3VNK#kv8{ps& z7|l`kdW&~=Huv`LnReSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00M1EL_t(|+U?s*h)!`B$MMg&MjE#%BbTsHvQTHrVpeQ~ zg{_sHl7$s}J0U4cw}mOPU@2L!F+?%BBzNUbOfDIc#cMHt^*ChlzL;s|dFrk6JkS6C zyytvR=il?|e@>g`Z5i6iaX$tyKjiOX4yF|UGah3}81obpFe}8aVJXIk+8?p7R(lqv z75__#{a5>jM)~c>hTu0);au>qVsUNEM(n7?;AQX+V%=|Qp9p?mvllVOD7OTV01`j~ zNB{{S0VIG?Yi%veofnP=@D(#c>~-nYCx+JfEoO%??=TkaHGMEA+?;{Z>vz;@w_{SM z{px=M*cwjqI-X-~$oF7H5J<19s=Mc3-O0Ybi%rcN*TR494D%157rR6LEH+`~k8>)*5DYX7yk?{VSB7yRoxGUS`4iU^Pd!H zyE^3CvAiaRCfCNC#G+bEnbR2_uSdVBor_=sNB{{S0VIF~kN^_EP>G?#K@9blR`*cI zzb)KZP7`cEWA>V~PQ43U6ch_(O z@Hf|hMlOO0AOR$R1dsp{KmterqeKjC4ghZ(d`oLn$Unhe954Qxkp`fzrp^X%CB#1C z9$o~0L;<+$*SExa{v?JL5SVKT;cQi nj*iYd|KcJV4f^|=`eMd+(!G{d+wDA600000NkvXXu0mjf2(<`H literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-mdpi/ic_pause.png b/android/app/src/main/res/drawable-mdpi/ic_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..cdb6c67d355dc433505d94179af5f106f507ff6a GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJa8DP-;(uZy2p9>=6W&RG-7da`De%w{&bp&cgC`5%+>)~_m@;U6zEusjZKe9_ znRX;yJn|^Mfyw&IteAhi0gsvrFL&=}^jfp^kAdoekALr0G3&6}9p4%AuD+V-&|ag@ UzER6kfX-#`boFyt=akR{0G#hw3IG5A literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-mdpi/ic_skip_next.png b/android/app/src/main/res/drawable-mdpi/ic_skip_next.png new file mode 100644 index 0000000000000000000000000000000000000000..dc8a8137158929130693967ffbd44abc2c4374d7 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJL!K^VXvN95Z2ZH1gIuA2>Za~p}rRi^8mX;u{Kbdmeq z73TMxnY+h{r6#F+y39E?@ik5?I(hAX6FSmD8O2p17Kep8Sh4R3m7H)c=G){cViO*4 z-(AIY$@1ad_jyy~3XX|<-NY>P=EDESQ^Yp7SRdB3c_7_v?YEFo+CXNK z;0|B0098GF;IRq7$mS+v^}gdSuA2a)QmNB!4bZ4S`BSECSpWb407*qoM6N<$f=LBu A9smFU literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-mdpi/ic_stop.png b/android/app/src/main/res/drawable-mdpi/ic_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..e51c5e765403c1d32d88b0d00e7301bc5a7b6699 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzM^6{Wkcif|=QeUODDbdej6QYj zkm04B6M}Ew;8qOX(R{y7ZpO^N(he%-+6;_yo@`@aWMbhExWHs^KQL`IQ$pI_-Op#% VspS0e>;M|Z;OXk;vd$@?2>?!$C#e7c literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xhdpi/ic_logo.png b/android/app/src/main/res/drawable-xhdpi/ic_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e535ac224cbc35a28301e794c815bed2f98f90c5 GIT binary patch literal 1740 zcma)+dsNZ~8^?b@pdscBZ&QS#Ov{)ebI4@Ul!RH{G8Htn3kb7pC9Q50LZs7US0uAFE3nN!YOXd2@U`_NY6;AjC(ZO zo~VOuwdQ&T`DE`#KMQZVZ5xu_X#90n2xdP)d(PgFnJ>PiX2&fZQ~ai$zSfl4gwsDO zB)d}_?=bQ|J zM`jn^Oj}(|wS3IFKBRR|y-&Q4??6F? zSMCuLUr8e#&Orx!dtU!K#nHmF6&w2)%h#ITMkkmnRSKagNp%CeZge*38_v$1U3JlD zUPgRnkqNHZ;Qp?{*55gH z7S}XL2B4a+ULA;$Yb>6zms6WGPhLS7L7^{g)M{g^fxwkiaZ-}on-xuYYKCWAenP{8 zndEo6vmlQ8`gj8yACTX@T%vO}$1zxm06@Th5G1+Y^R&*?<1-J?^`0UuQHW2UCKN~M zENebJjPG?SHkNae4|pYTj_^6haY-?J9?pk(ARtt<#S#EE)iJ&I1}FdeqUvyNFvm8h z#@&^>0$-sEq%L$6;`!n@$=bm=(;4};!$JRTNAtE?Q{ON(AJ6c?y*~WhDr=F#8eH3ADZ-g}cS6M-uwN$sP5hlsb zW~)EMN7z$0Uj&z9X0r;woiSYcK5kU1#~kN4SJ*?P_CvB=iAiTs9$X_6O159v*nzJ~F_Hki(3&Yyi#vXKe?4_?78(rUo~~J!j~|Pa zNLkN@-=cBIzef&KL*d4MAURo!`8aD4(Ev^C9gephGf{yS+3Tg!am{cwCe{JP+Iulz z3A`o8WNnS@*aUVAPo{6S!eG+TVYad<)83gY+pkQ(C#+Npxla;`w_iA`en8`T6!t$X zsY@^)sOS!{oqrzg?o4WRHS+N7a9h$&O@%k)vy)_PYhiz9 zm!7ap7{rSod6(%U)Pt1^NKN7p$SDL7raY}?tE*_-6FlA=Fi^es)K|8e*?pH>47+5C z4o^slQd@a7f>ISKDl}7G2Cy(X#QPs`-0r8sTj#JafU^C%mIoapHe@z)Q0)ct*}lqK z%GaXXoua$SG$mC8BGkv!%;+;1^|J7FmM0s%OIY)Yzv6-?~QUlbRwRT(eNaAA9uK(`q^xk^YQuN?&yA5dN++w zb}7>HM{xi1!EJ&6+L^!Yqw|RK`|iFj>zh%{4c%=g9S*b#azGD;S@Ye*mUNTAr{)Wl zX3>29Qlz?A`Kp~v!1@*U#VQ3NaFI+X+QFQ$mwQUC^u({FmECgHKqB!I#0D%G<#FJ2 zzsx1taD2}(v~KJFPx|KxzJzuV{uRF7i{#zOn1PJfQ~8-bMepHDge5x8wV2xtwTG7H lkrMp^Z;pNvG+Vj>#9sK~$Ka4%6S}7cFzJ5YH@=8I_dirY@T33$ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xhdpi/ic_pause.png b/android/app/src/main/res/drawable-xhdpi/ic_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..e631f09beb49f26981b8a2baa8896d46e26fd1d9 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=i#=T&Ln`LHyaWWjetYnk*c+Q$ z{o6SV<}e&=V>sBy@b-8#i-cc8f^$QHd&9TKx=cLk4jU95HYhv%{wT)SCaiEnK;eeq zg1;5r42L-daySIua9pU{bP0l+XkKa&J}c literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xhdpi/ic_play_arrow.png b/android/app/src/main/res/drawable-xhdpi/ic_play_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..3cac8d48f9bbb67451bf7dd9b87d14a2ffc90da8 GIT binary patch literal 410 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU`+IMaSW-L^Y*5#_Ynt?)`#J) zADJBwMhURKU8}QY<3%^e3-TKhHcss-(^@2P{mlAp5$sJVXVZ+0r>i_~ygk4A#D$5?ErGPM2N0 zG$W*8zJEeHpM3W!rawF{UR*ZFW#s$8(3g{REOE=lZHGzAx11*!;EJK)>fivI_`8z|ZsiZM`R?|Eq8v28KCmdKI;Vst0L~$; ANdN!< literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xhdpi/ic_skip_next.png b/android/app/src/main/res/drawable-xhdpi/ic_skip_next.png new file mode 100644 index 0000000000000000000000000000000000000000..aa54bd387bfcf2b603376e3585ff8042de444f0d GIT binary patch literal 456 zcmV;(0XP1MP)gKXd&YaM&OqiW24 z$Ih|XQh%5q*u&F~JTo7lLJvnBd9nzQ<`S=4_GA^HLLUd(yCkv;kS>W+yllafWq>rl z@dk^J@MIkzZNstYBV->S%};Dk;VC9Sg+KUYvTZ0TK>C+B!}^$>;sT_(!}~Ej#Rf>* zaANfHM9~2Tw_yhhLp*a4pu#Oa<9Wj~Hv#VO6{`);TmiD1?b@mmL~8N6W|7KjrXe$l6`=_`k-5$(vx+7TYNCt$~Va} zKsx9)TkvETppQe-uY8lN0$i(KlC()S0lszQnfU;})CXNxFG^=Nz$UJYzK?H%nGLX{ yy@PHPyXr4II9K>h*xvU=#ZQ0000c+uXwZ#>T-alGq`}|$R`sJfo`pjKNxnDdy z@Og9Gng+(Ylq^yG1?{$fzI{KtE`ss&B{%a|2f76|^quy(|A_U>!wdh<|8n7$@Hqd= zo87LEDQ!vdAJ=EMv{=qOln9@hy;{Jb>Ta&YzX`!}8rrVMeS0;#f^o^!4ZW{@?rX7Z z`CS+I(s4y1m;92w3wJFpn9cj=)Rk3k3_gz++yDO^s@kBE$o+igu27DQistq6;(1-U z71p-JPW>m6ySeTC%sE*sCNe8y9OU1B3|`74CH9f`z110sS(TY;w{nHoTb-Lb&2DqE f0!I@Jxjka+i{QBJd5zfz7$Xdxu6{1-oD!Ms1_B1RNR`a$fil@7chi(7@mZKp^R(lF=1M(O=UHx3vIVCg!0Q#^zp#T5? literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_logo.png b/android/app/src/main/res/drawable-xxhdpi/ic_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ccdce980cbcd4cc80c4566c5e5ea28799cc3b585 GIT binary patch literal 2189 zcmb_d`#;nBAO9FLxrF725Z~jLLhd#Z9hNN-xy~hv=6+d>p<;4W=z@KX5DJZ0qBM7N z9MTDUgzAVGif(2MbK32!^TYWAzI`9B$LsxiJ)V#E>-EF)^?W^Ed7d7w3bOlT0RT`y zAze<3BmKL}NQ>XovvCjrkoYy)+1V52?5u-JN{on(!ves8qDw^%$U!H~p-}Jkdp|+s z@?kCw9;z+~&30KtgHlYcpVmoJ!DRylRDMA%GZ4oPZ~e?%Y;MYF(vis|!r*pBUC2C< zo2*Hg1B~^o`@*em0@2gNVk|}jV)f2uPisTjiI)6qe|(MhJ0){t%NJ#&I#}S%mJ2&O z8G9GdRE7YaF?D?is7Bhqke@V|)2W(!qA8%5gg!(@3#$0J1K0c7MpMe2ubowPD{RmO zV^utVy&*%jGg5^<(T-ox#tWdGDoH=lM_P$ctC5G=e8o&cEY{Glrw*eMm36-Ima@(x zxv7IUIhVe|+V{{!^1+`JvKnPaFBYGPj#|*IA!u}TBt-qOAJ-`%Nd*!8V-zOD^iXnA8A^`84 z7$1*Kzyr=n*t2--IUPbYK1#bq0df^)U#>uVLXBexr@ z_BAS({CA?5Uf9415RKK#2qhGsUR4cjm027pfCN!Lx{uz?J-CSSsdK2y&W9@dNQpGh z8K$#6DUw$^7QmWE8f5oCItO6$Ml*w@0D8`4G=zoyjv zvbMDg6U6MfMeME^Q=OdLQ%mPKIhb*mw^vI=M(*DCDTYr$rz8;=)^x<X7M1sZ;dH^OuV#odQ^g(ecAe4^VJ?ai9?(Tn~ z4KTp{q`gGS1Dw|lp992LVw2>`DkRFv1~f&~$Ucr?;c8#%xVr-5-~`#e7TYT=;78yN zIE)(=oiGDk{(NKj_=FXBm@Af;?cUQ0X9`7e9HYIuaMj$3`YK2dINqMrp zmEmAuIKQQev>=vzYdpa(txw_0o5A72Smr%?BZtm1jwP+!QR%2yXrm!UgVR5>x4e$A z-spL(z7x;Rq>-?z=MU>k2E=or^U%)j&A)^vlfoaS z;U5<7AWBrv^^9aC`q@|H)Gr-n8=LJb<3&bCGC^$lRt0lj@AU^w78SHqmS#A9%B0Ab zNgna_R5=r{q3#q|%>cZ;mr6lJ7i#vKT}X0!e`J@6qwL&g0p(R!f+-5R(c=vN zeDfA$Ue}3+=Ob{Y@FfQ=^e_R$Mzb9=UF9*W9oR<6+FFgS-nn&cSH`JHQczBDosG9j zPC>Xgg?3mU)kZsz-+Q-F&&Z@2nR=}C&?YIwO^#Sp~TFNY2&OGK>L z#CNepcEmrLQSVyAuV=ioZuDiA`#cY-DY3S;-hY(#s_Uj6s_ZtL-Wu*Ym`ouLjE!l9 zrEcfwGoAx}lgSsm1?xw~PM+*ZjwQFlQ@=)OrP=N%@lW?>Eefr)&Wb-)1BdqnLAeLm zPfCj=nx9hX+w}BjjI`ltX)93jhw8F#IMYSY;o8q))%;(m73rdv)1S+V1SRE@`#kHx z>I7g#YMj@Fp9Q}iDA+_&$yIhjnU4HFuaxDSIsWPc8A*lFTuvO7Y-XP-A-oM_FaQ#1 zi3^m1JshO$$=LXf9!rqDCcl#Ruw${@A-cSH<&Ft`Er$WLoI~?W{#i(xq(5YQM$z8J z-XnWnc?R04k?%0LG)5N;aIF>9h%~2v2meC}Ue!0Sa9y6A#O#3+6Sy$?E{s1r*(0?( zWa5b;u8dTH{aGW-Zt%^7XUiLoTcIBH{5-G_>GM(Q^t|{e0RRf&;qveo%;moUCPc~I literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_pause.png b/android/app/src/main/res/drawable-xxhdpi/ic_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..76388728850421e1da320b306b4f6f1d3cf0144a GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoUp-wMLn`LHy|dBFIZ(vqqN2); znf(*KG|gYuD==F{?AO(@Z{L?lOj^UbTu$%zReeUF7BJXx@A3n)=DBAJUccL`zEkIp z<;m9x&s9$r7QUX5VqJah?GK+%y9?|+@3C38t1LgdHh9wAH<8<&8;lrFv1kY{@Szdo zx5uZw1=s(qd7NGNTCwih$2lqcD<-cmvc7SX|2_-M=^x(nAL^XYt1nRY2qfg`>gTe~ HDWM4flYevs literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_play_arrow.png b/android/app/src/main/res/drawable-xxhdpi/ic_play_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..ecf4f8a2a3177ca934caf257ff77adf77ca3f4dc GIT binary patch literal 683 zcmV;c0#yBpP)4o3E24N=C|)qqg?It$Mi3DfDn&(65fK+IEQ%mvtI(ogBG%MPlE2!;bRdhE z=5}V9GtUpc{WtR_Gm|+dAW4!WNs=TF6PY%ESl@x?z=^c&&%ap(5UU9+;wC+^SqBhLOD}oEGpHIF-EX8ksbJ6~Ygy1L<3?mr0hKCA>nI znNgRUHsKY-MxHk7Ym~`f2kzj%C@V2+^4q{u;2eeC)u-^kPyJ`$DsHls8+48E0+*X) z;>7s!c=q) RR_g!&002ovPDHLkV1l`YENuV) literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_skip_next.png b/android/app/src/main/res/drawable-xxhdpi/ic_skip_next.png new file mode 100644 index 0000000000000000000000000000000000000000..24365b82f1df9405658e65645d3e9eaedbb561c5 GIT binary patch literal 734 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U|QhLbt!1Xr3ktRxEeG$DK&XNauo?=`CfRU$F#mwkMAf?@8xeryRw(u zW54&izi!pJU!lTI9EvRh7{tTPPuTVy6^|7+I>5Vz=j6F}UaP&Ems|9lmA$@c+C7el zKoy+_eb!` zQJu$%ewx}#D}@-t+Lt`v(NX(sdr((Hqs}9@PZHTg+O3!Lsf65BU_!8(o=Q&epN{lbsm+~Ml5)Ff>B z>hKN8M|LSKD3VIu`AfjveT6nt+61?m3*xn|&yQ}uBFbp&)BOF%>0iPnEN3iE|6p&w zwi2YG%&Bhen;HA%g2Gus{1)4M^)F0n0h*E|^>osIwQqe9K;cuHEhBm!Dl;CC3;x|5v!z_uGs$mdkf3In2!XAF6kyeAfHtUVFta+>4Mk+}&9wu~+oM zyNvpyd7I~Ev|sdQeB1YJMc%w$TfcZY+%_r--Dz->BmT^HHwWt{b1wW1-VcoL9lf!; zq+efOY|gan2S>HYHck6aRW~{Qrwd{v98hBVaps5o%)6nEH9a@Gf$5gP)78&qol`;+ E08&Xw=>Px# literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_skip_previous.png b/android/app/src/main/res/drawable-xxhdpi/ic_skip_previous.png new file mode 100644 index 0000000000000000000000000000000000000000..31dbbf80c8cc990b018c37c8c83b8ed25c734daa GIT binary patch literal 723 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>V4CIW;uumf=k0Cx?2tf)wuk9L z&MKXY(iW~*A${9Tgw`q7SVxu_iXY(#OHZ%IziSGwu)1DRF zKWY2iObG)dMgF>#zPt0~N8a2{zO(|l;$%7R+-cqoo;k;u?2^w`v_QUeB`r zgR5jT)0PCUpI74#vfKCTGD?{>*X~#^Q&cA#&190odhM~vy)Qr|CJAEI1>ExNJ-Uop zCXJOcM}zOH-(tB?(~$Y*fa)G;gLy0~0^M(Rw*RSI*DrZKiB8quuk)-S>o*dzgS+(I?noZ$*Q-q^BHb5NY9E+QfoNazF?|F zr+5*^s+21Xw$@W$|D2y9B#`RMD_AyM+p2z;dVduhm!W;L8gg4Cd zy}Q5K`oU)51*_jN?5Zzzsywvtoc9GzgC%e8o?r1=&4;NcLHFFFomJ0UStJfEDN_E| zmu3D)ctI2AQ_ttcr%pyQm24GVkj~d$=)culk~84olp?m;lP|t^3olr7k9p_u4<|kd zmoQyPVXH2T-MMly!!2HiO3mcOMbV#^+RVFG)i5vgRMFRU2Z3r#QlxHAagY8r*HPV} zx#~Ti%rW8p_A06l+*SX1&2?+jbr_?J8cR>H?A6fE>OX5z_Hd(+BIB_I%~yATI#JqisPnp6*kIX6(0wz`lPgg&ebxsLQ0CAc>g8%>k literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_stop.png b/android/app/src/main/res/drawable-xxhdpi/ic_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..a6803836a9e76f713e724e140be5c61a7c9abe6a GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGot36#DLn`LHy~xPPU?{+Ra9{JQ zb+5t$r)e8+V4JiRr~m>aUh?GLmslLY|FU7BrNTMJLcWe-hdIoTWCWf!Sg;?Vfl&3c i2HP#~k4eB>aNu@b(c-FQYO+G5AR$jzKbLh*2~7YVNJ$y|JIy)_@+%qQ2oXWe!7*=Mb@&iU{C``@!cnhFaX z6#xK07&J4o1pqE6LF*WU%3BttLWL2}Bw?WMx zw3)hTyxCIf$@fAhM9b3suI1lz8tJ}Uc=yfo0=tHXD~?n3%}%FNop!T#V(AGD_p4Usv=GXiDC3>eM4!@N3AD1QW9L0l`y=;NVKS8Y4rk^>0033_{huo&-{1z6_{{W@b~w^5&=WJ*HxmIr(7_K=qqOmTG?EV{$3IQ_?1DUpX@^h7W=L4 z4h74!EO&UyDxmyi>;|4^>6d_3=Q5ixRE@{EHhIVNeU}RqfBISExTBhb{>j+mtXtx; zzs0>5=(*+i*sR$U9nq$cPpfdF^@Ccp$L1(d4CAd$n}3|)54)bZDw6!2^`igM2DNKa~k`)}Fz0)Y4bGBDNo~OC7X>XI!%;`(MxdctG1mWTKwWInAK8 zOz?u^nR&nVX}Yxs4$DX0`H?ZFH$$<)yH$kZHe(RGN{m71sC)3yrJ2m@IGzJnbQt2i zEyDInd#sk|*SeXfQ_Slsn0qcNl*(E4MbyXFh^*@TPm-7NXNGQnNkgpv?qxBnR+Wtq z_u$zj5il#Jq8L|hfE(Zk0Tt zGc)Yf)x~bKOEO&1nyJ7T249>^*X*hI5;~rZ

)(Y=+P&=H!`Pi4=3P{=X)zc`Fpc zScObBDkzJPnp{kjJa^6x#CwqWAT^8{M`0->1G>r640KR@cLg>JsaV3QDgF0@*5Vr? z`9r4LW`#r=9f_C?x*OTj62`3Zmp3LLv-FZot}BD;x}os(E#?zl=u!)#k?~Xst{Qtm z!4_HM3Nyyg;Jnt2kI_rlP^e|ZB4>?>3cEmh-oD%6eS?MR>BTVyL7J{VsuO@#9E&}zu-$wiT=X9t$N3B-oV?KQ8 ztH7Svv?TWgF?A6JqsWpfO%T5_i6P%S%Sf50*nukv7OAbz-m?|^d^PM!u*={-$X2uT z;r8v@_^Fgq7Z-!|?s3fM1>2W*Vq=d;$;eocEs@8pUNt=RWipZ%VLG_hfv{^6xGH~_ zy=*Q2qi=U^p1*Ihx4+|L_2*a|EcH&CxI)uiv2J!sG`B>X}{AhOHvyslQvFlfx7oUbMZ z&=3(mbPD@KZ6VFkRX^O0hS)WuQ!2nmVCwJ)_d|F9vb=Dtrgx*bREa_;%S8K-!|27Q z!&sHC5r~MS(wJ}oo_FEGZkKBc{lZyqVhLX|gg-U9WOMxuLf?w7`X~D}HZWIr!VM)O z<}=_M;%%WMELN*>fCXm^4M7Dy&FJB+K&};wNG_q!-UTV0otd=xX1IrHIz&vtOl8iA z(8pI;0pYBUtkEvWU6fBa1^Rhx@%8l{z3=_JN96*FRnj$^*K>43{ABWr@EDg9Q+%Tk^@G#|2JCyF`&P|_Rksjp0R^EEiL3W$f$@NTSjC)foXkh zZS72Fe?PJ(Br$_L*zy zZj{fyWi@c`^s)o*hN4{a2EP6Ys~bO6?XY*B*RNsoeLuocAb=rjAsdniM8lM zQ5KDx1xuhUzW3&J%)&eQ;pT~n{z2yw`C!Sm&>IjXck1G$v3*I9^oHPzQ|arq@W>ne z$APq^X?U<0Y{R!>YYWa+MZGh24>#QxyR_#2=T;9Cb?tCNn2s%bvaCeg<{)GjP$vs| zgljOQ1-y5APP9(hFH6*4lHt44OLBL2|6^_r-ARd#rrRs2?Uq%Rms3(wrpiUAwv48x oha%IO<#l!BsVTw;Kakt8BPh#Ba8DOr@dTg`G)5Y|xO64vPZG{ko&W#< literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_pause.png b/android/app/src/main/res/drawable-xxxhdpi/ic_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..85a177ea091e0cc1221119b9da804d55d163505a GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU}W}maSW-L^Y-pSL8d?f)`Pt- zc;q}C6fC)T1BIFIg!`0V{iS~FJr7U=3iy*Sd*!#kzJjb}wP@NM9_bL!4+ zsS8J#M7FY?VPfCpw_u{lP6pStO#H=s3x5UaI0SA!aI|LeioPk_0WtD62h;hEg}nk< z^3lgQlVhjY0`43p;{*S6Ca;_{hdba3e}dBSf?Kgbve0A!ByiG4f0_P8rd1!f=Dyi&IM!MC@+Y@fM+ ziqVhq12dlpXD#UXF#YA<_MqOzIS2C@^FMMv*f^<}aZjstThW}?%Nv|`vRx_&YWpv^ zV@|%v)rm?!Odk{;lQd~srvGW*1J`@=E~Wg~Zv1^6n~C7R?3%{p^HQom<{#+&qr2L( zv?+f1_t#3l_<4kD*ne=vaJ>xi4B@R~t`NDhSZLKIhWU+?LGkW*@ITwTBU_irl>M4) z-`t3Yoh&Mzldz&CeD|2oO_NJf$Y8goTo;jhUw%kl7JaF>N1@g2Cf={ArATSZsnz7R_N~xyGDv-R^_Y2Zw_@h1djk zgfnPAuzw)^pl0XAZD|aRkC`&A>wS<}{`l?z2Bz6e8UIykVzLhCN;oX=X3(Cc+?su0 zbLz1-M;Mr5fyU%MI4jg#mcY=M%N)VjZXz!*U&G+NCy&AemJ93Z8@n&}*XS^FeBn%R zE#C1%vb1J<9z)|k#x2?6I}AR)ahG&RSiul>K<C9DjobhfaoDUv)pcXs9-9a5%{@?ST9NZRWQ}8JJXoS{Vyi zEv^^qvk9zFZ1{Hf0o&hyDnO4;W4N`|zqsAM$nGEm(^l3C>#}p|L6$`^M=)6*kS^J; zbQ37fc3~as2hO|qczF~8su|w?ntK-HxPmCAAHo%-hvUGa-VfLxY~%yke3tPJi{8b* z6E1*sZaDmH`cz4W1=|>&nS58Y6L|x4jw$O0^S|$GO&T0{8D*H_8T-HA>1Jf{n$P!- zy&`+TUZAs581^&y^Y0L6=9t3qfbWCiVf#{GGz7D6aQ+-^e@r?ZPG+V-%0 z&|v295j@cJaNTd~PDYkv`%K@sKRDU>4H!rpnRYPmv3_WGfI%twj$GZ`XE&RIjX`1m zhB=;@-+x#0ZlFOS4BH!~tIhihH0BF$0%MK)|Jhb;z<9P}l(}HTx@6jO4rvDk&IHCk zJ~R2N)PYgAjqyyQzvg$94U;7t5@s`$HHx3^xe2s+7mLC2ozwT1u?gG|IUslT>km^K zt}90NR=v_sr;D9MYyuJd4^AK2{3Vs4 zQS$7=yRWZ&?u|Rez%)Pj`1c>qJA6Jr%8N2LX!w0ea+dhE)7UeNis!8t^`3_M&MSX> Rj|65|22WQ%mvv4FO#sSgl41Y= literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_skip_previous.png b/android/app/src/main/res/drawable-xxxhdpi/ic_skip_previous.png new file mode 100644 index 0000000000000000000000000000000000000000..7035b0f5a7597fa37bb7d47494679902801f822c GIT binary patch literal 953 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU~ceqaSW-L^Y-rTY>{w=hL8T6 z-3-jM0_A-KSR4ZbypBq9ylkG%Hl>OG(bI!L2f0Oq_DrqHfBkj+w}&aOI^U)Fr=>qT zM-SN?*GX9KsuH)f&H=nd!7X? z+t@d7S}^{ZYT(AKvG6Qo4!a(+yzuc12GuR54Xh6YUt8}rZVJ9rYD za=8-JKeSZc`^skEB+Vqjpx(G&_;?b7=qcF)3_BeEzOQ1IP)uiNZ#>?4KA*w#q~L+D z2SR7}z2;45S;jmgzVh6v^KW?beL(6J-vfz< ztmpS$1ghV~G$ZQg>^su88IG+`ZfHK>d~5S*^9Iup$pZ}^j-Ix%KW^U86)Jkb?@(jh zyWVVu*CC+{+y~}&_D`(_2I18IOxps_v+yym2$W@Sv}f}FsIWo!l@;$C#&>FV+ZamOuL%H>{Az)~^O!i;%_Lo_qP4c9i2vxln$8K7sAgz&aI>uc?XI_9`akzQ*!NcQcJl3?^3P=(86L3+ zs5e+J9^q8*V<=?m5O$a|P(nLi-)o;zHk-lDuX=uYpP7!HK%bCs~|ePrtx4wCV7 L^>bP0l+XkK4iQ*v literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..e2fe9c32942237f622ecee6171ad3b7607217401 GIT binary patch literal 3232 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 LNkvXXu0mjfQ`U(N literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..03298596fdff6fadb67f9f51ddbf1fef9aad5db6 GIT binary patch literal 5549 zcmZ8l2{e?^-+pI?83q~qnw?0LEJ^l#-}jVV_Jr)q3}Iv`*(E6%C3_}o3=NTxCA&

f1YG*HTD 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 P+5rYSrrI@{E(!ky*7ssh literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..3d7313e2877ba8c9a2be749482d59ca8eee78c2e GIT binary patch literal 5806 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 MV=LlaL-OVS2fe8^fdBvi literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..1f83a33 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..5cad113 --- /dev/null +++ b/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..11e3d09 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.6.3' + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..a6d680e --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx1536M +#android.enableR8=true +android.useAndroidX=true +android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..4b82974 --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sat May 23 20:49:20 CEST 2020 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 0000000..5a2f14f --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,15 @@ +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/android/settings_aar.gradle b/android/settings_aar.gradle new file mode 100644 index 0000000..e7b4def --- /dev/null +++ b/android/settings_aar.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/assets/cover.jpg b/assets/cover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6ca5067e1b3cd56bf5a5cbe2e29a937f107adc97 GIT binary patch literal 20785 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/Jost-Italic.ttf b/assets/fonts/Jost-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5b38c7234cd8e3c6b048e9c98d98e17900ceffc9 GIT binary patch literal 73232 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 YjrXj>h$QGjMS1L6#%iA|!$b=EPd`4|WB>pF literal 0 HcmV?d00001 diff --git a/assets/fonts/Montserrat-Bold.ttf b/assets/fonts/Montserrat-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..221819bca06ec2b584dd1c24ccd701082d12774f GIT binary patch literal 244468 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 *lt(l)6c@ENm9wuF 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 l$g3wJ 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 z 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 Lg_BF?GlRba@aD!@ literal 0 HcmV?d00001 diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..e96ef60 --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,32 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..6b4c0f7 --- /dev/null +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..b53de6b --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,506 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = f.f.freezer; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = f.f.freezer; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = f.f.freezer; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..a28140c --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..70693e4 --- /dev/null +++ b/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 zcmds$`#;kQ7{|XelZftyR5~xW7?MLxS4^|Hw3&P7^y)@A9Fj{Xm1~_CIV^XZ%SLBn zA;!r`GqGHg=7>xrB{?psZQs88ZaedDoagm^KF{a*>G|dJWRSe^I$DNW008I^+;Kjt z>9p3GNR^I;v>5_`+91i(*G;u5|L+Bu6M=(afLjtkya#yZ175|z$pU~>2#^Z_pCZ7o z1c6UNcv2B3?; zX%qdxCXQpdKRz=#b*q0P%b&o)5ZrNZt7$fiETSK_VaY=mb4GK`#~0K#~9^ zcY!`#Af+4h?UMR-gMKOmpuYeN5P*RKF!(tb`)oe0j2BH1l?=>y#S5pMqkx6i{*=V9JF%>N8`ewGhRE(|WohnD59R^$_36{4>S zDFlPC5|k?;SPsDo87!B{6*7eqmMdU|QZ84>6)Kd9wNfh90=y=TFQay-0__>=<4pk& zYDjgIhL-jQ9o>z32K)BgAH+HxamL{ZL~ozu)Qqe@a`FpH=oQRA8=L-m-1dam(Ix2V z?du;LdMO+ooBelr^_y4{|44tmgH^2hSzPFd;U^!1p>6d|o)(-01z{i&Kj@)z-yfWQ)V#3Uo!_U}q3u`(fOs`_f^ueFii1xBNUB z6MecwJN$CqV&vhc+)b(p4NzGGEgwWNs z@*lUV6LaduZH)4_g!cE<2G6#+hJrWd5(|p1Z;YJ7ifVHv+n49btR}dq?HHDjl{m$T z!jLZcGkb&XS2OG~u%&R$(X+Z`CWec%QKt>NGYvd5g20)PU(dOn^7%@6kQb}C(%=vr z{?RP(z~C9DPnL{q^@pVw@|Vx~@3v!9dCaBtbh2EdtoNHm4kGxp>i#ct)7p|$QJs+U z-a3qtcPvhihub?wnJqEt>zC@)2suY?%-96cYCm$Q8R%-8$PZYsx3~QOLMDf(piXMm zB=<63yQk1AdOz#-qsEDX>>c)EES%$owHKue;?B3)8aRd}m~_)>SL3h2(9X;|+2#7X z+#2)NpD%qJvCQ0a-uzZLmz*ms+l*N}w)3LRQ*6>|Ub-fyptY(keUxw+)jfwF5K{L9 z|Cl_w=`!l_o><384d&?)$6Nh(GAm=4p_;{qVn#hI8lqewW7~wUlyBM-4Z|)cZr?Rh z=xZ&Ol>4(CU85ea(CZ^aO@2N18K>ftl8>2MqetAR53_JA>Fal`^)1Y--Am~UDa4th zKfCYpcXky$XSFDWBMIl(q=Mxj$iMBX=|j9P)^fDmF(5(5$|?Cx}DKEJa&XZP%OyE`*GvvYQ4PV&!g2|L^Q z?YG}tx;sY@GzMmsY`7r$P+F_YLz)(e}% zyakqFB<6|x9R#TdoP{R$>o7y(-`$$p0NxJ6?2B8tH)4^yF(WhqGZlM3=9Ibs$%U1w zWzcss*_c0=v_+^bfb`kBFsI`d;ElwiU%frgRB%qBjn@!0U2zZehBn|{%uNIKBA7n= zzE`nnwTP85{g;8AkYxA68>#muXa!G>xH22D1I*SiD~7C?7Za+9y7j1SHiuSkKK*^O zsZ==KO(Ua#?YUpXl{ViynyT#Hzk=}5X$e04O@fsMQjb}EMuPWFO0e&8(2N(29$@Vd zn1h8Yd>6z(*p^E{c(L0Lg=wVdupg!z@WG;E0k|4a%s7Up5C0c)55XVK*|x9RQeZ1J@1v9MX;>n34(i>=YE@Iur`0Vah(inE3VUFZNqf~tSz{1fz3Fsn_x4F>o(Yo;kpqvBe-sbwH(*Y zu$JOl0b83zu$JMvy<#oH^Wl>aWL*?aDwnS0iEAwC?DK@aT)GHRLhnz2WCvf3Ba;o=aY7 z2{Asu5MEjGOY4O#Ggz@@J;q*0`kd2n8I3BeNuMmYZf{}pg=jTdTCrIIYuW~luKecn z+E-pHY%ohj@uS0%^ z&(OxwPFPD$+#~`H?fMvi9geVLci(`K?Kj|w{rZ9JgthFHV+=6vMbK~0)Ea<&WY-NC zy-PnZft_k2tfeQ*SuC=nUj4H%SQ&Y$gbH4#2sT0cU0SdFs=*W*4hKGpuR1{)mV;Qf5pw4? zfiQgy0w3fC*w&Bj#{&=7033qFR*<*61B4f9K%CQvxEn&bsWJ{&winp;FP!KBj=(P6 z4Z_n4L7cS;ao2)ax?Tm|I1pH|uLpDSRVghkA_UtFFuZ0b2#>!8;>-_0ELjQSD-DRd z4im;599VHDZYtnWZGAB25W-e(2VrzEh|etsv2YoP#VbIZ{aFkwPrzJ#JvCvA*mXS& z`}Q^v9(W4GiSs}#s7BaN!WA2bniM$0J(#;MR>uIJ^uvgD3GS^%*ikdW6-!VFUU?JV zZc2)4cMsX@j z5HQ^e3BUzOdm}yC-xA%SY``k$rbfk z;CHqifhU*jfGM@DkYCecD9vl*qr58l6x<8URB=&%{!Cu3RO*MrKZ4VO}V6R0a zZw3Eg^0iKWM1dcTYZ0>N899=r6?+adUiBKPciJw}L$=1f4cs^bio&cr9baLF>6#BM z(F}EXe-`F=f_@`A7+Q&|QaZ??Txp_dB#lg!NH=t3$G8&06MFhwR=Iu*Im0s_b2B@| znW>X}sy~m#EW)&6E&!*0%}8UAS)wjt+A(io#wGI@Z2S+Ms1Cxl%YVE800007ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 0000000..090a3fb --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + freezer + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/lib/api/deezer.dart b/lib/api/deezer.dart new file mode 100644 index 0000000..3f6eb4c --- /dev/null +++ b/lib/api/deezer.dart @@ -0,0 +1,356 @@ +import 'package:dio/dio.dart'; +import 'package:cookie_jar/cookie_jar.dart'; +import 'package:dio_cookie_manager/dio_cookie_manager.dart'; + +import 'dart:io'; +import 'dart:convert'; + +import '../settings.dart'; +import 'definitions.dart'; + +DeezerAPI deezerAPI = DeezerAPI(); + +class DeezerAPI { + + String arl; + + DeezerAPI({this.arl}); + + String token; + String userId; + String favoritesPlaylistId; + String privateUrl = 'http://www.deezer.com/ajax/gw-light.php'; + Map headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36", + "Content-Language": '${settings.deezerLanguage??"en"}-${settings.deezerCountry??'US'}', + "Cache-Control": "max-age=0", + "Accept": "*/*", + "Accept-Charset": "utf-8,ISO-8859-1;q=0.7,*;q=0.3", + "Accept-Language": "${settings.deezerLanguage??"en"}-${settings.deezerCountry??'US'},${settings.deezerLanguage??"en"};q=0.9,en-US;q=0.8,en;q=0.7", + "Connection": "keep-alive" + }; + + CookieJar _cookieJar = new CookieJar(); + + //Call private api + Future> callApi(String method, {Map params, String gatewayInput}) async { + Dio dio = Dio(); + + //Add headers + dio.interceptors.add(InterceptorsWrapper( + onRequest: (RequestOptions options) { + options.headers = this.headers; + return options; + } + )); + //Add cookies + List cookies = [Cookie('arl', this.arl)]; + _cookieJar.saveFromResponse(Uri.parse(this.privateUrl), cookies); + dio.interceptors.add(CookieManager(_cookieJar)); + //Make request + Response response = await dio.post( + this.privateUrl, + queryParameters: { + 'api_version': '1.0', + 'api_token': this.token, + 'input': '3', + 'method': method, + + //Used for homepage + if (gatewayInput != null) + 'gateway_input': gatewayInput + }, + data: jsonEncode(params??{}), + options: Options(responseType: ResponseType.json, sendTimeout: 7000, receiveTimeout: 7000) + ); + return response.data; + } + + //Authorize, bool = success + Future authorize() async { + try { + Map data = await callApi('deezer.getUserData'); + if (data['results']['USER']['USER_ID'] == 0) { + return false; + } else { + this.token = data['results']['checkForm']; + this.userId = data['results']['USER']['USER_ID'].toString(); + this.favoritesPlaylistId = data['results']['USER']['LOVEDTRACKS_ID']; + return true; + } + } catch (e) { return false; } + } + + //Search + Future search(String query) async { + Map data = await callApi('deezer.pageSearch', params: { + 'nb': 50, + 'query': query, + 'start': 0 + }); + return SearchResults.fromPrivateJson(data['results']); + } + + Future track(String id) async { + Map data = await callApi('song.getListData', params: {'sng_ids': [id]}); + return Track.fromPrivateJson(data['results']['data'][0]); + } + + //Get album details, tracks + Future album(String id) async { + Map data = await callApi('deezer.pageAlbum', params: { + 'alb_id': id, + 'header': true, + 'lang': 'us' + }); + return Album.fromPrivateJson(data['results']['DATA'], songsJson: data['results']['SONGS']); + } + + //Get artist details + Future artist(String id) async { + Map data = await callApi('deezer.pageArtist', params: { + 'art_id': id, + 'lang': 'us', + }); + return Artist.fromPrivateJson( + data['results']['DATA'], + topJson: data['results']['TOP'], + albumsJson: data['results']['ALBUMS'] + ); + } + + //Get playlist tracks at offset + Future> playlistTracksPage(String id, int start, {int nb = 50}) async { + Map data = await callApi('deezer.pagePlaylist', params: { + 'playlist_id': id, + 'lang': 'us', + 'nb': nb, + 'tags': true, + 'start': start + }); + return data['results']['SONGS']['data'].map((json) => Track.fromPrivateJson(json)).toList(); + } + + //Get playlist details + Future playlist(String id, {int nb = 100}) async { + Map data = await callApi('deezer.pagePlaylist', params: { + 'playlist_id': id, + 'lang': 'us', + 'nb': nb, + 'tags': true, + 'start': 0 + }); + return Playlist.fromPrivateJson(data['results']['DATA'], songsJson: data['results']['SONGS']); + } + + //Get playlist with all tracks + Future fullPlaylist(String id) async { + Playlist p = await playlist(id, nb: 200); + for (int i=200; i tracks = await playlistTracksPage(id, i, nb: 200); + p.tracks.addAll(tracks); + i += 200; + continue; + } + return p; + } + + //Add track to favorites + Future addFavoriteTrack(String id) async { + await callApi('favorite_song.add', params: {'SNG_ID': id}); + } + + //Add album to favorites/library + Future addFavoriteAlbum(String id) async { + await callApi('album.addFavorite', params: {'ALB_ID': id}); + } + + //Add artist to favorites/library + Future addFavoriteArtist(String id) async { + await callApi('artist.addFavorite', params: {'ART_ID': id}); + } + + //Remove artist from favorites/library + Future removeArtist(String id) async { + await callApi('artist.deleteFavorite', params: {'ART_ID': id}); + } + + //Add tracks to playlist + Future addToPlaylist(String trackId, String playlistId, {int offset = -1}) async { + await callApi('playlist.addSongs', params: { + 'offset': offset, + 'playlist_id': playlistId, + 'songs': [[trackId, 0]] + }); + } + + //Remove track from playlist + Future removeFromPlaylist(String trackId, String playlistId) async { + await callApi('playlist.deleteSongs', params: { + 'playlist_id': playlistId, + 'songs': [[trackId, 0]] + }); + } + + //Get users playlists + Future> getPlaylists() async { + Map data = await callApi('deezer.pageProfile', params: { + 'nb': 100, + 'tab': 'playlists', + 'user_id': this.userId + }); + return data['results']['TAB']['playlists']['data'].map((json) => Playlist.fromPrivateJson(json, library: true)).toList(); + } + + //Get favorite albums + Future> getAlbums() async { + Map data = await callApi('deezer.pageProfile', params: { + 'nb': 50, + 'tab': 'albums', + 'user_id': this.userId + }); + List albumList = data['results']['TAB']['albums']['data']; + List albums = albumList.map((json) => Album.fromPrivateJson(json, library: true)).toList(); + return albums; + } + + //Remove album from library + Future removeAlbum(String id) async { + await callApi('album.deleteFavorite', params: { + 'ALB_ID': id + }); + } + + //Remove track from favorites + Future removeFavorite(String id) async { + await callApi('favorite_song.remove', params: { + 'SNG_ID': id + }); + } + + //Get favorite artists + Future> getArtists() async { + Map data = await callApi('deezer.pageProfile', params: { + 'nb': 40, + 'tab': 'artists', + 'user_id': this.userId + }); + return data['results']['TAB']['artists']['data'].map((json) => Artist.fromPrivateJson(json, library: true)).toList(); + } + + //Get lyrics by track id + Future lyrics(String trackId) async { + Map data = await callApi('song.getLyrics', params: { + 'sng_id': trackId + }); + if (data['error'] != null && data['error'].length > 0) return Lyrics().error; + return Lyrics.fromPrivateJson(data['results']); + } + + Future smartTrackList(String id) async { + Map data = await callApi('deezer.pageSmartTracklist', params: { + 'smarttracklist_id': id + }); + return SmartTrackList.fromPrivateJson(data['results']['DATA'], songsJson: data['results']['SONGS']); + } + + Future> flow() async { + Map data = await callApi('radio.getUserRadio', params: { + 'user_id': userId + }); + return data['results']['data'].map((json) => Track.fromPrivateJson(json)).toList(); + } + + //Get homepage/music library from deezer + Future homePage() async { + List grid = ['album', 'artist', 'channel', 'flow', 'playlist', 'radio', 'show', 'smarttracklist', 'track', 'user']; + Map data = await callApi('page.get', gatewayInput: jsonEncode({ + "PAGE": "home", + "VERSION": "2.3", + "SUPPORT": { + /* + "deeplink-list": ["deeplink"], + "list": ["episode"], + "grid-preview-one": grid, + "grid-preview-two": grid, + "slideshow": grid, + "message": ["call_onboarding"], + */ + "grid": grid, + "horizontal-grid": grid, + "item-highlight": ["radio"], + "large-card": ["album", "playlist", "show", "video-link"], + "ads": [] //Nope + }, + "LANG": "us", + "OPTIONS": [] + })); + return HomePage.fromPrivateJson(data['results']); + } + + //Log song listen to deezer + Future logListen(String trackId) async { + await callApi('log.listen', params: {'next_media': {'media': {'id': trackId, 'type': 'song'}}}); + } + + Future getChannel(String target) async { + List grid = ['album', 'artist', 'channel', 'flow', 'playlist', 'radio', 'show', 'smarttracklist', 'track', 'user']; + Map data = await callApi('page.get', gatewayInput: jsonEncode({ + 'PAGE': target, + "VERSION": "2.3", + "SUPPORT": { + /* + "deeplink-list": ["deeplink"], + "list": ["episode"], + "grid-preview-one": grid, + "grid-preview-two": grid, + "slideshow": grid, + "message": ["call_onboarding"], + */ + "grid": grid, + "horizontal-grid": grid, + "item-highlight": ["radio"], + "large-card": ["album", "playlist", "show", "video-link"], + "ads": [] //Nope + }, + "LANG": "us", + "OPTIONS": [] + })); + return HomePage.fromPrivateJson(data['results']); + } + + //Add playlist to library + Future addPlaylist(String id) async { + await callApi('playlist.addFavorite', params: { + 'parent_playlist_id': int.parse(id) + }); + } + //Remove playlist from library + Future removePlaylist(String id) async { + await callApi('playlist.deleteFavorite', params: { + 'playlist_id': int.parse(id) + }); + } + //Delete playlist + Future deletePlaylist(String id) async { + await callApi('playlist.delete', params: { + 'playlist_id': id + }); + } + + //Create playlist + //Status 1 - private, 2 - collaborative + Future createPlaylist(String title, {String description = "", int status = 1, List trackIds = const []}) async { + Map data = await callApi('playlist.create', params: { + 'title': title, + 'description': description, + 'songs': trackIds.map((id) => [int.parse(id), trackIds.indexOf(id)]).toList(), + 'status': status + }); + //Return playlistId + return data['results']; + } + +} + diff --git a/lib/api/definitions.dart b/lib/api/definitions.dart new file mode 100644 index 0000000..61e754f --- /dev/null +++ b/lib/api/definitions.dart @@ -0,0 +1,676 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:audio_service/audio_service.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:intl/intl.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:pointycastle/api.dart'; +import 'package:pointycastle/block/aes_fast.dart'; +import 'package:pointycastle/block/modes/ecb.dart'; +import 'package:hex/hex.dart'; +import 'package:path/path.dart' as p; +import 'package:crypto/crypto.dart' as crypto; + +import 'dart:typed_data'; +import 'dart:convert'; + +part 'definitions.g.dart'; + +@JsonSerializable() +class Track { + + String id; + String title; + Album album; + List artists; + Duration duration; + ImageDetails albumArt; + int trackNumber; + bool offline; + Lyrics lyrics; + bool favorite; + + List playbackDetails; + + Track({this.id, this.title, this.duration, this.album, this.playbackDetails, this.albumArt, + this.artists, this.trackNumber, this.offline, this.lyrics, this.favorite}); + + String get artistString => artists.map((art) => art.name).join(', '); + String get durationString => "${duration.inMinutes}:${duration.inSeconds.remainder(60).toString().padLeft(2, '0')}"; + + String getUrl(int quality) { + var md5 = crypto.md5; + int magic = 164; + List _s1 = [ + ...utf8.encode(playbackDetails[0]), + magic, + ...utf8.encode(quality.toString()), + magic, + ...utf8.encode(id), + magic, + ...utf8.encode(playbackDetails[1]) + ]; + List _s2 = [ + ...utf8.encode(HEX.encode(md5.convert(_s1).bytes)), + magic, + ..._s1, + magic + ]; + while(_s2.length%16 > 0) _s2.add(46); + String _s3 = ''; + BlockCipher cipher = ECBBlockCipher(AESFastEngine()); + cipher.init(true, KeyParameter(Uint8List.fromList('jo6aey6haid2Teih'.codeUnits))); + for (int i=0; i<_s2.length/16; i++) { + _s3 += HEX.encode(cipher.process(Uint8List.fromList(_s2.sublist(i*16, i*16+16)))); + } + return 'https://e-cdns-proxy-${playbackDetails[0][0]}.dzcdn.net/mobile/1/$_s3'; + } + + //MediaItem + MediaItem toMediaItem() => MediaItem( + title: this.title, + album: this.album.title, + artist: this.artists[0].name, + displayTitle: this.title, + displaySubtitle: this.artistString, + displayDescription: this.album.title, + artUri: this.albumArt.full, + duration: this.duration, + id: this.id, + extras: { + "playbackDetails": jsonEncode(this.playbackDetails), + "lyrics": jsonEncode(this.lyrics.toJson()), + "albumId": this.album.id, + "artists": jsonEncode(this.artists.map((art) => art.toJson()).toList()) + } + ); + + factory Track.fromMediaItem(MediaItem mi) { + //Load album and artists. + //It is stored separately, to save id and other metadata + Album album = Album(title: mi.album); + List artists = [Artist(name: mi.displaySubtitle??mi.artist)]; + if (mi.extras != null) { + album.id = mi.extras['albumId']; + if (mi.extras['artists'] != null) { + artists = jsonDecode(mi.extras['artists']).map((j) => Artist.fromJson(j)).toList(); + } + } + return Track( + title: mi.title??mi.displayTitle, + artists: artists, + album: album, + id: mi.id, + albumArt: ImageDetails(fullUrl: mi.artUri), + duration: mi.duration, + playbackDetails: null, // So it gets updated from api + lyrics: Lyrics.fromJson(jsonDecode(((mi.extras??{})['lyrics'])??"{}")) + ); + } + + //JSON + factory Track.fromPrivateJson(Map json, {bool favorite = false}) { + String title = json['SNG_TITLE']; + if (json['VERSION'] != null && json['VERSION'] != '') { + title = "${json['SNG_TITLE']} ${json['VERSION']}"; + } + return Track( + id: json['SNG_ID'], + title: title, + duration: Duration(seconds: int.parse(json['DURATION'])), + albumArt: ImageDetails.fromPrivateString(json['ALB_PICTURE']), + album: Album.fromPrivateJson(json), + artists: (json['ARTISTS']??[json]).map((dynamic art) => + Artist.fromPrivateJson(art)).toList(), + trackNumber: int.parse((json['TRACK_NUMBER']??'0').toString()), + playbackDetails: [json['MD5_ORIGIN'], json['MEDIA_VERSION']], + lyrics: Lyrics(id: json['LYRICS_ID'].toString()), + favorite: favorite + ); + } + Map toSQL({off = false}) => { + 'id': id, + 'title': title, + 'album': album.id, + 'artists': artists.map((dynamic a) => a.id).join(','), + 'duration': duration.inSeconds, + 'albumArt': albumArt.full, + 'trackNumber': trackNumber, + 'offline': off?1:0, + 'lyrics': jsonEncode(lyrics.toJson()), + 'favorite': (favorite??0)?1:0 + }; + factory Track.fromSQL(Map data) => Track( + id: data['trackId']??data['id'], //If loading from downloads table + title: data['title'], + album: Album(id: data['album']), + duration: Duration(seconds: data['duration']), + albumArt: ImageDetails(fullUrl: data['albumArt']), + trackNumber: data['trackNumber'], + artists: List.generate(data['artists'].split(',').length, (i) => Artist( + id: data['artists'].split(',')[i] + )), + offline: (data['offline'] == 1) ? true:false, + lyrics: Lyrics.fromJson(jsonDecode(data['lyrics'])), + favorite: (data['favorite'] == 1) ? true:false + ); + + factory Track.fromJson(Map json) => _$TrackFromJson(json); + Map toJson() => _$TrackToJson(this); +} + +@JsonSerializable() +class Album { + String id; + String title; + List artists; + List tracks; + ImageDetails art; + int fans; + bool offline; //If the album is offline, or just saved in db as metadata + bool library; + + Album({this.id, this.title, this.art, this.artists, this.tracks, this.fans, this.offline, this.library}); + + String get artistString => artists.map((art) => art.name).join(', '); + Duration get duration => Duration(seconds: tracks.fold(0, (v, t) => v += t.duration.inSeconds)); + String get durationString => "${duration.inMinutes}:${duration.inSeconds.remainder(60).toString().padLeft(2, '0')}"; + String get fansString => NumberFormat.compact().format(fans); + + //JSON + factory Album.fromPrivateJson(Map json, {Map songsJson = const {}, bool library = false}) => Album( + id: json['ALB_ID'], + title: json['ALB_TITLE'], + art: ImageDetails.fromPrivateString(json['ALB_PICTURE']), + artists: (json['ARTISTS']??[json]).map((dynamic art) => Artist.fromPrivateJson(art)).toList(), + tracks: (songsJson['data']??[]).map((dynamic track) => Track.fromPrivateJson(track)).toList(), + fans: json['NB_FAN'], + library: library + ); + Map toSQL({off = false}) => { + 'id': id, + 'title': title, + 'artists': artists.map((dynamic a) => a.id).join(','), + 'tracks': tracks.map((dynamic t) => t.id).join(','), + 'art': art.full, + 'fans': fans, + 'offline': off?1:0, + 'library': (library??false)?1:0 + }; + factory Album.fromSQL(Map data) => Album( + id: data['id'], + title: data['title'], + artists: List.generate(data['artists'].split(',').length, (i) => Artist( + id: data['artists'].split(',')[i] + )), + tracks: List.generate(data['tracks'].split(',').length, (i) => Track( + id: data['tracks'].split(',')[i] + )), + art: ImageDetails(fullUrl: data['art']), + fans: data['fans'], + offline: (data['offline'] == 1) ? true:false, + library: (data['library'] == 1) ? true:false + ); + + factory Album.fromJson(Map json) => _$AlbumFromJson(json); + Map toJson() => _$AlbumToJson(this); +} + +@JsonSerializable() +class Artist { + String id; + String name; + List albums; + int albumCount; + List topTracks; + ImageDetails picture; + int fans; + bool offline; + bool library; + + Artist({this.id, this.name, this.albums, this.albumCount, this.topTracks, this.picture, this.fans, this.offline, this.library}); + + String get fansString => NumberFormat.compact().format(fans); + + //JSON + factory Artist.fromPrivateJson( + Map json, { + Map albumsJson = const {}, + Map topJson = const {}, + bool library = false + }) => Artist( + id: json['ART_ID'], + name: json['ART_NAME'], + fans: json['NB_FAN'], + picture: ImageDetails.fromPrivateString(json['ART_PICTURE'], type: 'artist'), + albumCount: albumsJson['total'], + albums: (albumsJson['data']??[]).map((dynamic data) => Album.fromPrivateJson(data)).toList(), + topTracks: (topJson['data']??[]).map((dynamic data) => Track.fromPrivateJson(data)).toList(), + library: library + ); + Map toSQL({off = false}) => { + 'id': id, + 'name': name, + 'albums': albums.map((dynamic a) => a.id).join(','), + 'topTracks': topTracks.map((dynamic t) => t.id).join(','), + 'picture': picture.full, + 'fans': fans, + 'albumCount': this.albumCount??(this.albums??[]).length, + 'offline': off?1:0, + 'library': (library??false)?1:0 + }; + factory Artist.fromSQL(Map data) => Artist( + id: data['id'], + name: data['name'], + topTracks: List.generate(data['topTracks'].split(',').length, (i) => Track( + id: data['topTracks'].split(',')[i] + )), + albums: List.generate(data['albums'].split(',').length, (i) => Album( + id: data['albums'].split(',')[i] + )), + albumCount: data['albumCount'], + picture: ImageDetails(fullUrl: data['picture']), + fans: data['fans'], + offline: (data['offline'] == 1)?true:false, + library: (data['library'] == 1)?true:false + ); + + factory Artist.fromJson(Map json) => _$ArtistFromJson(json); + Map toJson() => _$ArtistToJson(this); +} + +@JsonSerializable() +class Playlist { + String id; + String title; + List tracks; + ImageDetails image; + Duration duration; + int trackCount; + User user; + int fans; + bool library; + String description; + + Playlist({this.id, this.title, this.tracks, this.image, this.trackCount, this.duration, this.user, this.fans, this.library, this.description}); + + String get durationString => "${duration.inHours}:${duration.inMinutes.remainder(60).toString().padLeft(2, '0')}:${duration.inSeconds.remainder(60).toString().padLeft(2, '0')}"; + + //JSON + factory Playlist.fromPrivateJson(Map json, {Map songsJson = const {}, bool library = false}) => Playlist( + id: json['PLAYLIST_ID'], + title: json['TITLE'], + trackCount: json['NB_SONG']??songsJson['total'], + image: ImageDetails.fromPrivateString(json['PLAYLIST_PICTURE'], type: 'playlist'), + fans: json['NB_FAN'], + duration: Duration(seconds: json['DURATION']??0), + description: json['DESCRIPTION'], + user: User( + id: json['PARENT_USER_ID'], + name: json['PARENT_USERNAME']??'', + picture: ImageDetails.fromPrivateString(json['PARENT_USER_PICTURE'], type: 'user') + ), + tracks: (songsJson['data']??[]).map((dynamic data) => Track.fromPrivateJson(data)).toList(), + library: library + ); + Map toSQL() => { + 'id': id, + 'title': title, + 'tracks': tracks.map((dynamic t) => t.id).join(','), + 'image': image.full, + 'duration': duration.inSeconds, + 'userId': user.id, + 'userName': user.name, + 'fans': fans, + 'description': description, + 'library': (library??false)?1:0 + }; + factory Playlist.fromSQL(data) => Playlist( + id: data['id'], + title: data['title'], + description: data['description'], + tracks: List.generate(data['tracks'].split(',').length, (i) => Track( + id: data['tracks'].split(',')[i] + )), + image: ImageDetails(fullUrl: data['image']), + duration: Duration(seconds: data['duration']), + user: User( + id: data['userId'], + name: data['userName'] + ), + fans: data['fans'], + library: (data['library'] == 1)?true:false + ); + + factory Playlist.fromJson(Map json) => _$PlaylistFromJson(json); + Map toJson() => _$PlaylistToJson(this); +} + +@JsonSerializable() +class User { + String id; + String name; + ImageDetails picture; + + User({this.id, this.name, this.picture}); + + //Mostly handled by playlist + + factory User.fromJson(Map json) => _$UserFromJson(json); + Map toJson() => _$UserToJson(this); +} + +@JsonSerializable() +class ImageDetails { + String fullUrl; + String thumbUrl; + + ImageDetails({this.fullUrl, this.thumbUrl}); + + //Get full/thumb with fallback + String get full => fullUrl??thumbUrl; + String get thumb => thumbUrl??fullUrl; + + //JSON + factory ImageDetails.fromPrivateString(String art, {String type='cover'}) => ImageDetails( + fullUrl: 'https://e-cdns-images.dzcdn.net/images/$type/$art/1400x1400-000000-80-0-0.jpg', + thumbUrl: 'https://e-cdns-images.dzcdn.net/images/$type/$art/180x180-000000-80-0-0.jpg' + ); + factory ImageDetails.fromPrivateJson(Map json) => ImageDetails.fromPrivateString( + json['MD5'].split('-').first, + type: json['TYPE'] + ); + + factory ImageDetails.fromJson(Map json) => _$ImageDetailsFromJson(json); + Map toJson() => _$ImageDetailsToJson(this); +} + +class SearchResults { + List tracks; + List albums; + List artists; + List playlists; + + SearchResults({this.tracks, this.albums, this.artists, this.playlists}); + + //Check if no search results + bool get empty { + return ((tracks == null || tracks.length == 0) && + (albums == null || albums.length == 0) && + (artists == null || artists.length == 0) && + (playlists == null || playlists.length == 0)); + } + + factory SearchResults.fromPrivateJson(Map json) => SearchResults( + tracks: json['TRACK']['data'].map((dynamic data) => Track.fromPrivateJson(data)).toList(), + albums: json['ALBUM']['data'].map((dynamic data) => Album.fromPrivateJson(data)).toList(), + artists: json['ARTIST']['data'].map((dynamic data) => Artist.fromPrivateJson(data)).toList(), + playlists: json['PLAYLIST']['data'].map((dynamic data) => Playlist.fromPrivateJson(data)).toList() + ); +} + +@JsonSerializable() +class Lyrics { + String id; + String writers; + List lyrics; + + Lyrics({this.id, this.writers, this.lyrics}); + + Lyrics get error => Lyrics( + id: id, + writers: writers, + lyrics: [Lyric( + offset: Duration(milliseconds: 0), + text: 'Error loading lyrics!' + )] + ); + + //JSON + factory Lyrics.fromPrivateJson(Map json) { + Lyrics l = Lyrics( + id: json['LYRICS_ID'], + writers: json['LYRICS_WRITERS'], + lyrics: json['LYRICS_SYNC_JSON'].map((l) => Lyric.fromPrivateJson(l)).toList() + ); + //Clean empty lyrics + l.lyrics.removeWhere((l) => l.offset == null); + return l; + } + + factory Lyrics.fromJson(Map json) => _$LyricsFromJson(json); + Map toJson() => _$LyricsToJson(this); +} + +@JsonSerializable() +class Lyric { + Duration offset; + String text; + + Lyric({this.offset, this.text}); + + //JSON + factory Lyric.fromPrivateJson(Map json) { + if (json['milliseconds'] == null || json['line'] == null) return Lyric(); //Empty lyric + return Lyric( + offset: Duration(milliseconds: int.parse(json['milliseconds'].toString())), + text: json['line'] + ); + } + + factory Lyric.fromJson(Map json) => _$LyricFromJson(json); + Map toJson() => _$LyricToJson(this); +} + +@JsonSerializable() +class QueueSource { + String id; + String text; + String source; + + QueueSource({this.id, this.text, this.source}); + + factory QueueSource.fromJson(Map json) => _$QueueSourceFromJson(json); + Map toJson() => _$QueueSourceToJson(this); +} + +@JsonSerializable() +class SmartTrackList { + String id; + String title; + String subtitle; + String description; + int trackCount; + List tracks; + ImageDetails cover; + + SmartTrackList({this.id, this.title, this.description, this.trackCount, this.tracks, this.cover, this.subtitle}); + + //JSON + factory SmartTrackList.fromPrivateJson(Map json, {Map songsJson = const {}}) => SmartTrackList( + id: json['SMARTTRACKLIST_ID'], + title: json['TITLE'], + subtitle: json['SUBTITLE'], + description: json['DESCRIPTION'], + trackCount: json['NB_SONG']??(songsJson['total']), + tracks: (songsJson['data']??[]).map((t) => Track.fromPrivateJson(t)).toList(), + cover: ImageDetails.fromPrivateJson(json['COVER']) + ); + + factory SmartTrackList.fromJson(Map json) => _$SmartTrackListFromJson(json); + Map toJson() => _$SmartTrackListToJson(this); +} + +@JsonSerializable() +class HomePage { + + List sections; + + HomePage({this.sections}); + + //Save/Load + Future _getPath() async { + Directory d = await getApplicationDocumentsDirectory(); + return p.join(d.path, 'homescreen.json'); + } + Future exists() async { + String path = await _getPath(); + return await File(path).exists(); + } + Future save() async { + String path = await _getPath(); + await File(path).writeAsString(jsonEncode(this.toJson())); + } + Future load() async { + String path = await _getPath(); + Map data = jsonDecode(await File(path).readAsString()); + return HomePage.fromJson(data); + } + + //JSON + factory HomePage.fromPrivateJson(Map json) { + HomePage hp = HomePage(sections: []); + //Parse every section + for (var s in (json['sections']??[])) { + HomePageSection section = HomePageSection.fromPrivateJson(s); + if (section != null) hp.sections.add(section); + } + return hp; + } + + factory HomePage.fromJson(Map json) => _$HomePageFromJson(json); + Map toJson() => _$HomePageToJson(this); +} + +@JsonSerializable() +class HomePageSection { + + String title; + HomePageSectionLayout layout; + + @JsonKey(fromJson: _homePageItemFromJson, toJson: _homePageItemToJson) + List items; + + HomePageSection({this.layout, this.items, this.title}); + + //JSON + factory HomePageSection.fromPrivateJson(Map json) { + HomePageSection hps = HomePageSection(title: json['title'], items: []); + String layout = json['layout']; + //No ads there + if (layout == 'ads') return null; + if (layout == 'horizontal-grid' || layout == 'grid') { + hps.layout = HomePageSectionLayout.ROW; + } else { + //Currently only row layout + return null; + } + //Parse items + for (var i in (json['items']??[])) { + HomePageItem hpi = HomePageItem.fromPrivateJson(i); + if (hpi != null) hps.items.add(hpi); + } + return hps; + } + + factory HomePageSection.fromJson(Map json) => _$HomePageSectionFromJson(json); + Map toJson() => _$HomePageSectionToJson(this); + + static _homePageItemFromJson(json) => json.map((d) => HomePageItem.fromJson(d)).toList(); + static _homePageItemToJson(items) => items.map((i) => i.toJson()).toList(); +} + +class HomePageItem { + HomePageItemType type; + dynamic value; + + HomePageItem({this.type, this.value}); + + factory HomePageItem.fromPrivateJson(Map json) { + String type = json['type']; + switch (type) { + //Smart Track List + case 'flow': + case 'smarttracklist': + return HomePageItem(type: HomePageItemType.SMARTTRACKLIST, value: SmartTrackList.fromPrivateJson(json['data'])); + case 'playlist': + return HomePageItem(type: HomePageItemType.PLAYLIST, value: Playlist.fromPrivateJson(json['data'])); + case 'artist': + return HomePageItem(type: HomePageItemType.ARTIST, value: Artist.fromPrivateJson(json['data'])); + case 'channel': + return HomePageItem(type: HomePageItemType.CHANNEL, value: DeezerChannel.fromPrivateJson(json)); + case 'album': + return HomePageItem(type: HomePageItemType.ALBUM, value: Album.fromPrivateJson(json['data'])); + default: + return null; + } + } + + factory HomePageItem.fromJson(Map json) { + String _t = json['type']; + switch (_t) { + case 'SMARTTRACKLIST': + return HomePageItem(type: HomePageItemType.SMARTTRACKLIST, value: SmartTrackList.fromJson(json['value'])); + case 'PLAYLIST': + return HomePageItem(type: HomePageItemType.PLAYLIST, value: Playlist.fromJson(json['value'])); + case 'ARTIST': + return HomePageItem(type: HomePageItemType.ARTIST, value: Artist.fromJson(json['value'])); + case 'CHANNEL': + return HomePageItem(type: HomePageItemType.CHANNEL, value: DeezerChannel.fromJson(json['value'])); + case 'ALBUM': + return HomePageItem(type: HomePageItemType.ALBUM, value: Album.fromJson(json['value'])); + default: + return HomePageItem(); + } + } + + Map toJson() { + String type = this.type.toString().split('.').last; + return {'type': type, 'value': value.toJson()}; + } + +} + +@JsonSerializable() +class DeezerChannel { + + String id; + String target; + String title; + @JsonKey(fromJson: _colorFromJson, toJson: _colorToJson) + Color backgroundColor; + + DeezerChannel({this.id, this.title, this.backgroundColor, this.target}); + + factory DeezerChannel.fromPrivateJson(Map json) => DeezerChannel( + id: json['id'], + title: json['title'], + backgroundColor: Color(int.parse(json['background_color'].replaceFirst('#', 'FF'), radix: 16)), + target: json['target'].replaceFirst('/', '') + ); + + //JSON + static _colorToJson(Color c) => c.value; + static _colorFromJson(int v) => Color(v??Colors.blue.value); + factory DeezerChannel.fromJson(Map json) => _$DeezerChannelFromJson(json); + Map toJson() => _$DeezerChannelToJson(this); +} + +enum HomePageItemType { + SMARTTRACKLIST, + PLAYLIST, + ARTIST, + CHANNEL, + ALBUM +} + +enum HomePageSectionLayout { + ROW +} + +enum RepeatType { + NONE, + LIST, + TRACK +} \ No newline at end of file diff --git a/lib/api/definitions.g.dart b/lib/api/definitions.g.dart new file mode 100644 index 0000000..8d840b8 --- /dev/null +++ b/lib/api/definitions.g.dart @@ -0,0 +1,338 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'definitions.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Track _$TrackFromJson(Map json) { + return Track( + id: json['id'] as String, + title: json['title'] as String, + duration: json['duration'] == null + ? null + : Duration(microseconds: json['duration'] as int), + album: json['album'] == null + ? null + : Album.fromJson(json['album'] as Map), + playbackDetails: json['playbackDetails'] as List, + albumArt: json['albumArt'] == null + ? null + : ImageDetails.fromJson(json['albumArt'] as Map), + artists: (json['artists'] as List) + ?.map((e) => + e == null ? null : Artist.fromJson(e as Map)) + ?.toList(), + trackNumber: json['trackNumber'] as int, + offline: json['offline'] as bool, + lyrics: json['lyrics'] == null + ? null + : Lyrics.fromJson(json['lyrics'] as Map), + favorite: json['favorite'] as bool, + ); +} + +Map _$TrackToJson(Track instance) => { + 'id': instance.id, + 'title': instance.title, + 'album': instance.album, + 'artists': instance.artists, + 'duration': instance.duration?.inMicroseconds, + 'albumArt': instance.albumArt, + 'trackNumber': instance.trackNumber, + 'offline': instance.offline, + 'lyrics': instance.lyrics, + 'favorite': instance.favorite, + 'playbackDetails': instance.playbackDetails, + }; + +Album _$AlbumFromJson(Map json) { + return Album( + id: json['id'] as String, + title: json['title'] as String, + art: json['art'] == null + ? null + : ImageDetails.fromJson(json['art'] as Map), + artists: (json['artists'] as List) + ?.map((e) => + e == null ? null : Artist.fromJson(e as Map)) + ?.toList(), + tracks: (json['tracks'] as List) + ?.map( + (e) => e == null ? null : Track.fromJson(e as Map)) + ?.toList(), + fans: json['fans'] as int, + offline: json['offline'] as bool, + library: json['library'] as bool, + ); +} + +Map _$AlbumToJson(Album instance) => { + 'id': instance.id, + 'title': instance.title, + 'artists': instance.artists, + 'tracks': instance.tracks, + 'art': instance.art, + 'fans': instance.fans, + 'offline': instance.offline, + 'library': instance.library, + }; + +Artist _$ArtistFromJson(Map json) { + return Artist( + id: json['id'] as String, + name: json['name'] as String, + albums: (json['albums'] as List) + ?.map( + (e) => e == null ? null : Album.fromJson(e as Map)) + ?.toList(), + albumCount: json['albumCount'] as int, + topTracks: (json['topTracks'] as List) + ?.map( + (e) => e == null ? null : Track.fromJson(e as Map)) + ?.toList(), + picture: json['picture'] == null + ? null + : ImageDetails.fromJson(json['picture'] as Map), + fans: json['fans'] as int, + offline: json['offline'] as bool, + library: json['library'] as bool, + ); +} + +Map _$ArtistToJson(Artist instance) => { + 'id': instance.id, + 'name': instance.name, + 'albums': instance.albums, + 'albumCount': instance.albumCount, + 'topTracks': instance.topTracks, + 'picture': instance.picture, + 'fans': instance.fans, + 'offline': instance.offline, + 'library': instance.library, + }; + +Playlist _$PlaylistFromJson(Map json) { + return Playlist( + id: json['id'] as String, + title: json['title'] as String, + tracks: (json['tracks'] as List) + ?.map( + (e) => e == null ? null : Track.fromJson(e as Map)) + ?.toList(), + image: json['image'] == null + ? null + : ImageDetails.fromJson(json['image'] as Map), + trackCount: json['trackCount'] as int, + duration: json['duration'] == null + ? null + : Duration(microseconds: json['duration'] as int), + user: json['user'] == null + ? null + : User.fromJson(json['user'] as Map), + fans: json['fans'] as int, + library: json['library'] as bool, + description: json['description'] as String, + ); +} + +Map _$PlaylistToJson(Playlist instance) => { + 'id': instance.id, + 'title': instance.title, + 'tracks': instance.tracks, + 'image': instance.image, + 'duration': instance.duration?.inMicroseconds, + 'trackCount': instance.trackCount, + 'user': instance.user, + 'fans': instance.fans, + 'library': instance.library, + 'description': instance.description, + }; + +User _$UserFromJson(Map json) { + return User( + id: json['id'] as String, + name: json['name'] as String, + picture: json['picture'] == null + ? null + : ImageDetails.fromJson(json['picture'] as Map), + ); +} + +Map _$UserToJson(User instance) => { + 'id': instance.id, + 'name': instance.name, + 'picture': instance.picture, + }; + +ImageDetails _$ImageDetailsFromJson(Map json) { + return ImageDetails( + fullUrl: json['fullUrl'] as String, + thumbUrl: json['thumbUrl'] as String, + ); +} + +Map _$ImageDetailsToJson(ImageDetails instance) => + { + 'fullUrl': instance.fullUrl, + 'thumbUrl': instance.thumbUrl, + }; + +Lyrics _$LyricsFromJson(Map json) { + return Lyrics( + id: json['id'] as String, + writers: json['writers'] as String, + lyrics: (json['lyrics'] as List) + ?.map( + (e) => e == null ? null : Lyric.fromJson(e as Map)) + ?.toList(), + ); +} + +Map _$LyricsToJson(Lyrics instance) => { + 'id': instance.id, + 'writers': instance.writers, + 'lyrics': instance.lyrics, + }; + +Lyric _$LyricFromJson(Map json) { + return Lyric( + offset: json['offset'] == null + ? null + : Duration(microseconds: json['offset'] as int), + text: json['text'] as String, + ); +} + +Map _$LyricToJson(Lyric instance) => { + 'offset': instance.offset?.inMicroseconds, + 'text': instance.text, + }; + +QueueSource _$QueueSourceFromJson(Map json) { + return QueueSource( + id: json['id'] as String, + text: json['text'] as String, + source: json['source'] as String, + ); +} + +Map _$QueueSourceToJson(QueueSource instance) => + { + 'id': instance.id, + 'text': instance.text, + 'source': instance.source, + }; + +SmartTrackList _$SmartTrackListFromJson(Map json) { + return SmartTrackList( + id: json['id'] as String, + title: json['title'] as String, + description: json['description'] as String, + trackCount: json['trackCount'] as int, + tracks: (json['tracks'] as List) + ?.map( + (e) => e == null ? null : Track.fromJson(e as Map)) + ?.toList(), + cover: json['cover'] == null + ? null + : ImageDetails.fromJson(json['cover'] as Map), + subtitle: json['subtitle'] as String, + ); +} + +Map _$SmartTrackListToJson(SmartTrackList instance) => + { + 'id': instance.id, + 'title': instance.title, + 'subtitle': instance.subtitle, + 'description': instance.description, + 'trackCount': instance.trackCount, + 'tracks': instance.tracks, + 'cover': instance.cover, + }; + +HomePage _$HomePageFromJson(Map json) { + return HomePage( + sections: (json['sections'] as List) + ?.map((e) => e == null + ? null + : HomePageSection.fromJson(e as Map)) + ?.toList(), + ); +} + +Map _$HomePageToJson(HomePage instance) => { + 'sections': instance.sections, + }; + +HomePageSection _$HomePageSectionFromJson(Map json) { + return HomePageSection( + layout: + _$enumDecodeNullable(_$HomePageSectionLayoutEnumMap, json['layout']), + items: HomePageSection._homePageItemFromJson(json['items']), + title: json['title'] as String, + ); +} + +Map _$HomePageSectionToJson(HomePageSection instance) => + { + 'title': instance.title, + 'layout': _$HomePageSectionLayoutEnumMap[instance.layout], + 'items': HomePageSection._homePageItemToJson(instance.items), + }; + +T _$enumDecode( + Map enumValues, + dynamic source, { + T unknownValue, +}) { + if (source == null) { + throw ArgumentError('A value must be provided. Supported values: ' + '${enumValues.values.join(', ')}'); + } + + final value = enumValues.entries + .singleWhere((e) => e.value == source, orElse: () => null) + ?.key; + + if (value == null && unknownValue == null) { + throw ArgumentError('`$source` is not one of the supported values: ' + '${enumValues.values.join(', ')}'); + } + return value ?? unknownValue; +} + +T _$enumDecodeNullable( + Map enumValues, + dynamic source, { + T unknownValue, +}) { + if (source == null) { + return null; + } + return _$enumDecode(enumValues, source, unknownValue: unknownValue); +} + +const _$HomePageSectionLayoutEnumMap = { + HomePageSectionLayout.ROW: 'ROW', +}; + +DeezerChannel _$DeezerChannelFromJson(Map json) { + return DeezerChannel( + id: json['id'] as String, + title: json['title'] as String, + backgroundColor: + DeezerChannel._colorFromJson(json['backgroundColor'] as int), + target: json['target'] as String, + ); +} + +Map _$DeezerChannelToJson(DeezerChannel instance) => + { + 'id': instance.id, + 'target': instance.target, + 'title': instance.title, + 'backgroundColor': DeezerChannel._colorToJson(instance.backgroundColor), + }; diff --git a/lib/api/download.dart b/lib/api/download.dart new file mode 100644 index 0000000..bd7b7f5 --- /dev/null +++ b/lib/api/download.dart @@ -0,0 +1,577 @@ +import 'package:disk_space/disk_space.dart'; +import 'package:ext_storage/ext_storage.dart'; +import 'package:flutter/services.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:random_string/random_string.dart'; +import 'package:sqflite/sqflite.dart'; +import 'package:path/path.dart' as p; +import 'package:dio/dio.dart'; +import 'package:filesize/filesize.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; + +import 'dart:io'; + +import 'dart:async'; +import 'deezer.dart'; +import '../settings.dart'; +import 'definitions.dart'; +import '../ui/cached_image.dart'; + +DownloadManager downloadManager = DownloadManager(); +MethodChannel platformChannel = const MethodChannel('f.f.freezer/native'); + +class DownloadManager { + + Database db; + List queue = []; + String _offlinePath; + Future _download; + FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin; + bool _cancelNotifications = true; + + bool get stopped => queue.length > 0 && _download == null; + + Future init() async { + //Prepare DB + String dir = await getDatabasesPath(); + String path = p.join(dir, 'offline.db'); + db = await openDatabase( + path, + version: 1, + onCreate: (Database db, int version) async { + Batch b = db.batch(); + //Create tables + b.execute(""" CREATE TABLE downloads ( + id INTEGER PRIMARY KEY AUTOINCREMENT, path TEXT, url TEXT, private INTEGER, state INTEGER, trackId TEXT)"""); + b.execute("""CREATE TABLE tracks ( + id TEXT PRIMARY KEY, title TEXT, album TEXT, artists TEXT, duration INTEGER, albumArt TEXT, trackNumber INTEGER, offline INTEGER, lyrics TEXT, favorite INTEGER)"""); + b.execute("""CREATE TABLE albums ( + id TEXT PRIMARY KEY, title TEXT, artists TEXT, tracks TEXT, art TEXT, fans INTEGER, offline INTEGER, library INTEGER)"""); + b.execute("""CREATE TABLE artists ( + id TEXT PRIMARY KEY, name TEXT, albums TEXT, topTracks TEXT, picture TEXT, fans INTEGER, albumCount INTEGER, offline INTEGER, library INTEGER)"""); + b.execute("""CREATE TABLE playlists ( + id TEXT PRIMARY KEY, title TEXT, tracks TEXT, image TEXT, duration INTEGER, userId TEXT, userName TEXT, fans INTEGER, library INTEGER, description TEXT)"""); + await b.commit(); + } + ); + //Prepare folders (/sdcard/Android/data/freezer/data/) + _offlinePath = p.join((await getExternalStorageDirectory()).path, 'offline/'); + await Directory(_offlinePath).create(recursive: true); + + //Notifications + await _prepareNotifications(); + + //Restore + List downloads = await db.rawQuery("SELECT * FROM downloads INNER JOIN tracks ON tracks.id = downloads.trackId WHERE downloads.state = 0"); + downloads.forEach((download) => queue.add(Download.fromSQL(download, parseTrack: true))); + } + + //Initialize flutter local notification plugin + Future _prepareNotifications() async { + flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); + AndroidInitializationSettings androidInitializationSettings = AndroidInitializationSettings('@drawable/ic_logo'); + InitializationSettings initializationSettings = InitializationSettings(androidInitializationSettings, null); + await flutterLocalNotificationsPlugin.initialize(initializationSettings); + } + + //Show download progress notification, if now/total = null, show intermediate + Future _startProgressNotification() async { + _cancelNotifications = false; + Timer.periodic(Duration(milliseconds: 500), (timer) async { + //Cancel notifications + if (_cancelNotifications) { + flutterLocalNotificationsPlugin.cancel(10); + timer.cancel(); + return; + } + //Not downloading + if (this.queue.length <= 0) return; + Download d = queue[0]; + //Prepare and show notification + AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails( + 'download', 'Download', 'Download', + importance: Importance.Default, + priority: Priority.Default, + showProgress: true, + maxProgress: d.total??1, + progress: d.received??1, + playSound: false, + enableVibration: false, + autoCancel: true, + //ongoing: true, //Allow dismissing + indeterminate: (d.total == null || d.total == d.received), + onlyAlertOnce: true + ); + NotificationDetails notificationDetails = NotificationDetails(androidNotificationDetails, null); + await downloadManager.flutterLocalNotificationsPlugin.show( + 10, + 'Downloading: ${d.track.title}', + (d.state == DownloadState.POST) ? 'Post processing...' : '${filesize(d.received)} / ${filesize(d.total)} (${queue.length} in queue)', + notificationDetails + ); + }); + } + + //Update queue, start new download + void updateQueue() async { + if (_download == null && queue.length > 0) { + _download = queue[0].download( + onDone: () async { + //On download finished + await db.rawUpdate('UPDATE downloads SET state = 1 WHERE trackId = ?', [queue[0].track.id]); + /* + if (queue[0].private) { + await db.rawUpdate('UPDATE downloads SET state = 1 WHERE trackId = ?', [queue[0].track.id]); + } else { + //Remove on db if public + await db.delete('downloads', where: 'trackId = ?', whereArgs: [queue[0].track.id]); + } + */ + queue.removeAt(0); + _download = null; + //Remove notification if no more downloads + if (queue.length == 0) { + _cancelNotifications = true; + } + updateQueue(); + } + ).catchError((err) async { + //Catch download errors + _download = null; + _cancelNotifications = true; + await _showError(); + }); + //Show download progress notifications + if (_cancelNotifications == null || _cancelNotifications) _startProgressNotification(); + } + } + + //Show error notification + Future _showError() async { + AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails( + 'downloadError', 'Download Error', 'Download Error' + ); + NotificationDetails notificationDetails = NotificationDetails(androidNotificationDetails, null); + flutterLocalNotificationsPlugin.show( + 11, 'Error while downloading!', 'Please restart downloads in the library', notificationDetails + ); + } + + //Returns all offline tracks + Future> allOfflineTracks() async { + List data = await db.query('tracks', where: 'offline == 1'); + List tracks = []; + //Load track data + for (var t in data) { + tracks.add(await getTrack(t['id'])); + } + return tracks; + } + + //Get all offline playlists + Future> getOfflinePlaylists() async { + List data = await db.query('playlists'); + List playlists = []; + //Load playlists + for (var p in data) { + playlists.add(await getPlaylist(p['id'])); + } + return playlists; + } + + //Get playlist metadata with tracks + Future getPlaylist(String id) async { + if (id == null) return null; + List data = await db.query('playlists', where: 'id == ?', whereArgs: [id]); + if (data.length == 0) return null; + //Load playlist tracks + Playlist p = Playlist.fromSQL(data[0]); + for (int i=0; i getFavorites() async { + return await getPlaylist('FAVORITES'); + } + + Future> getOfflineAlbums({List albumsData}) async { + //Load albums + if (albumsData == null) { + albumsData = await db.query('albums', where: 'offline == 1'); + } + List albums = albumsData.map((alb) => Album.fromSQL(alb)).toList(); + for(int i=0; i((a) => Artist.fromSQL(a)).toList(); + } + return albums; + } + + //Get track with metadata from db + Future getTrack(String id, {Album album, List artists}) async { + List tracks = await db.query('tracks', where: 'id == ?', whereArgs: [id]); + if (tracks.length == 0) return null; + Track t = Track.fromSQL(tracks[0]); + //Load album from DB + t.album = album ?? Album.fromSQL((await db.query('albums', where: 'id == ?', whereArgs: [t.album.id]))[0]); + if (artists != null) { + t.artists = artists; + return t; + } + //Load artists from DB + for (int i=0; i 0) return; + //and in playlists + counter = await db.rawQuery('SELECT COUNT(*) FROM playlists WHERE tracks LIKE "%$id%"'); + if (counter[0]['COUNT(*)'] > 0) return; + //Remove file + List download = await db.query('downloads', where: 'trackId == ?', whereArgs: [id]); + await File(download[0]['path']).delete(); + //Delete from db + await db.delete('tracks', where: 'id == ?', whereArgs: [id]); + await db.delete('downloads', where: 'trackId == ?', whereArgs: [id]); + } + + //Delete offline album + Future removeOfflineAlbum(String id) async { + List data = await db.rawQuery('SELECT * FROM albums WHERE id == ? AND offline == 1', [id]); + if (data.length == 0) return; + Map album = Map.from(data[0]); //make writable + //Remove DB + album['offline'] = 0; + await db.update('albums', album, where: 'id == ?', whereArgs: [id]); + //Get track ids + List tracks = album['tracks'].split(','); + for (String t in tracks) { + //Remove tracks + await removeOfflineTrack(t); + } + } + + Future removeOfflinePlaylist(String id) async { + List data = await db.query('playlists', where: 'id == ?', whereArgs: [id]); + if (data.length == 0) return; + Playlist p = Playlist.fromSQL(data[0]); + //Remove db + await db.delete('playlists', where: 'id == ?', whereArgs: [id]); + //Remove tracks + for(Track t in p.tracks) { + await removeOfflineTrack(t.id); + } + } + + //Get path to offline track + Future getOfflineTrackPath(String id) async { + List tracks = await db.rawQuery('SELECT path FROM downloads WHERE state == 1 AND trackId == ?', [id]); + if (tracks.length < 1) { + return null; + } + Download d = Download.fromSQL(tracks[0]); + return d.path; + } + + Future addOfflineTrack(Track track, {private = true}) async { + //Paths + String path = p.join(_offlinePath, track.id); + if (track.playbackDetails == null) { + //Get track from API if download info missing + track = await deezerAPI.track(track.id); + } + //Load lyrics + try { + Lyrics l = await deezerAPI.lyrics(track.id); + track.lyrics = l; + } catch (e) {} + + String url = track.getUrl(settings.getQualityInt(settings.offlineQuality)); + if (!private) { + //Check permissions + if (!(await Permission.storage.request().isGranted)) { + return; + } + //If saving to external + url = track.getUrl(settings.getQualityInt(settings.downloadQuality)); + //Save just extension to path, will be generated before download + path = 'mp3'; + if (settings.downloadQuality == AudioQuality.FLAC) { + path = 'flac'; + } + } + + Download download = Download(track: track, path: path, url: url, private: private); + //Database + Batch b = db.batch(); + b.insert('downloads', download.toSQL()); + b.insert('tracks', track.toSQL(off: false), conflictAlgorithm: ConflictAlgorithm.ignore); + + if (private) { + //Duplicate check + List duplicate = await db.rawQuery('SELECT * FROM downloads WHERE trackId == ?', [track.id]); + if (duplicate.length != 0) return; + //Save art + await imagesDatabase.getImage(track.albumArt.full, permanent: true); + //Save to db + b.insert('tracks', track.toSQL(off: true), conflictAlgorithm: ConflictAlgorithm.replace); + b.insert('albums', track.album.toSQL(), conflictAlgorithm: ConflictAlgorithm.ignore); + track.artists.forEach((art) => b.insert('artists', art.toSQL(), conflictAlgorithm: ConflictAlgorithm.ignore)); + } + await b.commit(); + + queue.add(download); + updateQueue(); + } + + Future addOfflineAlbum(Album album, {private = true}) async { + //Get full album from API if tracks are missing + if (album.tracks == null || album.tracks.length == 0) { + album = await deezerAPI.album(album.id); + } + //Update album in database + if (private) { + await db.insert('albums', album.toSQL(off: true), conflictAlgorithm: ConflictAlgorithm.replace); + } + //Save all tracks + for (Track track in album.tracks) { + await addOfflineTrack(track, private: private); + } + } + + //Add offline playlist, can be also used as update + Future addOfflinePlaylist(Playlist playlist, {private = true}) async { + //Load full playlist if missing tracks + if (playlist.tracks == null || playlist.tracks.length != playlist.trackCount) { + playlist = await deezerAPI.fullPlaylist(playlist.id); + } + playlist.library = true; + //To DB + if (private) { + await db.insert('playlists', playlist.toSQL(), conflictAlgorithm: ConflictAlgorithm.replace); + } + //Download all tracks + for (Track t in playlist.tracks) { + await addOfflineTrack(t, private: private); + } + } + + + Future checkOffline({Album album, Track track, Playlist playlist}) async { + //Check if album/track (TODO: Artist, playlist) is offline + if (track != null) { + List res = await db.query('tracks', where: 'id == ? AND offline == 1', whereArgs: [track.id]); + if (res.length == 0) return false; + return true; + } + + if (album != null) { + List res = await db.query('albums', where: 'id == ? AND offline == 1', whereArgs: [album.id]); + if (res.length == 0) return false; + return true; + } + + if (playlist != null && playlist.id != null) { + List res = await db.query('playlists', where: 'id == ?', whereArgs: [playlist.id]); + if (res.length == 0) return false; + return true; + } + return false; + } + + //Offline search + Future search(String query) async { + SearchResults results = SearchResults( + tracks: [], + albums: [], + artists: [], + playlists: [] + ); + //Tracks + List tracksData = await db.rawQuery('SELECT * FROM tracks WHERE offline == 1 AND title like "%$query%"'); + for (Map trackData in tracksData) { + results.tracks.add(await getTrack(trackData['id'])); + } + //Albums + List albumsData = await db.rawQuery('SELECT * FROM albums WHERE offline == 1 AND title like "%$query%"'); + results.albums = await getOfflineAlbums(albumsData: albumsData); + //Artists + //TODO: offline artists + //Playlists + List playlists = await db.rawQuery('SELECT * FROM playlists WHERE title like "%$query%"'); + for (Map playlist in playlists) { + results.playlists.add(await getPlaylist(playlist['id'])); + } + return results; + } + + Future> getFinishedDownloads() async { + //Fetch from db + List data = await db.rawQuery("SELECT * FROM downloads INNER JOIN tracks ON tracks.id = downloads.trackId WHERE downloads.state = 1"); + List downloads = data.map((d) => Download.fromSQL(d, parseTrack: true)).toList(); + return downloads; + } + + //Get stats for library screen + Future> getStats() async { + //Get offline counts + int trackCount = (await db.rawQuery('SELECT COUNT(*) FROM tracks WHERE offline == 1'))[0]['COUNT(*)']; + int albumCount = (await db.rawQuery('SELECT COUNT(*) FROM albums WHERE offline == 1'))[0]['COUNT(*)']; + int playlistCount = (await db.rawQuery('SELECT COUNT(*) FROM albums WHERE offline == 1'))[0]['COUNT(*)']; + //Free space + double diskSpace = await DiskSpace.getFreeDiskSpace; + + //Used space + List offlineStat = await Directory(_offlinePath).list().toList(); + int offlineSize = 0; + for (var fs in offlineStat) { + offlineSize += (await fs.stat()).size; + } + + //Return as a list, maybe refactor in future if feature stays + return ([ + trackCount.toString(), + albumCount.toString(), + playlistCount.toString(), + filesize(offlineSize), + filesize((diskSpace * 1000000).floor()) + ]); + } + + +} + +class Download { + Track track; + String path; + String url; + bool private; + DownloadState state; + String _cover; + + int received = 0; + int total = 1; + + Download({this.track, this.path, this.url, this.private, this.state = DownloadState.NONE}); + + Future download({onDone}) async { + Dio dio = Dio(); + + //TODO: Check for internet before downloading + + if (!this.private) { + String ext = this.path; + //Get track details + this.track = await deezerAPI.track(track.id); + //Get path if public + RegExp sanitize = RegExp(r'[\/\\\?\%\*\:\|\"\<\>]'); + //Download path + if (settings.downloadFolderStructure) { + this.path = p.join( + settings.downloadPath ?? (await ExtStorage.getExternalStoragePublicDirectory(ExtStorage.DIRECTORY_MUSIC)), + track.artists[0].name.replaceAll(sanitize, ''), + track.album.title.replaceAll(sanitize, ''), + ); + } else { + this.path = settings.downloadPath; + } + //Make dirs + await Directory(this.path).create(recursive: true); + + //Grab cover + _cover = p.join(this.path, 'cover.jpg'); + if (!settings.downloadFolderStructure) _cover = p.join(this.path, randomAlpha(12) + '_cover.jpg'); + + if (!await File(_cover).exists()) { + try { + await dio.download( + this.track.albumArt.full, + _cover, + ); + } catch (e) {print('Error downloading cover');} + } + + //Add filename + String _filename = '${track.trackNumber.toString().padLeft(2, '0')}. ${track.title.replaceAll(sanitize, "")}.$ext'; + //Different naming types + if (settings.downloadNaming == DownloadNaming.STANDALONE) + _filename = '${track.artistString.replaceAll(sanitize, "")} - ${track.title.replaceAll(sanitize, "")}.$ext'; + + this.path = p.join(this.path, _filename); + } + //Download + this.state = DownloadState.DOWNLOADING; + + await dio.download( + this.url, + this.path + '.ENC', + deleteOnError: true, + onReceiveProgress: (rec, total) { + this.received = rec; + this.total = total; + } + ); + + this.state = DownloadState.POST; + //Decrypt + await platformChannel.invokeMethod('decryptTrack', {'id': track.id, 'path': path}); + //Tag + if (!private) { + //Tag track in native + await platformChannel.invokeMethod('tagTrack', { + 'path': path, + 'title': track.title, + 'album': track.album.title, + 'artists': track.artistString, + 'artist': track.artists[0].name, + 'cover': _cover, + 'trackNumber': track.trackNumber + }); + } + //Remove encrypted + await File(path + '.ENC').delete(); + if (!settings.downloadFolderStructure) await File(_cover).delete(); + this.state = DownloadState.DONE; + onDone(); + return; + } + + //JSON + Map toSQL() => { + 'trackId': track.id, + 'path': path, + 'url': url, + 'state': state == DownloadState.DONE ? 1:0, + 'private': private?1:0 + }; + factory Download.fromSQL(Map data, {parseTrack = false}) => Download( + track: parseTrack?Track.fromSQL(data):Track(id: data['trackId']), + path: data['path'], + url: data['url'], + state: data['state'] == 1 ? DownloadState.DONE:DownloadState.NONE, + private: data['private'] == 1 + ); +} + +enum DownloadState { + NONE, + DOWNLOADING, + POST, + DONE +} \ No newline at end of file diff --git a/lib/api/player.dart b/lib/api/player.dart new file mode 100644 index 0000000..9d9491d --- /dev/null +++ b/lib/api/player.dart @@ -0,0 +1,657 @@ +import 'package:audio_service/audio_service.dart'; +import 'package:collection/collection.dart'; +import 'package:dio/dio.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:freezer/api/deezer.dart'; +import 'package:freezer/ui/cached_image.dart'; +import 'package:just_audio/just_audio.dart'; +import 'package:connectivity/connectivity.dart'; +import 'package:path/path.dart' as p; +import 'package:path_provider/path_provider.dart'; + +import 'definitions.dart'; +import '../settings.dart'; + +import 'dart:io'; +import 'dart:async'; +import 'dart:convert'; + +PlayerHelper playerHelper = PlayerHelper(); + +class PlayerHelper { + + StreamSubscription _customEventSubscription; + StreamSubscription _playbackStateStreamSubscription; + QueueSource queueSource; + RepeatType repeatType = RepeatType.NONE; + + //Find queue index by id + int get queueIndex => AudioService.queue.indexWhere((mi) => mi.id == AudioService.currentMediaItem?.id??'Random string so it returns -1'); + + Future start() async { + //Subscribe to custom events + _customEventSubscription = AudioService.customEventStream.listen((event) async { + if (!(event is Map)) return; + if (event['action'] == 'onLoad') { + //After audio_service is loaded, load queue, set quality + await settings.updateAudioServiceQuality(); + await AudioService.customAction('load'); + return; + } + if (event['action'] == 'onRestore') { + //Load queueSource from isolate + this.queueSource = QueueSource.fromJson(event['queueSource']); + } + if (event['action'] == 'queueEnd') { + //If last song is played, load more queue + this.queueSource = QueueSource.fromJson(event['queueSource']); + print(queueSource.toJson()); + return; + } + }); + _playbackStateStreamSubscription = AudioService.playbackStateStream.listen((event) { + //Log song (if allowed) + if (event == null) return; + if (event.processingState == AudioProcessingState.ready && event.playing) { + if (settings.logListen) deezerAPI.logListen(AudioService.currentMediaItem.id); + } + }); + //Start audio_service + _startService(); + } + + Future _startService() async { + if (AudioService.running) return; + await AudioService.start( + backgroundTaskEntrypoint: backgroundTaskEntrypoint, + androidEnableQueue: true, + androidStopForegroundOnPause: true, + androidNotificationOngoing: false, + androidNotificationClickStartsActivity: true, + androidNotificationChannelDescription: 'Freezer', + androidNotificationChannelName: 'Freezer', + androidNotificationIcon: 'drawable/ic_logo' + ); + } + + //Repeat toggle + Future changeRepeat() async { + //Change to next repeat type + switch (repeatType) { + case RepeatType.NONE: + repeatType = RepeatType.LIST; break; + case RepeatType.LIST: + repeatType = RepeatType.TRACK; break; + default: + repeatType = RepeatType.NONE; break; + } + //Set repeat type + await AudioService.customAction("repeatType", RepeatType.values.indexOf(repeatType)); + } + + //Executed before exit + Future onExit() async { + _customEventSubscription.cancel(); + _playbackStateStreamSubscription.cancel(); + } + + //Replace queue, play specified track id + Future _loadQueuePlay(List queue, String trackId) async { + await _startService(); + await settings.updateAudioServiceQuality(); + await AudioService.updateQueue(queue); + await AudioService.playFromMediaId(trackId); + } + + //Play track from album + Future playFromAlbum(Album album, String trackId) async { + await playFromTrackList(album.tracks, trackId, QueueSource( + id: album.id, + text: album.title, + source: 'album' + )); + } + //Play from artist top tracks + Future playFromTopTracks(List tracks, String trackId, Artist artist) async { + await playFromTrackList(tracks, trackId, QueueSource( + id: artist.id, + text: 'Top ${artist.name}', + source: 'topTracks' + )); + } + Future playFromPlaylist(Playlist playlist, String trackId) async { + await playFromTrackList(playlist.tracks, trackId, QueueSource( + id: playlist.id, + text: playlist.title, + source: 'playlist' + )); + } + //Load tracks as queue, play track id, set queue source + Future playFromTrackList(List tracks, String trackId, QueueSource queueSource) async { + await _startService(); + + List queue = tracks.map((track) => track.toMediaItem()).toList(); + await setQueueSource(queueSource); + await _loadQueuePlay(queue, trackId); + } + + //Load smart track list as queue, start from beginning + Future playFromSmartTrackList(SmartTrackList stl) async { + //Load from API if no tracks + if (stl.tracks == null || stl.tracks.length == 0) { + if (settings.offlineMode) { + Fluttertoast.showToast( + msg: "Offline mode, can't play flow/smart track lists.", + gravity: ToastGravity.BOTTOM, + toastLength: Toast.LENGTH_SHORT + ); + return; + } + + //Flow songs cannot be accessed by smart track list call + if (stl.id == 'flow') { + stl.tracks = await deezerAPI.flow(); + } else { + stl = await deezerAPI.smartTrackList(stl.id); + } + } + QueueSource queueSource = QueueSource( + id: stl.id, + source: (stl.id == 'flow')?'flow':'smarttracklist', + text: stl.title + ); + await playFromTrackList(stl.tracks, stl.tracks[0].id, queueSource); + } + + Future setQueueSource(QueueSource queueSource) async { + await _startService(); + + this.queueSource = queueSource; + await AudioService.customAction('queueSource', queueSource.toJson()); + } + +} + +void backgroundTaskEntrypoint() async { + AudioServiceBackground.run(() => AudioPlayerTask()); +} + +class AudioPlayerTask extends BackgroundAudioTask { + + AudioPlayer _audioPlayer = AudioPlayer(); + + List _queue = []; + int _queueIndex = -1; + + bool _playing; + bool _interrupted; + AudioProcessingState _skipState; + Duration _lastPosition; + + ImagesDatabase imagesDB; + int mobileQuality; + int wifiQuality; + + StreamSubscription _eventSub; + StreamSubscription _playerStateSub; + + QueueSource queueSource; + int repeatType = 0; + + MediaItem get mediaItem => _queue[_queueIndex]; + + //Controls + final playControl = MediaControl( + androidIcon: 'drawable/ic_play_arrow', + label: 'Play', + action: MediaAction.play + ); + final pauseControl = MediaControl( + androidIcon: 'drawable/ic_pause', + label: 'Pause', + action: MediaAction.pause + ); + final stopControl = MediaControl( + androidIcon: 'drawable/ic_stop', + label: 'Stop', + action: MediaAction.stop + ); + final nextControl = MediaControl( + androidIcon: 'drawable/ic_skip_next', + label: 'Next', + action: MediaAction.skipToNext + ); + final previousControl = MediaControl( + androidIcon: 'drawable/ic_skip_previous', + label: 'Previous', + action: MediaAction.skipToPrevious + ); + + @override + Future onStart(Map params) async { + _playerStateSub = _audioPlayer.playbackStateStream + .where((state) => state == AudioPlaybackState.completed) + .listen((_event) { + if (_queue.length > _queueIndex + 1) { + onSkipToNext(); + return; + } else { + //Repeat whole list (if enabled) + if (repeatType == 1) { + _skip(-_queueIndex); + return; + } + //Ask for more tracks in queue + AudioServiceBackground.sendCustomEvent({ + 'action': 'queueEnd', + 'queueSource': (queueSource??QueueSource()).toJson() + }); + if (_playing) _playing = false; + _setState(AudioProcessingState.none); + return; + } + }); + + //Read audio player events + _eventSub = _audioPlayer.playbackEventStream.listen((event) { + AudioProcessingState bufferingState = event.buffering ? AudioProcessingState.buffering : null; + switch (event.state) { + case AudioPlaybackState.paused: + case AudioPlaybackState.playing: + _setState(bufferingState ?? AudioProcessingState.ready, pos: event.position); + break; + case AudioPlaybackState.connecting: + _setState(_skipState ?? AudioProcessingState.connecting, pos: event.position); + break; + default: + break; + } + }); + + //Initialize later + //await imagesDB.init(); + + AudioServiceBackground.setQueue(_queue); + AudioServiceBackground.sendCustomEvent({'action': 'onLoad'}); + } + + @override + Future onSkipToNext() { + //If repeating allowed + if (repeatType == 2) { + _skip(0); + return null; + } + _skip(1); + } + + @override + Future onSkipToPrevious() => _skip(-1); + + Future _skip(int offset) async { + int newPos = _queueIndex + offset; + //Out of bounds + if (newPos >= _queue.length || newPos < 0) return; + //First song + if (_playing == null) { + _playing = true; + } else if (_playing) { + await _audioPlayer.stop(); + } + //Update position, album art source, queue source text + _queueIndex = newPos; + //Get uri + String uri = await _getTrackUri(mediaItem); + //Modify extras + Map extras = mediaItem.extras; + extras.addAll({"qualityString": await _getQualityString(uri, mediaItem.duration)}); + _queue[_queueIndex] = mediaItem.copyWith( + artUri: await _getArtUri(mediaItem.artUri), + extras: extras + ); + //Play + AudioServiceBackground.setMediaItem(mediaItem); + _skipState = offset > 0 ? AudioProcessingState.skippingToNext:AudioProcessingState.skippingToPrevious; + //Load + await _audioPlayer.setUrl(uri); + _skipState = null; + await _saveQueue(); + (_playing??false) ? onPlay() : _setState(AudioProcessingState.ready); + } + + @override + void onPlay() async { + //Start playing preloaded queue + if (AudioServiceBackground.state.processingState == AudioProcessingState.none && _queue.length > 0) { + if (_queueIndex < 0 || _queueIndex == null) { + await this._skip(1); + } else { + await this._skip(0); + } + //Restore position from saved queue + if (_lastPosition != null) { + onSeekTo(_lastPosition); + _lastPosition = null; + } + return; + } + if (_skipState == null) { + _playing = true; + _audioPlayer.play(); + } + } + + @override + void onPause() { + if (_skipState == null && _playing) { + _playing = false; + _audioPlayer.pause(); + } + } + + @override + void onSeekTo(Duration pos) { + _audioPlayer.seek(pos); + } + + @override + void onClick(MediaButton button) { + if (_playing) onPause(); + onPlay(); + } + + @override + Future onUpdateQueue(List q) async { + this._queue = q; + AudioServiceBackground.setQueue(_queue); + await _saveQueue(); + } + + @override + void onPlayFromMediaId(String mediaId) async { + int pos = this._queue.indexWhere((mi) => mi.id == mediaId); + await _skip(pos - _queueIndex); + if (_playing == null || !_playing) onPlay(); + } + + @override + Future onFastForward() async { + await _seekRelative(fastForwardInterval); + } + + @override + void onAddQueueItemAt(MediaItem mi, int index) { + _queue.insert(index, mi); + AudioServiceBackground.setQueue(_queue); + _saveQueue(); + } + + @override + void onAddQueueItem(MediaItem mi) { + _queue.add(mi); + AudioServiceBackground.setQueue(_queue); + _saveQueue(); + } + + @override + Future onRewind() async { + await _seekRelative(rewindInterval); + } + + Future _seekRelative(Duration offset) async { + Duration newPos = _audioPlayer.playbackEvent.position + offset; + if (newPos < Duration.zero) newPos = Duration.zero; + if (newPos > mediaItem.duration) newPos = mediaItem.duration; + onSeekTo(_audioPlayer.playbackEvent.position + offset); + } + + //Audio interruptions + @override + void onAudioFocusLost(AudioInterruption interruption) { + if (_playing) _interrupted = true; + switch (interruption) { + case AudioInterruption.pause: + case AudioInterruption.temporaryPause: + case AudioInterruption.unknownPause: + if (_playing) onPause(); + break; + case AudioInterruption.temporaryDuck: + _audioPlayer.setVolume(0.5); + break; + } + } + + @override + void onAudioFocusGained(AudioInterruption interruption) { + switch (interruption) { + case AudioInterruption.temporaryPause: + if (!_playing && _interrupted) onPlay(); + break; + case AudioInterruption.temporaryDuck: + _audioPlayer.setVolume(1.0); + break; + default: + break; + } + _interrupted = false; + } + + @override + void onAudioBecomingNoisy() { + onPause(); + } + + + @override + Future onCustomAction(String name, dynamic args) async { + if (name == 'updateQuality') { + //Pass wifi & mobile quality by custom action + //Isolate can't access globals + this.wifiQuality = args['wifiQuality']; + this.mobileQuality = args['mobileQuality']; + } + if (name == 'saveQueue') { + await this._saveQueue(); + } + //Load queue, called after start + if (name == 'load') { + await _loadQueue(); + } + //Change queue source + if (name == 'queueSource') { + this.queueSource = QueueSource.fromJson(Map.from(args)); + } + //Shuffle + if (name == 'shuffleQueue') { + MediaItem mi = mediaItem; + shuffle(this._queue); + _queueIndex = _queue.indexOf(mi); + AudioServiceBackground.setQueue(this._queue); + } + //Repeating + if (name == 'repeatType') { + this.repeatType = args; + } + return true; + } + + Future _getArtUri(String url) async { + //Load from cache + if (url.startsWith('http')) { + //Prepare db + if (imagesDB == null) { + imagesDB = ImagesDatabase(); + await imagesDB.init(); + } + + String path = await imagesDB.getImage(url); + return 'file://$path'; + } + //If file + if (url.startsWith('/')) return 'file://' + url; + return url; + } + + Future _getTrackUri(MediaItem mi) async { + String prefix = 'DEEZER|${mi.id}|'; + + //Check if song is available offline + String _offlinePath = p.join((await getExternalStorageDirectory()).path, 'offline/'); + File f = File(p.join(_offlinePath, mi.id)); + if (await f.exists()) return f.path; + + //Get online url + Track t = Track( + id: mi.id, + playbackDetails: jsonDecode(mi.extras['playbackDetails']) //JSON Because of audio_service bug + ); + ConnectivityResult conn = await Connectivity().checkConnectivity(); + if (conn == ConnectivityResult.wifi) { + return prefix + t.getUrl(wifiQuality); + } + return prefix + t.getUrl(mobileQuality); + } + + Future _getQualityString(String uri, Duration duration) async { + //Get url/path + String url = uri; + List split = uri.split('|'); + if (split.length >= 3) url = split[2]; + + int size; + String format; + String source; + + //Local file + if (url.startsWith('/')) { + //Read first 4 bytes of file, get format + File f = File(url); + Stream> reader = f.openRead(0, 4); + List magic = await reader.first; + format = _magicToFormat(magic); + size = await f.length(); + source = 'Offline'; + } + + //URL + if (url.startsWith('http')) { + Dio dio = Dio(); + Response response = await dio.head(url); + size = int.parse(response.headers['Content-Length'][0]); + //Parse format + format = response.headers['Content-Type'][0]; + if (format.trim() == 'audio/mpeg') format = 'MP3'; + if (format.trim() == 'audio/flac') format = 'FLAC'; + source = 'Stream'; + } + //Calculate + int bitrate = ((size / 125) / duration.inSeconds).floor(); + return '$format ${bitrate}kbps ($source)'; + } + + //Magic number to string, source: https://en.wikipedia.org/wiki/List_of_file_signatures + String _magicToFormat(List magic) { + Function eq = const ListEquality().equals; + if (eq(magic.sublist(0, 4), [0x66, 0x4c, 0x61, 0x43])) return 'FLAC'; + //MP3 With ID3 + if (eq(magic.sublist(0, 3), [0x49, 0x44, 0x33])) return 'MP3'; + //MP3 + List m = magic.sublist(0, 2); + if (eq(m, [0xff, 0xfb]) ||eq(m, [0xff, 0xf3]) || eq(m, [0xff, 0xf2])) return 'MP3'; + //Unknown + return 'UNK'; + } + + @override + void onTaskRemoved() async { + await _saveQueue(); + onStop(); + } + + @override + Future onStop() async { + await _saveQueue(); + + if (_playing != null) _audioPlayer.stop(); + if (_playerStateSub != null) _playerStateSub.cancel(); + if (_eventSub != null) _eventSub.cancel(); + + await super.onStop(); + } + + @override + void onClose() async { + //await _saveQueue(); + //Gets saved in onStop() + await onStop(); + } + + //Update state + void _setState(AudioProcessingState state, {Duration pos}) { + AudioServiceBackground.setState( + controls: _getControls(), + systemActions: (_playing == null) ? [] : [MediaAction.seekTo], + processingState: state ?? AudioServiceBackground.state.processingState, + playing: _playing ?? false, + position: pos ?? _audioPlayer.playbackEvent.position, + bufferedPosition: pos ?? _audioPlayer.playbackEvent.position, + speed: _audioPlayer.speed + ); + } + + List _getControls() { + if (_playing == null || !_playing) { + //Paused / not-started + return [ + previousControl, + playControl, + nextControl + ]; + } + //Playing + return [ + previousControl, + pauseControl, + nextControl + ]; + } + + //Get queue saved file path + Future _getQueuePath() async { + Directory dir = await getApplicationDocumentsDirectory(); + return p.join(dir.path, 'offline.json'); + } + + //Export queue to JSON + Future _saveQueue() async { + print('save'); + File f = File(await _getQueuePath()); + await f.writeAsString(jsonEncode({ + 'index': _queueIndex, + 'queue': _queue.map>((mi) => mi.toJson()).toList(), + 'position': _audioPlayer.playbackEvent.position.inMilliseconds, + 'queueSource': (queueSource??QueueSource()).toJson(), + })); + } + + Future _loadQueue() async { + File f = File(await _getQueuePath()); + if (await f.exists()) { + Map json = jsonDecode(await f.readAsString()); + this._queue = (json['queue']??[]).map((mi) => MediaItem.fromJson(mi)).toList(); + this._queueIndex = json['index'] ?? -1; + this._lastPosition = Duration(milliseconds: json['position']??0); + this.queueSource = QueueSource.fromJson(json['queueSource']??{}); + if (_queue != null) { + AudioServiceBackground.setQueue(_queue); + AudioServiceBackground.setMediaItem(mediaItem); + //Update state to allow play button in notification + this._setState(AudioProcessingState.none, pos: _lastPosition); + } + //Send restored queue source to ui + AudioServiceBackground.sendCustomEvent({'action': 'onRestore', 'queueSource': (queueSource??QueueSource()).toJson()}); + return true; + } + } + +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..f1a65f0 --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,175 @@ +import 'package:custom_navigator/custom_navigator.dart'; +import 'package:audio_service/audio_service.dart'; +import 'package:flutter/material.dart'; +import 'package:freezer/ui/library.dart'; +import 'package:freezer/ui/login_screen.dart'; +import 'package:freezer/ui/search.dart'; +import 'package:move_to_background/move_to_background.dart'; + +import 'ui/player_bar.dart'; +import 'api/deezer.dart'; +import 'settings.dart'; +import 'ui/cached_image.dart'; +import 'api/download.dart'; +import 'api/player.dart'; +import 'ui/home_screen.dart'; + +Function updateTheme; +GlobalKey mainNavigatorKey = GlobalKey(); +GlobalKey navigatorKey; + +void main() async { + + WidgetsFlutterBinding.ensureInitialized(); + + //Initialize globals + settings = await Settings().loadSettings(); + await imagesDatabase.init(); + await downloadManager.init(); + + runApp(FreezerApp()); +} + +class FreezerApp extends StatefulWidget { + @override + _FreezerAppState createState() => _FreezerAppState(); +} + +class _FreezerAppState extends State { + @override + void initState() { + //Make update theme global + updateTheme = _updateTheme; + super.initState(); + } + + void _updateTheme() { + setState(() { + settings.themeData; + }); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'freezer', + theme: settings.themeData, + home: WillPopScope( + onWillPop: () async { + //For some reason AudioServiceWidget caused the app to freeze after 2 back button presses. "fix" + if (navigatorKey.currentState.canPop()) { + await navigatorKey.currentState.maybePop(); + return false; + } + await MoveToBackground.moveTaskToBack(); + return false; + }, + child: LoginMainWrapper(), + ), + navigatorKey: mainNavigatorKey, + ); + } +} + +//Wrapper for login and main screen. +class LoginMainWrapper extends StatefulWidget { + @override + _LoginMainWrapperState createState() => _LoginMainWrapperState(); +} + +class _LoginMainWrapperState extends State { + + @override + void initState() { + if (settings.arl != null) { + playerHelper.start(); + //Load token on background + deezerAPI.arl = settings.arl; + settings.offlineMode = true; + deezerAPI.authorize().then((b) { + if (b) setState(() => settings.offlineMode = false); + }); + } + super.initState(); + } + + @override + Widget build(BuildContext context) { + if (settings.arl == null) + return LoginWidget(callback: () => setState(() => {}),); + return MainScreen(); + } +} + + + +class MainScreen extends StatefulWidget { + @override + _MainScreenState createState() => _MainScreenState(); +} + +class _MainScreenState extends State { + + List _screens = [ + HomeScreen(), + SearchScreen(), + LibraryScreen() + ]; + int _selected = 0; + + @override + void initState() { + navigatorKey = GlobalKey(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + bottomNavigationBar: Column( + mainAxisSize: MainAxisSize.min, + children: [ + PlayerBar(), + BottomNavigationBar( + backgroundColor: Theme.of(context).bottomAppBarColor, + currentIndex: _selected, + onTap: (int s) async { + //Pop all routes until home screen + + while (navigatorKey.currentState.canPop()) { + await navigatorKey.currentState.maybePop(); + } + + await navigatorKey.currentState.maybePop(); + setState(() { + _selected = s; + }); + }, + selectedItemColor: Theme.of(context).primaryColor, + items: [ + BottomNavigationBarItem( + icon: Icon(Icons.home), + title: Text('Home') + ), + BottomNavigationBarItem( + icon: Icon(Icons.search), + title: Text('Search'), + ), + BottomNavigationBarItem( + icon: Icon(Icons.library_music), + title: Text('Library') + ) + ], + ) + ], + ), + body: AudioServiceWidget( + child: CustomNavigator( + navigatorKey: navigatorKey, + home: _screens[_selected], + pageRoute: PageRoutes.materialPageRoute, + ), + ) + ); + } +} diff --git a/lib/settings.dart b/lib/settings.dart new file mode 100644 index 0000000..fd09f54 --- /dev/null +++ b/lib/settings.dart @@ -0,0 +1,194 @@ +import 'dart:async'; + +import 'package:audio_service/audio_service.dart'; +import 'package:freezer/main.dart'; +import 'package:freezer/ui/cached_image.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:ext_storage/ext_storage.dart'; +import 'package:path/path.dart' as p; +import 'package:flutter/material.dart'; + +import 'dart:io'; +import 'dart:convert'; + +part 'settings.g.dart'; + +Settings settings; + +@JsonSerializable() +class Settings { + + //Account + String arl; + @JsonKey(ignore: true) + bool offlineMode = false; + + //Quality + @JsonKey(defaultValue: AudioQuality.MP3_320) + AudioQuality wifiQuality; + @JsonKey(defaultValue: AudioQuality.MP3_128) + AudioQuality mobileQuality; + @JsonKey(defaultValue: AudioQuality.FLAC) + AudioQuality offlineQuality; + @JsonKey(defaultValue: AudioQuality.FLAC) + AudioQuality downloadQuality; + + //Download options + String downloadPath; + @JsonKey(defaultValue: DownloadNaming.DEFAULT) + DownloadNaming downloadNaming; + @JsonKey(defaultValue: true) + bool downloadFolderStructure; + + //Appearance + @JsonKey(defaultValue: Themes.Light) + Themes theme; + + //Colors + @JsonKey(toJson: _colorToJson, fromJson: _colorFromJson) + Color primaryColor = Colors.blue; + + static _colorToJson(Color c) => c.value; + static _colorFromJson(int v) => Color(v??Colors.blue.value); + + @JsonKey(defaultValue: false) + bool useArtColor = false; + StreamSubscription _useArtColorSub; + + + //Deezer + @JsonKey(defaultValue: 'en') + String deezerLanguage; + @JsonKey(defaultValue: 'US') + String deezerCountry; + @JsonKey(defaultValue: false) + bool logListen; + + Settings({this.downloadPath, this.arl}); + + ThemeData get themeData { + switch (theme??Themes.Light) { + case Themes.Light: + return ThemeData( + fontFamily: 'Montserrat', + primaryColor: primaryColor, + accentColor: primaryColor, + sliderTheme: _sliderTheme, + toggleableActiveColor: primaryColor, + ); + case Themes.Dark: + return ThemeData( + fontFamily: 'Montserrat', + brightness: Brightness.dark, + primaryColor: primaryColor, + accentColor: primaryColor, + sliderTheme: _sliderTheme, + toggleableActiveColor: primaryColor, + ); + case Themes.Black: + return ThemeData( + fontFamily: 'Montserrat', + brightness: Brightness.dark, + primaryColor: primaryColor, + accentColor: primaryColor, + backgroundColor: Colors.black, + scaffoldBackgroundColor: Colors.black, + bottomAppBarColor: Colors.black, + dialogBackgroundColor: Colors.black, + sliderTheme: _sliderTheme, + toggleableActiveColor: primaryColor, + bottomSheetTheme: BottomSheetThemeData( + backgroundColor: Colors.black + ) + ); + } + return ThemeData(); + } + + + void updateUseArtColor(bool v) { + useArtColor = v; + if (v) { + //On media item change set color + _useArtColorSub = AudioService.currentMediaItemStream.listen((event) async { + if (event == null || event.artUri == null) return; + this.primaryColor = await imagesDatabase.getPrimaryColor(event.artUri); + updateTheme(); + }); + } else { + //Cancel stream subscription + if (_useArtColorSub != null) { + _useArtColorSub.cancel(); + _useArtColorSub = null; + } + } + } + + SliderThemeData get _sliderTheme => SliderThemeData( + thumbColor: primaryColor, + activeTrackColor: primaryColor, + inactiveTrackColor: primaryColor.withOpacity(0.2) + ); + + //Load settings/init + Future loadSettings() async { + String path = await getPath(); + File f = File(path); + if (await f.exists()) { + String data = await f.readAsString(); + return Settings.fromJson(jsonDecode(data)); + } + Settings s = Settings.fromJson({}); + //Set default path, because async + s.downloadPath = (await ExtStorage.getExternalStoragePublicDirectory(ExtStorage.DIRECTORY_MUSIC)); + s.save(); + return s; + } + + Future save() async { + File f = File(await getPath()); + await f.writeAsString(jsonEncode(this.toJson())); + } + + Future updateAudioServiceQuality() async { + //Send wifi & mobile quality to audio service isolate + await AudioService.customAction('updateQuality', { + 'mobileQuality': getQualityInt(mobileQuality), + 'wifiQuality': getQualityInt(wifiQuality) + }); + } + + //AudioQuality to deezer int + int getQualityInt(AudioQuality q) { + switch (q) { + case AudioQuality.MP3_128: return 1; + case AudioQuality.MP3_320: return 3; + case AudioQuality.FLAC: return 9; + } + return 8; //default + } + + Future getPath() async => p.join((await getApplicationDocumentsDirectory()).path, 'settings.json'); + + //JSON + factory Settings.fromJson(Map json) => _$SettingsFromJson(json); + Map toJson() => _$SettingsToJson(this); +} + +enum AudioQuality { + MP3_128, + MP3_320, + FLAC +} + +enum Themes { + Light, + Dark, + Black +} + +enum DownloadNaming { + DEFAULT, + STANDALONE +} \ No newline at end of file diff --git a/lib/settings.g.dart b/lib/settings.g.dart new file mode 100644 index 0000000..6d7ca97 --- /dev/null +++ b/lib/settings.g.dart @@ -0,0 +1,103 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'settings.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Settings _$SettingsFromJson(Map json) { + return Settings( + downloadPath: json['downloadPath'] as String, + arl: json['arl'] as String, + ) + ..wifiQuality = + _$enumDecodeNullable(_$AudioQualityEnumMap, json['wifiQuality']) ?? + AudioQuality.MP3_320 + ..mobileQuality = + _$enumDecodeNullable(_$AudioQualityEnumMap, json['mobileQuality']) ?? + AudioQuality.MP3_128 + ..offlineQuality = + _$enumDecodeNullable(_$AudioQualityEnumMap, json['offlineQuality']) ?? + AudioQuality.FLAC + ..downloadQuality = + _$enumDecodeNullable(_$AudioQualityEnumMap, json['downloadQuality']) ?? + AudioQuality.FLAC + ..downloadNaming = + _$enumDecodeNullable(_$DownloadNamingEnumMap, json['downloadNaming']) ?? + DownloadNaming.DEFAULT + ..downloadFolderStructure = json['downloadFolderStructure'] as bool ?? true + ..theme = + _$enumDecodeNullable(_$ThemesEnumMap, json['theme']) ?? Themes.Light + ..primaryColor = Settings._colorFromJson(json['primaryColor'] as int) + ..useArtColor = json['useArtColor'] as bool ?? false + ..deezerLanguage = json['deezerLanguage'] as String ?? 'en' + ..deezerCountry = json['deezerCountry'] as String ?? 'US' + ..logListen = json['logListen'] as bool ?? false; +} + +Map _$SettingsToJson(Settings instance) => { + 'arl': instance.arl, + 'wifiQuality': _$AudioQualityEnumMap[instance.wifiQuality], + 'mobileQuality': _$AudioQualityEnumMap[instance.mobileQuality], + 'offlineQuality': _$AudioQualityEnumMap[instance.offlineQuality], + 'downloadQuality': _$AudioQualityEnumMap[instance.downloadQuality], + 'downloadPath': instance.downloadPath, + 'downloadNaming': _$DownloadNamingEnumMap[instance.downloadNaming], + 'downloadFolderStructure': instance.downloadFolderStructure, + 'theme': _$ThemesEnumMap[instance.theme], + 'primaryColor': Settings._colorToJson(instance.primaryColor), + 'useArtColor': instance.useArtColor, + 'deezerLanguage': instance.deezerLanguage, + 'deezerCountry': instance.deezerCountry, + 'logListen': instance.logListen, + }; + +T _$enumDecode( + Map enumValues, + dynamic source, { + T unknownValue, +}) { + if (source == null) { + throw ArgumentError('A value must be provided. Supported values: ' + '${enumValues.values.join(', ')}'); + } + + final value = enumValues.entries + .singleWhere((e) => e.value == source, orElse: () => null) + ?.key; + + if (value == null && unknownValue == null) { + throw ArgumentError('`$source` is not one of the supported values: ' + '${enumValues.values.join(', ')}'); + } + return value ?? unknownValue; +} + +T _$enumDecodeNullable( + Map enumValues, + dynamic source, { + T unknownValue, +}) { + if (source == null) { + return null; + } + return _$enumDecode(enumValues, source, unknownValue: unknownValue); +} + +const _$AudioQualityEnumMap = { + AudioQuality.MP3_128: 'MP3_128', + AudioQuality.MP3_320: 'MP3_320', + AudioQuality.FLAC: 'FLAC', +}; + +const _$DownloadNamingEnumMap = { + DownloadNaming.DEFAULT: 'DEFAULT', + DownloadNaming.STANDALONE: 'STANDALONE', +}; + +const _$ThemesEnumMap = { + Themes.Light: 'Light', + Themes.Dark: 'Dark', + Themes.Black: 'Black', +}; diff --git a/lib/ui/cached_image.dart b/lib/ui/cached_image.dart new file mode 100644 index 0000000..06c0159 --- /dev/null +++ b/lib/ui/cached_image.dart @@ -0,0 +1,203 @@ +import 'package:flutter/material.dart'; +import 'package:palette_generator/palette_generator.dart'; +import 'package:path/path.dart' as p; +import 'package:path_provider/path_provider.dart'; +import 'package:sqflite/sqflite.dart'; +import 'package:crypto/crypto.dart'; +import 'package:dio/dio.dart'; + +import 'dart:io'; +import 'dart:convert'; + +ImagesDatabase imagesDatabase = ImagesDatabase(); + +class ImagesDatabase { + + /* + images.db: + Table: images + Fields: + id - id + name - md5 hash of url. also filename + url - url + permanent - 0/1 - if image is cached or offline + */ + + + Database db; + String imagesPath; + + //Prepare database + Future init() async { + String dir = await getDatabasesPath(); + String path = p.join(dir, 'images.db'); + db = await openDatabase( + path, + version: 1, + singleInstance: false, + onCreate: (Database db, int version) async { + //Create table on db created + await db.execute('CREATE TABLE images (id INTEGER PRIMARY KEY, name TEXT, url TEXT, permanent INTEGER)'); + } + ); + //Prepare folders + imagesPath = p.join((await getApplicationDocumentsDirectory()).path, 'images/'); + Directory imagesDir = Directory(imagesPath); + await imagesDir.create(recursive: true); + } + + String getPath(String name) { + return p.join(imagesPath, name); + } + + //Get image url/path, cache it + Future getImage(String url, {bool permanent = false}) async { + //Already file + if (!url.startsWith('http')) { + url = url.replaceFirst('file://', ''); + if (!permanent) return url; + //Update in db to permanent + String name = p.basenameWithoutExtension(url); + await db.rawUpdate('UPDATE images SET permanent == 1 WHERE name == ?', [name]); + } + //Filename = md5 hash + String hash = md5.convert(utf8.encode(url)).toString(); + List results = await db.rawQuery('SELECT * FROM images WHERE name == ?', [hash]); + String path = getPath(hash); + if (results.length > 0) { + //Image in database + return path; + } + //Save image + Dio dio = Dio(); + try { + await dio.download(url, path); + await db.insert('images', {'url': url, 'name': hash, 'permanent': permanent?1:0}); + return path; + } catch (e) { + return null; + } + } + + Future getPaletteGenerator(String url) async { + String path = await getImage(url); + //Get image provider + ImageProvider provider = AssetImage('assets/cover.jpg'); + if (path != null) { + provider = FileImage(File(path)); + } + PaletteGenerator paletteGenerator = await PaletteGenerator.fromImageProvider(provider); + return paletteGenerator; + } + + //Get primary color from album art + Future getPrimaryColor(String url) async { + PaletteGenerator paletteGenerator = await getPaletteGenerator(url); + return paletteGenerator.colors.first; + } + + //Check if is dark + Future isDark(String url) async { + PaletteGenerator paletteGenerator = await getPaletteGenerator(url); + return paletteGenerator.colors.first.computeLuminance() > 0.5 ? false : true; + } + + +} + +class CachedImage extends StatefulWidget { + + final String url; + final double width; + final double height; + final bool circular; + + const CachedImage({Key key, this.url, this.height, this.width, this.circular = false}): super(key: key); + + @override + _CachedImageState createState() => _CachedImageState(); +} + +class _CachedImageState extends State { + + final ImageProvider _placeholder = AssetImage('assets/cover.jpg'); + ImageProvider _image = AssetImage('assets/cover.jpg'); + double _opacity = 0.0; + bool _disposed = false; + + Future _getImage() async { + //Image already path + if (!widget.url.startsWith('http')) { + //Remove file://, if used in audio_service + if (widget.url.startsWith('/')) return FileImage(File(widget.url)); + return FileImage(File(widget.url.replaceFirst('file://', ''))); + } + //Load image from db + String path = await imagesDatabase.getImage(widget.url); + if (path == null) return _placeholder; + return FileImage(File(path)); + } + + //Load image and fade + void _load() async { + ImageProvider image = await _getImage(); + if (_disposed) return; + setState(() { + _image = image; + _opacity = 1.0; + }); + } + + @override + void dispose() { + _disposed = true; + super.dispose(); + } + + @override + void initState() { + _load(); + super.initState(); + } + + @override + void didUpdateWidget(CachedImage oldWidget) { + _load(); + super.didUpdateWidget(oldWidget); + } + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + widget.circular ? + CircleAvatar( + radius: (widget.width??widget.height), + backgroundImage: _placeholder, + ): + Image( + image: _placeholder, + height: widget.height, + width: widget.width, + ), + AnimatedOpacity( + duration: Duration(milliseconds: 250), + opacity: _opacity, + child: widget.circular ? + CircleAvatar( + radius: (widget.width??widget.height), + backgroundImage: _image, + ): + Image( + image: _image, + height: widget.height, + width: widget.width, + ), + ) + ], + ); + } + +} + + diff --git a/lib/ui/details_screens.dart b/lib/ui/details_screens.dart new file mode 100644 index 0000000..88d0896 --- /dev/null +++ b/lib/ui/details_screens.dart @@ -0,0 +1,697 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:freezer/api/deezer.dart'; +import 'package:freezer/api/download.dart'; +import 'package:freezer/api/player.dart'; +import 'package:freezer/ui/error.dart'; +import 'package:freezer/ui/search.dart'; + +import '../api/definitions.dart'; +import 'player_bar.dart'; +import 'cached_image.dart'; +import 'tiles.dart'; +import 'menu.dart'; + +class AlbumDetails extends StatelessWidget { + + Album album; + + AlbumDetails(this.album); + + Future _loadAlbum() async { + //Get album from API, if doesn't have tracks + if (this.album.tracks == null || this.album.tracks.length == 0) { + this.album = await deezerAPI.album(album.id); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: FutureBuilder( + future: _loadAlbum(), + builder: (BuildContext context, AsyncSnapshot snapshot) { + + //Wait for data + if (snapshot.connectionState != ConnectionState.done) return Center(child: CircularProgressIndicator(),); + //On error + if (snapshot.hasError) return ErrorScreen(); + + return ListView( + children: [ + //Album art, title, artists + Card( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container(height: 8.0,), + CachedImage( + url: album.art.full, + height: 256.0, + ), + Container(height: 8,), + Text( + album.title, + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis, + maxLines: 2, + style: TextStyle( + fontSize: 20.0, + fontWeight: FontWeight.bold + ), + ), + Text( + album.artistString, + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis, + maxLines: 2, + style: TextStyle( + fontSize: 16.0, + color: Theme.of(context).primaryColor + ), + ), + Container(height: 8.0,), + ], + ), + ), + //Details + Card( + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + children: [ + Icon(Icons.audiotrack, size: 32.0,), + Container(width: 8.0, height: 42.0,), //Height to adjust card height + Text( + album.tracks.length.toString(), + style: TextStyle(fontSize: 16.0), + ) + ], + ), + Row( + children: [ + Icon(Icons.timelapse, size: 32.0,), + Container(width: 8.0,), + Text( + album.durationString, + style: TextStyle(fontSize: 16.0), + ) + ], + ), + Row( + children: [ + Icon(Icons.people, size: 32.0,), + Container(width: 8.0,), + Text( + album.fansString, + style: TextStyle(fontSize: 16.0), + ) + ], + ), + ], + ), + ), + //Options (offline, download...) + Card( + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + FlatButton( + child: Row( + children: [ + Icon(Icons.favorite, size: 32), + Container(width: 4,), + Text('Library') + ], + ), + onPressed: () async { + await deezerAPI.addFavoriteAlbum(album.id); + Fluttertoast.showToast( + msg: 'Added to library', + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.BOTTOM + ); + }, + ), + MakeAlbumOffline(album: album), + FlatButton( + child: Row( + children: [ + Icon(Icons.file_download, size: 32.0,), + Container(width: 4,), + Text('Download') + ], + ), + onPressed: () { + downloadManager.addOfflineAlbum(album, private: false); + }, + ) + ], + ), + ), + ...List.generate(album.tracks.length, (i) { + Track t = album.tracks[i]; + return TrackTile( + t, + onTap: () { + playerHelper.playFromAlbum(album, t.id); + }, + onHold: () { + MenuSheet m = MenuSheet(context); + m.defaultTrackMenu(t); + } + ); + }) + ], + ); + }, + ) + ); + } +} + +class MakeAlbumOffline extends StatefulWidget { + + Album album; + MakeAlbumOffline({Key key, this.album}): super(key: key); + + @override + _MakeAlbumOfflineState createState() => _MakeAlbumOfflineState(); +} + +class _MakeAlbumOfflineState extends State { + + bool _offline = false; + + @override + void initState() { + downloadManager.checkOffline(album: widget.album).then((v) { + setState(() { + _offline = v; + }); + }); + } + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Switch( + value: _offline, + onChanged: (v) async { + if (v) { + //Add to offline + await deezerAPI.addFavoriteAlbum(widget.album.id); + downloadManager.addOfflineAlbum(widget.album, private: true); + setState(() { + _offline = true; + }); + return; + } + downloadManager.removeOfflineAlbum(widget.album.id); + setState(() { + _offline = false; + }); + }, + ), + Container(width: 4.0,), + Text( + 'Offline', + style: TextStyle(fontSize: 16), + ) + ], + ); + } +} + + +class ArtistDetails extends StatelessWidget { + + Artist artist; + ArtistDetails(this.artist); + + Future _loadArtist() async { + //Load artist from api if no albums + if ((this.artist.albums??[]).length == 0) { + this.artist = await deezerAPI.artist(artist.id); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: FutureBuilder( + future: _loadArtist(), + builder: (BuildContext context, AsyncSnapshot snapshot) { + //Error / not done + if (snapshot.hasError) return ErrorScreen(); + if (snapshot.connectionState != ConnectionState.done) return Center(child: CircularProgressIndicator(),); + + return ListView( + children: [ + Card( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + CachedImage( + url: artist.picture.full, + height: 200, + ), + Container( + width: 200.0, + height: 220, + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + artist.name, + overflow: TextOverflow.ellipsis, + maxLines: 4, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 24.0, fontWeight: FontWeight.bold), + ), + Container( + height: 8.0, + ), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.people, + size: 32.0, + ), + Container( + width: 8, + ), + Text( + artist.fansString, + style: TextStyle(fontSize: 16), + ), + ], + ), + Container( + height: 4.0, + ), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.album, size: 32.0), + Container( + width: 8.0, + ), + Text( + artist.albumCount.toString(), + style: TextStyle(fontSize: 16), + ) + ], + ) + ], + ), + ), + ], + ), + ), + Container(height: 4.0,), + Card( + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + FlatButton( + child: Row( + children: [ + Icon(Icons.favorite, size: 32), + Container(width: 4,), + Text('Library') + ], + ), + onPressed: () async { + await deezerAPI.addFavoriteArtist(artist.id); + Fluttertoast.showToast( + msg: 'Added to library', + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.BOTTOM + ); + }, + ), + ], + ), + ), + Container(height: 16.0,), + //Top tracks + Text( + 'Top Tracks', + textAlign: TextAlign.center, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 22.0 + ), + ), + Container(height: 4.0), + ...List.generate(5, (i) { + if (artist.topTracks.length <= i) return Container(height: 0, width: 0,); + Track t = artist.topTracks[i]; + return TrackTile( + t, + onTap: () { + playerHelper.playFromTopTracks( + artist.topTracks, + t.id, + artist + ); + }, + onHold: () { + MenuSheet mi = MenuSheet(context); + mi.defaultTrackMenu(t); + }, + ); + }), + ListTile( + title: Text('Show more tracks'), + onTap: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => TrackListScreen(artist.topTracks, QueueSource( + id: artist.id, + text: 'Top ${artist.name}', + source: 'topTracks' + ))) + ); + } + ), + Divider(), + //Albums + Text( + 'Top Albums', + textAlign: TextAlign.center, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 22.0 + ), + ), + ...List.generate(artist.albums.length, (i) { + Album a = artist.albums[i]; + return AlbumTile( + a, + onTap: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => AlbumDetails(a)) + ); + }, + onHold: () { + MenuSheet m = MenuSheet(context); + m.defaultAlbumMenu( + a + ); + }, + ); + }) + ], + ); + }, + ), + ); + } +} + + +class PlaylistDetails extends StatefulWidget { + + Playlist playlist; + PlaylistDetails(this.playlist, {Key key}): super(key: key); + + @override + _PlaylistDetailsState createState() => _PlaylistDetailsState(); +} + +class _PlaylistDetailsState extends State { + + Playlist playlist; + bool _loading = false; + bool _error = false; + ScrollController _scrollController = ScrollController(); + + //Load tracks from api + void _load() async { + if (playlist.tracks.length < playlist.trackCount && !_loading) { + setState(() => _loading = true); + int pos = playlist.tracks.length; + //Get another page of tracks + List tracks; + try { + tracks = await deezerAPI.playlistTracksPage(playlist.id, pos); + } catch (e) { + setState(() => _error = true); + return; + } + + setState(() { + playlist.tracks.addAll(tracks); + _loading = false; + }); + } + } + + @override + void initState() { + playlist = widget.playlist; + //If scrolled past 90% load next tracks + _scrollController.addListener(() { + double off = _scrollController.position.maxScrollExtent * 0.90; + if (_scrollController.position.pixels > off) { + _load(); + } + }); + //Load if no tracks + if (playlist.tracks.length == 0) { + //Get correct metadata + deezerAPI.playlist(playlist.id) + .catchError((e) => setState(() => _error = true)) + .then((Playlist p) { + if (p == null) return; + setState(() { + playlist = p; + }); + //Load tracks + _load(); + }); + } + + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: ListView( + controller: _scrollController, + children: [ + Container(height: 4.0,), + Card( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + mainAxisSize: MainAxisSize.max, + children: [ + CachedImage( + url: playlist.image.full, + height: 180.0, + ), + Container( + width: 180, + height: 200, //Card padding + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + playlist.title, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.center, + maxLines: 2, + style: TextStyle( + fontSize: 24.0, + fontWeight: FontWeight.bold + ), + ), + Text( + playlist.user.name, + overflow: TextOverflow.ellipsis, + maxLines: 2, + textAlign: TextAlign.center, + style: TextStyle( + color: Theme.of(context).primaryColor, + fontSize: 18.0 + ), + ), + Container( + height: 8.0, + ), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.audiotrack, + size: 32.0, + ), + Container(width: 8.0,), + Text(playlist.trackCount.toString(), style: TextStyle(fontSize: 16),) + ], + ), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.timelapse, + size: 32.0, + ), + Container(width: 8.0,), + Text(playlist.durationString, style: TextStyle(fontSize: 16),) + ], + ), + ], + ), + ) + ], + ), + ), + Container(height: 4.0,), + Card( + child: Padding( + padding: EdgeInsets.all(4.0), + child: Text( + playlist.description ?? '', + maxLines: 4, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16.0 + ), + ), + ) + ), + Card( + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + FlatButton( + child: Row( + children: [ + Icon(Icons.favorite, size: 32), + Container(width: 4,), + Text('Library') + ], + ), + onPressed: () async { + await deezerAPI.addFavoriteAlbum(playlist.id); + Fluttertoast.showToast( + msg: 'Added to library', + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.BOTTOM + ); + }, + ), + MakePlaylistOffline(playlist), + FlatButton( + child: Row( + children: [ + Icon(Icons.file_download, size: 32.0,), + Container(width: 4,), + Text('Download') + ], + ), + onPressed: () { + downloadManager.addOfflinePlaylist(playlist, private: false); + }, + ) + ], + ), + ), + ...List.generate(playlist.tracks.length, (i) { + Track t = playlist.tracks[i]; + return TrackTile( + t, + onTap: () { + playerHelper.playFromPlaylist(playlist, t.id); + }, + onHold: () { + MenuSheet m = MenuSheet(context); + m.defaultTrackMenu(t, options: [ + (playlist.user.id == deezerAPI.userId) ? m.removeFromPlaylist(t, playlist) : Container(width: 0, height: 0,) + ]); + } + ); + }), + if (_loading) + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircularProgressIndicator() + ], + ), + if (_error) + ErrorScreen() + ], + ) + ); + } +} + +class MakePlaylistOffline extends StatefulWidget { + Playlist playlist; + MakePlaylistOffline(this.playlist, {Key key}): super(key: key); + + @override + _MakePlaylistOfflineState createState() => _MakePlaylistOfflineState(); +} + +class _MakePlaylistOfflineState extends State { + bool _offline = false; + + @override + void initState() { + downloadManager.checkOffline(playlist: widget.playlist).then((v) { + setState(() { + _offline = v; + }); + }); + } + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Switch( + value: _offline, + onChanged: (v) async { + if (v) { + //Add to offline + if (widget.playlist.user != null && widget.playlist.user.id != deezerAPI.userId) + await deezerAPI.addPlaylist(widget.playlist.id); + downloadManager.addOfflinePlaylist(widget.playlist, private: true); + setState(() { + _offline = true; + }); + return; + } + downloadManager.removeOfflinePlaylist(widget.playlist.id); + setState(() { + _offline = false; + }); + }, + ), + Container(width: 4.0,), + Text( + 'Offline', + style: TextStyle(fontSize: 16), + ) + ], + ); + } +} diff --git a/lib/ui/downloads_screen.dart b/lib/ui/downloads_screen.dart new file mode 100644 index 0000000..371585f --- /dev/null +++ b/lib/ui/downloads_screen.dart @@ -0,0 +1,113 @@ +import 'package:filesize/filesize.dart'; +import 'package:flutter/material.dart'; + +import 'cached_image.dart'; +import '../api/download.dart'; + + +class DownloadTile extends StatelessWidget { + + final Download download; + DownloadTile(this.download); + + String get subtitle { + switch (download.state) { + case DownloadState.NONE: return ''; + case DownloadState.DOWNLOADING: + return '${filesize(download.received)} / ${filesize(download.total)}'; + case DownloadState.POST: + return 'Post processing...'; + case DownloadState.DONE: + return 'Done'; //Shouldn't be visible + } + return ''; + } + + Widget get progressBar { + switch (download.state) { + case DownloadState.DOWNLOADING: + return LinearProgressIndicator(value: download.received / download.total); + case DownloadState.POST: + return LinearProgressIndicator(); + default: + return Container(height: 0, width: 0,); + } + } + + Widget get trailing { + if (download.private) { + return Icon(Icons.offline_pin); + } + return Icon(Icons.sd_card); + } + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + title: Text(download.track.title), + subtitle: Text(subtitle), + leading: CachedImage( + url: download.track.albumArt.thumb, + ), + trailing: trailing, + ), + progressBar + ], + ); + } +} + +class DownloadsScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Downloads'), + ), + body: ListView( + children: [ + StreamBuilder( + stream: Stream.periodic(Duration(milliseconds: 500)), //Periodic to get current download progress + builder: (BuildContext context, AsyncSnapshot snapshot) { + + if (downloadManager.queue.length == 0) + return Container(width: 0, height: 0,); + + return Column( + children: List.generate(downloadManager.queue.length, (i) { + return DownloadTile(downloadManager.queue[i]); + }) + ); + }, + ), + FutureBuilder( + future: downloadManager.getFinishedDownloads(), + builder: (context, snapshot) { + if (!snapshot.hasData || snapshot.data.length == 0) return Container(height: 0, width: 0,); + + return Column( + children: [ + Divider(), + Text( + 'History', + style: TextStyle( + fontSize: 24.0, + fontWeight: FontWeight.bold + ), + ), + ...List.generate(snapshot.data.length, (i) { + Download d = snapshot.data[i]; + return DownloadTile(d); + }) + ], + ); + }, + ) + ], + ) + ); + } +} \ No newline at end of file diff --git a/lib/ui/error.dart b/lib/ui/error.dart new file mode 100644 index 0000000..64eaf3b --- /dev/null +++ b/lib/ui/error.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; + +class ErrorScreen extends StatelessWidget { + + final String message; + + ErrorScreen({this.message}); + + @override + Widget build(BuildContext context) { + return Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.error, + color: Colors.red, + size: 64.0, + ), + Container(height: 4.0,), + Text(message ?? 'Please check your connection and try again later...') + ], + ), + ); + } +} diff --git a/lib/ui/home_screen.dart b/lib/ui/home_screen.dart new file mode 100644 index 0000000..6ce4030 --- /dev/null +++ b/lib/ui/home_screen.dart @@ -0,0 +1,224 @@ +import 'package:flutter/material.dart'; +import 'package:freezer/api/deezer.dart'; +import 'package:freezer/api/definitions.dart'; +import 'package:freezer/api/player.dart'; +import 'package:freezer/ui/error.dart'; +import 'package:freezer/ui/menu.dart'; +import 'tiles.dart'; +import 'details_screens.dart'; +import '../settings.dart'; + +class HomeScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return ListView( + children: [ + Container(height: 16.0,), + FreezerTitle(), + Container(height: 16.0,), + HomePageScreen() + ], + ); + } +} + +class FreezerTitle extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Text( + 'freezer', + textAlign: TextAlign.center, + style: TextStyle( + fontFamily: 'Jost', + fontSize: 75, + fontStyle: FontStyle.italic, + letterSpacing: 7 + ), + ); + } +} + + + +class HomePageScreen extends StatefulWidget { + + final HomePage homePage; + final DeezerChannel channel; + HomePageScreen({this.homePage, this.channel, Key key}): super(key: key); + + @override + _HomePageScreenState createState() => _HomePageScreenState(); +} + +class _HomePageScreenState extends State { + + HomePage _homePage; + bool _cancel = false; + bool _error = false; + + void _loadChannel() async { + HomePage _hp; + //Fetch channel from api + try { + _hp = await deezerAPI.getChannel(widget.channel.target); + } catch (e) {} + if (_hp == null) { + //On error + setState(() => _error = true); + return; + } + setState(() => _homePage = _hp); + } + void _loadHomePage() async { + //Load local + try { + HomePage _hp = await HomePage().load(); + setState(() => _homePage = _hp); + } catch (e) {} + //On background load from API + try { + if (settings.offlineMode) return; + HomePage _hp = await deezerAPI.homePage(); + if (_hp != null) { + if (_cancel) return; + if (_hp.sections.length == 0) return; + setState(() => _homePage = _hp); + //Save to cache + await _homePage.save(); + } + } catch (e) {} + } + + void _load() { + if (widget.channel != null) { + _loadChannel(); + return; + } + if (widget.channel == null && widget.homePage == null) { + _loadHomePage(); + return; + } + if (widget.homePage.sections == null || widget.homePage.sections.length == 0) { + _loadHomePage(); + return; + } + //Already have data + setState(() => _homePage = widget.homePage); + } + + @override + void initState() { + _load(); + super.initState(); + } + + @override + void dispose() { + _cancel = true; + super.dispose(); + } + + @override + Widget build(BuildContext context) { + if (_homePage == null) + return Center(child: CircularProgressIndicator(),); + if (_error) + return ErrorScreen(); + return SingleChildScrollView( + child: Column( + children: [ + ...List.generate(_homePage.sections.length, (i) { + HomePageSection section = _homePage.sections[i]; + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + child: Text( + section.title, + textAlign: TextAlign.left, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle(fontSize: 24.0), + ), + padding: EdgeInsets.symmetric(horizontal: 8.0, vertical: 8.0) + ), + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: List.generate(section.items.length, (i) { + HomePageItem item = section.items[i]; + + switch (item.type) { + case HomePageItemType.SMARTTRACKLIST: + return SmartTrackListTile( + item.value, + onTap: () { + playerHelper.playFromSmartTrackList(item.value); + }, + ); + case HomePageItemType.ALBUM: + return AlbumCard( + item.value, + onTap: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => AlbumDetails(item.value) + )); + }, + onHold: () { + MenuSheet m = MenuSheet(context); + m.defaultAlbumMenu(item.value); + }, + ); + case HomePageItemType.ARTIST: + return ArtistTile( + item.value, + onTap: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => ArtistDetails(item.value) + )); + }, + onHold: () { + MenuSheet m = MenuSheet(context); + m.defaultArtistMenu(item.value); + }, + ); + case HomePageItemType.PLAYLIST: + return PlaylistCardTile( + item.value, + onTap: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => PlaylistDetails(item.value) + )); + }, + onHold: () { + MenuSheet m = MenuSheet(context); + m.defaultPlaylistMenu(item.value); + }, + ); + case HomePageItemType.CHANNEL: + return ChannelTile( + item.value, + onTap: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => Scaffold( + appBar: AppBar(title: Text(item.value.title.toString()),), + body: HomePageScreen(channel: item.value,), + ) + )); + }, + ); + } + return Container(height: 0, width: 0); + }), + ), + ), + Container(height: 16.0,) + ], + ); + }) + ], + ), + ); + } +} diff --git a/lib/ui/library.dart b/lib/ui/library.dart new file mode 100644 index 0000000..250e76f --- /dev/null +++ b/lib/ui/library.dart @@ -0,0 +1,610 @@ +import 'package:connectivity/connectivity.dart'; +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:freezer/api/deezer.dart'; +import 'package:freezer/api/definitions.dart'; +import 'package:freezer/api/player.dart'; +import 'package:freezer/settings.dart'; +import 'package:freezer/ui/details_screens.dart'; +import 'package:freezer/ui/downloads_screen.dart'; +import 'package:freezer/ui/error.dart'; +import 'package:freezer/ui/tiles.dart'; + +import 'menu.dart'; +import 'settings_screen.dart'; +import 'player_bar.dart'; +import '../api/download.dart'; + +class LibraryAppBar extends StatelessWidget implements PreferredSizeWidget { + + @override + Size get preferredSize => AppBar().preferredSize; + + @override + Widget build(BuildContext context) { + return AppBar( + title: Text('Library'), + actions: [ + IconButton( + icon: Icon(Icons.file_download), + onPressed: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => DownloadsScreen()) + ); + }, + ), + IconButton( + icon: Icon(Icons.settings), + onPressed: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => SettingsScreen()) + ); + }, + ), + ], + ); + } + +} + +class LibraryScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: LibraryAppBar(), + body: ListView( + children: [ + Container(height: 4.0,), + if (downloadManager.stopped) + ListTile( + title: Text('Downloads'), + leading: Icon(Icons.file_download), + subtitle: Text('Downloading is currently stopped, click here to resume.'), + onTap: () { + downloadManager.updateQueue(); + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => DownloadsScreen() + )); + }, + ), + //Dirty if to not use columns + if (downloadManager.stopped) + Divider(), + + ListTile( + title: Text('Tracks'), + leading: Icon(Icons.audiotrack), + onTap: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => LibraryTracks()) + ); + }, + ), + ListTile( + title: Text('Albums'), + leading: Icon(Icons.album), + onTap: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => LibraryAlbums()) + ); + }, + ), + ListTile( + title: Text('Artists'), + leading: Icon(Icons.recent_actors), + onTap: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => LibraryArtists()) + ); + }, + ), + ListTile( + title: Text('Playlists'), + leading: Icon(Icons.playlist_play), + onTap: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => LibraryPlaylists()) + ); + }, + ), + ExpansionTile( + title: Text('Statistics'), + leading: Icon(Icons.insert_chart), + children: [ + FutureBuilder( + future: downloadManager.getStats(), + builder: (context, snapshot) { + if (snapshot.hasError) return ErrorScreen(); + if (!snapshot.hasData) return Padding( + padding: EdgeInsets.symmetric(vertical: 4.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircularProgressIndicator() + ], + ), + ); + List data = snapshot.data; + return Column( + children: [ + ListTile( + title: Text('Offline tracks'), + leading: Icon(Icons.audiotrack), + trailing: Text(data[0]), + ), + ListTile( + title: Text('Offline albums'), + leading: Icon(Icons.album), + trailing: Text(data[1]), + ), + ListTile( + title: Text('Offline playlists'), + leading: Icon(Icons.playlist_add), + trailing: Text(data[2]), + ), + ListTile( + title: Text('Offline size'), + leading: Icon(Icons.sd_card), + trailing: Text(data[3]), + ), + ListTile( + title: Text('Free space'), + leading: Icon(Icons.disc_full), + trailing: Text(data[4]), + ), + ], + ); + }, + ) + ], + ) + ], + ), + ); + } +} + +class LibraryTracks extends StatefulWidget { + @override + _LibraryTracksState createState() => _LibraryTracksState(); +} + +class _LibraryTracksState extends State { + + bool _loading = false; + ScrollController _scrollController = ScrollController(); + List tracks = []; + List allTracks = []; + + Playlist get _playlist => Playlist(id: deezerAPI.favoritesPlaylistId); + + Future _load() async { + ConnectivityResult connectivity = await Connectivity().checkConnectivity(); + if (connectivity != ConnectivityResult.none) { + setState(() => _loading = true); + int pos = tracks.length; + //Load another page of tracks from deezer + List _t; + try { + _t = await deezerAPI.playlistTracksPage(deezerAPI.favoritesPlaylistId, pos); + } catch (e) {} + //On error load offline + if (_t == null) { + await _loadOffline(); + return; + } + setState(() { + tracks.addAll(_t); + _loading = false; + }); + + } + } + + Future _loadOffline() async { + Playlist p = await downloadManager.getPlaylist(deezerAPI.favoritesPlaylistId); + if (p != null) setState(() { + tracks = p.tracks; + }); + } + + Future _loadAll() async { + List tracks = await downloadManager.allOfflineTracks(); + setState(() { + allTracks = tracks; + }); + } + + @override + void initState() { + _scrollController.addListener(() { + //Load more tracks on scroll + double off = _scrollController.position.maxScrollExtent * 0.90; + if (_scrollController.position.pixels > off) _load(); + }); + + _load(); + + //Load all tracks + _loadAll(); + + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Tracks'),), + body: ListView( + children: [ + Card( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container(height: 8.0,), + Text( + 'Loved tracks', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 24 + ), + ), + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + MakePlaylistOffline(_playlist), + FlatButton( + child: Row( + children: [ + Icon(Icons.file_download, size: 32.0,), + Container(width: 4,), + Text('Download') + ], + ), + onPressed: () { + downloadManager.addOfflinePlaylist(_playlist, private: false); + }, + ) + ], + ) + ], + ), + ), + //Loved tracks + ...List.generate(tracks.length, (i) { + Track t = tracks[i]; + return TrackTile( + t, + onTap: () { + playerHelper.playFromTrackList(tracks, t.id, QueueSource( + id: deezerAPI.favoritesPlaylistId, + text: 'Favorites', + source: 'playlist' + )); + }, + onHold: () { + MenuSheet m = MenuSheet(context); + m.defaultTrackMenu( + t, + onRemove: () { + setState(() { + tracks.removeWhere((track) => t.id == track.id); + }); + } + ); + }, + ); + }), + if (_loading) + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: CircularProgressIndicator(), + ) + ], + ), + Divider(), + Text( + 'All offline tracks', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold + ), + ), + Container(height: 8,), + ...List.generate(allTracks.length, (i) { + Track t = allTracks[i]; + return TrackTile( + t, + onTap: () { + playerHelper.playFromTrackList(allTracks, t.id, QueueSource( + id: 'allTracks', + text: 'All offline tracks', + source: 'offline' + )); + }, + onHold: () { + MenuSheet m = MenuSheet(context); + m.defaultTrackMenu(t); + }, + ); + }) + ], + ) + ); + } +} + + +class LibraryAlbums extends StatefulWidget { + @override + _LibraryAlbumsState createState() => _LibraryAlbumsState(); +} + +class _LibraryAlbumsState extends State { + + List _albums; + + Future _load() async { + if (settings.offlineMode) return; + try { + List albums = await deezerAPI.getAlbums(); + setState(() => _albums = albums); + } catch (e) {} + } + + @override + void initState() { + _load(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Albums'),), + body: ListView( + children: [ + Container(height: 8.0,), + if (!settings.offlineMode && _albums == null) + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircularProgressIndicator() + ], + ), + + if (_albums != null) + ...List.generate(_albums.length, (int i) { + Album a = _albums[i]; + return AlbumTile( + a, + onTap: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => AlbumDetails(a)) + ); + }, + onHold: () async { + MenuSheet m = MenuSheet(context); + m.defaultAlbumMenu(a, onRemove: () { + setState(() => _albums.remove(a)); + }); + }, + ); + }), + + FutureBuilder( + future: downloadManager.getOfflineAlbums(), + builder: (context, snapshot) { + if (snapshot.hasError || !snapshot.hasData || snapshot.data.length == 0) return Container(height: 0, width: 0,); + + List albums = snapshot.data; + return Column( + children: [ + Divider(), + Text( + 'Offline albums', + textAlign: TextAlign.center, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 24.0 + ), + ), + ...List.generate(albums.length, (i) { + Album a = albums[i]; + return AlbumTile( + a, + onTap: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => AlbumDetails(a)) + ); + }, + onHold: () async { + MenuSheet m = MenuSheet(context); + m.defaultAlbumMenu(a, onRemove: () { + setState(() { + albums.remove(a); + _albums.remove(a); + }); + }); + }, + ); + }) + ], + ); + }, + ) + ], + ), + ); + } +} + +class LibraryArtists extends StatefulWidget { + @override + _LibraryArtistsState createState() => _LibraryArtistsState(); +} + +class _LibraryArtistsState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Artists'),), + body: FutureBuilder( + future: deezerAPI.getArtists(), + builder: (BuildContext context, AsyncSnapshot snapshot) { + + if (snapshot.hasError) return ErrorScreen(); + if (!snapshot.hasData) return Center(child: CircularProgressIndicator(),); + + return ListView( + children: [ + ...List.generate(snapshot.data.length, (i) { + Artist a = snapshot.data[i]; + return ArtistHorizontalTile( + a, + onTap: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => ArtistDetails(a)) + ); + }, + onHold: () { + MenuSheet m = MenuSheet(context); + m.defaultArtistMenu(a, onRemove: () { + setState(() => {}); + }); + }, + ); + }), + ], + ); + }, + ), + ); + } +} + + +class LibraryPlaylists extends StatefulWidget { + @override + _LibraryPlaylistsState createState() => _LibraryPlaylistsState(); +} + +class _LibraryPlaylistsState extends State { + + List _playlists; + + Future _load() async { + if (!settings.offlineMode) { + try { + List playlists = await deezerAPI.getPlaylists(); + setState(() => _playlists = playlists); + } catch (e) {} + } + } + + @override + void initState() { + _load(); + super.initState(); + } + + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Playlists'),), + body: ListView( + children: [ + ListTile( + title: Text('Create new playlist'), + leading: Icon(Icons.playlist_add), + onTap: () { + if (settings.offlineMode) { + Fluttertoast.showToast( + msg: 'Cannot create playlists in offline mode', + gravity: ToastGravity.BOTTOM + ); + return; + } + MenuSheet m = MenuSheet(context); + m.createPlaylist(); + }, + ), + Divider(), + + if (!settings.offlineMode && _playlists == null) + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircularProgressIndicator(), + ], + ), + + if (_playlists != null) + ...List.generate(_playlists.length, (int i) { + Playlist p = _playlists[i]; + return PlaylistTile( + p, + onTap: () => Navigator.of(context).push(MaterialPageRoute( + builder: (context) => PlaylistDetails(p) + )), + onHold: () { + MenuSheet m = MenuSheet(context); + m.defaultPlaylistMenu(p, onRemove: () { + setState(() => _playlists.remove(p)); + }); + }, + ); + }), + + FutureBuilder( + future: downloadManager.getOfflinePlaylists(), + builder: (context, snapshot) { + if (snapshot.hasError || !snapshot.hasData) return Container(height: 0, width: 0,); + if (snapshot.data.length == 0) return Container(height: 0, width: 0,); + + List playlists = snapshot.data; + return Column( + children: [ + Divider(), + Text( + 'Offline playlists', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 24.0, + fontWeight: FontWeight.bold + ), + ), + ...List.generate(playlists.length, (i) { + Playlist p = playlists[i]; + return PlaylistTile( + p, + onTap: () => Navigator.of(context).push(MaterialPageRoute( + builder: (context) => PlaylistDetails(p) + )), + onHold: () { + MenuSheet m = MenuSheet(context); + m.defaultPlaylistMenu(p, onRemove: () { + setState(() { + playlists.remove(p); + _playlists.remove(p); + }); + }); + }, + ); + }) + ], + ); + }, + ) + + ], + ), + ); + } +} diff --git a/lib/ui/login_screen.dart b/lib/ui/login_screen.dart new file mode 100644 index 0000000..6d61638 --- /dev/null +++ b/lib/ui/login_screen.dart @@ -0,0 +1,254 @@ +import 'package:audio_service/audio_service.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:freezer/api/deezer.dart'; +import 'package:freezer/api/player.dart'; +import 'package:freezer/main.dart'; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; + +import '../settings.dart'; +import '../api/definitions.dart'; +import 'home_screen.dart'; + +class LoginWidget extends StatefulWidget { + + Function callback; + LoginWidget({this.callback, Key key}): super(key: key); + + @override + _LoginWidgetState createState() => _LoginWidgetState(); +} + +class _LoginWidgetState extends State { + + String _arl; + + //Initialize deezer etc + Future _init() async { + deezerAPI.arl = settings.arl; + await playerHelper.start(); + + //Pre-cache homepage + if (!await HomePage().exists()) { + await deezerAPI.authorize(); + settings.offlineMode = false; + HomePage hp = await deezerAPI.homePage(); + await hp.save(); + } + } + //Call _init() + void _start() async { + if (settings.arl != null) { + _init().then((_) { + if (widget.callback != null) widget.callback(); + }); + } + } + + @override + void didUpdateWidget(LoginWidget oldWidget) { + _start(); + super.didUpdateWidget(oldWidget); + } + + @override + void initState() { + _start(); + super.initState(); + } + + void errorDialog() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text('Error'), + content: Text('Error logging in! Please check your token and internet connection and try again.'), + actions: [ + FlatButton( + child: Text('Dismiss'), + onPressed: () { + Navigator.of(context).pop(); + }, + ) + ], + ); + } + ); + } + + void _update() async { + setState(() => {}); + + //Try logging in + try { + deezerAPI.arl = settings.arl; + bool resp = await deezerAPI.authorize(); + if (resp == false) { //false, not null + setState(() => settings.arl = null); + errorDialog(); + } + //On error show dialog and reset to null + } catch (e) { + setState(() => settings.arl = null); + errorDialog(); + } + + await settings.save(); + _start(); + } + + @override + Widget build(BuildContext context) { + + //If arl non null, show loading + if (settings.arl != null) + return Scaffold( + body: Center( + child: CircularProgressIndicator(), + ), + ); + + if (settings.arl == null) + return Scaffold( + body: Padding( + padding: EdgeInsets.symmetric(horizontal: 8.0), + child: ListView( + children: [ + Container(height: 16.0,), + Text( + 'Welcome to', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16.0 + ), + ), + FreezerTitle(), + Container(height: 8.0,), + Text( + "Please login using your Deezer account.", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18.0 + ), + ), + Container(height: 16.0,), + Padding( + padding: EdgeInsets.symmetric(horizontal: 32.0), + child: OutlineButton( + child: Text('Login using browser'), + onPressed: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => LoginBrowser(_update)) + ); + }, + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 32.0), + child: OutlineButton( + child: Text('Login using token'), + onPressed: () { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text('Enter ARL'), + content: Container( + child: TextField( + onChanged: (String s) => _arl = s, + decoration: InputDecoration( + labelText: 'Token (ARL)' + ), + ), + ), + actions: [ + FlatButton( + child: Text('Save'), + onPressed: () { + settings.arl = _arl; + Navigator.of(context).pop(); + _update(); + }, + ) + ], + ); + } + ); + }, + ), + ), + Container(height: 16.0,), + Text( + "If you don't have account, you can register on deezer.com for free.", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18.0 + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 32.0), + child: OutlineButton( + child: Text('Open in browser'), + onPressed: () { + InAppBrowser.openWithSystemBrowser(url: 'https://deezer.com/register'); + }, + ), + ), + Container(height: 8.0,), + Divider(), + Container(height: 8.0,), + Text( + "By using this app, you don't agree with the Deezer ToS", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18.0 + ), + ) + ], + ), + ), + ); + return null; + } +} + + +class LoginBrowser extends StatelessWidget { + + Function updateParent; + LoginBrowser(this.updateParent); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Expanded( + child: Container( + + child: InAppWebView( + initialUrl: 'https://deezer.com/login', + onLoadStart: (InAppWebViewController controller, String url) async { + //Parse arl from url + if (url.startsWith('intent://deezer.page.link')) { + try { + //Parse url + Uri uri = Uri.parse(url); + //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) {} + } + }, + ), + ), + ), + ], + ); + } +} diff --git a/lib/ui/menu.dart b/lib/ui/menu.dart new file mode 100644 index 0000000..dc8cd63 --- /dev/null +++ b/lib/ui/menu.dart @@ -0,0 +1,615 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:audio_service/audio_service.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:freezer/api/deezer.dart'; +import 'package:freezer/api/download.dart'; +import 'package:freezer/ui/details_screens.dart'; +import 'package:freezer/ui/error.dart'; + +import '../api/definitions.dart'; +import '../api/player.dart'; +import 'cached_image.dart'; + +class MenuSheet { + + BuildContext context; + + MenuSheet(this.context); + + //=================== + // DEFAULT + //=================== + + void show(List options) { + showModalBottomSheet( + isScrollControlled: true, + context: context, + builder: (BuildContext context) { + return ConstrainedBox( + constraints: BoxConstraints( + maxHeight: (MediaQuery.of(context).orientation == Orientation.landscape)?220:350, + ), + child: SingleChildScrollView( + child: Column( + children: options + ), + ), + ); + } + ); + } + + //=================== + // TRACK + //=================== + + void showWithTrack(Track track, List options) { + showModalBottomSheet( + isScrollControlled: true, + context: context, + builder: (BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container(height: 16.0,), + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + CachedImage( + url: track.albumArt.full, + height: 128, + width: 128, + ), + Container( + width: 240.0, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + track.title, + maxLines: 1, + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 22.0, + fontWeight: FontWeight.bold + ), + ), + Text( + track.artistString, + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis, + maxLines: 1, + style: TextStyle( + fontSize: 20.0 + ), + ), + Container(height: 8.0,), + Text( + track.album.title, + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + Text( + track.durationString + ) + ], + ), + ), + ], + ), + Container(height: 16.0,), + ConstrainedBox( + constraints: BoxConstraints( + maxHeight: (MediaQuery.of(context).orientation == Orientation.landscape)?220:350, + ), + child: SingleChildScrollView( + child: Column( + children: options + ), + ), + ) + ], + ); + } + ); + } + + //Default track options + void defaultTrackMenu(Track track, {List options = const [], Function onRemove}) { + showWithTrack(track, [ + addToQueueNext(track), + addToQueue(track), + (track.favorite??false)?removeFavoriteTrack(track, onUpdate: onRemove):addTrackFavorite(track), + addToPlaylist(track), + downloadTrack(track), + showAlbum(track.album), + ...List.generate(track.artists.length, (i) => showArtist(track.artists[i])), + ...options + ]); + } + + //=================== + // TRACK OPTIONS + //=================== + + Widget addToQueueNext(Track t) => ListTile( + title: Text('Play next'), + leading: Icon(Icons.playlist_play), + onTap: () async { + if (playerHelper.queueIndex == -1) { + //First track + await AudioService.addQueueItem(t.toMediaItem()); + await AudioService.play(); + } else { + //Normal + await AudioService.addQueueItemAt( + t.toMediaItem(), playerHelper.queueIndex + 1); + } + _close(); + }); + + Widget addToQueue(Track t) => ListTile( + title: Text('Add to queue'), + leading: Icon(Icons.playlist_add), + onTap: () async { + await AudioService.addQueueItem(t.toMediaItem()); + _close(); + } + ); + + Widget addTrackFavorite(Track t) => ListTile( + title: Text('Add track to favorites'), + leading: Icon(Icons.favorite), + onTap: () async { + await deezerAPI.addFavoriteTrack(t.id); + //Make track offline, if favorites are offline + Playlist p = Playlist(id: deezerAPI.favoritesPlaylistId); + if (await downloadManager.checkOffline(playlist: p)) { + downloadManager.addOfflinePlaylist(p); + } + Fluttertoast.showToast( + msg: 'Added to library!', + gravity: ToastGravity.BOTTOM, + toastLength: Toast.LENGTH_SHORT + ); + _close(); + } + ); + + Widget downloadTrack(Track t) => ListTile( + title: Text('Download'), + leading: Icon(Icons.file_download), + onTap: () async { + await downloadManager.addOfflineTrack(t, private: false); + _close(); + }, + ); + + Widget addToPlaylist(Track t) => ListTile( + title: Text('Add to playlist'), + leading: Icon(Icons.playlist_add), + onTap: () async { + + Playlist p; + + //Show dialog to pick playlist + await showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text('Select playlist'), + content: FutureBuilder( + future: deezerAPI.getPlaylists(), + builder: (context, snapshot) { + + if (snapshot.hasError) SizedBox( + height: 100, + child: ErrorScreen(), + ); + if (snapshot.connectionState != ConnectionState.done) return SizedBox( + height: 100, + child: Center(child: CircularProgressIndicator(),), + ); + + List playlists = snapshot.data; + return SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ...List.generate(playlists.length, (i) => ListTile( + title: Text(playlists[i].title), + leading: CachedImage( + url: playlists[i].image.thumb, + ), + onTap: () { + p = playlists[i]; + Navigator.of(context).pop(); + }, + )), + ListTile( + title: Text('Create new playlist'), + leading: Icon(Icons.add), + onTap: () { + Navigator.of(context).pop(); + showDialog( + context: context, + builder: (context) => CreatePlaylistDialog(tracks: [t],) + ); + }, + ) + ] + ), + ); + }, + ), + ); + } + ); + //Add to playlist, show toast + if (p != null) { + await deezerAPI.addToPlaylist(t.id, p.id); + //Update the playlist if offline + if (await downloadManager.checkOffline(playlist: p)) { + downloadManager.addOfflinePlaylist(p); + } + Fluttertoast.showToast( + msg: "Track added to ${p.title}", + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.BOTTOM, + ); + } + + _close(); + }, + ); + + Widget removeFromPlaylist(Track t, Playlist p) => ListTile( + title: Text('Remove from playlist'), + leading: Icon(Icons.delete), + onTap: () async { + await deezerAPI.removeFromPlaylist(t.id, p.id); + Fluttertoast.showToast( + msg: 'Track removed from ${p.title}', + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.BOTTOM, + ); + _close(); + }, + ); + + Widget removeFavoriteTrack(Track t, {onUpdate}) => ListTile( + title: Text('Remove favorite'), + leading: Icon(Icons.delete), + onTap: () async { + await deezerAPI.removeFavorite(t.id); + //Check if favorites playlist is offline, update it + Playlist p = Playlist(id: deezerAPI.favoritesPlaylistId); + if (await downloadManager.checkOffline(playlist: p)) { + await downloadManager.addOfflinePlaylist(p); + } + Fluttertoast.showToast( + msg: 'Track removed from library', + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.BOTTOM + ); + onUpdate(); + _close(); + }, + ); + + //Redirect to artist page (ie from track) + Widget showArtist(Artist a) => ListTile( + title: Text( + 'Go to ${a.name}', + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + leading: Icon(Icons.recent_actors), + onTap: () { + _close(); + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => ArtistDetails(a)) + ); + }, + ); + + Widget showAlbum(Album a) => ListTile( + title: Text( + 'Go to ${a.title}', + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + leading: Icon(Icons.album), + onTap: () { + _close(); + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => AlbumDetails(a)) + ); + }, + ); + + + //=================== + // ALBUM + //=================== + + //Default album options + void defaultAlbumMenu(Album album, {List options = const [], Function onRemove}) { + show([ + album.library?removeAlbum(album, onRemove: onRemove):libraryAlbum(album), + downloadAlbum(album), + offlineAlbum(album), + ...options + ]); + } + + //=================== + // ALBUM OPTIONS + //=================== + + Widget downloadAlbum(Album a) => ListTile( + title: Text('Download'), + leading: Icon(Icons.file_download), + onTap: () async { + await downloadManager.addOfflineAlbum(a, private: false); + _close(); + } + ); + + Widget offlineAlbum(Album a) => ListTile( + title: Text('Make offline'), + leading: Icon(Icons.offline_pin), + onTap: () async { + await deezerAPI.addFavoriteAlbum(a.id); + await downloadManager.addOfflineAlbum(a, private: true); + _close(); + }, + ); + + Widget libraryAlbum(Album a) => ListTile( + title: Text('Add to library'), + leading: Icon(Icons.library_music), + onTap: () async { + await deezerAPI.addFavoriteAlbum(a.id); + Fluttertoast.showToast( + msg: 'Added to library', + gravity: ToastGravity.BOTTOM + ); + _close(); + }, + ); + + //Remove album from favorites + Widget removeAlbum(Album a, {Function onRemove}) => ListTile( + title: Text('Remove album'), + leading: Icon(Icons.delete), + onTap: () async { + await deezerAPI.removeAlbum(a.id); + await downloadManager.removeOfflineAlbum(a.id); + Fluttertoast.showToast( + msg: 'Album removed', + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.BOTTOM, + ); + if (onRemove != null) onRemove(); + _close(); + }, + ); + + //=================== + // ARTIST + //=================== + + void defaultArtistMenu(Artist artist, {List options = const [], Function onRemove}) { + show([ + artist.library?removeArtist(artist, onRemove: onRemove):favoriteArtist(artist), + ...options + ]); + } + + //=================== + // ARTIST OPTIONS + //=================== + + Widget removeArtist(Artist a, {Function onRemove}) => ListTile( + title: Text('Remove from favorites'), + leading: Icon(Icons.delete), + onTap: () async { + await deezerAPI.removeArtist(a.id); + Fluttertoast.showToast( + msg: 'Artist removed from library', + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.BOTTOM + ); + if (onRemove != null) onRemove(); + _close(); + }, + ); + + Widget favoriteArtist(Artist a) => ListTile( + title: Text('Add to favorites'), + leading: Icon(Icons.favorite), + onTap: () async { + await deezerAPI.addFavoriteArtist(a.id); + Fluttertoast.showToast( + msg: 'Added to library', + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.BOTTOM + ); + _close(); + }, + ); + + //=================== + // PLAYLIST + //=================== + + void defaultPlaylistMenu(Playlist playlist, {List options = const [], Function onRemove}) { + show([ + playlist.library?removePlaylistLibrary(playlist, onRemove: onRemove):addPlaylistLibrary(playlist), + addPlaylistOffline(playlist), + downloadPlaylist(playlist), + ...options + ]); + } + + //=================== + // PLAYLIST OPTIONS + //=================== + + Widget removePlaylistLibrary(Playlist p, {Function onRemove}) => ListTile( + title: Text('Remove from library'), + leading: Icon(Icons.delete), + onTap: () async { + if (p.user.id.trim() == deezerAPI.userId) { + //Delete playlist if own + await deezerAPI.deletePlaylist(p.id); + } else { + //Just remove from library + await deezerAPI.removePlaylist(p.id); + } + downloadManager.removeOfflinePlaylist(p.id); + if (onRemove != null) onRemove(); + _close(); + }, + ); + + Widget addPlaylistLibrary(Playlist p) => ListTile( + title: Text('Add playlist to library'), + leading: Icon(Icons.favorite), + onTap: () async { + await deezerAPI.addPlaylist(p.id); + Fluttertoast.showToast( + msg: 'Added playlist to library', + gravity: ToastGravity.BOTTOM + ); + _close(); + }, + ); + + Widget addPlaylistOffline(Playlist p) => ListTile( + title: Text('Make playlist offline'), + leading: Icon(Icons.offline_pin), + onTap: () async { + //Add to library + await deezerAPI.addPlaylist(p.id); + downloadManager.addOfflinePlaylist(p, private: true); + _close(); + }, + ); + + Widget downloadPlaylist(Playlist p) => ListTile( + title: Text('Download playlist'), + leading: Icon(Icons.file_download), + onTap: () async { + downloadManager.addOfflinePlaylist(p, private: false); + _close(); + }, + ); + + + //=================== + // OTHER + //=================== + + //Create playlist + void createPlaylist() { + showDialog( + context: context, + builder: (BuildContext context) { + return CreatePlaylistDialog(); + } + ); + } + + + void _close() => Navigator.of(context).pop(); +} + + +class CreatePlaylistDialog extends StatefulWidget { + + final List tracks; + CreatePlaylistDialog({this.tracks, Key key}): super(key: key); + + @override + _CreatePlaylistDialogState createState() => _CreatePlaylistDialogState(); +} + +class _CreatePlaylistDialogState extends State { + + int _playlistType = 1; + String _title = ''; + String _description = ''; + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text('Create playlist'), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + TextField( + decoration: InputDecoration( + labelText: 'Title' + ), + onChanged: (String s) => _title = s, + ), + TextField( + onChanged: (String s) => _description = s, + decoration: InputDecoration( + labelText: 'Description' + ), + ), + Container(height: 4.0,), + DropdownButton( + value: _playlistType, + onChanged: (int v) { + setState(() => _playlistType = v); + }, + items: [ + DropdownMenuItem( + value: 1, + child: Text('Private'), + ), + DropdownMenuItem( + value: 2, + child: Text('Collaborative'), + ), + ], + ), + ], + ), + actions: [ + FlatButton( + child: Text('Cancel'), + onPressed: () => Navigator.of(context).pop(), + ), + FlatButton( + child: Text('Create'), + onPressed: () async { + List tracks = []; + if (widget.tracks != null) { + tracks = widget.tracks.map((t) => t.id).toList(); + } + await deezerAPI.createPlaylist( + _title, + status: _playlistType, + description: _description, + trackIds: tracks + ); + Fluttertoast.showToast( + msg: 'Playlist created!', + gravity: ToastGravity.BOTTOM + ); + Navigator.of(context).pop(); + }, + ) + ], + ); + } +} diff --git a/lib/ui/player_bar.dart b/lib/ui/player_bar.dart new file mode 100644 index 0000000..6d422d3 --- /dev/null +++ b/lib/ui/player_bar.dart @@ -0,0 +1,160 @@ +import 'package:audio_service/audio_service.dart'; +import 'package:flutter/material.dart'; +import 'package:freezer/settings.dart'; + +import '../api/player.dart'; +import 'cached_image.dart'; +import 'player_screen.dart'; + +class PlayerBar extends StatelessWidget { + double get progress { + if (AudioService.playbackState == null) return 0.0; + if (AudioService.currentMediaItem == null) return 0.0; + if (AudioService.currentMediaItem.duration.inSeconds == 0) return 0.0; //Division by 0 + return AudioService.playbackState.currentPosition.inSeconds / AudioService.currentMediaItem.duration.inSeconds; + } + + double iconSize = 32; + + @override + Widget build(BuildContext context) { + return StreamBuilder( + stream: Stream.periodic(Duration(milliseconds: 250)), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (AudioService.currentMediaItem == null) return Container(width: 0, height: 0,); + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + onTap: () => Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) => PlayerScreen())), + leading: CachedImage( + width: 50, + height: 50, + url: AudioService.currentMediaItem.artUri, + ), + title: Text( + AudioService.currentMediaItem.displayTitle, + overflow: TextOverflow.clip, + maxLines: 1, + ), + subtitle: Text( + AudioService.currentMediaItem.displaySubtitle, + overflow: TextOverflow.clip, + maxLines: 1, + ), + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + PrevNextButton(iconSize, prev: true, hidePrev: true,), + PlayPauseButton(iconSize), + PrevNextButton(iconSize) + ], + ) + ), + Container( + height: 3.0, + child: LinearProgressIndicator( + backgroundColor: Theme.of(context).primaryColor.withOpacity(0.1), + value: progress, + ), + ) + ], + ); + }, + ); + } +} + + +class PrevNextButton extends StatelessWidget { + + final double size; + final bool prev; + final bool hidePrev; + int i; + PrevNextButton(this.size, {this.prev = false, this.hidePrev = false}); + + @override + Widget build(BuildContext context) { + if (!prev) { + if (playerHelper.queueIndex == (AudioService.queue??[]).length - 1) { + return IconButton( + icon: Icon(Icons.skip_next), + iconSize: size, + onPressed: null, + ); + } + return IconButton( + icon: Icon(Icons.skip_next), + iconSize: size, + onPressed: () => AudioService.skipToNext(), + ); + } + if (prev) { + if (i == 0) { + if (hidePrev) { + return Container(height: 0, width: 0,); + } + return IconButton( + icon: Icon(Icons.skip_previous), + iconSize: size, + onPressed: null, + ); + } + return IconButton( + icon: Icon(Icons.skip_previous), + iconSize: size, + onPressed: () => AudioService.skipToPrevious(), + ); + } + return Container(); + } +} + + + +class PlayPauseButton extends StatelessWidget { + + final double size; + PlayPauseButton(this.size); + + @override + Widget build(BuildContext context) { + + //Playing + if (AudioService.playbackState?.playing??false) { + return IconButton( + iconSize: this.size, + icon: Icon(Icons.pause), + onPressed: () => AudioService.pause() + ); + } + + //Paused + if ((!AudioService.playbackState.playing && + AudioService.playbackState.processingState == AudioProcessingState.ready) || + //None state (stopped) + AudioService.playbackState.processingState == AudioProcessingState.none) { + return IconButton( + iconSize: this.size, + icon: Icon(Icons.play_arrow), + onPressed: () => AudioService.play() + ); + } + + switch (AudioService.playbackState.processingState) { + //Stopped/Error + case AudioProcessingState.error: + case AudioProcessingState.none: + case AudioProcessingState.stopped: + return Container(width: this.size, height: this.size); + //Loading, connecting, rewinding... + default: + return Container( + width: this.size, + height: this.size, + child: CircularProgressIndicator(), + ); + } + } +} diff --git a/lib/ui/player_screen.dart b/lib/ui/player_screen.dart new file mode 100644 index 0000000..5e5ba21 --- /dev/null +++ b/lib/ui/player_screen.dart @@ -0,0 +1,581 @@ +import 'dart:ui'; +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:audio_service/audio_service.dart'; +import 'package:freezer/api/deezer.dart'; +import 'package:freezer/api/player.dart'; +import 'package:freezer/ui/menu.dart'; +import 'package:freezer/ui/tiles.dart'; + +import 'cached_image.dart'; +import '../api/definitions.dart'; +import 'player_bar.dart'; + + + +class PlayerScreen extends StatefulWidget { + @override + _PlayerScreenState createState() => _PlayerScreenState(); +} + +class _PlayerScreenState extends State { + + double iconSize = 48; + bool _lyrics = false; + + @override + Widget build(BuildContext context) { + return Scaffold( + body: StreamBuilder( + stream: AudioService.playbackStateStream, + builder: (BuildContext context, AsyncSnapshot snapshot) { + + //Disable lyrics when skipping songs, loading + PlaybackState s = snapshot.data; + if (s != null && s.processingState != AudioProcessingState.ready && s.processingState != AudioProcessingState.buffering) _lyrics = false; + + return OrientationBuilder( + builder: (context, orientation) { + //Landscape + if (orientation == Orientation.landscape) { + return Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Padding( + padding: EdgeInsets.fromLTRB(16, 32, 16, 8), + child: Container( + width: 320, + child: Stack( + children: [ + CachedImage( + url: AudioService.currentMediaItem.artUri, + ), + if (_lyrics) LyricsWidget( + artUri: AudioService.currentMediaItem.artUri, + trackId: AudioService.currentMediaItem.id, + lyrics: Track.fromMediaItem(AudioService.currentMediaItem).lyrics, + height: 320.0, + ), + ], + ), + ) + ), + SizedBox( + width: MediaQuery.of(context).size.width / 2 - 32, + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: EdgeInsets.fromLTRB(8, 42, 8, 0), + child: Container( + width: 300, + child: PlayerScreenTopRow(), + ) + ), + Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + AudioService.currentMediaItem.displayTitle, + maxLines: 1, + textAlign: TextAlign.center, + overflow: TextOverflow.clip, + style: TextStyle( + fontSize: 24.0, + fontWeight: FontWeight.bold + ), + ), + Container(height: 4,), + Text( + AudioService.currentMediaItem.displaySubtitle, + maxLines: 1, + textAlign: TextAlign.center, + overflow: TextOverflow.clip, + style: TextStyle( + fontSize: 18.0, + color: Theme.of(context).primaryColor, + ), + ), + ], + ), + Container( + width: 320, + child: SeekBar(), + ), + Container( + width: 320, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + mainAxisSize: MainAxisSize.max, + children: [ + PrevNextButton(iconSize, prev: true,), + PlayPauseButton(iconSize), + PrevNextButton(iconSize) + ], + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(8, 0, 8, 16), + child: Container( + width: 300, + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + icon: Icon(Icons.subtitles), + onPressed: () { + setState(() => _lyrics = !_lyrics); + }, + ), + Text( + AudioService.currentMediaItem.extras['qualityString'] + ), + IconButton( + icon: Icon(Icons.more_vert), + onPressed: () { + Track t = Track.fromMediaItem(AudioService.currentMediaItem); + MenuSheet m = MenuSheet(context); + m.defaultTrackMenu(t); + }, + ) + ], + ), + ) + ) + ], + ), + ) + ], + ); + } + + //Portrait + return Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: EdgeInsets.fromLTRB(28, 28, 28, 0), + child: PlayerScreenTopRow() + ), + Padding( + padding: EdgeInsets.fromLTRB(16, 8, 16, 8), + child: Container( + height: 360, + child: Stack( + children: [ + CachedImage( + url: AudioService.currentMediaItem.artUri, + ), + if (_lyrics) LyricsWidget( + artUri: AudioService.currentMediaItem.artUri, + trackId: AudioService.currentMediaItem.id, + lyrics: Track.fromMediaItem(AudioService.currentMediaItem).lyrics, + height: 360.0, + ), + ], + ), + ) + ), + Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + AudioService.currentMediaItem.displayTitle, + maxLines: 1, + textAlign: TextAlign.center, + overflow: TextOverflow.clip, + style: TextStyle( + fontSize: 24.0, + fontWeight: FontWeight.bold + ), + ), + Container(height: 4,), + Text( + AudioService.currentMediaItem.displaySubtitle, + maxLines: 1, + textAlign: TextAlign.center, + overflow: TextOverflow.clip, + style: TextStyle( + fontSize: 18.0, + color: Theme.of(context).primaryColor, + ), + ), + ], + ), + SeekBar(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + mainAxisSize: MainAxisSize.max, + children: [ + PrevNextButton(iconSize, prev: true,), + PlayPauseButton(iconSize), + PrevNextButton(iconSize) + ], + ), + //Container(height: 8.0,), + Padding( + padding: EdgeInsets.symmetric(vertical: 4.0, horizontal: 16.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + icon: Icon(Icons.subtitles), + onPressed: () { + setState(() => _lyrics = !_lyrics); + }, + ), + Text( + AudioService.currentMediaItem.extras['qualityString'] + ), + IconButton( + icon: Icon(Icons.more_vert), + onPressed: () { + Track t = Track.fromMediaItem(AudioService.currentMediaItem); + MenuSheet m = MenuSheet(context); + m.defaultTrackMenu(t); + }, + ) + ], + ), + ) + ], + ); + + }, + ); + }, + ) + ); + } +} + +class LyricsWidget extends StatefulWidget { + + final Lyrics lyrics; + final String trackId; + final String artUri; + final double height; + LyricsWidget({this.artUri, this.lyrics, this.trackId, this.height, Key key}): super(key: key); + + @override + _LyricsWidgetState createState() => _LyricsWidgetState(); +} + +class _LyricsWidgetState extends State { + + bool _loading = true; + Lyrics _l; + Color _textColor = Colors.black; + ScrollController _scrollController = ScrollController(); + Timer _timer; + int _currentIndex; + double _boxHeight; + + Future _load() async { + //Get text color by album art (black or white) + if (widget.artUri != null) { + bool bw = await imagesDatabase.isDark(widget.artUri); + if (bw != null) setState(() => _textColor = bw?Colors.white:Colors.black); + } + + if (widget.lyrics.lyrics == null || widget.lyrics.lyrics.length == 0) { + //Load from api + try { + _l = await deezerAPI.lyrics(widget.trackId); + setState(() => _loading = false); + } catch (e) { + //Error Lyrics + setState(() => _l = Lyrics().error); + } + } else { + //Use provided lyrics + _l = widget.lyrics; + setState(() => _loading = false); + } + } + + @override + void initState() { + this._boxHeight = widget.height??400.0; + _load(); + Timer.periodic(Duration(milliseconds: 500), (timer) { + _timer = timer; + if (_loading) return; + //Update index of current lyric + setState(() { + _currentIndex = _l.lyrics.lastIndexWhere((l) => l.offset <= AudioService.playbackState.currentPosition); + }); + //Scroll to current lyric + if (_currentIndex <= 0) return; + _scrollController.animateTo( + (_boxHeight * _currentIndex), + duration: Duration(milliseconds: 250), + curve: Curves.ease + ); + + }); + super.initState(); + } + + @override + void dispose() { + if (_timer != null) _timer.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + height: _boxHeight, + width: _boxHeight, + child: BackdropFilter( + filter: ImageFilter.blur( + sigmaX: 7.0, + sigmaY: 7.0 + ), + child: Container( + child: _loading? + Center(child: CircularProgressIndicator(),) : + SingleChildScrollView( + controller: _scrollController, + child: Column( + children: List.generate(_l.lyrics.length, (i) { + return Container( + height: _boxHeight, + child: Center( + child: Text( + _l.lyrics[i].text, + textAlign: TextAlign.center, + style: TextStyle( + color: _textColor, + fontSize: 40.0, + fontWeight: (_currentIndex == i)?FontWeight.bold:FontWeight.normal + ), + ), + ) + ); + }), + ), + ) + ), + ), + ); + } +} + +//Top row containing QueueSource, queue... +class PlayerScreenTopRow extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Playing from: ' + playerHelper.queueSource.text, + maxLines: 1, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.right, + style: TextStyle(fontSize: 16.0), + ), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + RepeatButton(), + Container(width: 16.0,), + InkWell( + child: Icon(Icons.menu), + onTap: (){ + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => QueueScreen() + )); + }, + ), + ], + ) + ], + ); + } +} + + + +class RepeatButton extends StatefulWidget { + @override + _RepeatButtonState createState() => _RepeatButtonState(); +} + +class _RepeatButtonState extends State { + + Icon get icon { + switch (playerHelper.repeatType) { + case RepeatType.NONE: + return Icon(Icons.repeat); + case RepeatType.LIST: + return Icon( + Icons.repeat, + color: Theme.of(context).primaryColor, + ); + case RepeatType.TRACK: + return Icon( + Icons.repeat_one, + color: Theme.of(context).primaryColor, + ); + } + } + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () async { + await playerHelper.changeRepeat(); + setState(() {}); + }, + child: icon, + ); + } +} + + + +class SeekBar extends StatefulWidget { + @override + _SeekBarState createState() => _SeekBarState(); +} + +class _SeekBarState extends State { + + bool _seeking = false; + double _pos; + + double get position { + if (_seeking) return _pos; + if (AudioService.playbackState == null) return 0.0; + double p = AudioService.playbackState.currentPosition.inMilliseconds.toDouble()??0.0; + if (p > duration) return duration; + return p; + } + + //Duration to mm:ss + String _timeString(double pos) { + Duration d = Duration(milliseconds: pos.toInt()); + return "${d.inMinutes}:${d.inSeconds.remainder(60).toString().padLeft(2, '0')}"; + } + + double get duration { + if (AudioService.currentMediaItem == null) return 1.0; + return AudioService.currentMediaItem.duration.inMilliseconds.toDouble(); + } + + @override + Widget build(BuildContext context) { + return StreamBuilder( + stream: Stream.periodic(Duration(milliseconds: 250)), + builder: (BuildContext context, AsyncSnapshot snapshot) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 0.0, horizontal: 24.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + _timeString(position), + style: TextStyle( + fontSize: 14.0 + ), + ), + Text( + _timeString(duration), + style: TextStyle( + fontSize: 14.0 + ), + ) + ], + ), + ), + Container( + height: 32.0, + child: Slider( + value: position, + max: duration, + onChangeStart: (double d) { + setState(() { + _seeking = true; + _pos = d; + }); + }, + onChanged: (double d) { + setState(() { + _pos = d; + }); + }, + onChangeEnd: (double d) async { + await AudioService.seekTo(Duration(milliseconds: d.round())); + setState(() { + _pos = d; + _seeking = false; + }); + }, + ), + ) + ], + ); + }, + ); + } +} + +class QueueScreen extends StatefulWidget { + @override + _QueueScreenState createState() => _QueueScreenState(); +} + +class _QueueScreenState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Queue'), + actions: [ + IconButton( + icon: Icon(Icons.shuffle), + onPressed: () async { + await AudioService.customAction('shuffleQueue'); + setState(() => {}); + }, + ) + ], + ), + body: ListView.builder( + itemCount: AudioService.queue.length, + itemBuilder: (context, i) { + Track t = Track.fromMediaItem(AudioService.queue[i]); + return TrackTile( + t, + onTap: () async { + await AudioService.playFromMediaId(t.id); + Navigator.of(context).pop(); + }, + onHold: () { + MenuSheet m = MenuSheet(context); + m.defaultTrackMenu(t); + }, + ); + }, + ) + ); + } +} \ No newline at end of file diff --git a/lib/ui/search.dart b/lib/ui/search.dart new file mode 100644 index 0000000..02c3aea --- /dev/null +++ b/lib/ui/search.dart @@ -0,0 +1,387 @@ +import 'package:flutter/material.dart'; +import 'package:freezer/api/download.dart'; +import 'package:freezer/api/player.dart'; +import 'package:freezer/ui/details_screens.dart'; +import 'package:freezer/ui/menu.dart'; + +import 'tiles.dart'; +import '../api/deezer.dart'; +import '../api/definitions.dart'; +import '../settings.dart'; +import 'error.dart'; + +class SearchScreen extends StatefulWidget { + @override + _SearchScreenState createState() => _SearchScreenState(); +} + +class _SearchScreenState extends State { + + String _query; + bool _offline = settings.offlineMode; + + void _submit(BuildContext context, {String query}) { + if (query != null) _query = query; + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => SearchResultsScreen(_query, offline: _offline,)) + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Search'),), + body: ListView( + children: [ + Container(height: 16.0), + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.0), + child: Row( + children: [ + Expanded( + child: TextField( + onChanged: (String s) => _query = s, + decoration: InputDecoration( + labelText: 'Search' + ), + onSubmitted: (String s) => _submit(context, query: s), + ), + ), + IconButton( + icon: Icon(Icons.search), + onPressed: () => _submit(context), + ) + ], + ), + ), + ListTile( + title: Text('Offline search'), + leading: Switch( + value: _offline, + onChanged: (v) { + if (settings.offlineMode) { + setState(() => _offline = true); + } else { + setState(() => _offline = v); + } + }, + ), + ) + ], + ), + ); + } +} + + + +class SearchResultsScreen extends StatelessWidget { + + final String query; + final bool offline; + + SearchResultsScreen(this.query, {this.offline}); + + Future _search() async { + if (offline??false) { + return await downloadManager.search(query); + } + return await deezerAPI.search(query); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Search Results'), + ), + body: FutureBuilder( + future: _search(), + builder: (BuildContext context, AsyncSnapshot snapshot) { + + if (!snapshot.hasData) return Center(child: CircularProgressIndicator(),); + if (snapshot.hasError) return ErrorScreen(); + + SearchResults results = snapshot.data; + + if (results.empty) + return Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.warning, + size: 64, + ), + Text('No results!') + ], + ), + ); + + //Tracks + List tracks = []; + if (results.tracks != null && results.tracks.length != 0) { + tracks = [ + Text( + 'Tracks', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 26.0 + ), + ), + ...List.generate(3, (i) { + if (results.tracks.length <= i) return Container(width: 0, height: 0,); + Track t = results.tracks[i]; + return TrackTile( + t, + onTap: () { + playerHelper.playFromTrackList(results.tracks, t.id, QueueSource( + text: 'Search', + id: query, + source: 'search' + )); + }, + onHold: () { + MenuSheet m = MenuSheet(context); + m.defaultTrackMenu(t); + }, + ); + }), + ListTile( + title: Text('Show all tracks'), + onTap: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => TrackListScreen(results.tracks, QueueSource( + id: query, + source: 'search', + text: 'Search' + ))) + ); + }, + ) + ]; + } + + //Albums + List albums = []; + if (results.albums != null && results.albums.length != 0) { + albums = [ + Text( + 'Albums', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 26.0 + ), + ), + ...List.generate(3, (i) { + if (results.albums.length <= i) return Container(height: 0, width: 0,); + Album a = results.albums[i]; + return AlbumTile( + a, + onHold: () { + MenuSheet m = MenuSheet(context); + m.defaultAlbumMenu(a); + }, + onTap: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => AlbumDetails(a)) + ); + }, + ); + }), + ListTile( + title: Text('Show all albums'), + onTap: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => AlbumListScreen(results.albums)) + ); + }, + ) + ]; + } + + //Artists + List artists = []; + if (results.artists != null && results.artists.length != 0) { + artists = [ + Text( + 'Artists', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 26.0 + ), + ), + Container(height: 4), + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: List.generate(results.artists.length, (int i) { + Artist a = results.artists[i]; + return ArtistTile( + a, + onTap: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => ArtistDetails(a)) + ); + }, + onHold: () { + MenuSheet m = MenuSheet(context); + m.defaultArtistMenu(a); + }, + ); + }), + ) + ) + ]; + } + + //Playlists + List playlists = []; + if (results.playlists != null && results.playlists.length != 0) { + playlists = [ + Text( + 'Playlists', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 26.0 + ), + ), + ...List.generate(3, (i) { + if (results.playlists.length <= i) return Container(height: 0, width: 0,); + Playlist p = results.playlists[i]; + return PlaylistTile( + p, + onTap: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => PlaylistDetails(p)) + ); + }, + onHold: () { + MenuSheet m = MenuSheet(context); + m.defaultPlaylistMenu(p); + }, + ); + }), + ListTile( + title: Text('Show all playlists'), + onTap: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => SearchResultPlaylists(results.playlists)) + ); + }, + ) + ]; + } + + return ListView( + children: [ + Container(height: 8.0,), + ...tracks, + Container(height: 8.0,), + ...albums, + Container(height: 8.0,), + ...artists, + Container(height: 8.0,), + ...playlists + ], + ); + }, + ) + ); + } +} + +//List all tracks +class TrackListScreen extends StatelessWidget { + + final QueueSource queueSource; + final List tracks; + + TrackListScreen(this.tracks, this.queueSource); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Tracks'),), + body: ListView.builder( + itemCount: tracks.length, + itemBuilder: (BuildContext context, int i) { + Track t = tracks[i]; + return TrackTile( + t, + onTap: () { + playerHelper.playFromTrackList(tracks, t.id, queueSource); + }, + onHold: () { + MenuSheet m = MenuSheet(context); + m.defaultTrackMenu(t); + }, + ); + }, + ), + ); + } +} + +//List all albums +class AlbumListScreen extends StatelessWidget { + + final List albums; + AlbumListScreen(this.albums); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Albums'),), + body: ListView.builder( + itemCount: albums.length, + itemBuilder: (context, i) { + Album a = albums[i]; + return AlbumTile( + a, + onTap: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => AlbumDetails(a)) + ); + }, + onHold: () { + MenuSheet m = MenuSheet(context); + m.defaultAlbumMenu(a); + }, + ); + }, + ), + ); + } +} + +class SearchResultPlaylists extends StatelessWidget { + + final List playlists; + SearchResultPlaylists(this.playlists); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Playlists'),), + body: ListView.builder( + itemCount: playlists.length, + itemBuilder: (context, i) { + Playlist p = playlists[i]; + return PlaylistTile( + p, + onTap: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => PlaylistDetails(p)) + ); + }, + onHold: () { + MenuSheet m = MenuSheet(context); + m.defaultPlaylistMenu(p); + }, + ); + }, + ), + ); + } +} diff --git a/lib/ui/settings_screen.dart b/lib/ui/settings_screen.dart new file mode 100644 index 0000000..21aac76 --- /dev/null +++ b/lib/ui/settings_screen.dart @@ -0,0 +1,655 @@ +import 'package:country_pickers/country.dart'; +import 'package:country_pickers/country_picker_dialog.dart'; +import 'package:filesize/filesize.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_material_color_picker/flutter_material_color_picker.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:freezer/api/deezer.dart'; +import 'package:freezer/ui/error.dart'; +import 'package:freezer/ui/player_bar.dart'; +import 'package:language_pickers/language_pickers.dart'; +import 'package:language_pickers/languages.dart'; +import 'package:package_info/package_info.dart'; +import 'package:path_provider_ex/path_provider_ex.dart'; +import 'package:permission_handler/permission_handler.dart'; + +import '../settings.dart'; +import '../main.dart'; + +import 'dart:io'; + +class SettingsScreen extends StatefulWidget { + @override + _SettingsScreenState createState() => _SettingsScreenState(); +} + +class _SettingsScreenState extends State { + + String _about = ''; + + @override + void initState() { + //Load about text + PackageInfo.fromPlatform().then((PackageInfo info) { + setState(() { + _about = '${info.appName} ${info.version}'; + }); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Settings'),), + body: ListView( + children: [ + ListTile( + title: Text('General'), + leading: Icon(Icons.settings), + onTap: () => Navigator.of(context).push(MaterialPageRoute( + builder: (context) => GeneralSettings() + )), + ), + ListTile( + title: Text('Appearance'), + leading: Icon(Icons.color_lens), + onTap: () => Navigator.push( + context, + MaterialPageRoute(builder: (context) => AppearanceSettings()) + ), + ), + ListTile( + title: Text('Quality'), + leading: Icon(Icons.high_quality), + onTap: () => Navigator.push( + context, + MaterialPageRoute(builder: (context) => QualitySettings()) + ), + ), + ListTile( + title: Text('Deezer'), + leading: Icon(Icons.equalizer), + onTap: () => Navigator.push(context, MaterialPageRoute( + builder: (context) => DeezerSettings() + )), + ), + Divider(), + Text( + _about, + textAlign: TextAlign.center, + ) + ], + ), + ); + } +} + +class AppearanceSettings extends StatefulWidget { + @override + _AppearanceSettingsState createState() => _AppearanceSettingsState(); +} + +class _AppearanceSettingsState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Appearance'),), + body: ListView( + children: [ + ListTile( + title: Text('Theme'), + subtitle: Text('Currently: ${settings.theme.toString().split('.').last}'), + leading: Icon(Icons.color_lens), + onTap: () { + showDialog( + context: context, + builder: (context) { + return SimpleDialog( + title: Text('Select theme'), + children: [ + SimpleDialogOption( + child: Text('Light (default)'), + onPressed: () { + setState(() => settings.theme = Themes.Light); + settings.save(); + updateTheme(); + Navigator.of(context).pop(); + }, + ), + SimpleDialogOption( + child: Text('Dark'), + onPressed: () { + setState(() => settings.theme = Themes.Dark); + settings.save(); + updateTheme(); + Navigator.of(context).pop(); + }, + ), + SimpleDialogOption( + child: Text('Black (AMOLED)'), + onPressed: () { + setState(() => settings.theme = Themes.Black); + settings.save(); + updateTheme(); + Navigator.of(context).pop(); + }, + ) + ], + ); + } + ); + }, + ), + ListTile( + title: Text('Primary color'), + leading: Icon(Icons.format_paint), + subtitle: Text( + 'Selected color', + style: TextStyle( + color: settings.primaryColor + ), + ), + onTap: () { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text('Primary color'), + content: Container( + height: 200, + child: MaterialColorPicker( + allowShades: false, + selectedColor: settings.primaryColor, + onMainColorChange: (ColorSwatch color) { + setState(() { + settings.primaryColor = color; + }); + settings.save(); + updateTheme(); + Navigator.of(context).pop(); + }, + ), + ), + ); + } + ); + }, + ), + ListTile( + title: Text('Use album art primary color'), + subtitle: Text('Warning: might be buggy'), + leading: Switch( + value: settings.useArtColor, + onChanged: (v) => setState(() => settings.updateUseArtColor(v)), + ), + ) + ], + ), + ); + } +} + + +class QualitySettings extends StatefulWidget { + @override + _QualitySettingsState createState() => _QualitySettingsState(); +} + +class _QualitySettingsState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Quality'),), + body: ListView( + children: [ + ListTile( + title: Text('Mobile streaming'), + leading: Icon(Icons.network_cell), + ), + QualityPicker('mobile'), + Divider(), + ListTile( + title: Text('Wifi streaming'), + leading: Icon(Icons.network_wifi), + ), + QualityPicker('wifi'), + Divider(), + ListTile( + title: Text('Offline'), + leading: Icon(Icons.offline_pin), + ), + QualityPicker('offline'), + Divider(), + ListTile( + title: Text('External downloads'), + leading: Icon(Icons.file_download), + ), + QualityPicker('download'), + ], + ), + ); + } +} + +class QualityPicker extends StatefulWidget { + + final String field; + QualityPicker(this.field, {Key key}): super(key: key); + + @override + _QualityPickerState createState() => _QualityPickerState(); +} + +class _QualityPickerState extends State { + + AudioQuality _quality; + + @override + void initState() { + _getQuality(); + super.initState(); + } + + //Get current quality + void _getQuality() { + switch (widget.field) { + case 'mobile': + _quality = settings.mobileQuality; break; + case 'wifi': + _quality = settings.wifiQuality; break; + case 'download': + _quality = settings.downloadQuality; break; + case 'offline': + _quality = settings.offlineQuality; break; + } + } + + //Update quality in settings + void _updateQuality(AudioQuality q) { + setState(() { + _quality = q; + }); + switch (widget.field) { + case 'mobile': + settings.mobileQuality = _quality; break; + case 'wifi': + settings.wifiQuality = _quality; break; + case 'download': + settings.downloadQuality = _quality; break; + case 'offline': + settings.offlineQuality = _quality; break; + } + settings.updateAudioServiceQuality(); + } + + @override + void dispose() { + //Save + settings.updateAudioServiceQuality(); + settings.save(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + ListTile( + title: Text('MP3 128kbps'), + leading: Radio( + groupValue: _quality, + value: AudioQuality.MP3_128, + onChanged: (q) => _updateQuality(q), + ), + ), + ListTile( + title: Text('MP3 320kbps'), + leading: Radio( + groupValue: _quality, + value: AudioQuality.MP3_320, + onChanged: (q) => _updateQuality(q), + ), + ), + ListTile( + title: Text('FLAC'), + leading: Radio( + groupValue: _quality, + value: AudioQuality.FLAC, + onChanged: (q) => _updateQuality(q), + ), + ), + ], + ); + } +} + +class DeezerSettings extends StatefulWidget { + @override + _DeezerSettingsState createState() => _DeezerSettingsState(); +} + +class _DeezerSettingsState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Deezer'),), + body: ListView( + children: [ + ListTile( + title: Text('Content language'), + subtitle: Text('Not app language, used in headers. Now: ${settings.deezerLanguage}'), + leading: Icon(Icons.language), + onTap: () { + showDialog( + context: context, + builder: (context) => LanguagePickerDialog( + titlePadding: EdgeInsets.all(8.0), + isSearchable: true, + title: Text('Select language'), + onValuePicked: (Language language) { + setState(() => settings.deezerLanguage = language.isoCode); + settings.save(); + }, + ) + ); + }, + ), + ListTile( + title: Text('Content country'), + subtitle: Text('Country used in headers. Now: ${settings.deezerCountry}'), + leading: Icon(Icons.vpn_lock), + onTap: () { + showDialog( + context: context, + builder: (context) => CountryPickerDialog( + titlePadding: EdgeInsets.all(8.0), + isSearchable: true, + onValuePicked: (Country country) { + setState(() => settings.deezerCountry = country.isoCode); + settings.save(); + }, + ) + ); + }, + ), + ListTile( + title: Text('Log tracks'), + subtitle: Text('Send track listen logs to Deezer, enable it for features like Flow to work properly'), + leading: Checkbox( + value: settings.logListen, + onChanged: (bool v) { + setState(() => settings.logListen = v); + settings.save(); + }, + ), + ) + ], + ), + ); + } +} + +class GeneralSettings extends StatefulWidget { + @override + _GeneralSettingsState createState() => _GeneralSettingsState(); +} + +class _GeneralSettingsState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('General'),), + body: ListView( + children: [ + ListTile( + title: Text('Offline mode'), + subtitle: Text('Will be overwritten on start.'), + leading: Switch( + value: settings.offlineMode, + onChanged: (bool v) { + if (v) { + setState(() => settings.offlineMode = true); + return; + } + showDialog( + context: context, + builder: (context) { + deezerAPI.authorize().then((v) { + if (v) { + setState(() => settings.offlineMode = false); + } else { + Fluttertoast.showToast( + msg: 'Error logging in, check your internet connections.', + gravity: ToastGravity.BOTTOM, + toastLength: Toast.LENGTH_SHORT + ); + } + Navigator.of(context).pop(); + }); + return AlertDialog( + title: Text('Logging in...'), + content: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircularProgressIndicator() + ], + ) + ); + } + ); + }, + ), + ), + ListTile( + title: Text('Download path'), + leading: Icon(Icons.folder), + subtitle: Text(settings.downloadPath), + onTap: () async { + //Check permissions + if (!(await Permission.storage.request().isGranted)) return; + //Navigate + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => DirectoryPicker(settings.downloadPath, onSelect: (String p) { + setState(() => settings.downloadPath = p); + },) + )); + }, + ), + ListTile( + title: Text('Downloads naming'), + leading: Icon(Icons.text_format), + onTap: () { + showDialog( + context: context, + builder: (context) { + return SimpleDialog( + children: [ + ListTile( + title: Text('Default naming'), + subtitle: Text('01. Title'), + onTap: () { + settings.downloadNaming = DownloadNaming.DEFAULT; + Navigator.of(context).pop(); + settings.save(); + }, + ), + ListTile( + title: Text('Standalone naming'), + subtitle: Text('Artist - Title'), + onTap: () { + settings.downloadNaming = DownloadNaming.STANDALONE; + Navigator.of(context).pop(); + settings.save(); + }, + ), + ], + ); + } + ); + }, + ), + ListTile( + title: Text('Create download folder structure'), + subtitle: Text('Artist/Album/Track'), + leading: Switch( + value: settings.downloadFolderStructure, + onChanged: (v) { + setState(() => settings.downloadFolderStructure = v); + settings.save(); + }, + ), + ) + ], + ), + ); + } +} + +class DirectoryPicker extends StatefulWidget { + + final String initialPath; + final Function onSelect; + DirectoryPicker(this.initialPath, {this.onSelect, Key key}): super(key: key); + + @override + _DirectoryPickerState createState() => _DirectoryPickerState(); +} + +class _DirectoryPickerState extends State { + + String _path; + String _previous; + String _root; + + @override + void initState() { + _path = widget.initialPath; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Pick-a-Path'), + actions: [ + IconButton( + icon: Icon(Icons.sd_card), + onPressed: () { + String path = ''; + //Chose storage + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: Text('Select storage'), + content: FutureBuilder( + future: PathProviderEx.getStorageInfo(), + builder: (context, snapshot) { + if (snapshot.hasError) return ErrorScreen(); + if (!snapshot.hasData) return Padding( + padding: EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircularProgressIndicator() + ], + ), + ); + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + ...List.generate(snapshot.data.length, (i) { + StorageInfo si = snapshot.data[i]; + return ListTile( + title: Text(si.rootDir), + leading: Icon(Icons.sd_card), + trailing: Text(filesize(si.availableBytes)), + onTap: () { + setState(() { + _path = si.appFilesDir; + //Android 5+ blocks sd card, so this prevents going outside + //app data dir, until permission request fix. + _root = si.rootDir; + if (i != 0) _root = si.appFilesDir; + }); + Navigator.of(context).pop(); + }, + ); + }) + ], + ); + }, + ), + ); + } + ); + } + ) + ], + ), + floatingActionButton: FloatingActionButton( + child: Icon(Icons.done), + onPressed: () { + //When folder confirmed + if (widget.onSelect != null) widget.onSelect(_path); + Navigator.of(context).pop(); + }, + ), + body: FutureBuilder( + future: Directory(_path).list().toList(), + builder: (BuildContext context, AsyncSnapshot snapshot) { + + //On error go to last good path + if (snapshot.hasError) Future.delayed(Duration(milliseconds: 50), () => setState(() => _path = _previous)); + if (!snapshot.hasData) return Center(child: CircularProgressIndicator(),); + + List data = snapshot.data; + return ListView( + children: [ + ListTile( + title: Text(_path), + ), + ListTile( + title: Text('Go up'), + leading: Icon(Icons.arrow_upward), + onTap: () { + setState(() { + if (_root == _path) { + Fluttertoast.showToast( + msg: 'Permission denied', + gravity: ToastGravity.BOTTOM + ); + return; + } + _previous = _path; + _path = Directory(_path).parent.path; + }); + }, + ), + ...List.generate(data.length, (i) { + FileSystemEntity f = data[i]; + if (f is Directory) { + return ListTile( + title: Text(f.path.split('/').last), + leading: Icon(Icons.folder), + onTap: () { + setState(() { + _previous = _path; + _path = f.path; + }); + }, + ); + } + return Container(height: 0, width: 0,); + }) + ], + ); + }, + ), + ); + } +} diff --git a/lib/ui/tiles.dart b/lib/ui/tiles.dart new file mode 100644 index 0000000..14e3378 --- /dev/null +++ b/lib/ui/tiles.dart @@ -0,0 +1,363 @@ +import 'dart:async'; + +import 'package:audio_service/audio_service.dart'; +import 'package:flutter/material.dart'; + +import '../api/definitions.dart'; +import 'cached_image.dart'; + +class TrackTile extends StatefulWidget { + + final Track track; + final Function onTap; + final Function onHold; + final Widget trailing; + + TrackTile(this.track, {this.onTap, this.onHold, this.trailing, Key key}): super(key: key); + + @override + _TrackTileState createState() => _TrackTileState(); +} + +class _TrackTileState extends State { + + StreamSubscription _subscription; + + bool get nowPlaying { + if (AudioService.currentMediaItem == null) return false; + return AudioService.currentMediaItem.id == widget.track.id; + } + + @override + void initState() { + //Listen to media item changes, update text color if currently playing + _subscription = AudioService.currentMediaItemStream.listen((event) { + setState(() {}); + }); + super.initState(); + } + + @override + void dispose() { + if (_subscription != null) _subscription.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ListTile( + title: Text( + widget.track.title, + maxLines: 1, + style: TextStyle( + color: nowPlaying?Theme.of(context).primaryColor:null + ), + ), + subtitle: Text( + widget.track.artistString, + maxLines: 1, + ), + leading: CachedImage( + url: widget.track.albumArt.thumb, + ), + onTap: widget.onTap, + onLongPress: widget.onHold, + trailing: widget.trailing, + ); + } +} + +class AlbumTile extends StatelessWidget { + + final Album album; + final Function onTap; + final Function onHold; + final Widget trailing; + + AlbumTile(this.album, {this.onTap, this.onHold, this.trailing}); + + @override + Widget build(BuildContext context) { + return ListTile( + title: Text( + album.title, + maxLines: 1, + ), + subtitle: Text( + album.artistString, + maxLines: 1, + ), + leading: CachedImage( + url: album.art.thumb, + ), + onTap: onTap, + onLongPress: onHold, + trailing: trailing, + ); + } +} + +class ArtistTile extends StatelessWidget { + + final Artist artist; + final Function onTap; + final Function onHold; + + ArtistTile(this.artist, {this.onTap, this.onHold}); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 150, + child: Card( + child: InkWell( + onTap: onTap, + onLongPress: onHold, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container(height: 4,), + CachedImage( + url: artist.picture.thumb, + circular: true, + width: 64, + ), + Container(height: 4,), + Text( + artist.name, + maxLines: 1, + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 16.0 + ), + ), + Container(height: 4,), + ], + ), + ), + ) + ); + } +} + +class PlaylistTile extends StatelessWidget { + + final Playlist playlist; + final Function onTap; + final Function onHold; + final Widget trailing; + + PlaylistTile(this.playlist, {this.onHold, this.onTap, this.trailing}); + + @override + Widget build(BuildContext context) { + return ListTile( + title: Text( + playlist.title, + maxLines: 1, + ), + subtitle: Text( + playlist.user.name, + maxLines: 1, + ), + leading: CachedImage( + url: playlist.image.thumb, + ), + onTap: onTap, + onLongPress: onHold, + trailing: trailing, + ); + } +} + +class ArtistHorizontalTile extends StatelessWidget { + + final Artist artist; + final Function onTap; + final Function onHold; + final Widget trailing; + + ArtistHorizontalTile(this.artist, {this.onHold, this.onTap, this.trailing}); + + @override + Widget build(BuildContext context) { + return ListTile( + title: Text( + artist.name, + maxLines: 1, + ), + leading: CachedImage( + url: artist.picture.thumb, + circular: true, + ), + onTap: onTap, + onLongPress: onHold, + trailing: trailing, + ); + } +} + +class PlaylistCardTile extends StatelessWidget { + + final Playlist playlist; + final Function onTap; + final Function onHold; + PlaylistCardTile(this.playlist, {this.onTap, this.onHold}); + + @override + Widget build(BuildContext context) { + return Card( + child: InkWell( + onTap: onTap, + onLongPress: onHold, + child: Column( + children: [ + Padding( + padding: EdgeInsets.all(8), + child: CachedImage( + url: playlist.image.thumb, + width: 128, + height: 128, + ), + ), + Container( + width: 144, + child: Text( + playlist.title, + maxLines: 1, + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis, + style: TextStyle(fontSize: 16.0), + ), + ) + ], + ), + ) + ); + } +} + +class SmartTrackListTile extends StatelessWidget { + + final SmartTrackList smartTrackList; + final Function onTap; + final Function onHold; + SmartTrackListTile(this.smartTrackList, {this.onHold, this.onTap}); + + @override + Widget build(BuildContext context) { + return Card( + child: InkWell( + onTap: onTap, + onLongPress: onHold, + child: Column( + children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: CachedImage( + width: 128, + height: 128, + url: smartTrackList.cover.thumb, + ), + ), + Container( + width: 144.0, + child: Text( + smartTrackList.title, + maxLines: 1, + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 16.0 + ), + ), + ) + ], + ), + ), + ); + } +} + +class AlbumCard extends StatelessWidget { + + final Album album; + final Function onTap; + final Function onHold; + + AlbumCard(this.album, {this.onTap, this.onHold}); + + @override + Widget build(BuildContext context) { + return Card( + child: InkWell( + onTap: onTap, + onLongPress: onHold, + child: Column( + children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: CachedImage( + width: 128.0, + height: 128.0, + url: album.art.thumb, + ), + ), + Container( + width: 144.0, + child: Text( + album.title, + maxLines: 1, + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 16.0 + ), + ), + ) + ], + ), + ) + ); + } +} + +class ChannelTile extends StatelessWidget { + + final DeezerChannel channel; + final Function onTap; + ChannelTile(this.channel, {this.onTap}); + + Color _textColor() { + double luminance = channel.backgroundColor.computeLuminance(); + return (luminance>0.5)?Colors.black:Colors.white; + } + + @override + Widget build(BuildContext context) { + return Card( + color: channel.backgroundColor, + child: InkWell( + onTap: this.onTap, + child: Container( + width: 150, + height: 75, + child: Center( + child: Text( + channel.title, + textAlign: TextAlign.center, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 18.0, + fontWeight: FontWeight.bold, + color: _textColor() + ), + ), + ), + ), + ) + ); + } +} diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..ca3fd6a --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,805 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + url: "https://pub.dartlang.org" + source: hosted + version: "0.39.10" + archive: + dependency: transitive + description: + name: archive + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.13" + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.0" + async: + dependency: transitive + description: + name: async + url: "https://pub.dartlang.org" + source: hosted + version: "2.4.1" + audio_service: + dependency: "direct main" + description: + name: audio_service + url: "https://pub.dartlang.org" + source: hosted + version: "0.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + build: + dependency: transitive + description: + name: build + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + build_config: + dependency: transitive + description: + name: build_config + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.2" + build_daemon: + dependency: transitive + description: + name: build_daemon + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.4" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.9" + build_runner: + dependency: "direct dev" + description: + name: build_runner + url: "https://pub.dartlang.org" + source: hosted + version: "1.10.0" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + url: "https://pub.dartlang.org" + source: hosted + version: "5.2.0" + built_collection: + dependency: transitive + description: + name: built_collection + url: "https://pub.dartlang.org" + source: hosted + version: "4.3.2" + built_value: + dependency: transitive + description: + name: built_value + url: "https://pub.dartlang.org" + source: hosted + version: "7.1.0" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.3" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + clock: + dependency: transitive + description: + name: clock + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + code_builder: + dependency: transitive + description: + name: code_builder + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.0" + collection: + dependency: "direct main" + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.14.12" + connectivity: + dependency: "direct main" + description: + name: connectivity + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.8+6" + connectivity_macos: + dependency: transitive + description: + name: connectivity_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.0+3" + connectivity_platform_interface: + dependency: transitive + description: + name: connectivity_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.6" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + cookie_jar: + dependency: "direct main" + description: + name: cookie_jar + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + country_pickers: + dependency: "direct main" + description: + name: country_pickers + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + crypto: + dependency: "direct main" + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.4" + csslib: + dependency: transitive + description: + name: csslib + url: "https://pub.dartlang.org" + source: hosted + version: "0.16.1" + custom_navigator: + dependency: "direct main" + description: + name: custom_navigator + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.0" + dart_style: + dependency: transitive + description: + name: dart_style + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.6" + dio: + dependency: "direct main" + description: + name: dio + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.9" + dio_cookie_manager: + dependency: "direct main" + description: + name: dio_cookie_manager + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + disk_space: + dependency: "direct main" + description: + name: disk_space + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.3" + ext_storage: + dependency: "direct main" + description: + name: ext_storage + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.0" + filesize: + dependency: "direct main" + description: + name: filesize + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + fixnum: + dependency: transitive + description: + name: fixnum + url: "https://pub.dartlang.org" + source: hosted + version: "0.10.11" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_cache_manager: + dependency: transitive + description: + name: flutter_cache_manager + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" + flutter_inappwebview: + dependency: "direct main" + description: + name: flutter_inappwebview + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.0+3" + flutter_isolate: + dependency: transitive + description: + name: flutter_isolate + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0+14" + flutter_local_notifications: + dependency: "direct main" + description: + name: flutter_local_notifications + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.4+1" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + flutter_material_color_picker: + dependency: "direct main" + description: + name: flutter_material_color_picker + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.5" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + fluttertoast: + dependency: "direct main" + description: + name: fluttertoast + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.1" + glob: + dependency: transitive + description: + name: glob + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + graphs: + dependency: transitive + description: + name: graphs + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0" + hex: + dependency: "direct main" + description: + name: hex + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.2" + html: + dependency: transitive + description: + name: html + url: "https://pub.dartlang.org" + source: hosted + version: "0.14.0+3" + http: + dependency: transitive + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.1" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.4" + image: + dependency: transitive + description: + name: image + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.12" + intl: + dependency: "direct main" + description: + name: intl + url: "https://pub.dartlang.org" + source: hosted + version: "0.16.1" + io: + dependency: transitive + description: + name: io + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.4" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.2" + json_annotation: + dependency: "direct main" + description: + name: json_annotation + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + json_serializable: + dependency: "direct dev" + description: + name: json_serializable + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.0" + just_audio: + dependency: "direct main" + description: + path: "." + ref: HEAD + resolved-ref: "70392a52590c95bd4b1ca35c7e92d30793c7c4d3" + url: "https://notabug.org/exttex/just_audio.git" + source: git + version: "0.1.10" + language_pickers: + dependency: "direct main" + description: + name: language_pickers + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0+1" + logging: + dependency: transitive + description: + name: logging + url: "https://pub.dartlang.org" + source: hosted + version: "0.11.4" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.6" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.8" + mime: + dependency: transitive + description: + name: mime + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.6+3" + move_to_background: + dependency: "direct main" + description: + name: move_to_background + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + node_interop: + dependency: transitive + description: + name: node_interop + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" + node_io: + dependency: transitive + description: + name: node_io + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" + package_config: + dependency: transitive + description: + name: package_config + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.3" + package_info: + dependency: "direct main" + description: + name: package_info + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.1" + palette_generator: + dependency: "direct main" + description: + name: palette_generator + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.3" + path: + dependency: "direct main" + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.4" + path_provider: + dependency: "direct main" + description: + name: path_provider + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.10" + path_provider_ex: + dependency: "direct main" + description: + name: path_provider_ex + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+1" + path_provider_macos: + dependency: transitive + description: + name: path_provider_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.4+3" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.0" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + url: "https://pub.dartlang.org" + source: hosted + version: "5.0.1" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + petitparser: + dependency: transitive + description: + name: petitparser + url: "https://pub.dartlang.org" + source: hosted + version: "2.4.0" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + pointycastle: + dependency: "direct main" + description: + name: pointycastle + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + pool: + dependency: transitive + description: + name: pool + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.13" + pub_semver: + dependency: transitive + description: + name: pub_semver + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.4" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.5" + quiver: + dependency: transitive + description: + name: quiver + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.3" + random_string: + dependency: "direct main" + description: + name: random_string + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + rxdart: + dependency: transitive + description: + name: rxdart + url: "https://pub.dartlang.org" + source: hosted + version: "0.24.1" + shelf: + dependency: transitive + description: + name: shelf + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.5" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.3" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_gen: + dependency: transitive + description: + name: source_gen + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.5" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.dartlang.org" + source: hosted + version: "1.7.0" + sqflite: + dependency: "direct main" + description: + name: sqflite + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.1" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.3" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + stream_transform: + dependency: transitive + description: + name: stream_transform + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.5" + synchronized: + dependency: transitive + description: + name: synchronized + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.15" + timing: + dependency: transitive + description: + name: timing + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.1+2" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.6" + uuid: + dependency: transitive + description: + name: uuid + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.4" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" + watcher: + dependency: transitive + description: + name: watcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.9.7+15" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.0" + xml: + dependency: transitive + description: + name: xml + url: "https://pub.dartlang.org" + source: hosted + version: "3.6.1" + yaml: + dependency: transitive + description: + name: yaml + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" +sdks: + dart: ">=2.7.0 <3.0.0" + flutter: ">=1.15.21 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..9b84b6e --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,127 @@ +name: freezer +description: Freezer + +# The following line prevents the package from being accidentally published to +# pub.dev using `pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +version: 0.1.0 + +environment: + sdk: ">=2.7.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + + dio: ^3.0.9 + dio_cookie_manager: ^1.0.0 + cookie_jar: ^1.0.1 + json_annotation: ^3.0.1 + path_provider: ^1.6.9 + path: ^1.6.4 + sqflite: ^1.3.0+1 + crypto: ^2.1.4 + hex: ^0.1.2 + pointycastle: ^1.0.2 + ext_storage: ^1.0.3 + permission_handler: ^5.0.0+hotfix.6 + connectivity: ^0.4.8+6 + intl: ^0.16.1 + filesize: ^1.0.4 + fluttertoast: ^4.0.1 + palette_generator: ^0.2.3 + flutter_material_color_picker: ^1.0.5 + flutter_inappwebview: ^3.3.0+3 + custom_navigator: ^0.3.0 + language_pickers: ^0.2.0+1 + country_pickers: ^1.3.0 + package_info: ^0.4.1 + move_to_background: ^1.0.1 + flutter_local_notifications: ^1.4.4+1 + collection: ^1.14.12 + disk_space: ^0.0.3 + audio_service: ^0.11.0 + path_provider_ex: ^1.0.1 + random_string: ^2.0.1 + + just_audio: + git: https://notabug.org/exttex/just_audio.git + + # cupertino_icons: ^0.1.3 + +dev_dependencies: + flutter_test: + sdk: flutter + + json_serializable: ^3.3.0 + build_runner: ^1.10.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + assets: + - assets/cover.jpg + + fonts: + - family: Montserrat + fonts: + - asset: assets/fonts/Montserrat-Regular.ttf + - asset: assets/fonts/Montserrat-Bold.ttf + weight: 700 + - asset: assets/fonts/Montserrat-Italic.ttf + style: italic + - family: Jost + fonts: + - asset: assets/fonts/Jost-Italic.ttf + style: italic + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages +