From 39e35d06e1662af69fce6710d0ca73e940a0a618 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nguy=E1=BB=85n=20=C4=90=E1=BB=A9c=20Tu=E1=BA=A5n=20Minh?=
<113747128+maxrave-dev@users.noreply.github.com>
Date: Sun, 20 Aug 2023 21:18:58 +0700
Subject: [PATCH 1/5] Update README.md
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index bd7eda8a..90262265 100644
--- a/README.md
+++ b/README.md
@@ -28,8 +28,8 @@ A simple music app using YouTube Music for backend
-
-
+
+
More [screenshot](https://photos.app.goo.gl/AbieoXG5ctDrpwzp7) here.
From 94884f72b9ed25eaf97be779bfe3a3ae394b8fd9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nguy=E1=BB=85n=20=C4=90=E1=BB=A9c=20Tu=E1=BA=A5n=20Minh?=
<113747128+maxrave-dev@users.noreply.github.com>
Date: Mon, 11 Sep 2023 00:26:40 +0700
Subject: [PATCH 2/5] Revert "Release 0.1.3 beta"
---
README.md | 28 +-
app/build.gradle.kts | 37 +-
app/release/output-metadata.json | 4 +-
.../3.json | 614 --------------
app/src/main/AndroidManifest.xml | 17 +-
.../maxrave/simpmusic/SimpMusicApplication.kt | 40 +-
.../adapter/home/QuickPicksAdapter.kt | 2 -
.../adapter/playlist/PlaylistItemAdapter.kt | 5 +-
.../com/maxrave/simpmusic/common/Config.kt | 28 -
.../data/dataStore/DataStoreManager.kt | 229 +-----
.../maxrave/simpmusic/data/db/Converters.kt | 13 -
.../maxrave/simpmusic/data/db/DatabaseDao.kt | 11 -
.../simpmusic/data/db/LocalDataSource.kt | 5 -
.../simpmusic/data/db/MusicDatabase.kt | 3 +-
.../data/db/entities/FormatEntity.kt | 1 -
.../simpmusic/data/db/entities/QueueEntity.kt | 12 -
.../simpmusic/data/parser/PlaylistParser.kt | 7 +-
.../com/maxrave/simpmusic/data/queue/Queue.kt | 11 +-
.../data/repository/MainRepository.kt | 65 +-
.../simpmusic/di/LocalServiceModule.kt | 11 -
.../simpmusic/di/MusicServiceModule.kt | 41 +-
.../com/maxrave/simpmusic/extension/AllExt.kt | 9 -
.../simpmusic/extension/StringMatcher.kt | 37 -
.../service/SimpleMediaNotificationAdapter.kt | 63 ++
.../service/SimpleMediaNotificationManager.kt | 115 +++
.../simpmusic/service/SimpleMediaService.kt | 61 +-
.../service/SimpleMediaServiceHandler.kt | 292 +------
.../service/SimpleMediaSessionCallback.kt | 55 --
.../service/test/PersistentStorage.kt | 113 ---
.../service/test/source/FetchQueue.kt | 8 +-
.../service/test/source/MusicSource.kt | 3 +-
.../com/maxrave/simpmusic/ui/MainActivity.kt | 562 +++++--------
.../simpmusic/ui/fragment/SearchFragment.kt | 183 +++--
.../ui/fragment/home/SettingsFragment.kt | 166 +---
.../ui/fragment/library/DownloadedFragment.kt | 6 +-
.../ui/fragment/library/FavoriteFragment.kt | 8 +-
.../ui/fragment/library/MostPlayedFragment.kt | 6 +-
.../ui/fragment/login/LogInFragment.kt | 7 -
.../ui/fragment/other/ArtistFragment.kt | 5 +-
.../ui/fragment/player/InfoFragment.kt | 2 -
.../ui/fragment/player/NowPlayingFragment.kt | 772 ++++++++----------
.../simpmusic/viewModel/ArtistViewModel.kt | 8 +-
.../viewModel/DownloadedViewModel.kt | 3 +-
.../simpmusic/viewModel/FavoriteViewModel.kt | 6 +-
.../simpmusic/viewModel/LibraryViewModel.kt | 14 +-
.../viewModel/MostPlayedViewModel.kt | 6 +-
.../simpmusic/viewModel/PlaylistViewModel.kt | 3 +-
.../simpmusic/viewModel/SearchViewModel.kt | 17 +-
.../simpmusic/viewModel/SettingsViewModel.kt | 227 +----
.../simpmusic/viewModel/SharedViewModel.kt | 293 ++-----
app/src/main/res/drawable/alarm_enable.xml | 5 -
.../res/drawable/background_image_view.xml | 4 +-
.../res/drawable/baseline_access_alarm_24.xml | 5 -
.../main/res/drawable/baseline_circle_24.xml | 5 -
app/src/main/res/drawable/repeat_on.xml | 11 -
.../res/layout/bottom_sheet_now_playing.xml | 29 -
.../res/layout/bottom_sheet_sleep_timer.xml | 50 --
.../res/layout/fragment_local_playlist.xml | 2 +-
.../main/res/layout/fragment_now_playing.xml | 58 +-
app/src/main/res/layout/fragment_playlist.xml | 2 +-
app/src/main/res/layout/fragment_search.xml | 46 +-
app/src/main/res/layout/fragment_settings.xml | 254 +-----
app/src/main/res/layout/info_fragment.xml | 26 +-
app/src/main/res/layout/item_popular_song.xml | 23 +-
app/src/main/res/layout/item_queue_track.xml | 5 +-
app/src/main/res/layout/item_quick_picks.xml | 16 +-
.../res/layout/item_songs_search_result.xml | 5 +-
.../res/layout/items_videos_search_result.xml | 5 +-
app/src/main/res/values-it/strings.xml | 50 --
app/src/main/res/values-vi/strings.xml | 52 --
app/src/main/res/values/strings.xml | 55 +-
asset/screenshot/artist_bottom.jpg | Bin 655315 -> 0 bytes
asset/screenshot/artist_top.jpg | Bin 650549 -> 0 bytes
asset/screenshot/miniplayer_bottom.jpg | Bin 755487 -> 0 bytes
asset/screenshot/miniplayer_top.jpg | Bin 533288 -> 0 bytes
.../screenshot/new_setting_sponsor_block.jpg | Bin 192418 -> 0 bytes
asset/screenshot/notification.jpg | Bin 624813 -> 0 bytes
...0899_b2eed27b24f5a3974421c0770eab2a5f.jpg} | Bin
...4784_97b08d37c039dc69281a0bf74a1cb688.jpg} | Bin
...5636_f309089b0f5db60252b25f0b6e89963a.jpg} | Bin
...9687_77b20f13e6196390ab8b8f6cf0e1071e.jpg} | Bin
...0917_ac8d59acbac7d5a3e47a60d687a337cb.jpg} | Bin
...5073_be57c0b10070ded437ddf59f546b9002.jpg} | Bin
...00661_926c2f0a8b6f5663bf7c45abe7a68060.jpg | Bin 0 -> 1182165 bytes
...06051_a9b3469344d3f72e5e9dad192539f7f4.jpg | Bin 0 -> 531065 bytes
...22758_2c14f823fda525931752b2d8a9d5a69d.jpg | Bin 0 -> 532529 bytes
...29854_769bf3dd0c2bdcc2193e8443e71dca87.jpg | Bin 0 -> 751082 bytes
build.gradle.kts | 6 +-
.../metadata/android/en-US/changelogs/9.txt | 15 -
.../android/en-US/full_description.txt | 5 +-
.../en-US/images/phoneScreenshots/1.jpg | Bin 533288 -> 799654 bytes
.../en-US/images/phoneScreenshots/10.jpg | Bin 581815 -> 0 bytes
.../en-US/images/phoneScreenshots/11.jpg | Bin 192418 -> 0 bytes
.../en-US/images/phoneScreenshots/12.jpg | Bin 624813 -> 0 bytes
.../en-US/images/phoneScreenshots/2.jpg | Bin 755487 -> 224975 bytes
.../en-US/images/phoneScreenshots/3.jpg | Bin 720452 -> 424946 bytes
.../en-US/images/phoneScreenshots/4.jpg | Bin 273348 -> 1130185 bytes
.../en-US/images/phoneScreenshots/5.jpg | Bin 65030 -> 347506 bytes
.../en-US/images/phoneScreenshots/6.jpg | Bin 110162 -> 341225 bytes
.../en-US/images/phoneScreenshots/7.jpg | Bin 542094 -> 388177 bytes
.../en-US/images/phoneScreenshots/8.jpg | Bin 650549 -> 475364 bytes
.../en-US/images/phoneScreenshots/9.jpg | Bin 655315 -> 0 bytes
.../metadata/android/vi-VN/changelogs/9.txt | 15 -
.../android/vi-VN/full_description.txt | 5 +-
.../vi-VN/images/phoneScreenshots/1.jpg | Bin 533288 -> 799654 bytes
.../vi-VN/images/phoneScreenshots/10.jpg | Bin 581815 -> 0 bytes
.../vi-VN/images/phoneScreenshots/11.jpg | Bin 192418 -> 0 bytes
.../vi-VN/images/phoneScreenshots/12.jpg | Bin 624813 -> 0 bytes
.../vi-VN/images/phoneScreenshots/2.jpg | Bin 755487 -> 224975 bytes
.../vi-VN/images/phoneScreenshots/3.jpg | Bin 720452 -> 424946 bytes
.../vi-VN/images/phoneScreenshots/4.jpg | Bin 273348 -> 1130185 bytes
.../vi-VN/images/phoneScreenshots/5.jpg | Bin 65030 -> 347506 bytes
.../vi-VN/images/phoneScreenshots/6.jpg | Bin 110162 -> 341225 bytes
.../vi-VN/images/phoneScreenshots/7.jpg | Bin 542094 -> 388177 bytes
.../vi-VN/images/phoneScreenshots/8.jpg | Bin 650549 -> 475364 bytes
.../vi-VN/images/phoneScreenshots/9.jpg | Bin 655315 -> 0 bytes
kotlinYtmusicScraper/build.gradle.kts | 4 +-
.../maxrave/kotlinytmusicscraper/YouTube.kt | 35 +-
.../maxrave/kotlinytmusicscraper/Ytmusic.kt | 25 -
.../models/response/PlayerResponse.kt | 1 -
.../models/simpmusic/Asset.kt | 35 -
.../models/simpmusic/Author.kt | 45 -
.../models/simpmusic/GithubResponse.kt | 47 --
.../models/simpmusic/Reactions.kt | 29 -
.../models/simpmusic/Uploader.kt | 45 -
.../models/sponsorblock/SkipSegments.kt | 25 -
126 files changed, 1232 insertions(+), 4047 deletions(-)
delete mode 100644 app/schemas/com.maxrave.simpmusic.data.db.MusicDatabase/3.json
delete mode 100644 app/src/main/java/com/maxrave/simpmusic/data/db/entities/QueueEntity.kt
delete mode 100644 app/src/main/java/com/maxrave/simpmusic/extension/StringMatcher.kt
create mode 100644 app/src/main/java/com/maxrave/simpmusic/service/SimpleMediaNotificationAdapter.kt
create mode 100644 app/src/main/java/com/maxrave/simpmusic/service/SimpleMediaNotificationManager.kt
delete mode 100644 app/src/main/java/com/maxrave/simpmusic/service/SimpleMediaSessionCallback.kt
delete mode 100644 app/src/main/java/com/maxrave/simpmusic/service/test/PersistentStorage.kt
delete mode 100644 app/src/main/res/drawable/alarm_enable.xml
delete mode 100644 app/src/main/res/drawable/baseline_access_alarm_24.xml
delete mode 100644 app/src/main/res/drawable/baseline_circle_24.xml
delete mode 100644 app/src/main/res/drawable/repeat_on.xml
delete mode 100644 app/src/main/res/layout/bottom_sheet_sleep_timer.xml
delete mode 100644 asset/screenshot/artist_bottom.jpg
delete mode 100644 asset/screenshot/artist_top.jpg
delete mode 100644 asset/screenshot/miniplayer_bottom.jpg
delete mode 100644 asset/screenshot/miniplayer_top.jpg
delete mode 100644 asset/screenshot/new_setting_sponsor_block.jpg
delete mode 100644 asset/screenshot/notification.jpg
rename asset/screenshot/{home.jpg => z4388612780899_b2eed27b24f5a3974421c0770eab2a5f.jpg} (100%)
rename asset/screenshot/{moodmoment.jpg => z4388612784784_97b08d37c039dc69281a0bf74a1cb688.jpg} (100%)
rename asset/screenshot/{chart.jpg => z4388612785636_f309089b0f5db60252b25f0b6e89963a.jpg} (100%)
rename asset/screenshot/{search.jpg => z4388612789687_77b20f13e6196390ab8b8f6cf0e1071e.jpg} (100%)
rename asset/screenshot/{search_suggest.jpg => z4388612790917_ac8d59acbac7d5a3e47a60d687a337cb.jpg} (100%)
rename asset/screenshot/{search_result.jpg => z4388612795073_be57c0b10070ded437ddf59f546b9002.jpg} (100%)
create mode 100644 asset/screenshot/z4388612800661_926c2f0a8b6f5663bf7c45abe7a68060.jpg
create mode 100644 asset/screenshot/z4388612806051_a9b3469344d3f72e5e9dad192539f7f4.jpg
create mode 100644 asset/screenshot/z4620350122758_2c14f823fda525931752b2d8a9d5a69d.jpg
create mode 100644 asset/screenshot/z4620350129854_769bf3dd0c2bdcc2193e8443e71dca87.jpg
delete mode 100644 fastlane/metadata/android/en-US/changelogs/9.txt
delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/10.jpg
delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/11.jpg
delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/12.jpg
delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/9.jpg
delete mode 100644 fastlane/metadata/android/vi-VN/changelogs/9.txt
delete mode 100644 fastlane/metadata/android/vi-VN/images/phoneScreenshots/10.jpg
delete mode 100644 fastlane/metadata/android/vi-VN/images/phoneScreenshots/11.jpg
delete mode 100644 fastlane/metadata/android/vi-VN/images/phoneScreenshots/12.jpg
delete mode 100644 fastlane/metadata/android/vi-VN/images/phoneScreenshots/9.jpg
delete mode 100644 kotlinYtmusicScraper/src/main/java/com/maxrave/kotlinytmusicscraper/models/simpmusic/Asset.kt
delete mode 100644 kotlinYtmusicScraper/src/main/java/com/maxrave/kotlinytmusicscraper/models/simpmusic/Author.kt
delete mode 100644 kotlinYtmusicScraper/src/main/java/com/maxrave/kotlinytmusicscraper/models/simpmusic/GithubResponse.kt
delete mode 100644 kotlinYtmusicScraper/src/main/java/com/maxrave/kotlinytmusicscraper/models/simpmusic/Reactions.kt
delete mode 100644 kotlinYtmusicScraper/src/main/java/com/maxrave/kotlinytmusicscraper/models/simpmusic/Uploader.kt
delete mode 100644 kotlinYtmusicScraper/src/main/java/com/maxrave/kotlinytmusicscraper/models/sponsorblock/SkipSegments.kt
diff --git a/README.md b/README.md
index f7a951ca..90262265 100644
--- a/README.md
+++ b/README.md
@@ -20,34 +20,24 @@ A simple music app using YouTube Music for backend
- Analyze your playing data and create custom playlists ...
- Caching and can save data for offline playback
- Synced lyrics ( From [akashrchandran/spotify-lyrics-api](https://github.com/akashrchandran/spotify-lyrics-api) )
-- Sleep Timer
-- Support SponsorBlock
-- Google Login
-- And many more ...
## Screenshot
-
-
-
+
+
+
-
-
-
-
-
-
-
-
+
+
+
More [screenshot](https://photos.app.goo.gl/AbieoXG5ctDrpwzp7) here.
## Data
-- This app using public api from YouTube Music with some tricks to get data from YouTube Music.
-- Thanks for [@InnerTune](https://github.com/z-huang/InnerTune/) for the idea to get data from YouTube Music. This repo is my inspiration to create this app.
-- Special thanks for [@spotify-lyrics-api](https://github.com/akashrchandran/spotify-lyrics-api) for lyrics and [@Piped](https://github.com/TeamPiped/Piped) for streaming data.
-- My app is using [@SponsorBlock](https://sponsor.ajay.app/) to skip sponsor in YouTube videos. Thanks for this great service.
+- This app using public api from YouTube Music with some tricks to get data from YouTube Music
+- Thanks for [InnerTune](https://github.com/z-huang/InnerTune/) for the idea to get data from YouTube Music. This repo is my inspiration to create this app.
+- Special thanks for [@spotify-lyrics-api](https://github.com/akashrchandran/spotify-lyrics-api) for lyrics and [@Piped](https://github.com/TeamPiped/Piped) for streaming data
## Translation
You can help me to translate this app to your language by cloning this repo and using Android Studio Translations Editor to translate "string.xml" file in "values" folder. Then create a pull request for me.
More info [here](https://developer.android.com/studio/write/translations-editor)
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 76c6bece..f0edc9e2 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -2,6 +2,7 @@ plugins {
id ("com.android.application")
id ("org.jetbrains.kotlin.android")
id ("androidx.navigation.safeargs")
+ id ("kotlin-kapt")
id ("com.google.dagger.hilt.android")
id("com.google.devtools.ksp")
}
@@ -14,8 +15,8 @@ android {
applicationId = "com.maxrave.simpmusic"
minSdk = 26
targetSdk = 34
- versionCode = 9
- versionName = "0.1.3-beta"
+ versionCode = 8
+ versionName = "0.1.2-beta"
ksp {
arg("room.schemaLocation", "$projectDir/schemas")
@@ -51,18 +52,18 @@ android {
dependencies {
- implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2")
- implementation("androidx.core:core-ktx:1.12.0")
+ implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1")
+ implementation("androidx.core:core-ktx:1.10.1")
implementation("androidx.appcompat:appcompat:1.6.1")
//material design3
implementation("com.google.android.material:material:1.9.0")
//runtime
implementation("androidx.startup:startup-runtime:1.1.1")
implementation(project(mapOf("path" to ":kotlinYtmusicScraper")))
- implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.2")
- implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2")
+ implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.1")
+ implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1")
//ExoPlayer
- val media3_version= "1.1.1"
+ val media3_version= "1.1.0"
implementation("androidx.media3:media3-exoplayer:$media3_version")
implementation("androidx.media3:media3-ui:$media3_version")
@@ -93,15 +94,15 @@ dependencies {
//Coroutines
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
//Navigation
- implementation("androidx.navigation:navigation-fragment-ktx:2.7.2")
- implementation("androidx.navigation:navigation-ui-ktx:2.7.2")
+ implementation("androidx.navigation:navigation-fragment-ktx:2.7.0")
+ implementation("androidx.navigation:navigation-ui-ktx:2.7.0")
implementation("com.google.code.gson:gson:2.10.1")
//Coil
implementation("io.coil-kt:coil:2.4.0")
//Glide
- implementation("com.github.bumptech.glide:glide:4.16.0")
+ implementation("com.github.bumptech.glide:glide:4.15.1")
//Easy Permissions
implementation("pub.devrel:easypermissions:3.0.0")
//Palette Color
@@ -113,8 +114,8 @@ dependencies {
//fragment ktx
implementation("androidx.fragment:fragment-ktx:1.6.1")
//Hilt
- implementation("com.google.dagger:hilt-android:2.48")
- ksp("com.google.dagger:hilt-compiler:2.48")
+ implementation("com.google.dagger:hilt-android:2.47")
+ kapt("com.google.dagger:hilt-compiler:2.47")
ksp("org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.7.0")
//DataStore
implementation("androidx.datastore:datastore-preferences:1.0.0")
@@ -132,16 +133,20 @@ dependencies {
implementation("com.airbnb.android:lottie:$lottieVersion")
//Paging 3
- val paging_version= "3.2.1"
+ val paging_version= "3.2.0"
implementation("androidx.paging:paging-runtime-ktx:$paging_version")
implementation("com.daimajia.swipelayout:library:1.2.0@aar")
-
- //Custom Activity On Crash
- implementation ("cat.ereza:customactivityoncrash:2.4.0")
+ //arca
+ val acraVersion = "5.11.0"
+ implementation("ch.acra:acra-mail:$acraVersion")
+}
+// Allow references to generated code
+kapt {
+ correctErrorTypes = true
}
hilt {
enableAggregatingTask = true
diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json
index ff0edffe..8de67f13 100644
--- a/app/release/output-metadata.json
+++ b/app/release/output-metadata.json
@@ -11,8 +11,8 @@
"type": "SINGLE",
"filters": [],
"attributes": [],
- "versionCode": 9,
- "versionName": "0.1.3-beta",
+ "versionCode": 8,
+ "versionName": "0.1.2-beta",
"outputFile": "app-release.apk"
}
],
diff --git a/app/schemas/com.maxrave.simpmusic.data.db.MusicDatabase/3.json b/app/schemas/com.maxrave.simpmusic.data.db.MusicDatabase/3.json
deleted file mode 100644
index 378fc319..00000000
--- a/app/schemas/com.maxrave.simpmusic.data.db.MusicDatabase/3.json
+++ /dev/null
@@ -1,614 +0,0 @@
-{
- "formatVersion": 1,
- "database": {
- "version": 3,
- "identityHash": "4b35660db52d28273c9895154a12f612",
- "entities": [
- {
- "tableName": "search_history",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`query` TEXT NOT NULL, PRIMARY KEY(`query`))",
- "fields": [
- {
- "fieldPath": "query",
- "columnName": "query",
- "affinity": "TEXT",
- "notNull": true
- }
- ],
- "primaryKey": {
- "autoGenerate": false,
- "columnNames": [
- "query"
- ]
- },
- "indices": [],
- "foreignKeys": []
- },
- {
- "tableName": "song",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`videoId` TEXT NOT NULL, `albumId` TEXT, `albumName` TEXT, `artistId` TEXT, `artistName` TEXT, `duration` TEXT NOT NULL, `durationSeconds` INTEGER NOT NULL, `isAvailable` INTEGER NOT NULL, `isExplicit` INTEGER NOT NULL, `likeStatus` TEXT NOT NULL, `thumbnails` TEXT, `title` TEXT NOT NULL, `videoType` TEXT NOT NULL, `category` TEXT, `resultType` TEXT, `liked` INTEGER NOT NULL, `totalPlayTime` INTEGER NOT NULL, `downloadState` INTEGER NOT NULL, `inLibrary` INTEGER NOT NULL, PRIMARY KEY(`videoId`))",
- "fields": [
- {
- "fieldPath": "videoId",
- "columnName": "videoId",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "albumId",
- "columnName": "albumId",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "albumName",
- "columnName": "albumName",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "artistId",
- "columnName": "artistId",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "artistName",
- "columnName": "artistName",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "duration",
- "columnName": "duration",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "durationSeconds",
- "columnName": "durationSeconds",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "isAvailable",
- "columnName": "isAvailable",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "isExplicit",
- "columnName": "isExplicit",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "likeStatus",
- "columnName": "likeStatus",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "thumbnails",
- "columnName": "thumbnails",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "title",
- "columnName": "title",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "videoType",
- "columnName": "videoType",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "category",
- "columnName": "category",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "resultType",
- "columnName": "resultType",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "liked",
- "columnName": "liked",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "totalPlayTime",
- "columnName": "totalPlayTime",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "downloadState",
- "columnName": "downloadState",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "inLibrary",
- "columnName": "inLibrary",
- "affinity": "INTEGER",
- "notNull": true
- }
- ],
- "primaryKey": {
- "autoGenerate": false,
- "columnNames": [
- "videoId"
- ]
- },
- "indices": [],
- "foreignKeys": []
- },
- {
- "tableName": "artist",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`channelId` TEXT NOT NULL, `name` TEXT NOT NULL, `thumbnails` TEXT, `followed` INTEGER NOT NULL, `inLibrary` INTEGER NOT NULL, PRIMARY KEY(`channelId`))",
- "fields": [
- {
- "fieldPath": "channelId",
- "columnName": "channelId",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "name",
- "columnName": "name",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "thumbnails",
- "columnName": "thumbnails",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "followed",
- "columnName": "followed",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "inLibrary",
- "columnName": "inLibrary",
- "affinity": "INTEGER",
- "notNull": true
- }
- ],
- "primaryKey": {
- "autoGenerate": false,
- "columnNames": [
- "channelId"
- ]
- },
- "indices": [],
- "foreignKeys": []
- },
- {
- "tableName": "album",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`browseId` TEXT NOT NULL, `artistId` TEXT, `artistName` TEXT, `audioPlaylistId` TEXT NOT NULL, `description` TEXT NOT NULL, `duration` TEXT, `durationSeconds` INTEGER NOT NULL, `thumbnails` TEXT, `title` TEXT NOT NULL, `trackCount` INTEGER NOT NULL, `tracks` TEXT, `type` TEXT NOT NULL, `year` TEXT, `liked` INTEGER NOT NULL, `inLibrary` INTEGER NOT NULL, `downloadState` INTEGER NOT NULL, PRIMARY KEY(`browseId`))",
- "fields": [
- {
- "fieldPath": "browseId",
- "columnName": "browseId",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "artistId",
- "columnName": "artistId",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "artistName",
- "columnName": "artistName",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "audioPlaylistId",
- "columnName": "audioPlaylistId",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "description",
- "columnName": "description",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "duration",
- "columnName": "duration",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "durationSeconds",
- "columnName": "durationSeconds",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "thumbnails",
- "columnName": "thumbnails",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "title",
- "columnName": "title",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "trackCount",
- "columnName": "trackCount",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "tracks",
- "columnName": "tracks",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "type",
- "columnName": "type",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "year",
- "columnName": "year",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "liked",
- "columnName": "liked",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "inLibrary",
- "columnName": "inLibrary",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "downloadState",
- "columnName": "downloadState",
- "affinity": "INTEGER",
- "notNull": true
- }
- ],
- "primaryKey": {
- "autoGenerate": false,
- "columnNames": [
- "browseId"
- ]
- },
- "indices": [],
- "foreignKeys": []
- },
- {
- "tableName": "playlist",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `author` TEXT, `description` TEXT NOT NULL, `duration` TEXT NOT NULL, `durationSeconds` INTEGER NOT NULL, `privacy` TEXT NOT NULL, `thumbnails` TEXT NOT NULL, `title` TEXT NOT NULL, `trackCount` INTEGER NOT NULL, `tracks` TEXT, `year` TEXT, `liked` INTEGER NOT NULL, `inLibrary` INTEGER NOT NULL, `downloadState` INTEGER NOT NULL, PRIMARY KEY(`id`))",
- "fields": [
- {
- "fieldPath": "id",
- "columnName": "id",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "author",
- "columnName": "author",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "description",
- "columnName": "description",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "duration",
- "columnName": "duration",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "durationSeconds",
- "columnName": "durationSeconds",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "privacy",
- "columnName": "privacy",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "thumbnails",
- "columnName": "thumbnails",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "title",
- "columnName": "title",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "trackCount",
- "columnName": "trackCount",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "tracks",
- "columnName": "tracks",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "year",
- "columnName": "year",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "liked",
- "columnName": "liked",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "inLibrary",
- "columnName": "inLibrary",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "downloadState",
- "columnName": "downloadState",
- "affinity": "INTEGER",
- "notNull": true
- }
- ],
- "primaryKey": {
- "autoGenerate": false,
- "columnNames": [
- "id"
- ]
- },
- "indices": [],
- "foreignKeys": []
- },
- {
- "tableName": "local_playlist",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `title` TEXT NOT NULL, `thumbnail` TEXT, `inLibrary` INTEGER NOT NULL, `downloadState` INTEGER NOT NULL, `tracks` TEXT)",
- "fields": [
- {
- "fieldPath": "id",
- "columnName": "id",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "title",
- "columnName": "title",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "thumbnail",
- "columnName": "thumbnail",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "inLibrary",
- "columnName": "inLibrary",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "downloadState",
- "columnName": "downloadState",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "tracks",
- "columnName": "tracks",
- "affinity": "TEXT",
- "notNull": false
- }
- ],
- "primaryKey": {
- "autoGenerate": true,
- "columnNames": [
- "id"
- ]
- },
- "indices": [],
- "foreignKeys": []
- },
- {
- "tableName": "lyrics",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`videoId` TEXT NOT NULL, `error` INTEGER NOT NULL, `lines` TEXT, `syncType` TEXT, PRIMARY KEY(`videoId`))",
- "fields": [
- {
- "fieldPath": "videoId",
- "columnName": "videoId",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "error",
- "columnName": "error",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "lines",
- "columnName": "lines",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "syncType",
- "columnName": "syncType",
- "affinity": "TEXT",
- "notNull": false
- }
- ],
- "primaryKey": {
- "autoGenerate": false,
- "columnNames": [
- "videoId"
- ]
- },
- "indices": [],
- "foreignKeys": []
- },
- {
- "tableName": "format",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`videoId` TEXT NOT NULL, `itag` INTEGER, `mimeType` TEXT, `bitrate` INTEGER, `contentLength` INTEGER, `lastModified` INTEGER, `loudnessDb` REAL, `uploader` TEXT, `uploaderId` TEXT, `uploaderSubCount` INTEGER, `uploaderThumbnail` TEXT, `description` TEXT, PRIMARY KEY(`videoId`))",
- "fields": [
- {
- "fieldPath": "videoId",
- "columnName": "videoId",
- "affinity": "TEXT",
- "notNull": true
- },
- {
- "fieldPath": "itag",
- "columnName": "itag",
- "affinity": "INTEGER",
- "notNull": false
- },
- {
- "fieldPath": "mimeType",
- "columnName": "mimeType",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "bitrate",
- "columnName": "bitrate",
- "affinity": "INTEGER",
- "notNull": false
- },
- {
- "fieldPath": "contentLength",
- "columnName": "contentLength",
- "affinity": "INTEGER",
- "notNull": false
- },
- {
- "fieldPath": "lastModified",
- "columnName": "lastModified",
- "affinity": "INTEGER",
- "notNull": false
- },
- {
- "fieldPath": "loudnessDb",
- "columnName": "loudnessDb",
- "affinity": "REAL",
- "notNull": false
- },
- {
- "fieldPath": "uploader",
- "columnName": "uploader",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "uploaderId",
- "columnName": "uploaderId",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "uploaderSubCount",
- "columnName": "uploaderSubCount",
- "affinity": "INTEGER",
- "notNull": false
- },
- {
- "fieldPath": "uploaderThumbnail",
- "columnName": "uploaderThumbnail",
- "affinity": "TEXT",
- "notNull": false
- },
- {
- "fieldPath": "description",
- "columnName": "description",
- "affinity": "TEXT",
- "notNull": false
- }
- ],
- "primaryKey": {
- "autoGenerate": false,
- "columnNames": [
- "videoId"
- ]
- },
- "indices": [],
- "foreignKeys": []
- },
- {
- "tableName": "queue",
- "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`queueId` INTEGER NOT NULL, `listTrack` TEXT NOT NULL, PRIMARY KEY(`queueId`))",
- "fields": [
- {
- "fieldPath": "queueId",
- "columnName": "queueId",
- "affinity": "INTEGER",
- "notNull": true
- },
- {
- "fieldPath": "listTrack",
- "columnName": "listTrack",
- "affinity": "TEXT",
- "notNull": true
- }
- ],
- "primaryKey": {
- "autoGenerate": false,
- "columnNames": [
- "queueId"
- ]
- },
- "indices": [],
- "foreignKeys": []
- }
- ],
- "views": [],
- "setupQueries": [
- "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
- "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '4b35660db52d28273c9895154a12f612')"
- ]
- }
-}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 20f9d5df..80dd0371 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -23,8 +23,7 @@
+ android:launchMode="singleTask">
@@ -99,12 +98,6 @@
-
-
-
-
-
@@ -144,9 +137,5 @@
-
-
-
-
-
+
\ No newline at end of file
diff --git a/app/src/main/java/com/maxrave/simpmusic/SimpMusicApplication.kt b/app/src/main/java/com/maxrave/simpmusic/SimpMusicApplication.kt
index 78517e5d..6cfa8de2 100644
--- a/app/src/main/java/com/maxrave/simpmusic/SimpMusicApplication.kt
+++ b/app/src/main/java/com/maxrave/simpmusic/SimpMusicApplication.kt
@@ -1,29 +1,37 @@
package com.maxrave.simpmusic
import android.app.Application
+import android.content.Context
import androidx.appcompat.app.AppCompatDelegate
-import androidx.media3.common.util.UnstableApi
-import cat.ereza.customactivityoncrash.config.CaocConfig
-import com.maxrave.simpmusic.ui.MainActivity
import dagger.hilt.android.HiltAndroidApp
-
+import org.acra.config.mailSender
+import org.acra.data.StringFormat
+import org.acra.ktx.initAcra
@HiltAndroidApp
class SimpMusicApplication: Application(){
- @UnstableApi
override fun onCreate() {
super.onCreate()
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
- CaocConfig.Builder.create()
- .backgroundMode(CaocConfig.BACKGROUND_MODE_SILENT) //default: CaocConfig.BACKGROUND_MODE_SHOW_CUSTOM
- .enabled(true) //default: true
- .showErrorDetails(true) //default: true
- .showRestartButton(true) //default: true
- .errorDrawable(R.drawable.logo_simpmusic_01)
- .logErrorOnRestart(false) //default: true
- .trackActivities(true) //default: false
- .minTimeBetweenCrashesMs(2000) //default: 3000 //default: bug image
- .restartActivity(MainActivity::class.java) //default: null (your app's launch activity)
- .apply()
+ }
+
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ initAcra {
+ buildConfigClass = BuildConfig::class.java
+ reportFormat = StringFormat.JSON
+ mailSender {
+ //required
+ mailTo = "simpmusic.maxravedev@gmail.com"
+ //defaults to true
+ reportAsFile = true
+ //defaults to ACRA-report.stacktrace
+ reportFileName = "Crash.txt"
+ //defaults to " Crash Report"
+ subject = getString(R.string.mail_subject)
+ //defaults to empty
+ body = getString(R.string.crash_log)
+ }
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/maxrave/simpmusic/adapter/home/QuickPicksAdapter.kt b/app/src/main/java/com/maxrave/simpmusic/adapter/home/QuickPicksAdapter.kt
index ba7ac4e2..d8a9c129 100644
--- a/app/src/main/java/com/maxrave/simpmusic/adapter/home/QuickPicksAdapter.kt
+++ b/app/src/main/java/com/maxrave/simpmusic/adapter/home/QuickPicksAdapter.kt
@@ -55,8 +55,6 @@ class QuickPicksAdapter(val contentList: ArrayList, val context: Contex
artistName = removeComma(artistName)
binding.tvSongArtist.text = artistName
binding.ivThumbnail.load(content.thumbnails.last().url)
- binding.tvSongArtist.isSelected = true
- binding.tvSongTitle.isSelected = true
}
}
private fun removeTrailingComma(sentence: String): String {
diff --git a/app/src/main/java/com/maxrave/simpmusic/adapter/playlist/PlaylistItemAdapter.kt b/app/src/main/java/com/maxrave/simpmusic/adapter/playlist/PlaylistItemAdapter.kt
index 01b38439..a39b82e2 100644
--- a/app/src/main/java/com/maxrave/simpmusic/adapter/playlist/PlaylistItemAdapter.kt
+++ b/app/src/main/java/com/maxrave/simpmusic/adapter/playlist/PlaylistItemAdapter.kt
@@ -2,6 +2,7 @@ package com.maxrave.simpmusic.adapter.playlist
import android.util.Log
import android.view.LayoutInflater
+import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import coil.load
@@ -40,8 +41,6 @@ class PlaylistItemAdapter(private var playlistItemList: ArrayList): Recycle
binding.tvSongTitle.text = track.title
binding.tvSongArtist.text = track.artists.toListName().connectArtists()
binding.ivThumbnail.load(track.thumbnails?.last()?.url)
- binding.tvSongTitle.isSelected = true
- binding.tvSongArtist.isSelected = true
}
}
inner class LocalPlaylistTrackViewHolder(val binding: ItemPopularSongBinding, rootListener: OnItemClickListener, mOptionListener: OnOptionClickListener): RecyclerView.ViewHolder(binding.root) {
@@ -56,8 +55,6 @@ class PlaylistItemAdapter(private var playlistItemList: ArrayList): Recycle
fun bind (song: SongEntity){
binding.tvSongTitle.text = song.title
binding.tvSongArtist.text = song.artistName?.connectArtists()
- binding.tvSongTitle.isSelected = true
- binding.tvSongArtist.isSelected = true
binding.ivThumbnail.load(song.thumbnails)
}
}
diff --git a/app/src/main/java/com/maxrave/simpmusic/common/Config.kt b/app/src/main/java/com/maxrave/simpmusic/common/Config.kt
index 14c341ca..5543e68d 100644
--- a/app/src/main/java/com/maxrave/simpmusic/common/Config.kt
+++ b/app/src/main/java/com/maxrave/simpmusic/common/Config.kt
@@ -1,7 +1,5 @@
package com.maxrave.simpmusic.common
-import com.maxrave.simpmusic.R
-
object Config {
enum class SyncState {
LINE_SYNCED,
@@ -18,7 +16,6 @@ object Config {
const val ALBUM_CLICK = "ALBUM_CLICK"
const val RADIO_CLICK = "RADIO_CLICK"
const val MINIPLAYER_CLICK = "MINIPLAYER_CLICK"
- const val SHARE = "SHARE"
const val VN = "VN"
@@ -61,31 +58,6 @@ object PIPED_INSTANCE {
"pipedapi.pfcd.me", "pipedapi.frontendfriendly.xyz", "api.piped.yt", "pipedapi.astartes.nl", "pipedapi.osphost.fi", "pipedapi.simpleprivacy.fr", "pipedapi.drgns.space")
}
-object SPONSOR_BLOCK {
- val list: Array = arrayOf("sponsor", "selfpromo", "interaction", "intro", "outro", "preview", "music_offtopic", "poi_highlight", "filler")
- val listName: Array = arrayOf(
- R.string.sponsor,
- R.string.self_promotion,
- R.string.interaction,
- R.string.intro,
- R.string.outro,
- R.string.preview,
- R.string.music_off_topic,
- R.string.poi_highlight,
- R.string.filler)
-}
-
-object MEDIA_CUSTOM_COMMAND {
- const val LIKE = "like"
- const val REPEAT = "repeat"
-}
-
-object MEDIA_NOTIFICATION {
- const val NOTIFICATION_ID = 200
- const val NOTIFICATION_CHANNEL_NAME = "SimpMusic Playback Notification"
- const val NOTIFICATION_CHANNEL_ID = "SimpMusic Playback Notification ID"
-}
-
const val SETTINGS_FILENAME = "settings"
const val DB_NAME = "Music Database"
diff --git a/app/src/main/java/com/maxrave/simpmusic/data/dataStore/DataStoreManager.kt b/app/src/main/java/com/maxrave/simpmusic/data/dataStore/DataStoreManager.kt
index 1d1fbff1..5c49f0c1 100644
--- a/app/src/main/java/com/maxrave/simpmusic/data/dataStore/DataStoreManager.kt
+++ b/app/src/main/java/com/maxrave/simpmusic/data/dataStore/DataStoreManager.kt
@@ -1,35 +1,32 @@
package com.maxrave.simpmusic.data.dataStore
import android.content.Context
-import android.util.Log
-import androidx.datastore.core.DataStore
-import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.stringPreferencesKey
-import androidx.media3.common.Player
+import androidx.datastore.preferences.preferencesDataStore
import com.maxrave.simpmusic.common.SELECTED_LANGUAGE
-import com.maxrave.simpmusic.common.SPONSOR_BLOCK
+import com.maxrave.simpmusic.common.SETTINGS_FILENAME
import com.maxrave.simpmusic.common.SUPPORTED_LANGUAGE
import dagger.hilt.android.qualifiers.ApplicationContext
-import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.withContext
import javax.inject.Inject
+import javax.inject.Singleton
import com.maxrave.simpmusic.common.QUALITY as COMMON_QUALITY
-class DataStoreManager @Inject constructor(@ApplicationContext appContext: Context, private val settingsDataStore: DataStore) {
+@Singleton
+class DataStoreManager @Inject constructor(@ApplicationContext appContext: Context) {
+ private val Context.dataStore by preferencesDataStore(SETTINGS_FILENAME)
+
+ private val settingsDataStore = appContext.dataStore
val location: Flow = settingsDataStore.data.map { preferences ->
preferences[LOCATION] ?: "VN"
}
suspend fun setLocation(location: String) {
- withContext(Dispatchers.IO) {
- settingsDataStore.edit { settings ->
- settings[LOCATION] = location
- }
+ settingsDataStore.edit { settings ->
+ settings[LOCATION] = location
}
}
@@ -38,18 +35,14 @@ class DataStoreManager @Inject constructor(@ApplicationContext appContext: Conte
}
suspend fun restore(isRestoring: Boolean) {
- withContext(Dispatchers.IO) {
- settingsDataStore.edit { settings ->
- settings[IS_RESTORING_DATABASE] = if (isRestoring) TRUE else FALSE
- }
+ settingsDataStore.edit { settings ->
+ settings[IS_RESTORING_DATABASE] = if (isRestoring) TRUE else FALSE
}
}
suspend fun setQuality(quality: String) {
- withContext(Dispatchers.IO) {
- settingsDataStore.edit { settings ->
- settings[QUALITY] = quality
- }
+ settingsDataStore.edit { settings ->
+ settings[QUALITY] = quality
}
}
@@ -80,23 +73,19 @@ class DataStoreManager @Inject constructor(@ApplicationContext appContext: Conte
preferences[COOKIE] ?: ""
}
suspend fun setCookie(cookie: String) {
- withContext(Dispatchers.IO) {
- settingsDataStore.edit { settings ->
- settings[COOKIE] = cookie
- }
+ settingsDataStore.edit { settings ->
+ settings[COOKIE] = cookie
}
}
suspend fun setLoggedIn(logged: Boolean) {
- withContext(Dispatchers.IO) {
- if (logged) {
- settingsDataStore.edit { settings ->
- settings[LOGGED_IN] = TRUE
- }
- } else {
- settingsDataStore.edit { settings ->
- settings[LOGGED_IN] = FALSE
- }
+ if (logged) {
+ settingsDataStore.edit { settings ->
+ settings[LOGGED_IN] = TRUE
+ }
+ } else {
+ settingsDataStore.edit { settings ->
+ settings[LOGGED_IN] = FALSE
}
}
}
@@ -106,168 +95,27 @@ class DataStoreManager @Inject constructor(@ApplicationContext appContext: Conte
}
suspend fun setNormalizeVolume(normalize: Boolean) {
- withContext(Dispatchers.IO) {
- if (normalize) {
- settingsDataStore.edit { settings ->
- settings[NORMALIZE_VOLUME] = TRUE
- }
- } else {
- settingsDataStore.edit { settings ->
- settings[NORMALIZE_VOLUME] = FALSE
- }
- }
- }
- }
- val skipSilent: Flow = settingsDataStore.data.map { preferences ->
- preferences[SKIP_SILENT] ?: FALSE
- }
- suspend fun setSkipSilent(skip: Boolean) {
- withContext(Dispatchers.IO) {
- if (skip) {
- settingsDataStore.edit { settings ->
- settings[SKIP_SILENT] = TRUE
- }
- } else {
- settingsDataStore.edit { settings ->
- settings[SKIP_SILENT] = FALSE
- }
- }
- }
- }
-
- val pipedInstance: Flow = settingsDataStore.data.map { preferences ->
- preferences[PIPED] ?: "pipedapi-libre.kavin.rocks"
- }
-
- suspend fun setPipedInstance(instance: String) {
- withContext(Dispatchers.IO) {
+ if (normalize) {
settingsDataStore.edit { settings ->
- settings[PIPED] = instance
- }
- }
- }
-
- val saveStateOfPlayback: Flow = settingsDataStore.data.map { preferences ->
- preferences[SAVE_STATE_OF_PLAYBACK] ?: FALSE
- }
- suspend fun setSaveStateOfPlayback(save: Boolean) {
- withContext(Dispatchers.IO) {
- if (save) {
- settingsDataStore.edit { settings ->
- settings[SAVE_STATE_OF_PLAYBACK] = TRUE
- }
- } else {
- settingsDataStore.edit { settings ->
- settings[SAVE_STATE_OF_PLAYBACK] = FALSE
- }
- }
- }
- }
- val shuffleKey: Flow = settingsDataStore.data.map { preferences ->
- preferences[SHUFFLE_KEY] ?: FALSE
- }
- val repeatKey: Flow = settingsDataStore.data.map { preferences ->
- preferences[REPEAT_KEY] ?: REPEAT_MODE_OFF
- }
-
- suspend fun recoverShuffleAndRepeatKey(shuffle: Boolean, repeat: Int) {
- withContext(Dispatchers.IO) {
- if (shuffle) {
- settingsDataStore.edit { settings ->
- settings[SHUFFLE_KEY] = TRUE
- }
- }
- else {
- settingsDataStore.edit { settings ->
- settings[SHUFFLE_KEY] = FALSE
- }
+ settings[NORMALIZE_VOLUME] = TRUE
}
+ } else {
settingsDataStore.edit { settings ->
- settings[REPEAT_KEY] = when (repeat) {
- Player.REPEAT_MODE_ONE -> REPEAT_ONE
- Player.REPEAT_MODE_ALL -> REPEAT_ALL
- Player.REPEAT_MODE_OFF -> REPEAT_MODE_OFF
- else -> REPEAT_MODE_OFF
- }
+ settings[NORMALIZE_VOLUME] = FALSE
}
}
}
- val saveRecentSongAndQueue: Flow = settingsDataStore.data.map { preferences ->
- preferences[SAVE_RECENT_SONG] ?: FALSE
- }
- suspend fun setSaveRecentSongAndQueue(save: Boolean) {
- withContext(Dispatchers.IO) {
- if (save) {
- settingsDataStore.edit { settings ->
- settings[SAVE_RECENT_SONG] = TRUE
- }
- } else {
- settingsDataStore.edit { settings ->
- settings[SAVE_RECENT_SONG] = FALSE
- }
- }
- }
- }
- val recentMediaId = settingsDataStore.data.map { preferences ->
- preferences[RECENT_SONG_MEDIA_ID_KEY] ?: ""
- }
- val recentPosition = settingsDataStore.data.map { preferences ->
- preferences[RECENT_SONG_POSITION_KEY] ?: "0"
- }
- suspend fun saveRecentSong (mediaId: String, position: Long) {
- withContext(Dispatchers.IO) {
- settingsDataStore.edit { settings ->
- settings[RECENT_SONG_MEDIA_ID_KEY] = mediaId
- settings[RECENT_SONG_POSITION_KEY] = position.toString()
- }
- }
+ val pipedInstance: Flow = settingsDataStore.data.map { preferences ->
+ preferences[PIPED] ?: "watchapi.whatever.social"
}
- val playlistFromSaved = settingsDataStore.data.map { preferences ->
- preferences[FROM_SAVED_PLAYLIST] ?: ""
- }
- suspend fun setPlaylistFromSaved(playlist: String) {
- withContext(Dispatchers.IO) {
- settingsDataStore.edit { settings ->
- settings[FROM_SAVED_PLAYLIST] = playlist
- }
+ suspend fun setPipedInstance(instance: String) {
+ settingsDataStore.edit { settings ->
+ settings[PIPED] = instance
}
}
- val sponsorBlockEnabled = settingsDataStore.data.map { preferences ->
- preferences[SPONSOR_BLOCK_ENABLED] ?: FALSE
- }
- suspend fun setSponsorBlockEnabled(enabled: Boolean) {
- withContext(Dispatchers.IO) {
- if (enabled) {
- settingsDataStore.edit { settings ->
- settings[SPONSOR_BLOCK_ENABLED] = TRUE
- }
- } else {
- settingsDataStore.edit { settings ->
- settings[SPONSOR_BLOCK_ENABLED] = FALSE
- }
- }
- }
- }
- suspend fun getSponsorBlockCategories(): ArrayList {
- val list : ArrayList = arrayListOf()
- for (category in SPONSOR_BLOCK.list) {
- if (getString(category.toString()).first() == TRUE) list.add(category.toString())
- }
- return list
- }
- suspend fun setSponsorBlockCategories(categories: ArrayList) {
- withContext(Dispatchers.IO) {
- Log.w("setSponsorBlockCategories", categories.toString())
- for (category in categories) {
- settingsDataStore.edit { settings ->
- settings[stringPreferencesKey(category)] = TRUE
- }
- }
- }
- }
companion object Settings {
val COOKIE = stringPreferencesKey("cookie")
@@ -277,19 +125,6 @@ class DataStoreManager @Inject constructor(@ApplicationContext appContext: Conte
val NORMALIZE_VOLUME = stringPreferencesKey("normalize_volume")
val IS_RESTORING_DATABASE = stringPreferencesKey("is_restoring_database")
val PIPED = stringPreferencesKey("piped")
- val SKIP_SILENT = stringPreferencesKey("skip_silent")
- val SAVE_STATE_OF_PLAYBACK = stringPreferencesKey("save_state_of_playback")
- val SAVE_RECENT_SONG = stringPreferencesKey("save_recent_song")
- val RECENT_SONG_MEDIA_ID_KEY = stringPreferencesKey("recent_song_media_id")
- val RECENT_SONG_POSITION_KEY = stringPreferencesKey("recent_song_position")
- val SHUFFLE_KEY = stringPreferencesKey("shuffle_key")
- val REPEAT_KEY = stringPreferencesKey("repeat_key")
- val FROM_SAVED_PLAYLIST = stringPreferencesKey("from_saved_playlist")
- val RESTORE_LAST_PLAYED_TRACK_AND_QUEUE_DONE = "RestoreLastPlayedTrackAndQueueDone"
- val SPONSOR_BLOCK_ENABLED = stringPreferencesKey("sponsor_block_enabled")
- val REPEAT_MODE_OFF = "REPEAT_MODE_OFF"
- val REPEAT_ONE = "REPEAT_ONE"
- val REPEAT_ALL = "REPEAT_ALL"
val TRUE = "TRUE"
val FALSE = "FALSE"
}
diff --git a/app/src/main/java/com/maxrave/simpmusic/data/db/Converters.kt b/app/src/main/java/com/maxrave/simpmusic/data/db/Converters.kt
index 801e5a2a..f11a937a 100644
--- a/app/src/main/java/com/maxrave/simpmusic/data/db/Converters.kt
+++ b/app/src/main/java/com/maxrave/simpmusic/data/db/Converters.kt
@@ -4,7 +4,6 @@ import androidx.room.ProvidedTypeConverter
import androidx.room.TypeConverter
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
-import com.maxrave.simpmusic.data.model.browse.album.Track
import com.maxrave.simpmusic.data.model.metadata.Line
import java.lang.reflect.Type
import java.time.Instant
@@ -25,18 +24,6 @@ class Converters {
return gson.toJson(list)
}
- @TypeConverter
- fun fromStringToListTrack(value: String?): List