From 1e673ad582c300933b8233e445ee17a7ed3aa30f Mon Sep 17 00:00:00 2001 From: vfsfitvnm Date: Thu, 2 Jun 2022 18:59:18 +0200 Subject: [PATCH] Initial commit --- .gitignore | 10 + LICENSE.md | 202 ++++++ README.md | 55 ++ app/.gitignore | 2 + app/build.gradle.kts | 97 +++ app/proguard-rules.pro | 24 + .../1.json | 304 ++++++++ app/src/main/AndroidManifest.xml | 57 ++ app/src/main/ic_launcher-playstore.png | Bin 0 -> 14782 bytes .../kotlin/it/vfsfitvnm/vimusic/Database.kt | 140 ++++ .../it/vfsfitvnm/vimusic/MainActivity.kt | 145 ++++ .../it/vfsfitvnm/vimusic/MainApplication.kt | 26 + .../vfsfitvnm/vimusic/enums/SongCollection.kt | 7 + .../it/vfsfitvnm/vimusic/models/Info.kt | 12 + .../it/vfsfitvnm/vimusic/models/Playlist.kt | 17 + .../vimusic/models/PlaylistPreview.kt | 8 + .../vimusic/models/PlaylistWithSongs.kt | 24 + .../vfsfitvnm/vimusic/models/SearchQuery.kt | 21 + .../it/vfsfitvnm/vimusic/models/Song.kt | 34 + .../vimusic/models/SongInPlaylist.kt | 31 + .../vimusic/models/SongWithAuthors.kt | 28 + .../vfsfitvnm/vimusic/models/SongWithInfo.kt | 25 + .../vimusic/models/SortedSongInPlaylist.kt | 11 + .../vimusic/services/PlayerService.kt | 354 ++++++++++ .../vimusic/ui/components/BottomSheet.kt | 304 ++++++++ .../vimusic/ui/components/ChunkyButton.kt | 98 +++ .../vimusic/ui/components/ChunkyChipGroup.kt | 50 ++ .../vimusic/ui/components/ExpandableText.kt | 80 +++ .../vfsfitvnm/vimusic/ui/components/Menu.kt | 77 ++ .../vimusic/ui/components/MusicBars.kt | 59 ++ .../vimusic/ui/components/OutcomeItem.kt | 127 ++++ .../vimusic/ui/components/TopAppBar.kt | 23 + .../vimusic/ui/components/themed/Dialog.kt | 217 ++++++ .../ui/components/themed/MediaItemMenu.kt | 488 +++++++++++++ .../vimusic/ui/components/themed/Menu.kt | 152 ++++ .../ui/components/themed/TextPlaceholder.kt | 30 + .../vimusic/ui/screens/AlbumScreen.kt | 367 ++++++++++ .../vimusic/ui/screens/ArtistScreen.kt | 220 ++++++ .../vimusic/ui/screens/HomeScreen.kt | 422 +++++++++++ .../vimusic/ui/screens/IntentVideoScreen.kt | 104 +++ .../vimusic/ui/screens/PlaylistScreen.kt | 337 +++++++++ .../vimusic/ui/screens/SearchResultScreen.kt | 493 +++++++++++++ .../vimusic/ui/screens/SearchScreen.kt | 307 ++++++++ .../it/vfsfitvnm/vimusic/ui/screens/routes.kt | 82 +++ .../vimusic/ui/styling/ColorPalette.kt | 78 +++ .../vimusic/ui/styling/Typography.kt | 74 ++ .../vimusic/ui/views/CurrentPlaylistView.kt | 205 ++++++ .../vimusic/ui/views/PlayerBottomSheet.kt | 259 +++++++ .../vfsfitvnm/vimusic/ui/views/PlayerView.kt | 466 +++++++++++++ .../vimusic/ui/views/PlaylistPreviewItem.kt | 100 +++ .../it/vfsfitvnm/vimusic/ui/views/SongItem.kt | 199 ++++++ .../it/vfsfitvnm/vimusic/utils/Player.kt | 44 ++ .../it/vfsfitvnm/vimusic/utils/PlayerState.kt | 92 +++ .../it/vfsfitvnm/vimusic/utils/Preferences.kt | 108 +++ .../vimusic/utils/RelaunchableEffect.kt | 19 + .../it/vfsfitvnm/vimusic/utils/RingBuffer.kt | 11 + .../it/vfsfitvnm/vimusic/utils/TextStyle.kt | 43 ++ .../vfsfitvnm/vimusic/utils/YoutubePlayer.kt | 129 ++++ .../vimusic/utils/rememberHapticFeedback.kt | 24 + .../it/vfsfitvnm/vimusic/utils/utils.kt | 172 +++++ app/src/main/res/drawable/add.xml | 20 + app/src/main/res/drawable/alert_circle.xml | 9 + app/src/main/res/drawable/app_icon.xml | 7 + app/src/main/res/drawable/arrow_forward.xml | 20 + app/src/main/res/drawable/chevron_back.xml | 13 + app/src/main/res/drawable/close.xml | 9 + app/src/main/res/drawable/disc.xml | 12 + .../main/res/drawable/disc_placeholder.xml | 12 + .../main/res/drawable/ellipsis_horizontal.xml | 15 + .../main/res/drawable/ellipsis_vertical.xml | 15 + app/src/main/res/drawable/heart.xml | 9 + app/src/main/res/drawable/heart_dislike.xml | 15 + .../res/drawable/ic_launcher_foreground.xml | 19 + app/src/main/res/drawable/list.xml | 48 ++ app/src/main/res/drawable/pause.xml | 12 + app/src/main/res/drawable/pause_circle.xml | 9 + app/src/main/res/drawable/pencil.xml | 20 + app/src/main/res/drawable/person.xml | 12 + app/src/main/res/drawable/play.xml | 9 + app/src/main/res/drawable/play_circle.xml | 9 + app/src/main/res/drawable/play_skip_back.xml | 9 + .../main/res/drawable/play_skip_forward.xml | 9 + app/src/main/res/drawable/radio.xml | 27 + app/src/main/res/drawable/repeat.xml | 34 + app/src/main/res/drawable/repeat_one.xml | 41 ++ app/src/main/res/drawable/sad.xml | 9 + app/src/main/res/drawable/search.xml | 9 + app/src/main/res/drawable/share_social.xml | 9 + app/src/main/res/drawable/shuffle.xml | 41 ++ app/src/main/res/drawable/text.xml | 12 + app/src/main/res/drawable/time.xml | 9 + app/src/main/res/drawable/trash.xml | 9 + app/src/main/res/font/poppins_w300.ttf | Bin 0 -> 159848 bytes app/src/main/res/font/poppins_w400.ttf | Bin 0 -> 158240 bytes app/src/main/res/font/poppins_w400_italic.ttf | Bin 0 -> 182012 bytes app/src/main/res/font/poppins_w500.ttf | Bin 0 -> 156520 bytes app/src/main/res/font/poppins_w600.ttf | Bin 0 -> 155232 bytes app/src/main/res/font/poppins_w700.ttf | Bin 0 -> 153944 bytes .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1639 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 3683 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1183 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2328 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2319 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 5219 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 3605 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 8244 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 5128 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 12143 bytes app/src/main/res/values-night/themes.xml | 18 + .../res/values/ic_launcher_background.xml | 4 + app/src/main/res/values/themes.xml | 18 + build.gradle.kts | 16 + compose-reordering/.gitignore | 1 + compose-reordering/build.gradle.kts | 46 ++ .../src/main/AndroidManifest.xml | 2 + .../vfsfitvnm/reordering/ReorderingState.kt | 65 ++ .../it/vfsfitvnm/reordering/dragToReorder.kt | 208 ++++++ compose-routing/.gitignore | 1 + compose-routing/build.gradle.kts | 48 ++ compose-routing/src/main/AndroidManifest.xml | 2 + .../main/kotlin/it/vfsfitvnm/route/Route.kt | 111 +++ .../kotlin/it/vfsfitvnm/route/RouteHandler.kt | 73 ++ .../it/vfsfitvnm/route/RouteHandlerScope.kt | 40 ++ .../kotlin/it/vfsfitvnm/route/Transitions.kt | 13 + gradle.properties | 5 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 +++++ gradlew.bat | 89 +++ ktor-client-brotli/.gitignore | 1 + ktor-client-brotli/build.gradle.kts | 12 + .../plugins/compression/BrotliEncoder.kt | 16 + .../ktor/client/plugins/compression/brotli.kt | 5 + settings.gradle.kts | 69 ++ youtube-music/.gitignore | 1 + youtube-music/build.gradle.kts | 21 + .../it/vfsfitvnm/youtubemusic/Extensions.kt | 42 ++ .../it/vfsfitvnm/youtubemusic/Outcome.kt | 68 ++ .../it/vfsfitvnm/youtubemusic/YouTube.kt | 659 ++++++++++++++++++ .../youtubemusic/models/BrowseResponse.kt | 49 ++ .../youtubemusic/models/ButtonRenderer.kt | 9 + .../youtubemusic/models/Continuation.kt | 15 + .../models/ContinuationResponse.kt | 19 + .../youtubemusic/models/GetQueueResponse.kt | 14 + .../models/GetSearchSuggestionsResponse.kt | 29 + .../models/MusicCarouselShelfRenderer.kt | 34 + .../models/MusicNavigationButtonRenderer.kt | 21 + .../models/MusicResponsiveListItemRenderer.kt | 23 + .../youtubemusic/models/MusicShelfRenderer.kt | 23 + .../models/MusicTwoRowItemRenderer.kt | 11 + .../youtubemusic/models/NavigationEndpoint.kt | 200 ++++++ .../youtubemusic/models/NextResponse.kt | 83 +++ .../youtubemusic/models/PlayerResponse.kt | 57 ++ .../it/vfsfitvnm/youtubemusic/models/Runs.kt | 27 + .../youtubemusic/models/SearchResponse.kt | 13 + .../it/vfsfitvnm/youtubemusic/models/Tabs.kt | 55 ++ .../youtubemusic/models/ThumbnailRenderer.kt | 47 ++ youtube-music/src/test/kotlin/Test.kt | 10 + 160 files changed, 10800 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 app/.gitignore create mode 100644 app/build.gradle.kts create mode 100644 app/proguard-rules.pro create mode 100644 app/schemas/it.vfsfitvnm.vimusic.DatabaseInitializer/1.json create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/ic_launcher-playstore.png create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/Database.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/MainActivity.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/MainApplication.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/enums/SongCollection.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/models/Info.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/models/Playlist.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/models/PlaylistPreview.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/models/PlaylistWithSongs.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SearchQuery.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/models/Song.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SongInPlaylist.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SongWithAuthors.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SongWithInfo.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SortedSongInPlaylist.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/services/PlayerService.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/BottomSheet.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/ChunkyButton.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/ChunkyChipGroup.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/ExpandableText.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/Menu.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/MusicBars.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/OutcomeItem.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/TopAppBar.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/Dialog.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/MediaItemMenu.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/Menu.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/TextPlaceholder.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/AlbumScreen.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/ArtistScreen.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/HomeScreen.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/IntentVideoScreen.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/PlaylistScreen.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchResultScreen.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchScreen.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/routes.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/styling/ColorPalette.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/styling/Typography.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/CurrentPlaylistView.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerBottomSheet.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerView.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlaylistPreviewItem.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/SongItem.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/Player.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/PlayerState.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/Preferences.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/RelaunchableEffect.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/RingBuffer.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/TextStyle.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/YoutubePlayer.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/rememberHapticFeedback.kt create mode 100644 app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/utils.kt create mode 100644 app/src/main/res/drawable/add.xml create mode 100644 app/src/main/res/drawable/alert_circle.xml create mode 100644 app/src/main/res/drawable/app_icon.xml create mode 100644 app/src/main/res/drawable/arrow_forward.xml create mode 100644 app/src/main/res/drawable/chevron_back.xml create mode 100644 app/src/main/res/drawable/close.xml create mode 100644 app/src/main/res/drawable/disc.xml create mode 100644 app/src/main/res/drawable/disc_placeholder.xml create mode 100644 app/src/main/res/drawable/ellipsis_horizontal.xml create mode 100644 app/src/main/res/drawable/ellipsis_vertical.xml create mode 100644 app/src/main/res/drawable/heart.xml create mode 100644 app/src/main/res/drawable/heart_dislike.xml create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/list.xml create mode 100644 app/src/main/res/drawable/pause.xml create mode 100644 app/src/main/res/drawable/pause_circle.xml create mode 100644 app/src/main/res/drawable/pencil.xml create mode 100644 app/src/main/res/drawable/person.xml create mode 100644 app/src/main/res/drawable/play.xml create mode 100644 app/src/main/res/drawable/play_circle.xml create mode 100644 app/src/main/res/drawable/play_skip_back.xml create mode 100644 app/src/main/res/drawable/play_skip_forward.xml create mode 100644 app/src/main/res/drawable/radio.xml create mode 100644 app/src/main/res/drawable/repeat.xml create mode 100644 app/src/main/res/drawable/repeat_one.xml create mode 100644 app/src/main/res/drawable/sad.xml create mode 100644 app/src/main/res/drawable/search.xml create mode 100644 app/src/main/res/drawable/share_social.xml create mode 100644 app/src/main/res/drawable/shuffle.xml create mode 100644 app/src/main/res/drawable/text.xml create mode 100644 app/src/main/res/drawable/time.xml create mode 100644 app/src/main/res/drawable/trash.xml create mode 100644 app/src/main/res/font/poppins_w300.ttf create mode 100644 app/src/main/res/font/poppins_w400.ttf create mode 100644 app/src/main/res/font/poppins_w400_italic.ttf create mode 100644 app/src/main/res/font/poppins_w500.ttf create mode 100644 app/src/main/res/font/poppins_w600.ttf create mode 100644 app/src/main/res/font/poppins_w700.ttf create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values/ic_launcher_background.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 build.gradle.kts create mode 100644 compose-reordering/.gitignore create mode 100644 compose-reordering/build.gradle.kts create mode 100644 compose-reordering/src/main/AndroidManifest.xml create mode 100644 compose-reordering/src/main/kotlin/it/vfsfitvnm/reordering/ReorderingState.kt create mode 100644 compose-reordering/src/main/kotlin/it/vfsfitvnm/reordering/dragToReorder.kt create mode 100644 compose-routing/.gitignore create mode 100644 compose-routing/build.gradle.kts create mode 100644 compose-routing/src/main/AndroidManifest.xml create mode 100644 compose-routing/src/main/kotlin/it/vfsfitvnm/route/Route.kt create mode 100644 compose-routing/src/main/kotlin/it/vfsfitvnm/route/RouteHandler.kt create mode 100644 compose-routing/src/main/kotlin/it/vfsfitvnm/route/RouteHandlerScope.kt create mode 100644 compose-routing/src/main/kotlin/it/vfsfitvnm/route/Transitions.kt create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 ktor-client-brotli/.gitignore create mode 100644 ktor-client-brotli/build.gradle.kts create mode 100644 ktor-client-brotli/src/main/kotlin/io/ktor/client/plugins/compression/BrotliEncoder.kt create mode 100644 ktor-client-brotli/src/main/kotlin/io/ktor/client/plugins/compression/brotli.kt create mode 100644 settings.gradle.kts create mode 100644 youtube-music/.gitignore create mode 100644 youtube-music/build.gradle.kts create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/Extensions.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/Outcome.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/YouTube.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/BrowseResponse.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/ButtonRenderer.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/Continuation.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/ContinuationResponse.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/GetQueueResponse.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/GetSearchSuggestionsResponse.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/MusicCarouselShelfRenderer.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/MusicNavigationButtonRenderer.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/MusicResponsiveListItemRenderer.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/MusicShelfRenderer.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/MusicTwoRowItemRenderer.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/NavigationEndpoint.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/NextResponse.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/PlayerResponse.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/Runs.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/SearchResponse.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/Tabs.kt create mode 100644 youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/models/ThumbnailRenderer.kt create mode 100644 youtube-music/src/test/kotlin/Test.kt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..878c2cd --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +*.iml +.gradle +/local.properties +.idea +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..dc8b239 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..659474f --- /dev/null +++ b/README.md @@ -0,0 +1,55 @@ +# ViMusic + +

+ +

+ +

A Jetpack Compose Android application for streaming music from YouTube Music

+ +--- + +

+ + + + +

+ +## Known problems +The application is using `androidx.media3`, which is unstable. Expect random crashes or buggy notification behaviours. Hopefully, they will be fixed within the next alpha release. + +## Features +- Play any non-age-restricted song/video from YouTube Music +- Background playback +- Cache audio chunks for offline playback +- Search for songs, albums, artists and videos +- Display songs lyrics +- Local playlist management +- Reorder songs in playlist or queue +- Light/Dark theme +- ... + +## TODO +- **Improve UI/UX** (help needed) +- Settings page +- Support YouTube playlists (and other stuff to improve features parity) +- Download songs (not sure about this) +- Play local songs (not sure about this, too) +- Translation + +## Installation +You can download the latest apk [here](https://github.com/vfsfitvnm/ViMusic/releases), **the unique distribution channel**. + +After installing, I recommend executing the following ADB command to neutralize some animation lags you may experience in cold starts: +``` +adb shell cmd package compile -r bg-dexopt it.vfsfitvnm.vimusic +``` + +## Contributions +There's a huge room for improvements! Please open an issue to report bugs, discuss ideas and so on. + +## Similar projects, inspirations and acknowledgments +- [**Beatbump**](https://github.com/snuffyDev/Beatbump): Alternative YouTube Music frontend built with Svelte/SvelteKit. +- [**music**](https://github.com/z-huang/music): A material design music player with music from YouTube/YouTube Music. +- [**YouTube-Internal-Clients**](https://github.com/zerodytrash/YouTube-Internal-Clients): A python script that discovers hidden YouTube API clients. Just a research project. +- [**ionicons**](https://github.com/ionic-team/ionicons): Premium hand-crafted icons built by Ionic, for Ionic apps and web apps everywhere. diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..956c004 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,2 @@ +/build +/release \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..42cdbc5 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,97 @@ +plugins { + id("com.android.application") + kotlin("android") + kotlin("kapt") +} + +android { + signingConfigs { + create("release") { + } + } + compileSdk = 32 + + defaultConfig { + applicationId = "it.vfsfitvnm.vimusic" + minSdk = 21 + targetSdk = 32 + versionCode = 1 + versionName = "0.1.0" + } + + splits { + abi { + reset() + isUniversalApk = true + } + } + + buildTypes { + debug { + applicationIdSuffix = ".debug" + manifestPlaceholders["appName"] = "Debug" + } + + release { + isMinifyEnabled = true + isShrinkResources = true + manifestPlaceholders["appName"] = "ViMusic" + signingConfig = signingConfigs.getByName("debug") + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + } + + sourceSets.all { + kotlin.srcDir("src/$name/kotlin") + } + + buildFeatures { + compose = true + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + composeOptions { + kotlinCompilerExtensionVersion = libs.versions.compose.get() + } + + kotlinOptions { + freeCompilerArgs += "-Xcontext-receivers" + jvmTarget = "1.8" + } +} + +kapt { + arguments { + arg("room.schemaLocation", "$projectDir/schemas") + } +} + +dependencies { + implementation(projects.composeRouting) + implementation(projects.composeReordering) + + implementation(libs.compose.activity) + implementation(libs.compose.foundation) + implementation(libs.compose.ui) + implementation(libs.compose.ui.util) + implementation(libs.compose.ripple) + implementation(libs.compose.shimmer) + implementation(libs.compose.coil) + + implementation(libs.accompanist.systemuicontroller) + implementation(libs.accompanist.flowlayout) + + implementation(libs.android.media) + implementation(libs.bundles.media3) + + implementation(libs.room) + kapt(libs.room.compiler) + + implementation(libs.guava.coroutines) + + implementation(projects.youtubeMusic) +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..134e059 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,24 @@ +-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation + +-if @kotlinx.serialization.Serializable class ** +-keepclassmembers class <1> { + static <1>$Companion Companion; +} + +-if @kotlinx.serialization.Serializable class ** { + static **$* *; +} +-keepclassmembers class <2>$<3> { + kotlinx.serialization.KSerializer serializer(...); +} + +-if @kotlinx.serialization.Serializable class ** { + public static ** INSTANCE; +} +-keepclassmembers class <1> { + public static <1> INSTANCE; + kotlinx.serialization.KSerializer serializer(...); +} + +-keepattributes RuntimeVisibleAnnotations,AnnotationDefault + diff --git a/app/schemas/it.vfsfitvnm.vimusic.DatabaseInitializer/1.json b/app/schemas/it.vfsfitvnm.vimusic.DatabaseInitializer/1.json new file mode 100644 index 0000000..2ccea01 --- /dev/null +++ b/app/schemas/it.vfsfitvnm.vimusic.DatabaseInitializer/1.json @@ -0,0 +1,304 @@ +{ + "formatVersion": 1, + "database": { + "version": 1, + "identityHash": "b93575bd08c10513f0bfc997b832c280", + "entities": [ + { + "tableName": "Song", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `title` TEXT NOT NULL, `albumInfoId` INTEGER, `durationText` TEXT NOT NULL, `thumbnailUrl` TEXT, `likedAt` INTEGER, `totalPlayTimeMs` INTEGER NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "albumInfoId", + "columnName": "albumInfoId", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "durationText", + "columnName": "durationText", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "thumbnailUrl", + "columnName": "thumbnailUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "likedAt", + "columnName": "likedAt", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "totalPlayTimeMs", + "columnName": "totalPlayTimeMs", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "SongInPlaylist", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`songId` TEXT NOT NULL, `playlistId` INTEGER NOT NULL, `position` INTEGER NOT NULL, PRIMARY KEY(`songId`, `playlistId`), FOREIGN KEY(`songId`) REFERENCES `Song`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`playlistId`) REFERENCES `Playlist`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "songId", + "columnName": "songId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "playlistId", + "columnName": "playlistId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "position", + "columnName": "position", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "songId", + "playlistId" + ] + }, + "indices": [ + { + "name": "index_SongInPlaylist_songId", + "unique": false, + "columnNames": [ + "songId" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_SongInPlaylist_songId` ON `${TABLE_NAME}` (`songId`)" + }, + { + "name": "index_SongInPlaylist_playlistId", + "unique": false, + "columnNames": [ + "playlistId" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_SongInPlaylist_playlistId` ON `${TABLE_NAME}` (`playlistId`)" + } + ], + "foreignKeys": [ + { + "table": "Song", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "songId" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "Playlist", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "playlistId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "Playlist", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "Info", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `browseId` TEXT, `text` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "browseId", + "columnName": "browseId", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "text", + "columnName": "text", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "SongWithAuthors", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`songId` TEXT NOT NULL, `authorInfoId` INTEGER NOT NULL, PRIMARY KEY(`songId`, `authorInfoId`), FOREIGN KEY(`songId`) REFERENCES `Song`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`authorInfoId`) REFERENCES `Info`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "songId", + "columnName": "songId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "authorInfoId", + "columnName": "authorInfoId", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "songId", + "authorInfoId" + ] + }, + "indices": [ + { + "name": "index_SongWithAuthors_authorInfoId", + "unique": false, + "columnNames": [ + "authorInfoId" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_SongWithAuthors_authorInfoId` ON `${TABLE_NAME}` (`authorInfoId`)" + } + ], + "foreignKeys": [ + { + "table": "Song", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "songId" + ], + "referencedColumns": [ + "id" + ] + }, + { + "table": "Info", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "authorInfoId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "SearchQuery", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `query` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "query", + "columnName": "query", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_SearchQuery_query", + "unique": true, + "columnNames": [ + "query" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_SearchQuery_query` ON `${TABLE_NAME}` (`query`)" + } + ], + "foreignKeys": [] + } + ], + "views": [ + { + "viewName": "SortedSongInPlaylist", + "createSql": "CREATE VIEW `${VIEW_NAME}` AS SELECT * FROM SongInPlaylist ORDER BY position" + } + ], + "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, 'b93575bd08c10513f0bfc997b832c280')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..8b869af --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..f23c2652b0539184d2b3427b1e2dda10a897ed9e GIT binary patch literal 14782 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 + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(searchQuery: SearchQuery) + + @Insert(onConflict = OnConflictStrategy.ABORT) + fun insert(info: Info): Long + + @Insert(onConflict = OnConflictStrategy.ABORT) + fun insert(playlist: Playlist): Long + + @Insert(onConflict = OnConflictStrategy.IGNORE) + fun insert(info: SongInPlaylist): Long + + @Insert(onConflict = OnConflictStrategy.ABORT) + fun insert(info: List): List + + @Query("SELECT * FROM Song WHERE id = :id") + fun songFlow(id: String): Flow + + @Query("SELECT * FROM Song WHERE id = :id") + fun song(id: String): Song? + + @Query("SELECT * FROM Playlist WHERE id = :id") + fun playlist(id: Long): Playlist? + + @Query("SELECT * FROM Song") + fun songs(): Flow> + + @Transaction + @Query("SELECT * FROM Song WHERE id = :id") + fun songWithInfo(id: String): SongWithInfo? + + @Transaction + @Query("SELECT * FROM Song WHERE totalPlayTimeMs >= 15000 ORDER BY ROWID DESC") + fun history(): Flow> + + @Transaction + @Query("SELECT * FROM Song WHERE likedAt IS NOT NULL ORDER BY likedAt DESC") + fun favorites(): Flow> + + @Transaction + @Query("SELECT * FROM Song WHERE totalPlayTimeMs >= 60000 ORDER BY totalPlayTimeMs DESC LIMIT 20") + fun mostPlayed(): Flow> + + @Query("UPDATE Song SET totalPlayTimeMs = totalPlayTimeMs + :addition WHERE id = :id") + fun incrementTotalPlayTimeMs(id: String, addition: Long) + + @Transaction + @Query("SELECT * FROM Playlist WHERE id = :id") + fun playlistWithSongs(id: Long): Flow + + @Query("SELECT COUNT(*) FROM SongInPlaylist WHERE playlistId = :id") + fun playlistSongCount(id: Long): Int + + @Query("UPDATE SongInPlaylist SET position = position - 1 WHERE playlistId = :playlistId AND position >= :fromPosition") + fun decrementSongPositions(playlistId: Long, fromPosition: Int) + + @Query("UPDATE SongInPlaylist SET position = position - 1 WHERE playlistId = :playlistId AND position >= :fromPosition AND position <= :toPosition") + fun decrementSongPositions(playlistId: Long, fromPosition: Int, toPosition: Int) + + @Query("UPDATE SongInPlaylist SET position = position + 1 WHERE playlistId = :playlistId AND position >= :fromPosition AND position <= :toPosition") + fun incrementSongPositions(playlistId: Long, fromPosition: Int, toPosition: Int) + + @Insert(onConflict = OnConflictStrategy.ABORT) + fun insert(songWithAuthors: SongWithAuthors): Long + + @Insert(onConflict = OnConflictStrategy.ABORT) + fun insert(song: Song): Long + + @Update + fun update(song: Song) + + @Update + fun update(songInPlaylist: SongInPlaylist) + + @Update + fun update(playlist: Playlist) + + @Delete + fun delete(searchQuery: SearchQuery) + + @Delete + fun delete(playlist: Playlist) + + @Delete + fun delete(song: Song) + + @Delete + fun delete(songInPlaylist: SongInPlaylist) + + @Transaction + @Query("SELECT id, name, (SELECT COUNT(*) FROM SongInPlaylist WHERE playlistId = id) as songCount FROM Playlist") + fun playlistPreviews(): Flow> + + @Query("SELECT thumbnailUrl FROM Song JOIN SongInPlaylist ON id = songId WHERE playlistId = :id ORDER BY position LIMIT 4") + fun playlistThumbnailUrls(id: Long): Flow> +} + +@androidx.room.Database( + entities = [ + Song::class, SongInPlaylist::class, Playlist::class, Info::class, SongWithAuthors::class, SearchQuery::class + ], + views = [ + SortedSongInPlaylist::class + ], + version = 1, + exportSchema = true +) +abstract class DatabaseInitializer protected constructor() : RoomDatabase() { + abstract val database: Database + + companion object { + lateinit var Instance: DatabaseInitializer + + context(Context) + operator fun invoke() { + if (!::Instance.isInitialized) { + Instance = Room + .databaseBuilder(this@Context, DatabaseInitializer::class.java, "data.db") + .build() + } + } + } +} + +val Database.internal: RoomDatabase + get() = DatabaseInitializer.Instance diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/MainActivity.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/MainActivity.kt new file mode 100644 index 0000000..f2e74b1 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/MainActivity.kt @@ -0,0 +1,145 @@ +package it.vfsfitvnm.vimusic + +import android.content.ComponentName +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.animation.core.LinearEasing +import androidx.compose.animation.core.RepeatMode +import androidx.compose.animation.core.infiniteRepeatable +import androidx.compose.animation.core.tween +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.LocalIndication +import androidx.compose.foundation.background +import androidx.compose.foundation.gestures.LocalOverScrollConfiguration +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material.ripple.LocalRippleTheme +import androidx.compose.material.ripple.RippleAlpha +import androidx.compose.material.ripple.RippleTheme +import androidx.compose.material.ripple.rememberRipple +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.SideEffect +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalHapticFeedback +import androidx.compose.ui.text.ExperimentalTextApi +import androidx.media3.session.MediaController +import androidx.media3.session.SessionToken +import com.google.accompanist.systemuicontroller.rememberSystemUiController +import com.google.common.util.concurrent.ListenableFuture +import com.valentinilk.shimmer.LocalShimmerTheme +import com.valentinilk.shimmer.defaultShimmerTheme +import it.vfsfitvnm.vimusic.services.PlayerService +import it.vfsfitvnm.vimusic.ui.components.BottomSheetMenu +import it.vfsfitvnm.vimusic.ui.components.LocalMenuState +import it.vfsfitvnm.vimusic.ui.components.rememberMenuState +import it.vfsfitvnm.vimusic.ui.screens.HomeScreen +import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette +import it.vfsfitvnm.vimusic.ui.styling.LocalTypography +import it.vfsfitvnm.vimusic.ui.styling.rememberColorPalette +import it.vfsfitvnm.vimusic.ui.styling.rememberTypography +import it.vfsfitvnm.vimusic.utils.* + + +@ExperimentalAnimationApi +@ExperimentalFoundationApi +@ExperimentalTextApi +class MainActivity : ComponentActivity() { + private lateinit var mediaControllerFuture: ListenableFuture + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + val sessionToken = SessionToken(this, ComponentName(this, PlayerService::class.java)) + mediaControllerFuture = MediaController.Builder(this, sessionToken).buildAsync() + + val intentVideoId = intent?.data?.getQueryParameter("v") + + setContent { + val preferences = rememberPreferences() + val systemUiController = rememberSystemUiController() + val isDarkTheme = isSystemInDarkTheme() + + val colorPalette = rememberColorPalette(isDarkTheme) + + val rippleTheme = remember(colorPalette.text, isDarkTheme) { + object : RippleTheme { + @Composable + override fun defaultColor(): Color = RippleTheme.defaultRippleColor( + contentColor = colorPalette.text, + lightTheme = !isDarkTheme + ) + + @Composable + override fun rippleAlpha(): RippleAlpha = RippleTheme.defaultRippleAlpha( + contentColor = colorPalette.text, + lightTheme = !isDarkTheme + ) + } + } + + val shimmerTheme = remember { + defaultShimmerTheme.copy( + animationSpec = infiniteRepeatable( + animation = tween( + durationMillis = 800, + easing = LinearEasing, + delayMillis = 250, + ), + repeatMode = RepeatMode.Restart + ), + shaderColors = listOf( + Color.Unspecified.copy(alpha = 0.25f), + Color.White.copy(alpha = 0.50f), + Color.Unspecified.copy(alpha = 0.25f), + ), + ) + } + + SideEffect { + systemUiController.setSystemBarsColor(colorPalette.background, !isDarkTheme) + } + + CompositionLocalProvider( + LocalOverScrollConfiguration provides null, + LocalIndication provides rememberRipple(bounded = false), + LocalRippleTheme provides rippleTheme, + LocalPreferences provides preferences, + LocalColorPalette provides colorPalette, + LocalShimmerTheme provides shimmerTheme, + LocalTypography provides rememberTypography(colorPalette.text), + LocalYoutubePlayer provides rememberYoutubePlayer( + mediaControllerFuture, + preferences.repeatMode + ), + LocalMenuState provides rememberMenuState(), + LocalHapticFeedback provides rememberHapticFeedback() + ) { + Box( + modifier = Modifier + .fillMaxSize() + .background(LocalColorPalette.current.background) + ) { + HomeScreen(intentVideoId = intentVideoId) + + BottomSheetMenu( + state = LocalMenuState.current, + modifier = Modifier + .align(Alignment.BottomCenter) + ) + } + } + } + } + + override fun onDestroy() { + MediaController.releaseFuture(mediaControllerFuture) + super.onDestroy() + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/MainApplication.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/MainApplication.kt new file mode 100644 index 0000000..46e8b70 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/MainApplication.kt @@ -0,0 +1,26 @@ +package it.vfsfitvnm.vimusic + +import android.app.Application +import coil.ImageLoader +import coil.ImageLoaderFactory +import coil.disk.DiskCache + + +class MainApplication : Application(), ImageLoaderFactory { + override fun onCreate() { + super.onCreate() + DatabaseInitializer() + } + + override fun newImageLoader(): ImageLoader { + return ImageLoader.Builder(this) + .crossfade(true) + .diskCache( + DiskCache.Builder() + .directory(filesDir.resolve("coil")) + .maxSizeBytes(1024 * 1024 * 1024) + .build() + ) + .build() + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/enums/SongCollection.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/enums/SongCollection.kt new file mode 100644 index 0000000..83af2f2 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/enums/SongCollection.kt @@ -0,0 +1,7 @@ +package it.vfsfitvnm.vimusic.enums + +enum class SongCollection { + MostPlayed, + Favorites, + History +} \ No newline at end of file diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/Info.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/Info.kt new file mode 100644 index 0000000..9e7c601 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/Info.kt @@ -0,0 +1,12 @@ +package it.vfsfitvnm.vimusic.models + +import androidx.room.Entity +import androidx.room.PrimaryKey + +// I know... +@Entity +data class Info( + @PrimaryKey(autoGenerate = true) val id: Long = 0, + val browseId: String?, + val text: String +) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/Playlist.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/Playlist.kt new file mode 100644 index 0000000..f428263 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/Playlist.kt @@ -0,0 +1,17 @@ +package it.vfsfitvnm.vimusic.models + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity +data class Playlist( + @PrimaryKey(autoGenerate = true) val id: Long = 0, + val name: String, +) { + companion object { + val Empty = Playlist( + id = 0, + name = "" + ) + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/PlaylistPreview.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/PlaylistPreview.kt new file mode 100644 index 0000000..1ea25d0 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/PlaylistPreview.kt @@ -0,0 +1,8 @@ +package it.vfsfitvnm.vimusic.models + +import androidx.room.Embedded + +data class PlaylistPreview( + @Embedded val playlist: Playlist, + val songCount: Int +) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/PlaylistWithSongs.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/PlaylistWithSongs.kt new file mode 100644 index 0000000..fa512c0 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/PlaylistWithSongs.kt @@ -0,0 +1,24 @@ +package it.vfsfitvnm.vimusic.models + +import androidx.room.* + + +data class PlaylistWithSongs( + @Embedded val playlist: Playlist, + @Relation( + entity = Song::class, + parentColumn = "id", + entityColumn = "id", + associateBy = Junction( + value = SortedSongInPlaylist::class, + parentColumn = "playlistId", + entityColumn = "songId" + ) + ) + val songs: List +) { + companion object { + val Empty = PlaylistWithSongs(Playlist(-1, ""), emptyList()) + val NotFound = PlaylistWithSongs(Playlist(-2, "Not found"), emptyList()) + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SearchQuery.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SearchQuery.kt new file mode 100644 index 0000000..de7417e --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SearchQuery.kt @@ -0,0 +1,21 @@ +package it.vfsfitvnm.vimusic.models + +import androidx.compose.runtime.Immutable +import androidx.room.Entity +import androidx.room.Index +import androidx.room.PrimaryKey + + +@Immutable +@Entity( + indices = [ + Index( + value = ["query"], + unique = true + ) + ] +) +data class SearchQuery( + @PrimaryKey(autoGenerate = true) val id: Long = 0, + val query: String +) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/Song.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/Song.kt new file mode 100644 index 0000000..c6a9ea6 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/Song.kt @@ -0,0 +1,34 @@ +package it.vfsfitvnm.vimusic.models + +import androidx.room.* + + +@Entity +data class Song( + @PrimaryKey val id: String, + val title: String, + val albumInfoId: Long?, + val durationText: String, + val thumbnailUrl: String?, + val likedAt: Long? = null, + val totalPlayTimeMs: Long = 0 +) { + val formattedTotalPlayTime: String + get() { + val seconds = totalPlayTimeMs / 1000 + + val hours = seconds / 3600 + + return when { + hours == 0L -> "${seconds / 60}m" + hours < 24L -> "${hours}h" + else -> "${hours / 24}d" + } + } + + fun toggleLike(): Song { + return copy( + likedAt = if (likedAt == null) System.currentTimeMillis() else null + ) + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SongInPlaylist.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SongInPlaylist.kt new file mode 100644 index 0000000..ed711e8 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SongInPlaylist.kt @@ -0,0 +1,31 @@ +package it.vfsfitvnm.vimusic.models + +import androidx.compose.runtime.Immutable +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.ForeignKey + + +@Immutable +@Entity( + primaryKeys = ["songId", "playlistId"], + foreignKeys = [ + ForeignKey( + entity = Song::class, + parentColumns = ["id"], + childColumns = ["songId"], + onDelete = ForeignKey.CASCADE + ), + ForeignKey( + entity = Playlist::class, + parentColumns = ["id"], + childColumns = ["playlistId"], + onDelete = ForeignKey.CASCADE + ) + ] +) +data class SongInPlaylist( + @ColumnInfo(index = true) val songId: String, + @ColumnInfo(index = true) val playlistId: Long, + val position: Int +) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SongWithAuthors.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SongWithAuthors.kt new file mode 100644 index 0000000..e8216d0 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SongWithAuthors.kt @@ -0,0 +1,28 @@ +package it.vfsfitvnm.vimusic.models + +import androidx.compose.runtime.Immutable +import androidx.room.* + + +@Immutable +@Entity( + primaryKeys = ["songId", "authorInfoId"], + foreignKeys = [ + ForeignKey( + entity = Song::class, + parentColumns = ["id"], + childColumns = ["songId"], + onDelete = ForeignKey.CASCADE + ), + ForeignKey( + entity = Info::class, + parentColumns = ["id"], + childColumns = ["authorInfoId"], + onDelete = ForeignKey.CASCADE + ) + ] +) +data class SongWithAuthors( + val songId: String, + @ColumnInfo(index = true) val authorInfoId: Long +) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SongWithInfo.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SongWithInfo.kt new file mode 100644 index 0000000..066b041 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SongWithInfo.kt @@ -0,0 +1,25 @@ +package it.vfsfitvnm.vimusic.models + +import androidx.room.Embedded +import androidx.room.Junction +import androidx.room.Relation + +open class SongWithInfo( + @Embedded val song: Song, + @Relation( + entity = Info::class, + parentColumn = "albumInfoId", + entityColumn = "id" + ) val album: Info?, + @Relation( + entity = Info::class, + parentColumn = "id", + entityColumn = "id", + associateBy = Junction( + value = SongWithAuthors::class, + parentColumn = "songId", + entityColumn = "authorInfoId" + ) + ) + val authors: List? +) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SortedSongInPlaylist.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SortedSongInPlaylist.kt new file mode 100644 index 0000000..b269174 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/models/SortedSongInPlaylist.kt @@ -0,0 +1,11 @@ +package it.vfsfitvnm.vimusic.models + +import androidx.room.ColumnInfo +import androidx.room.DatabaseView + +@DatabaseView("SELECT * FROM SongInPlaylist ORDER BY position") +data class SortedSongInPlaylist( + @ColumnInfo(index = true) val songId: String, + @ColumnInfo(index = true) val playlistId: Long, + val position: Int +) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/services/PlayerService.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/services/PlayerService.kt new file mode 100644 index 0000000..30f0d3f --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/services/PlayerService.kt @@ -0,0 +1,354 @@ +package it.vfsfitvnm.vimusic.services + +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.graphics.Bitmap +import android.graphics.drawable.BitmapDrawable +import android.net.Uri +import android.os.Build +import android.os.Bundle +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.ui.text.ExperimentalTextApi +import androidx.core.app.NotificationCompat +import androidx.core.graphics.drawable.IconCompat +import androidx.core.graphics.drawable.toBitmap +import androidx.core.net.toUri +import androidx.media3.common.* +import androidx.media3.common.util.Util +import androidx.media3.database.StandaloneDatabaseProvider +import androidx.media3.datasource.DataSource +import androidx.media3.datasource.DefaultHttpDataSource +import androidx.media3.datasource.ResolvingDataSource +import androidx.media3.datasource.cache.CacheDataSource +import androidx.media3.datasource.cache.NoOpCacheEvictor +import androidx.media3.datasource.cache.SimpleCache +import androidx.media3.exoplayer.ExoPlayer +import androidx.media3.exoplayer.analytics.AnalyticsListener +import androidx.media3.exoplayer.analytics.PlaybackStats +import androidx.media3.exoplayer.analytics.PlaybackStatsListener +import androidx.media3.exoplayer.source.DefaultMediaSourceFactory +import androidx.media3.session.MediaController +import androidx.media3.session.MediaNotification +import androidx.media3.session.MediaNotification.ActionFactory +import androidx.media3.session.MediaSession +import androidx.media3.session.MediaSessionService +import coil.ImageLoader +import coil.request.ImageRequest +import it.vfsfitvnm.vimusic.Database +import it.vfsfitvnm.vimusic.MainActivity +import it.vfsfitvnm.vimusic.R +import it.vfsfitvnm.vimusic.utils.RingBuffer +import it.vfsfitvnm.vimusic.utils.YoutubePlayer +import it.vfsfitvnm.vimusic.utils.insert +import it.vfsfitvnm.youtubemusic.Outcome +import kotlinx.coroutines.* +import kotlin.math.roundToInt + + +@ExperimentalAnimationApi +@ExperimentalFoundationApi +@ExperimentalTextApi +class PlayerService : MediaSessionService(), MediaSession.MediaItemFiller, + MediaNotification.Provider, + PlaybackStatsListener.Callback, Player.Listener,YoutubePlayer.Radio.Listener { + + companion object { + private const val NotificationId = 1001 + private const val NotificationChannelId = "default_channel_id" + } + + private val cache: SimpleCache by lazy(LazyThreadSafetyMode.NONE) { + SimpleCache(cacheDir, NoOpCacheEvictor(), StandaloneDatabaseProvider(this)) + } + + private lateinit var mediaSession: MediaSession + + private val notificationManager by lazy(LazyThreadSafetyMode.NONE) { + getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + } + + private var lastArtworkUri: Uri? = null + private var lastBitmap: Bitmap? = null + + private val coroutineScope = CoroutineScope(Dispatchers.IO) + Job() + + override fun onCreate() { + super.onCreate() + + createNotificationChannel() + setMediaNotificationProvider(this) + + val player = ExoPlayer.Builder(this) + .setHandleAudioBecomingNoisy(true) + .setWakeMode(C.WAKE_MODE_LOCAL) + .setMediaSourceFactory(DefaultMediaSourceFactory(createDataSourceFactory())) + .setAudioAttributes( + AudioAttributes.Builder() + .setUsage(C.USAGE_MEDIA) + .setContentType(C.CONTENT_TYPE_MUSIC) + .build(), + true + ) + .build() + .also { player -> + player.playWhenReady = true + player.addAnalyticsListener(PlaybackStatsListener(false, this)) + } + + mediaSession = MediaSession.Builder(this, player) + .withSessionActivity() + .setMediaItemFiller(this) + .build() + + player.addListener(this) + YoutubePlayer.Radio.listener = this + } + + override fun onDestroy() { + mediaSession.player.release() + mediaSession.release() + cache.release() + super.onDestroy() + } + + override fun onGetSession(controllerInfo: MediaSession.ControllerInfo): MediaSession { + return mediaSession + } + + override fun onPlaybackStatsReady( + eventTime: AnalyticsListener.EventTime, + playbackStats: PlaybackStats + ) { + val mediaItem = + eventTime.timeline.getWindow(eventTime.windowIndex, Timeline.Window()).mediaItem + + coroutineScope.launch(Dispatchers.IO) { + Database.insert(mediaItem) + Database.incrementTotalPlayTimeMs(mediaItem.mediaId, playbackStats.totalPlayTimeMs) + } + } + + override fun process(play: Boolean) { + if (YoutubePlayer.Radio.isActive) { + coroutineScope.launch { + YoutubePlayer.Radio.process(mediaSession.player, play = play) + } + } + } + + override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) { + if (YoutubePlayer.Radio.isActive) { + coroutineScope.launch { + YoutubePlayer.Radio.process(mediaSession.player) + } + } + } + + override fun fillInLocalConfiguration( + session: MediaSession, + controller: MediaSession.ControllerInfo, + mediaItem: MediaItem + ): MediaItem { + return mediaItem.buildUpon() + .setUri(mediaItem.mediaId) + .setCustomCacheKey(mediaItem.mediaId) + .build() + } + + override fun createNotification( + mediaController: MediaController, + actionFactory: ActionFactory, + onNotificationChangedCallback: MediaNotification.Provider.Callback + ): MediaNotification { + fun NotificationCompat.Builder.addMediaAction( + @DrawableRes resId: Int, + @StringRes stringId: Int, + @Player.Command command: Long + ): NotificationCompat.Builder { + return addAction( + actionFactory.createMediaAction( + IconCompat.createWithResource(this@PlayerService, resId), + getString(stringId), + command + ) + ) + } + + val mediaMetadata = mediaController.mediaMetadata + + val builder = NotificationCompat.Builder(applicationContext, NotificationChannelId) + .setContentTitle(mediaMetadata.title) + .setContentText(mediaMetadata.artist) + .addMediaAction( + R.drawable.play_skip_back, + R.string.media3_controls_seek_to_previous_description, + ActionFactory.COMMAND_SKIP_TO_PREVIOUS + ).run { + if (mediaController.playbackState == Player.STATE_ENDED || !mediaController.playWhenReady) { + addMediaAction( + R.drawable.play, + R.string.media3_controls_play_description, + ActionFactory.COMMAND_PLAY + ) + } else { + addMediaAction( + R.drawable.pause, + R.string.media3_controls_pause_description, + ActionFactory.COMMAND_PAUSE + ) + } + }.addMediaAction( + R.drawable.play_skip_forward, + R.string.media3_controls_seek_to_next_description, + ActionFactory.COMMAND_SKIP_TO_NEXT + ) + .setContentIntent(mediaController.sessionActivity) + .setDeleteIntent( + actionFactory.createMediaActionPendingIntent( + ActionFactory.COMMAND_STOP + ) + ) + .setAutoCancel(true) + .setOnlyAlertOnce(true) + .setShowWhen(false) + .setSmallIcon(R.drawable.app_icon) + .setOngoing(false) + .setStyle( + androidx.media.app.NotificationCompat.MediaStyle() + .setShowActionsInCompactView(0, 1, 2) + .setMediaSession(mediaSession.sessionCompatToken as android.support.v4.media.session.MediaSessionCompat.Token) + ) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + + + if (lastArtworkUri == mediaMetadata.artworkUri) { + builder.setLargeIcon(lastBitmap) + } else { + val size = (96 * resources.displayMetrics.density).roundToInt() + + builder.setLargeIcon( + resources.getDrawable(R.drawable.disc_placeholder, null)?.toBitmap(size, size) + ) + + ImageLoader(applicationContext) + .enqueue( + ImageRequest.Builder(applicationContext) + .listener { _, result -> + lastBitmap = (result.drawable as BitmapDrawable).bitmap + lastArtworkUri = mediaMetadata.artworkUri + + onNotificationChangedCallback.onNotificationChanged( + MediaNotification( + NotificationId, + builder.setLargeIcon(lastBitmap).build() + ) + ) + } + .data("${mediaMetadata.artworkUri}-w${size}-h${size}") + .build() + ) + } + + return MediaNotification(NotificationId, builder.build()) + } + + override fun handleCustomAction( + mediaController: MediaController, + action: String, + extras: Bundle + ) = Unit + + private fun createNotificationChannel() { + if (Util.SDK_INT >= 26 && notificationManager.getNotificationChannel(NotificationChannelId) == null) { + notificationManager.createNotificationChannel( + NotificationChannel( + NotificationChannelId, + getString(R.string.default_notification_channel_name), + NotificationManager.IMPORTANCE_LOW + ) + ) + } + } + + private fun createCacheDataSource(): DataSource.Factory { + return CacheDataSource.Factory().setCache(cache).apply { + setUpstreamDataSourceFactory( + DefaultHttpDataSource.Factory() + .setConnectTimeoutMs(16000) + .setReadTimeoutMs(8000) + .setUserAgent("Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0") + ) + } + } + + private fun createDataSourceFactory(): DataSource.Factory { + val chunkLength = 512 * 1024L + val ringBuffer = RingBuffer?>(2) { null } + + return ResolvingDataSource.Factory(createCacheDataSource()) { dataSpec -> + val videoId = dataSpec.key ?: error("A key must be set") + + if (cache.isCached(videoId, dataSpec.position, chunkLength)) { + dataSpec + } else { + when (videoId) { + ringBuffer.getOrNull(0)?.first -> dataSpec.withUri(ringBuffer.getOrNull(0)!!.second) + ringBuffer.getOrNull(1)?.first -> dataSpec.withUri(ringBuffer.getOrNull(1)!!.second) + else -> { + val url = runBlocking(Dispatchers.IO) { + it.vfsfitvnm.youtubemusic.YouTube.player(videoId) + }.flatMap { body -> + when (val status = body.playabilityStatus.status) { + "OK" -> body.streamingData?.adaptiveFormats?.findLast { format -> + format.itag == 251 || format.itag == 140 + }?.url?.let { Outcome.Success(it) } ?: Outcome.Error.Unhandled( + PlaybackException( + "Couldn't find a playable audio format", + null, + PlaybackException.ERROR_CODE_REMOTE_ERROR + ) + ) + else -> Outcome.Error.Unhandled( + PlaybackException( + status, + null, + PlaybackException.ERROR_CODE_REMOTE_ERROR + ) + ) + } + } + + when (url) { + is Outcome.Success -> { + ringBuffer.append(videoId to url.value.toUri()) + dataSpec.withUri(url.value.toUri()) + .subrange(dataSpec.uriPositionOffset, chunkLength) + } + // TODO + is Outcome.Error.Network -> throw Error("no network") + is Outcome.Error.Unhandled -> throw url.throwable + else -> TODO("unreachable") + } + } + } + } + } + } + + private fun MediaSession.Builder.withSessionActivity(): MediaSession.Builder { + return setSessionActivity( + PendingIntent.getActivity( + this@PlayerService, + 0, + Intent(this@PlayerService, MainActivity::class.java), + if (Build.VERSION.SDK_INT >= 23) PendingIntent.FLAG_IMMUTABLE else 0 + ) + ) + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/BottomSheet.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/BottomSheet.kt new file mode 100644 index 0000000..62db07a --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/BottomSheet.kt @@ -0,0 +1,304 @@ +package it.vfsfitvnm.vimusic.ui.components + +import androidx.activity.compose.BackHandler +import androidx.compose.animation.core.Animatable +import androidx.compose.animation.core.VectorConverter +import androidx.compose.foundation.clickable +import androidx.compose.foundation.gestures.DraggableState +import androidx.compose.foundation.gestures.Orientation +import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.foundation.gestures.draggable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.* +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.drawBehind +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.input.nestedscroll.NestedScrollConnection +import androidx.compose.ui.input.nestedscroll.NestedScrollSource +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.Velocity +import androidx.compose.ui.unit.dp +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.launch +import kotlin.math.absoluteValue + + +@Composable +@NonRestartableComposable +fun BottomSheet( + lowerBound: Dp, + upperBound: Dp, + modifier: Modifier = Modifier, + peekHeight: Dp = 0.dp, + elevation: Dp = 8.dp, + shape: Shape = RectangleShape, + handleOutsideInteractionsWhenExpanded: Boolean = false, + interactionSource: MutableInteractionSource? = null, + collapsedContent: @Composable BoxScope.() -> Unit, + content: @Composable BoxScope.() -> Unit +) { + BottomSheet( + state = rememberBottomSheetState(lowerBound, upperBound), + modifier = modifier, + peekHeight = peekHeight, + elevation = elevation, + shape = shape, + handleOutsideInteractionsWhenExpanded = handleOutsideInteractionsWhenExpanded, + interactionSource = interactionSource, + collapsedContent = collapsedContent, + content = content + ) +} + +@Composable +fun BottomSheet( + state: BottomSheetState, + modifier: Modifier = Modifier, + peekHeight: Dp = 0.dp, + elevation: Dp = 8.dp, + shape: Shape = RectangleShape, + handleOutsideInteractionsWhenExpanded: Boolean = false, + interactionSource: MutableInteractionSource? = null, + collapsedContent: @Composable BoxScope.() -> Unit, + content: @Composable BoxScope.() -> Unit +) { + var lastOffset by remember { + mutableStateOf(state.value) + } + + BackHandler(enabled = !state.isCollapsed, onBack = state.collapse) + + Box { + if (handleOutsideInteractionsWhenExpanded && !state.isCollapsed) { + Spacer( + modifier = Modifier + .pointerInput(Unit) { + detectTapGestures { + state.collapse() + } + } + .draggable( + state = state, + onDragStarted = { + lastOffset = state.value + }, + onDragStopped = { velocity -> + if (velocity.absoluteValue > 300 && lastOffset != state.value) { + if (lastOffset > state.value) { + state.collapse() + } else { + state.expand() + } + } else { + if (state.upperBound - state.value > state.value - state.lowerBound) { + state.collapse() + } else { + state.expand() + } + } + }, + orientation = Orientation.Vertical + ) + .drawBehind { + drawRect(color = Color.Black.copy(alpha = 0.5f * state.progress)) + } + .fillMaxSize() + ) + } + + Box( + modifier = modifier + .offset { + val y = (state.upperBound - state.value + peekHeight) + .roundToPx() + .coerceAtLeast(0) + IntOffset(x = 0, y = y) + } + .shadow(elevation = elevation, shape = shape) + .clip(shape) + .draggable( + state = state, + interactionSource = interactionSource, + onDragStarted = { + lastOffset = state.value + }, + onDragStopped = { velocity -> + if (velocity.absoluteValue > 300 && lastOffset != state.value) { + if (lastOffset > state.value) { + state.collapse() + } else { + state.expand() + } + } else { + if (state.upperBound - state.value > state.value - state.lowerBound) { + state.collapse() + } else { + state.expand() + } + } + }, + orientation = Orientation.Vertical + ) + .clickable( + enabled = !state.isRunning && state.isCollapsed, + indication = null, + interactionSource = interactionSource + ?: remember { MutableInteractionSource() }, + onClick = state.expand + ) + .fillMaxSize() + ) { + if (!state.isCollapsed) { + content() + } + + collapsedContent() + } + } +} + + +@Stable +class BottomSheetState( + draggableState: DraggableState, + valueState: State, + isRunningState: State, + isCollapsedState: State, + isExpandedState: State, + progressState: State, + val lowerBound: Dp, + val upperBound: Dp, + val collapse: () -> Unit, + val expand: () -> Unit, +) : DraggableState by draggableState { + val value by valueState + + val isRunning by isRunningState + + val isCollapsed by isCollapsedState + + val isExpanded by isExpandedState + + val progress by progressState + + fun nestedScrollConnection(initialIsTopReached: Boolean = true): NestedScrollConnection { + return object : NestedScrollConnection { + var isTopReached = initialIsTopReached + + override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { + if (isExpanded && available.y < 0) { + isTopReached = false + } + + if (isTopReached) { + dispatchRawDelta(available.y) + return available + } + + return Offset.Zero + } + + override fun onPostScroll( + consumed: Offset, + available: Offset, + source: NestedScrollSource + ): Offset { + if (!isTopReached) { + isTopReached = consumed.y == 0f && available.y > 0 + } + + return Offset.Zero + } + + override suspend fun onPreFling(available: Velocity): Velocity { + if (isTopReached) { + coroutineScope { + if (available.y.absoluteValue > 1000) { + collapse() + } else { + if (upperBound - value > value - lowerBound) { + collapse() + } else { + expand() + } + } + } + + return available + } + + return Velocity.Zero + } + + override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { + isTopReached = false + return super.onPostFling(consumed, available) + } + } + } +} + +@Composable +fun rememberBottomSheetState(lowerBound: Dp, upperBound: Dp): BottomSheetState { + val density = LocalDensity.current + val coroutineScope = rememberCoroutineScope() + + var wasExpanded by rememberSaveable { + mutableStateOf(false) + } + + val animatable = remember(lowerBound, upperBound) { + Animatable(if (wasExpanded) upperBound else lowerBound, Dp.VectorConverter).also { + it.updateBounds(lowerBound, upperBound) + } + } + + LaunchedEffect(animatable.value == upperBound) { + wasExpanded = animatable.value == upperBound + } + + return remember(animatable, coroutineScope) { + BottomSheetState( + draggableState = DraggableState { delta -> + coroutineScope.launch { + animatable.snapTo(animatable.value - density.run { delta.toDp() }) + } + }, + valueState = animatable.asState(), + lowerBound = lowerBound, + upperBound = upperBound, + isRunningState = derivedStateOf { + animatable.isRunning + }, + isCollapsedState = derivedStateOf { + animatable.value == lowerBound + }, + isExpandedState = derivedStateOf { + animatable.value == upperBound + }, + progressState = derivedStateOf { + 1f - (upperBound - animatable.value) / (upperBound - lowerBound) + }, + collapse = { + coroutineScope.launch { + animatable.animateTo(animatable.lowerBound!!) + } + }, + expand = { + coroutineScope.launch { + animatable.animateTo(animatable.upperBound!!) + } + } + ) + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/ChunkyButton.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/ChunkyButton.kt new file mode 100644 index 0000000..765c1c4 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/ChunkyButton.kt @@ -0,0 +1,98 @@ +package it.vfsfitvnm.vimusic.ui.components + +import androidx.annotation.DrawableRes +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicText +import androidx.compose.material.ripple.rememberRipple +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.unit.dp + + +@Composable +fun ChunkyButton( + onClick: () -> Unit, + backgroundColor: Color, + modifier: Modifier = Modifier, + text: String? = null, + secondaryText: String? = null, + textStyle: TextStyle = TextStyle.Default, + secondaryTextStyle: TextStyle = TextStyle.Default, + rippleColor: Color = Color.Unspecified, + @DrawableRes icon: Int? = null, + shape: Shape = RoundedCornerShape(16.dp), + colorFilter: ColorFilter = ColorFilter.tint(rippleColor), + onMore: (() -> Unit)? = null +) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(16.dp), + modifier = modifier + .clip(shape) + .background(backgroundColor) + .clickable( + indication = rememberRipple(bounded = true, color = rippleColor), + interactionSource = remember { MutableInteractionSource() }, + onClick = onClick + ) + .padding(horizontal = 24.dp, vertical = 16.dp) + ) { + icon?.let { icon -> + Image( + painter = painterResource(icon), + contentDescription = null, + colorFilter = colorFilter, + modifier = Modifier + .size(20.dp) + ) + } + + text?.let { text -> + Column { + BasicText( + text = text, + style = textStyle + ) + + secondaryText?.let { secondaryText -> + BasicText( + text = secondaryText, + style = secondaryTextStyle + ) + } + } + } + + onMore?.let { onMore -> + Spacer( + modifier = Modifier + .background(rippleColor.copy(alpha = 0.6f)) + .width(1.dp) + .height(24.dp) + ) + + Image( + // TODO: this is themed... + painter = painterResource(it.vfsfitvnm.vimusic.R.drawable.ellipsis_vertical), + contentDescription = null, + colorFilter = ColorFilter.tint(rippleColor.copy(alpha = 0.6f)), + modifier = Modifier + .clickable(onClick = onMore) + .size(20.dp) + ) + } + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/ChunkyChipGroup.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/ChunkyChipGroup.kt new file mode 100644 index 0000000..c739794 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/ChunkyChipGroup.kt @@ -0,0 +1,50 @@ +package it.vfsfitvnm.vimusic.ui.components + +import androidx.compose.foundation.horizontalScroll +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.unit.dp + +@Composable +fun ChipGroup( + items: List>, + value: T, + selectedBackgroundColor: Color, + unselectedBackgroundColor: Color, + selectedTextStyle: TextStyle, + unselectedTextStyle: TextStyle, + modifier: Modifier = Modifier, + shape: Shape = RoundedCornerShape(16.dp), + onValueChanged: (T) -> Unit +) { + Row( + horizontalArrangement = Arrangement.spacedBy(16.dp), + modifier = Modifier + .horizontalScroll(rememberScrollState()) + .then(modifier) + ) { + items.forEach { chipItem -> + ChunkyButton( + text = chipItem.text, + textStyle = if (chipItem.value == value) selectedTextStyle else unselectedTextStyle, + backgroundColor = if (chipItem.value == value) selectedBackgroundColor else unselectedBackgroundColor, + shape = shape, + onClick = { + onValueChanged(chipItem.value) + } + ) + } + } +} + +data class ChipItem( + val text: String, + val value: T +) \ No newline at end of file diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/ExpandableText.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/ExpandableText.kt new file mode 100644 index 0000000..bce3c24 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/ExpandableText.kt @@ -0,0 +1,80 @@ +package it.vfsfitvnm.vimusic.ui.components + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.text.BasicText +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.getValue +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.unit.dp + +@Composable +fun ExpandableText( + text: String, + style: TextStyle, + showMoreTextStyle: TextStyle, + minimizedMaxLines: Int, + backgroundColor: Color, + modifier: Modifier = Modifier +) { + var isExpanded by remember { + mutableStateOf(false) + } + + var hasVisualOverflow by remember { + mutableStateOf(true) + } + + Column( + modifier = modifier + ) { + Box { + BasicText( + text = text, + maxLines = if (isExpanded) Int.MAX_VALUE else minimizedMaxLines, + onTextLayout = { + hasVisualOverflow = it.hasVisualOverflow + }, + style = style + ) + + if (hasVisualOverflow) { + Spacer( + modifier = Modifier + .align(Alignment.BottomCenter) + .fillMaxWidth() + .height(14.dp) + .background( + brush = Brush.verticalGradient( + colors = listOf( + backgroundColor.copy(alpha = 0.5f), + backgroundColor + ) + ) + ) + ) + } + } + + BasicText( + text = if (isExpanded) "Less" else "More", + style = showMoreTextStyle, + modifier = Modifier + .align(Alignment.End) + .clickable( + indication = null, + interactionSource = remember { MutableInteractionSource() }, + onClick = { isExpanded = !isExpanded } + ) + ) + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/Menu.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/Menu.kt new file mode 100644 index 0000000..db41735 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/Menu.kt @@ -0,0 +1,77 @@ +package it.vfsfitvnm.vimusic.ui.components + +import androidx.activity.compose.BackHandler +import androidx.compose.animation.* +import androidx.compose.foundation.background +import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.input.pointer.pointerInput + +val LocalMenuState = compositionLocalOf { TODO() } + +class MenuState(isDisplayedState: MutableState) { + var isDisplayed by isDisplayedState + private set + + var content: @Composable () -> Unit = {} + + fun display(content: @Composable () -> Unit) { + this.content = content + isDisplayed = true + } + + fun hide() { + isDisplayed = false + } +} + +@Composable +fun rememberMenuState(): MenuState { + val isDisplayedState = remember { + mutableStateOf(false) + } + + return remember { + MenuState( + isDisplayedState = isDisplayedState + ) + } +} + +@Composable +fun BottomSheetMenu( + state: MenuState, + modifier: Modifier = Modifier +) { + AnimatedVisibility( + visible = state.isDisplayed, + enter = fadeIn(), + exit = fadeOut() + ) { + BackHandler(onBack = state::hide) + + Spacer( + modifier = Modifier + .pointerInput(Unit) { + detectTapGestures { + state.hide() + } + } + .background(Color.Black.copy(alpha = 0.5f)) + .fillMaxSize() + ) + } + + AnimatedVisibility( + visible = state.isDisplayed, + enter = slideInVertically { it }, + exit = slideOutVertically { it }, + modifier = modifier + ) { + state.content() + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/MusicBars.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/MusicBars.kt new file mode 100644 index 0000000..de0a79d --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/MusicBars.kt @@ -0,0 +1,59 @@ +package it.vfsfitvnm.vimusic.ui.components + +import androidx.compose.animation.core.Animatable +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import kotlinx.coroutines.launch + +@Composable +fun MusicBars( + color: Color, + modifier: Modifier = Modifier, + barWidth: Dp = 4.dp, + shape: Shape = CircleShape +) { + val animatablesWithSteps = remember { + listOf( + Animatable(0f) to listOf(0.2f, 0.8f, 0.1f, 0.1f, 0.3f, 0.1f, 0.2f, 0.8f, 0.7f, 0.2f, 0.4f, 0.9f, 0.7f, 0.6f, 0.1f, 0.3f, 0.1f, 0.4f, 0.1f, 0.8f, 0.7f, 0.9f, 0.5f, 0.6f, 0.3f, 0.1f), + Animatable(0f) to listOf(0.2f, 0.5f, 1.0f, 0.5f, 0.3f, 0.1f, 0.2f, 0.3f, 0.5f, 0.1f, 0.6f, 0.5f, 0.3f, 0.7f, 0.8f, 0.9f, 0.3f, 0.1f, 0.5f, 0.3f, 0.6f, 1.0f, 0.6f, 0.7f, 0.4f, 0.1f), + Animatable(0f) to listOf(0.6f, 0.5f, 1.0f, 0.6f, 0.5f, 1.0f, 0.6f, 0.5f, 1.0f, 0.5f, 0.6f, 0.7f, 0.2f, 0.3f, 0.1f, 0.5f, 0.4f, 0.6f, 0.7f, 0.1f, 0.4f, 0.3f, 0.1f, 0.4f, 0.3f, 0.7f) + ) + } + + LaunchedEffect(Unit) { + animatablesWithSteps.forEach { (animatable, steps) -> + launch { + while (true) { + steps.forEach { step -> + animatable.animateTo(step) + } + } + } + } + } + + Row( + horizontalArrangement = Arrangement.spacedBy(4.dp), + verticalAlignment = Alignment.Bottom, + modifier = modifier + ) { + animatablesWithSteps.forEach { (animatable) -> + Spacer( + modifier = Modifier + .background(color = color, shape = shape) + .fillMaxHeight(animatable.value) + .width(barWidth) + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/OutcomeItem.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/OutcomeItem.kt new file mode 100644 index 0000000..e22449f --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/OutcomeItem.kt @@ -0,0 +1,127 @@ +package it.vfsfitvnm.vimusic.ui.components + +import androidx.annotation.DrawableRes +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.text.BasicText +import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import it.vfsfitvnm.vimusic.R +import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette +import it.vfsfitvnm.vimusic.ui.styling.LocalTypography +import it.vfsfitvnm.vimusic.utils.italic +import it.vfsfitvnm.vimusic.utils.medium +import it.vfsfitvnm.vimusic.utils.secondary +import it.vfsfitvnm.youtubemusic.Outcome + +@Composable +inline fun OutcomeItem( + outcome: Outcome, + noinline onInitialize: (() -> Unit)? = null, + noinline onRetry: (() -> Unit)? = onInitialize, + onUninitialized: @Composable () -> Unit = { + onInitialize?.let { + SideEffect(it) + } + }, + onLoading: @Composable () -> Unit = {}, + onError: @Composable (Outcome.Error) -> Unit = { + Error( + error = it, + onRetry = onRetry, + ) + }, + onSuccess: @Composable (T) -> Unit +) { + when (outcome) { + is Outcome.Initial -> onUninitialized() + is Outcome.Loading -> onLoading() + is Outcome.Error -> onError(outcome) + is Outcome.Recovered -> onError(outcome.error) + is Outcome.Success -> onSuccess(outcome.value) + } +} + +@Composable +fun Error( + error: Outcome.Error, + modifier: Modifier = Modifier, + onRetry: (() -> Unit)? = null +) { + Column( + verticalArrangement = Arrangement.spacedBy( + space = 8.dp, + alignment = Alignment.CenterVertically + ), + horizontalAlignment = Alignment.CenterHorizontally, + modifier = modifier + .fillMaxSize() + .padding(horizontal = 16.dp) + ) { + Image( + painter = painterResource(R.drawable.alert_circle), + contentDescription = null, + colorFilter = ColorFilter.tint(Color(0xFFFC5F5F)), + modifier = Modifier + .padding(horizontal = 16.dp) + .size(48.dp) + ) + BasicText( + text = when (error) { + is Outcome.Error.Network -> "Couldn't reach the Internet" + is Outcome.Error.Unhandled -> (error.throwable.message ?: error.throwable.toString()) + }, + style = LocalTypography.current.xxs.medium.secondary, + ) + + onRetry?.let { retry -> + BasicText( + text = "Retry", + style = LocalTypography.current.xxs.medium, + modifier = Modifier + .clickable(onClick = retry) + .padding(vertical = 8.dp) + .padding(horizontal = 16.dp) + ) + } + + } +} + +@Composable +fun Message( + text: String, + modifier: Modifier = Modifier, + @DrawableRes icon: Int = R.drawable.alert_circle +) { + Column( + verticalArrangement = Arrangement.spacedBy( + space = 8.dp, + alignment = Alignment.CenterVertically + ), + horizontalAlignment = Alignment.CenterHorizontally, + modifier = modifier + .fillMaxSize() + .padding(horizontal = 16.dp) + ) { + Image( + painter = painterResource(icon), + contentDescription = null, + colorFilter = ColorFilter.tint(LocalColorPalette.current.darkGray), + modifier = Modifier + .padding(horizontal = 16.dp) + .size(36.dp) + ) + BasicText( + text = text, + style = LocalTypography.current.xs.medium.secondary.italic, + ) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/TopAppBar.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/TopAppBar.kt new file mode 100644 index 0000000..6b9c50e --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/TopAppBar.kt @@ -0,0 +1,23 @@ +package it.vfsfitvnm.vimusic.ui.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier + +@Composable +inline fun TopAppBar( + modifier: Modifier = Modifier, + content: @Composable RowScope.() -> Unit +) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + modifier = modifier + .fillMaxWidth(), + content = content + ) +} \ No newline at end of file diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/Dialog.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/Dialog.kt new file mode 100644 index 0000000..37e6f79 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/Dialog.kt @@ -0,0 +1,217 @@ +package it.vfsfitvnm.vimusic.ui.components.themed + +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicText +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.text.TextRange +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import it.vfsfitvnm.vimusic.ui.components.ChunkyButton +import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette +import it.vfsfitvnm.vimusic.ui.styling.LocalTypography +import it.vfsfitvnm.vimusic.utils.center +import it.vfsfitvnm.vimusic.utils.color +import it.vfsfitvnm.vimusic.utils.secondary +import it.vfsfitvnm.vimusic.utils.semiBold +import kotlinx.coroutines.delay + +@Composable +fun TextFieldDialog( + hintText: String, + onDismiss: () -> Unit, + onDone: (String) -> Unit, + modifier: Modifier = Modifier, + cancelText: String = "Cancel", + doneText: String = "Done", + initialTextInput: String = "", + onCancel: () -> Unit = onDismiss, + isTextInputValid: (String) -> Boolean = { it.isNotEmpty() } +) { + val focusRequester = remember { + FocusRequester() + } + val colorPalette = LocalColorPalette.current + val typography = LocalTypography.current + + var textFieldValue by rememberSaveable(initialTextInput, stateSaver = TextFieldValue.Saver) { + mutableStateOf( + TextFieldValue( + text = initialTextInput, + selection = TextRange(initialTextInput.length) + ) + ) + } + + DefaultDialog( + onDismiss = onDismiss, + modifier = modifier + ) { + BasicTextField( + value = textFieldValue, + onValueChange = { + textFieldValue = it + }, + textStyle = typography.xs.semiBold.center, + singleLine = true, + maxLines = 1, + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), + keyboardActions = KeyboardActions( + onDone = { + if (isTextInputValid(textFieldValue.text)) { + onDismiss() + onDone(textFieldValue.text) + } + } + ), + cursorBrush = SolidColor(colorPalette.text), + decorationBox = { innerTextField -> + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .weight(1f) + ) { + androidx.compose.animation.AnimatedVisibility( + visible = textFieldValue.text.isEmpty(), + enter = fadeIn(tween(100)), + exit = fadeOut(tween(100)), + ) { + BasicText( + text = hintText, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + style = typography.xs.semiBold.secondary, + ) + } + + innerTextField() + } + }, + modifier = Modifier + .padding(all = 16.dp) + .focusRequester(focusRequester) + ) + + Row( + horizontalArrangement = Arrangement.SpaceEvenly, + modifier = Modifier + .fillMaxWidth() + ) { + ChunkyButton( + backgroundColor = colorPalette.lightBackground, + text = cancelText, + textStyle = typography.xs.semiBold, + shape = RoundedCornerShape(36.dp), + onClick = onCancel + ) + + ChunkyButton( + backgroundColor = colorPalette.primaryContainer, + text = doneText, + textStyle = typography.xs.semiBold.color(colorPalette.onPrimaryContainer), + shape = RoundedCornerShape(36.dp), + onClick = { + if (isTextInputValid(textFieldValue.text)) { + onDismiss() + onDone(textFieldValue.text) + } + } + ) + } + } + + LaunchedEffect(Unit) { + delay(300) + focusRequester.requestFocus() + } +} + +@Composable +fun ConfirmationDialog( + text: String, + onDismiss: () -> Unit, + onConfirm: () -> Unit, + modifier: Modifier = Modifier, + cancelText: String = "Cancel", + confirmText: String = "Confirm", + onCancel: () -> Unit = onDismiss +) { + val colorPalette = LocalColorPalette.current + val typography = LocalTypography.current + + DefaultDialog( + onDismiss = onDismiss, + modifier = modifier + ) { + BasicText( + text = text, + style = typography.xs.semiBold.center, + modifier = Modifier + .padding(all = 16.dp) + ) + + Row( + horizontalArrangement = Arrangement.SpaceEvenly, + modifier = Modifier + .fillMaxWidth() + ) { + ChunkyButton( + backgroundColor = colorPalette.lightBackground, + text = cancelText, + textStyle = typography.xs.semiBold, + shape = RoundedCornerShape(36.dp), + onClick = onCancel + ) + + ChunkyButton( + backgroundColor = colorPalette.primaryContainer, + text = confirmText, + textStyle = typography.xs.semiBold.color(colorPalette.onPrimaryContainer), + shape = RoundedCornerShape(36.dp), + onClick = { + onConfirm() + onDismiss() + } + ) + } + } +} + +@Composable +private inline fun DefaultDialog( + noinline onDismiss: () -> Unit, + modifier: Modifier = Modifier, + crossinline content: @Composable ColumnScope.() -> Unit +) { + Dialog( + onDismissRequest = onDismiss + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = modifier + .padding(all = 48.dp) + .background( + color = LocalColorPalette.current.lightBackground, + shape = RoundedCornerShape(8.dp) + ) + .padding(horizontal = 24.dp, vertical = 16.dp), + content = content + ) + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/MediaItemMenu.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/MediaItemMenu.kt new file mode 100644 index 0000000..3f687c9 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/MediaItemMenu.kt @@ -0,0 +1,488 @@ +package it.vfsfitvnm.vimusic.ui.components.themed + +import androidx.compose.animation.AnimatedContentScope +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.animation.with +import androidx.compose.foundation.gestures.detectTapGestures +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.platform.LocalContext +import androidx.media3.common.MediaItem +import androidx.media3.common.Player +import it.vfsfitvnm.route.RouteHandler +import it.vfsfitvnm.route.empty +import it.vfsfitvnm.vimusic.Database +import it.vfsfitvnm.vimusic.R +import it.vfsfitvnm.vimusic.internal +import it.vfsfitvnm.vimusic.models.Playlist +import it.vfsfitvnm.vimusic.models.SongInPlaylist +import it.vfsfitvnm.vimusic.models.SongWithInfo +import it.vfsfitvnm.vimusic.ui.components.LocalMenuState +import it.vfsfitvnm.vimusic.ui.screens.rememberAlbumRoute +import it.vfsfitvnm.vimusic.ui.screens.rememberArtistRoute +import it.vfsfitvnm.vimusic.ui.screens.rememberCreatePlaylistRoute +import it.vfsfitvnm.vimusic.utils.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +@ExperimentalAnimationApi +@Composable +fun InFavoritesMediaItemMenu( + song: SongWithInfo, + modifier: Modifier = Modifier, + // https://issuetracker.google.com/issues/226410236 + onDismiss: () -> Unit = LocalMenuState.current.let { it::hide } +) { + val coroutineScope = rememberCoroutineScope() + + NonQueuedMediaItemMenu( + mediaItem = song.asMediaItem, + onDismiss = onDismiss, + onRemoveFromFavorites = { + coroutineScope.launch(Dispatchers.IO) { + Database.update(song.song.toggleLike()) + } + }, + modifier = modifier + ) +} + +@ExperimentalAnimationApi +@Composable +fun InHistoryMediaItemMenu( + song: SongWithInfo, + modifier: Modifier = Modifier, + // https://issuetracker.google.com/issues/226410236 + onDismiss: () -> Unit = LocalMenuState.current.let { it::hide } +) { + val coroutineScope = rememberCoroutineScope() + + var isDeletingFromDatabase by remember { + mutableStateOf(false) + } + + if (isDeletingFromDatabase) { + ConfirmationDialog( + text = "Do you really want to permanently delete this song? It will removed from any playlist as well.\nThis action is irreversible.", + onDismiss = { + isDeletingFromDatabase = false + }, + onConfirm = { + onDismiss() + coroutineScope.launch(Dispatchers.IO) { + Database.delete(song.song) + } + } + ) + } + + NonQueuedMediaItemMenu( + mediaItem = song.asMediaItem, + onDismiss = onDismiss, + onDeleteFromDatabase = { + isDeletingFromDatabase = true + }, + modifier = modifier + ) +} + +@ExperimentalAnimationApi +@Composable +fun InPlaylistMediaItemMenu( + playlistId: Long, + positionInPlaylist: Int, + song: SongWithInfo, + modifier: Modifier = Modifier, + // https://issuetracker.google.com/issues/226410236 + onDismiss: () -> Unit = LocalMenuState.current.let { it::hide } +) { + val coroutineScope = rememberCoroutineScope() + + NonQueuedMediaItemMenu( + mediaItem = song.asMediaItem, + onDismiss = onDismiss, + onRemoveFromPlaylist = { + coroutineScope.launch(Dispatchers.IO) { + Database.internal.runInTransaction { + Database.delete( + SongInPlaylist( + songId = song.song.id, + playlistId = playlistId, + position = positionInPlaylist + ) + ) + Database.decrementSongPositions( + playlistId = playlistId, + fromPosition = positionInPlaylist + 1 + ) + } + } + }, + modifier = modifier + ) +} + +@ExperimentalAnimationApi +@Composable +fun NonQueuedMediaItemMenu( + mediaItem: MediaItem, + modifier: Modifier = Modifier, + // https://issuetracker.google.com/issues/226410236 + onDismiss: () -> Unit = LocalMenuState.current.let { it::hide }, + onRemoveFromPlaylist: (() -> Unit)? = null, + onDeleteFromDatabase: (() -> Unit)? = null, + onRemoveFromFavorites: (() -> Unit)? = null, +) { + val player = LocalYoutubePlayer.current + + BaseMediaItemMenu( + mediaItem = mediaItem, + onDismiss = onDismiss, + onStartRadio = { + val playlistId = mediaItem.mediaMetadata.extras?.getString("playlistId") + YoutubePlayer.Radio.setup(playlistId = playlistId) + player?.mediaController?.forcePlay(mediaItem) + }, + onPlayNext = if (player?.playbackState == Player.STATE_READY) ({ + player.mediaController.addNext(mediaItem) + }) else null, + onEnqueue = if (player?.playbackState == Player.STATE_READY) ({ + player.mediaController.enqueue(mediaItem) + }) else null, + onRemoveFromPlaylist = onRemoveFromPlaylist, + onDeleteFromDatabase = onDeleteFromDatabase, + onRemoveFromFavorites = onRemoveFromFavorites, + modifier = modifier + ) +} + +@ExperimentalAnimationApi +@Composable +fun QueuedMediaItemMenu( + mediaItem: MediaItem, + indexInQueue: Int, + modifier: Modifier = Modifier, + // https://issuetracker.google.com/issues/226410236 + onDismiss: () -> Unit = LocalMenuState.current.let { it::hide }, + onGlobalRouteEmitted: (() -> Unit)? = null +) { + val player = LocalYoutubePlayer.current + + BaseMediaItemMenu( + mediaItem = mediaItem, + onDismiss = onDismiss, + onRemoveFromQueue = if (player?.mediaItemIndex != indexInQueue) ({ + player?.mediaController?.removeMediaItem(indexInQueue) + }) else null, + onGlobalRouteEmitted = onGlobalRouteEmitted, + modifier = modifier + ) +} + +@ExperimentalAnimationApi +@Composable +fun BaseMediaItemMenu( + mediaItem: MediaItem, + onDismiss: () -> Unit, + modifier: Modifier = Modifier, + onStartRadio: (() -> Unit)? = null, + onPlayNext: (() -> Unit)? = null, + onEnqueue: (() -> Unit)? = null, + onRemoveFromQueue: (() -> Unit)? = null, + onRemoveFromPlaylist: (() -> Unit)? = null, + onDeleteFromDatabase: (() -> Unit)? = null, + onRemoveFromFavorites: (() -> Unit)? = null, + onGlobalRouteEmitted: (() -> Unit)? = null, +) { + val context = LocalContext.current + val coroutineScope = rememberCoroutineScope() + + val albumRoute = rememberAlbumRoute() + val artistRoute = rememberArtistRoute() + + MediaItemMenu( + mediaItem = mediaItem, + onDismiss = onDismiss, + onStartRadio = onStartRadio, + onPlayNext = onPlayNext, + onEnqueue = onEnqueue, + onAddToPlaylist = { playlist, position -> + coroutineScope.launch(Dispatchers.IO) { + val playlistId = Database.playlist(playlist.id)?.id ?: Database.insert(playlist) + + if (Database.song(mediaItem.mediaId) == null) { + Database.insert(mediaItem) + } + + Database.insert( + SongInPlaylist( + songId = mediaItem.mediaId, + playlistId = playlistId, + position = position + ) + ) + } + }, + onDeleteFromDatabase = onDeleteFromDatabase, + onRemoveFromFavorites = onRemoveFromFavorites, + onRemoveFromPlaylist = onRemoveFromPlaylist, + onRemoveFromQueue = onRemoveFromQueue, + onGoToAlbum = albumRoute::global, + onGoToArtist = artistRoute::global, + onShare = { + context.shareAsYouTubeSong(mediaItem) + }, + onGlobalRouteEmitted = onGlobalRouteEmitted, + modifier = modifier + ) +} + +@ExperimentalAnimationApi +@Composable +fun MediaItemMenu( + mediaItem: MediaItem, + onDismiss: () -> Unit, + modifier: Modifier = Modifier, + onStartRadio: (() -> Unit)? = null, + onPlayNext: (() -> Unit)? = null, + onEnqueue: (() -> Unit)? = null, + onDeleteFromDatabase: (() -> Unit)? = null, + onRemoveFromQueue: (() -> Unit)? = null, + onRemoveFromFavorites: (() -> Unit)? = null, + onRemoveFromPlaylist: (() -> Unit)? = null, + onAddToPlaylist: ((Playlist, Int) -> Unit)? = null, + onGoToAlbum: ((String) -> Unit)? = null, + onGoToArtist: ((String) -> Unit)? = null, + onShare: (() -> Unit)? = null, + onGlobalRouteEmitted: (() -> Unit)? = null, +) { + val playlistPreviews by remember { + Database.playlistPreviews() + }.collectAsState(initial = emptyList(), context = Dispatchers.IO) + + val viewPlaylistsRoute = rememberCreatePlaylistRoute() + + Menu( + modifier = modifier + ) { + RouteHandler( + transitionSpec = { + when (targetState.route) { + viewPlaylistsRoute -> slideIntoContainer(AnimatedContentScope.SlideDirection.Left) with + slideOutOfContainer(AnimatedContentScope.SlideDirection.Left) + else -> when (initialState.route) { + viewPlaylistsRoute -> slideIntoContainer(AnimatedContentScope.SlideDirection.Right) with + slideOutOfContainer(AnimatedContentScope.SlideDirection.Right) + else -> empty + } + } + } + ) { + viewPlaylistsRoute { + var isCreatingNewPlaylist by rememberSaveable { + mutableStateOf(false) + } + + if (isCreatingNewPlaylist && onAddToPlaylist != null) { + TextFieldDialog( + hintText = "Enter the playlist name", + onDismiss = { + isCreatingNewPlaylist = false + }, + onDone = { text -> + onDismiss() + onAddToPlaylist(Playlist(name = text), 0) + } + ) + } + + Column { + Row( + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier + .fillMaxWidth() + ) { + MenuBackButton(onClick = pop) + + if (onAddToPlaylist != null) { + MenuIconButton( + icon = R.drawable.add, + onClick = { + isCreatingNewPlaylist = true + } + ) + } + } + + onAddToPlaylist?.let { onAddToPlaylist -> + playlistPreviews.forEach { playlistPreview -> + MenuEntry( + icon = R.drawable.list, + text = playlistPreview.playlist.name, + secondaryText = "${playlistPreview.songCount} songs", + onClick = { + onDismiss() + onAddToPlaylist( + playlistPreview.playlist, + playlistPreview.songCount + ) + } + ) + } + } + } + } + + host { + Column( + modifier = Modifier + .pointerInput(Unit) { + detectTapGestures { } + } + ) { + MenuCloseButton(onClick = onDismiss) + + onStartRadio?.let { onStartRadio -> + MenuEntry( + icon = R.drawable.radio, + text = "Start radio", + onClick = { + onDismiss() + onStartRadio() + } + ) + } + + onPlayNext?.let { onPlayNext -> + MenuEntry( + icon = R.drawable.play, + text = "Play next", + onClick = { + onDismiss() + onPlayNext() + } + ) + } + + onEnqueue?.let { onEnqueue -> + MenuEntry( + icon = R.drawable.time, + text = "Enqueue", + onClick = { + onDismiss() + onEnqueue() + } + ) + } + + onRemoveFromQueue?.let { onRemoveFromQueue -> + MenuEntry( + icon = R.drawable.trash, + text = "Remove", + onClick = { + onDismiss() + onRemoveFromQueue() + } + ) + } + + onRemoveFromFavorites?.let { onRemoveFromFavorites -> + MenuEntry( + icon = R.drawable.heart_dislike, + text = "Dislike", + onClick = { + onDismiss() + onRemoveFromFavorites() + } + ) + } + + onRemoveFromPlaylist?.let { onRemoveFromPlaylist -> + MenuEntry( + icon = R.drawable.trash, + text = "Remove", + onClick = { + onDismiss() + onRemoveFromPlaylist() + } + ) + } + + if (onAddToPlaylist != null) { + MenuEntry( + icon = R.drawable.list, + text = "Add to playlist", + onClick = { + viewPlaylistsRoute() + } + ) + } + + onGoToAlbum?.let { onGoToAlbum -> + mediaItem.mediaMetadata.extras?.getString("albumId")?.let { albumId -> + MenuEntry( + icon = R.drawable.disc, + text = "Go to album", + onClick = { + onDismiss() + onGlobalRouteEmitted?.invoke() + onGoToAlbum(albumId) + } + ) + } + } + + onGoToArtist?.let { onGoToArtist -> + mediaItem.mediaMetadata.extras?.getStringArrayList("artistNames") + ?.let { artistNames -> + mediaItem.mediaMetadata.extras?.getStringArrayList("artistIds") + ?.let { artistIds -> + artistNames.zip(artistIds) + .forEach { (authorName, authorId) -> + if (authorId != null) { + MenuEntry( + icon = R.drawable.person, + text = "More of $authorName", + onClick = { + onDismiss() + onGlobalRouteEmitted?.invoke() + onGoToArtist(authorId) + } + ) + } + } + } + } + } + + onShare?.let { onShare -> + MenuEntry( + icon = R.drawable.share_social, + text = "Share", + onClick = { + onDismiss() + onShare() + } + ) + } + + onDeleteFromDatabase?.let { onDeleteFromDatabase -> + MenuEntry( + icon = R.drawable.trash, + text = "Delete", + onClick = { + onDeleteFromDatabase() + } + ) + } + } + } + } + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/Menu.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/Menu.kt new file mode 100644 index 0000000..37ee5e8 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/Menu.kt @@ -0,0 +1,152 @@ +package it.vfsfitvnm.vimusic.ui.components.themed + +import androidx.annotation.DrawableRes +import androidx.compose.foundation.* +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicText +import androidx.compose.material.ripple.rememberRipple +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import it.vfsfitvnm.vimusic.R +import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette +import it.vfsfitvnm.vimusic.ui.styling.LocalTypography +import it.vfsfitvnm.vimusic.utils.color +import it.vfsfitvnm.vimusic.utils.semiBold + +@Composable +inline fun Menu( + modifier: Modifier = Modifier, + content: @Composable ColumnScope.() -> Unit +) { + val colorPalette = LocalColorPalette.current + + Column( + modifier = modifier + .verticalScroll(rememberScrollState()) + .width(256.dp) + .background( + color = colorPalette.elevatedBackground, + shape = RoundedCornerShape(topStart = 8.dp, topEnd = 8.dp) + ) + .padding(vertical = 8.dp), + content = content + ) +} + +@Composable +inline fun BasicMenu( + noinline onDismiss: () -> Unit, + modifier: Modifier = Modifier, + content: @Composable ColumnScope.() -> Unit +) { + Menu(modifier = modifier) { + MenuCloseButton(onClick = onDismiss) + content() + } +} + + +@Composable +fun MenuEntry( + @DrawableRes icon: Int, + text: String, + onClick: () -> Unit, + secondaryText: String? = null, + enabled: Boolean = true, +) { + val colorPalette = LocalColorPalette.current + val typography = LocalTypography.current + + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(24.dp), + modifier = Modifier + .clickable( + indication = rememberRipple(bounded = true), + interactionSource = remember { MutableInteractionSource() }, + enabled = enabled, + onClick = onClick + ) + .fillMaxWidth() + .padding(horizontal = 24.dp, vertical = 16.dp) + ) { + Image( + painter = painterResource(icon), + contentDescription = null, + colorFilter = ColorFilter.tint(if (enabled) colorPalette.textSecondary else colorPalette.textDisabled), + modifier = Modifier + .size(18.dp) + ) + + Column { + BasicText( + text = text, + style = typography.xs.semiBold.color(if (enabled) colorPalette.text else colorPalette.textDisabled) + ) + + secondaryText?.let { secondaryText -> + BasicText( + text = secondaryText, + style = typography.xxs.semiBold.color(if (enabled) colorPalette.textSecondary else colorPalette.textDisabled) + ) + } + } + } +} + +@Composable +fun MenuIconButton( + @DrawableRes icon: Int, + onClick: () -> Unit, + modifier: Modifier = Modifier +) { + val colorPalette = LocalColorPalette.current + + Box( + modifier = modifier + .padding(horizontal = 12.dp) + ) { + Image( + painter = painterResource(icon), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable(onClick = onClick) + .padding(horizontal = 8.dp, vertical = 16.dp) + .size(20.dp) + ) + } +} + +@Composable +fun MenuCloseButton( + onClick: () -> Unit, + modifier: Modifier = Modifier +) { + MenuIconButton( + icon = R.drawable.close, + onClick = onClick, + modifier = modifier + ) +} + +@Composable +fun MenuBackButton( + onClick: () -> Unit, + modifier: Modifier = Modifier +) { + MenuIconButton( + icon = R.drawable.chevron_back, + onClick = onClick, + modifier = modifier + ) +} + + diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/TextPlaceholder.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/TextPlaceholder.kt new file mode 100644 index 0000000..682d03f --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/components/themed/TextPlaceholder.kt @@ -0,0 +1,30 @@ +package it.vfsfitvnm.vimusic.ui.components.themed + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette +import kotlin.random.Random + +@Composable +fun TextPlaceholder( + modifier: Modifier = Modifier +) { + Spacer( + modifier = modifier + .padding(vertical = 4.dp) + .background( + color = LocalColorPalette.current.darkGray, + shape = RoundedCornerShape(0.dp) + ) + .fillMaxWidth(remember { 0.25f + Random.nextFloat() * 0.5f }) + .height(16.dp) + ) +} \ No newline at end of file diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/AlbumScreen.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/AlbumScreen.kt new file mode 100644 index 0000000..3c7324e --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/AlbumScreen.kt @@ -0,0 +1,367 @@ +package it.vfsfitvnm.vimusic.ui.screens + +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.foundation.* +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.text.BasicText +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.media3.common.Player +import coil.compose.AsyncImage +import com.valentinilk.shimmer.shimmer +import it.vfsfitvnm.vimusic.Database +import it.vfsfitvnm.vimusic.R +import it.vfsfitvnm.vimusic.internal +import it.vfsfitvnm.vimusic.models.Playlist +import it.vfsfitvnm.vimusic.models.SongInPlaylist +import it.vfsfitvnm.vimusic.ui.components.LocalMenuState +import it.vfsfitvnm.vimusic.ui.components.OutcomeItem +import it.vfsfitvnm.vimusic.ui.components.TopAppBar +import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette +import it.vfsfitvnm.vimusic.ui.styling.LocalTypography +import it.vfsfitvnm.vimusic.ui.views.SongItem +import it.vfsfitvnm.vimusic.utils.* +import it.vfsfitvnm.route.RouteHandler +import it.vfsfitvnm.vimusic.ui.components.themed.* +import it.vfsfitvnm.youtubemusic.Outcome +import it.vfsfitvnm.youtubemusic.YouTube +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + + +@ExperimentalAnimationApi +@Composable +fun AlbumScreen( + browseId: String, +) { + val scrollState = rememberScrollState() + + var album by remember { + mutableStateOf>(Outcome.Loading) + } + + val onLoad = relaunchableEffect(Unit) { + album = withContext(Dispatchers.IO) { + YouTube.album(browseId) + } + } + + val albumRoute = rememberAlbumRoute() + val artistRoute = rememberArtistRoute() + + RouteHandler(listenToGlobalEmitter = true) { + albumRoute { browseId -> + AlbumScreen( + browseId = browseId ?: error("browseId cannot be null") + ) + } + + artistRoute { browseId -> + ArtistScreen( + browseId = browseId ?: error("browseId cannot be null") + ) + } + + host { + val density = LocalDensity.current + val player = LocalYoutubePlayer.current + val colorPalette = LocalColorPalette.current + val typography = LocalTypography.current + val menuState = LocalMenuState.current + + val (thumbnailSizeDp, thumbnailSizePx) = remember { + density.run { + 128.dp to 128.dp.roundToPx() + } + } + + val coroutineScope = rememberCoroutineScope() + + Column( + modifier = Modifier + .verticalScroll(scrollState) + .padding(bottom = 72.dp) + .background(colorPalette.background) + .fillMaxSize() + ) { + TopAppBar( + modifier = Modifier + .height(52.dp) + ) { + Image( + painter = painterResource(R.drawable.chevron_back), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable(onClick = pop) + .padding(vertical = 8.dp) + .padding(horizontal = 16.dp) + .size(24.dp) + ) + + Image( + painter = painterResource(R.drawable.ellipsis_horizontal), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable { + menuState.display { + Menu { + MenuCloseButton(onClick = menuState::hide) + + MenuEntry( + icon = R.drawable.time, + text = "Enqueue", + enabled = player?.playbackState == Player.STATE_READY, + onClick = { + menuState.hide() + album.valueOrNull?.let { album -> + player?.mediaController?.enqueue(album.items.mapNotNull { song -> + song.toMediaItem(browseId, album) + }) + } + } + ) + + MenuEntry( + icon = R.drawable.list, + text = "Import as playlist", + onClick = { + menuState.hide() + + album.valueOrNull?.let { album -> + coroutineScope.launch(Dispatchers.IO) { + Database.internal.runInTransaction { + val playlistId = Database.insert(Playlist(name = album.title)) + + album.items.forEachIndexed { index, song -> + song.toMediaItem(browseId, album)?.let { mediaItem -> + if (Database.song(mediaItem.mediaId) == null) { + Database.insert(mediaItem) + } + + Database.insert( + SongInPlaylist( + songId = mediaItem.mediaId, + playlistId = playlistId, + position = index + ) + ) + } + } + } + } + } + } + ) + } + } + } + .padding(horizontal = 16.dp, vertical = 8.dp) + .size(24.dp) + ) + } + + OutcomeItem( + outcome = album, + onRetry = onLoad, + onLoading = { + Loading() + } + ) { album -> + Row( + horizontalArrangement = Arrangement.spacedBy(16.dp), + modifier = Modifier + .fillMaxWidth() + .height(IntrinsicSize.Max) + .padding(vertical = 8.dp, horizontal = 16.dp) + .padding(bottom = 16.dp) + ) { + AsyncImage( + model = album.thumbnail.size(thumbnailSizePx), + contentDescription = null, + modifier = Modifier + .size(thumbnailSizeDp) + ) + + Column( + verticalArrangement = Arrangement.SpaceEvenly, + modifier = Modifier + .fillMaxSize() + ) { + Column { + BasicText( + text = album.title, + style = typography.m.semiBold + ) + + BasicText( + text = "${album.authors.joinToString("") { it.name }} • ${album.year}", + style = typography.xs.secondary.semiBold, + maxLines = 2, + overflow = TextOverflow.Ellipsis, + ) + } + + Row( + horizontalArrangement = Arrangement.spacedBy(16.dp), + modifier = Modifier + .align(Alignment.End) + .padding(horizontal = 16.dp) + ) { + Image( + painter = painterResource(R.drawable.shuffle), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable { + YoutubePlayer.Radio.reset() + player?.mediaController?.forcePlayFromBeginning( + album.items.shuffled().mapNotNull { song -> + song.toMediaItem(browseId, album) + }) + } + .shadow(elevation = 2.dp, shape = CircleShape) + .background(color = colorPalette.elevatedBackground, shape = CircleShape) + .padding(horizontal = 16.dp, vertical = 16.dp) + .size(20.dp) + ) + + Image( + painter = painterResource(R.drawable.play), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable { + YoutubePlayer.Radio.reset() + player?.mediaController?.forcePlayFromBeginning(album.items.mapNotNull { song -> + song.toMediaItem(browseId, album) + }) + } + .shadow(elevation = 2.dp, shape = CircleShape) + .background(color = colorPalette.elevatedBackground, shape = CircleShape) + .padding(horizontal = 16.dp, vertical = 16.dp) + .size(20.dp) + ) + } + } + } + + album.items.forEachIndexed { index, song -> + SongItem( + title = song.info.name, + authors = (song.authors ?: album.authors).joinToString("") { it.name }, + durationText = song.durationText, + onClick = { + YoutubePlayer.Radio.reset() + player?.mediaController?.forcePlayAtIndex(album.items.mapNotNull { song -> + song.toMediaItem(browseId, album) + }, index) + }, + startContent = { + BasicText( + text = "${index + 1}", + style = typography.xs.secondary.bold.center, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier + .width(36.dp) + ) + }, + menuContent = { + NonQueuedMediaItemMenu( + mediaItem = song.toMediaItem(browseId, album) ?: return@SongItem, + onDismiss = menuState::hide, + ) + } + ) + } + } + } + } + } +} + +@Composable +private fun Loading() { + val colorPalette = LocalColorPalette.current + + Column( + modifier = Modifier + .shimmer() + ) { + Row( + horizontalArrangement = Arrangement.spacedBy(16.dp), + modifier = Modifier + .height(IntrinsicSize.Max) + .padding(vertical = 8.dp, horizontal = 16.dp) + .padding(bottom = 16.dp) + ) { + Spacer( + modifier = Modifier + .background(color = colorPalette.darkGray) + .size(128.dp) + ) + + Column( + verticalArrangement = Arrangement.SpaceEvenly, + modifier = Modifier + .fillMaxHeight() + ) { + Column { + TextPlaceholder() + + TextPlaceholder( + modifier = Modifier + .alpha(0.7f) + ) + } + } + } + + repeat(3) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp), + modifier = Modifier + .alpha(0.6f - it * 0.1f) + .height(54.dp) + .fillMaxWidth() + .padding(vertical = 4.dp, horizontal = 16.dp) + ) { + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .size(36.dp) + ) { + Spacer( + modifier = Modifier + .size(8.dp) + .background(color = colorPalette.darkGray, shape = CircleShape) + ) + } + + Column( + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + TextPlaceholder() + + TextPlaceholder( + modifier = Modifier + .alpha(0.7f) + ) + } + } + } + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/ArtistScreen.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/ArtistScreen.kt new file mode 100644 index 0000000..9cc8a63 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/ArtistScreen.kt @@ -0,0 +1,220 @@ +package it.vfsfitvnm.vimusic.ui.screens + +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.animation.animateContentSize +import androidx.compose.foundation.* +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.text.BasicText +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage +import com.valentinilk.shimmer.shimmer +import it.vfsfitvnm.route.RouteHandler +import it.vfsfitvnm.vimusic.R +import it.vfsfitvnm.vimusic.ui.components.ExpandableText +import it.vfsfitvnm.vimusic.ui.components.Message +import it.vfsfitvnm.vimusic.ui.components.OutcomeItem +import it.vfsfitvnm.vimusic.ui.components.TopAppBar +import it.vfsfitvnm.vimusic.ui.components.themed.TextPlaceholder +import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette +import it.vfsfitvnm.vimusic.ui.styling.LocalTypography +import it.vfsfitvnm.vimusic.utils.* +import it.vfsfitvnm.youtubemusic.Outcome +import it.vfsfitvnm.youtubemusic.YouTube +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + + +@ExperimentalAnimationApi +@Composable +fun ArtistScreen( + browseId: String, +) { + val scrollState = rememberScrollState() + + var artist by remember { + mutableStateOf>(Outcome.Loading) + } + + val onLoad = relaunchableEffect(Unit) { + artist = withContext(Dispatchers.IO) { + YouTube.artist(browseId) + } + } + + val albumRoute = rememberAlbumRoute() + val artistRoute = rememberArtistRoute() + + RouteHandler(listenToGlobalEmitter = true) { + albumRoute { browseId -> + AlbumScreen( + browseId = browseId ?: error("browseId cannot be null") + ) + } + + artistRoute { browseId -> + ArtistScreen( + browseId = browseId ?: error("browseId cannot be null") + ) + } + + host { + val density = LocalDensity.current + val colorPalette = LocalColorPalette.current + val typography = LocalTypography.current + + val (thumbnailSizeDp, thumbnailSizePx) = remember { + density.run { + 192.dp to 192.dp.roundToPx() + } + } + + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .verticalScroll(scrollState) + .padding(bottom = 72.dp) + .background(colorPalette.background) + .fillMaxSize() + ) { + TopAppBar( + modifier = Modifier + .height(52.dp) + ) { + Image( + painter = painterResource(R.drawable.chevron_back), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable(onClick = pop) + .padding(vertical = 8.dp) + .padding(horizontal = 16.dp) + .size(24.dp) + ) + } + + OutcomeItem( + outcome = artist, + onRetry = onLoad, + onLoading = { + Loading() + } + ) { artist -> + AsyncImage( + model = artist.thumbnail?.size(thumbnailSizePx), + contentDescription = null, + modifier = Modifier + .clip(CircleShape) + .size(thumbnailSizeDp) + + ) + + BasicText( + text = artist.name, + style = typography.l.semiBold, + modifier = Modifier + .padding(vertical = 8.dp, horizontal = 16.dp) + ) + + Row( + horizontalArrangement = Arrangement.spacedBy(16.dp), + modifier = Modifier + .padding(horizontal = 16.dp, vertical = 8.dp) + ) { + Image( + painter = painterResource(R.drawable.shuffle), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable { + YoutubePlayer.Radio.reset() + artist.shuffleEndpoint?.let(YoutubePlayer.Radio::setup) + } + .shadow(elevation = 2.dp, shape = CircleShape) + .background(color = colorPalette.elevatedBackground, shape = CircleShape) + .padding(horizontal = 16.dp, vertical = 16.dp) + .size(20.dp) + ) + + Image( + painter = painterResource(R.drawable.radio), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable { + YoutubePlayer.Radio.reset() + artist.radioEndpoint?.let(YoutubePlayer.Radio::setup) + } + .shadow(elevation = 2.dp, shape = CircleShape) + .background(color = colorPalette.elevatedBackground, shape = CircleShape) + .padding(horizontal = 16.dp, vertical = 16.dp) + .size(20.dp) + ) + } + + artist.description?.let { description -> + ExpandableText( + text = description, + style = typography.xxs.secondary.align(TextAlign.Justify), + minimizedMaxLines = 4, + backgroundColor = colorPalette.background, + showMoreTextStyle = typography.xxs.bold, + modifier = Modifier + .animateContentSize() + .padding(horizontal = 16.dp) + ) + } + + Message( + text = "Page under construction", + icon = R.drawable.sad, + modifier = Modifier + .padding(vertical = 64.dp) + ) + } + } + } + } +} + +@Composable +private fun Loading() { + val colorPalette = LocalColorPalette.current + + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .shimmer() + ) { + Spacer( + modifier = Modifier + .background(color = colorPalette.darkGray, shape = CircleShape) + .size(192.dp) + ) + + TextPlaceholder( + modifier = Modifier + .alpha(0.9f) + .padding(vertical = 8.dp, horizontal = 16.dp) + ) + + repeat(3) { + TextPlaceholder( + modifier = Modifier + .alpha(0.8f) + .padding(horizontal = 16.dp) + ) + } + } +} + diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/HomeScreen.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/HomeScreen.kt new file mode 100644 index 0000000..9cfbd01 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/HomeScreen.kt @@ -0,0 +1,422 @@ +package it.vfsfitvnm.vimusic.ui.screens + +import androidx.compose.animation.* +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyHorizontalGrid +import androidx.compose.foundation.lazy.grid.items +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.text.BasicText +import androidx.compose.material.ripple.rememberRipple +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.zIndex +import androidx.media3.common.Player +import it.vfsfitvnm.route.RouteHandler +import it.vfsfitvnm.route.rememberRoute +import it.vfsfitvnm.vimusic.Database +import it.vfsfitvnm.vimusic.R +import it.vfsfitvnm.vimusic.enums.SongCollection +import it.vfsfitvnm.vimusic.models.Playlist +import it.vfsfitvnm.vimusic.models.SearchQuery +import it.vfsfitvnm.vimusic.models.SongWithInfo +import it.vfsfitvnm.vimusic.ui.components.LocalMenuState +import it.vfsfitvnm.vimusic.ui.components.TopAppBar +import it.vfsfitvnm.vimusic.ui.components.rememberBottomSheetState +import it.vfsfitvnm.vimusic.ui.components.themed.* +import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette +import it.vfsfitvnm.vimusic.ui.styling.LocalTypography +import it.vfsfitvnm.vimusic.ui.views.PlayerView +import it.vfsfitvnm.vimusic.ui.views.PlaylistPreviewItem +import it.vfsfitvnm.vimusic.ui.views.SongItem +import it.vfsfitvnm.vimusic.utils.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +@ExperimentalAnimationApi +@Composable +fun HomeScreen(intentVideoId: String?) { + val colorPalette = LocalColorPalette.current + val typography = LocalTypography.current + + val coroutineScope = rememberCoroutineScope() + + val lazyListState = rememberLazyListState() + + val intentVideoRoute = rememberIntentVideoRoute(intentVideoId) + val playlistRoute = rememberLocalPlaylistRoute() + val searchRoute = rememberSearchRoute() + val searchResultRoute = rememberSearchResultRoute() + val albumRoute = rememberAlbumRoute() + val artistRoute = rememberArtistRoute() + + val (route, onRouteChanged) = rememberRoute(intentVideoId?.let { intentVideoRoute }) + + val playlistPreviews by remember { + Database.playlistPreviews() + }.collectAsState(initial = emptyList(), context = Dispatchers.IO) + + val preferences = LocalPreferences.current + + val songCollection by remember(preferences.homePageSongCollection) { + when (preferences.homePageSongCollection) { + SongCollection.MostPlayed -> Database.mostPlayed() + SongCollection.Favorites -> Database.favorites() + SongCollection.History -> Database.history() + } + }.collectAsState(initial = emptyList(), context = Dispatchers.IO) + + BoxWithConstraints( + modifier = Modifier + .fillMaxSize() + ) { + RouteHandler( + route = route, + onRouteChanged = onRouteChanged, + listenToGlobalEmitter = true + ) { + intentVideoRoute { videoId -> + IntentVideoScreen( + videoId = videoId ?: error("videoId must be not null") + ) + } + + playlistRoute { playlistId -> + LocalPlaylistScreen( + playlistId = playlistId ?: error("playlistId cannot be null") + ) + } + + searchResultRoute { query -> + SearchResultScreen( + query = query, + onSearchAgain = { + searchRoute(query) + }, + ) + } + + searchRoute { initialTextInput -> + SearchScreen( + initialTextInput = initialTextInput, + onSearch = { query -> + searchResultRoute(query) + + coroutineScope.launch(Dispatchers.IO) { + Database.insert(SearchQuery(query = query)) + } + } + ) + } + + albumRoute { browseId -> + AlbumScreen( + browseId = browseId ?: error("browseId cannot be null") + ) + } + + artistRoute { browseId -> + ArtistScreen( + browseId = browseId ?: error("browseId cannot be null") + ) + } + + host { + val player = LocalYoutubePlayer.current + val menuState = LocalMenuState.current + val density = LocalDensity.current + + val thumbnailSize = remember { + density.run { + 54.dp.roundToPx() + } + } + + var isCreatingANewPlaylist by rememberSaveable { + mutableStateOf(false) + } + + if (isCreatingANewPlaylist) { + TextFieldDialog( + hintText = "Enter the playlist name", + onDismiss = { + isCreatingANewPlaylist = false + }, + onDone = { text -> + coroutineScope.launch(Dispatchers.IO) { + Database.insert(Playlist(name = text)) + } + } + ) + } + + LazyColumn( + state = lazyListState, + contentPadding = PaddingValues(bottom = 72.dp), + modifier = Modifier + .background(colorPalette.background) + .fillMaxSize() + ) { + item { + TopAppBar( + modifier = Modifier + .height(52.dp) + ) { + Spacer( + modifier = Modifier + .padding(horizontal = 16.dp, vertical = 8.dp) + .size(24.dp) + ) + + Image( + painter = painterResource(R.drawable.search), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable { + searchRoute("") + } + .padding(horizontal = 16.dp, vertical = 8.dp) + .size(24.dp) + ) + } + } + + item { + BasicText( + text = "Your playlists", + style = typography.m.semiBold, + modifier = Modifier + .padding(horizontal = 16.dp) + ) + } + + item { + LazyHorizontalGrid( + rows = GridCells.Fixed(2), + contentPadding = PaddingValues(horizontal = 16.dp), + modifier = Modifier + .height(248.dp) + ) { + item { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .padding(all = 8.dp) + .width(108.dp) + ) { + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .clickable( + indication = rememberRipple(bounded = true), + interactionSource = remember { MutableInteractionSource() } + ) { + isCreatingANewPlaylist = true + } + .background(colorPalette.lightBackground) + .size(108.dp) + ) { + Image( + painter = painterResource(R.drawable.add), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .size(24.dp) + ) + } + } + } + + items(playlistPreviews) { playlistPreview -> + PlaylistPreviewItem( + playlistPreview = playlistPreview, + modifier = Modifier + .padding(all = 8.dp) + .clickable( + indication = rememberRipple(bounded = true), + interactionSource = remember { MutableInteractionSource() } + ) { + playlistRoute(playlistPreview.playlist.id) + } + ) + } + } + } + + item { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .zIndex(1f) + .padding(horizontal = 8.dp) + .padding(top = 32.dp) + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .weight(1f) + .padding(horizontal = 8.dp) + ) { + BasicText( + text = when (preferences.homePageSongCollection) { + SongCollection.MostPlayed -> "Most played" + SongCollection.Favorites -> "Favorites" + SongCollection.History -> "History" + }, + style = typography.m.semiBold, + modifier = Modifier + .animateContentSize() + ) + + Image( + painter = painterResource(R.drawable.repeat), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.textSecondary), + modifier = Modifier + .clickable { + val values = SongCollection.values() + + preferences.homePageSongCollection = + values[(preferences.homePageSongCollection.ordinal + 1) % values.size] + } + .padding(horizontal = 8.dp, vertical = 8.dp) + .size(16.dp) + ) + } + + Image( + painter = painterResource(R.drawable.ellipsis_horizontal), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable { + menuState.display { + BasicMenu(onDismiss = menuState::hide) { + MenuEntry( + icon = R.drawable.play, + text = "Play", + enabled = songCollection.isNotEmpty(), + onClick = { + menuState.hide() + YoutubePlayer.Radio.reset() + player?.mediaController?.forcePlayFromBeginning( + songCollection + .map(SongWithInfo::asMediaItem) + ) + } + ) + + MenuEntry( + icon = R.drawable.shuffle, + text = "Shuffle", + enabled = songCollection.isNotEmpty(), + onClick = { + menuState.hide() + YoutubePlayer.Radio.reset() + player?.mediaController?.forcePlayFromBeginning( + songCollection + .shuffled() + .map(SongWithInfo::asMediaItem) + ) + } + ) + + MenuEntry( + icon = R.drawable.time, + text = "Enqueue", + enabled = songCollection.isNotEmpty() && player?.playbackState == Player.STATE_READY, + onClick = { + menuState.hide() + player?.mediaController?.enqueue( + songCollection.map(SongWithInfo::asMediaItem) + ) + } + ) + } + } + } + .padding(horizontal = 8.dp, vertical = 8.dp) + .size(20.dp) + ) + } + } + + itemsIndexed( + items = songCollection, + key = { _, song -> + song.song.id + } + ) { index, song -> + SongItem( + song = song, + thumbnailSize = thumbnailSize, + onClick = { + YoutubePlayer.Radio.reset() + player?.mediaController?.forcePlayAtIndex( + songCollection.map(SongWithInfo::asMediaItem), + index + ) + }, + menuContent = { + when (preferences.homePageSongCollection) { + SongCollection.MostPlayed -> NonQueuedMediaItemMenu(mediaItem = song.asMediaItem) + SongCollection.Favorites -> InFavoritesMediaItemMenu(song = song) + SongCollection.History -> InHistoryMediaItemMenu(song = song) + } + }, + onThumbnailContent = { + AnimatedVisibility( + visible = preferences.homePageSongCollection == SongCollection.MostPlayed, + enter = fadeIn(), + exit = fadeOut(), + modifier = Modifier + .align(Alignment.BottomCenter) + ) { + BasicText( + text = song.song.formattedTotalPlayTime, + style = typography.xxs.semiBold.center.color(Color.White), + maxLines = 2, + overflow = TextOverflow.Ellipsis, + modifier = Modifier + .fillMaxWidth() + .background( + Brush.verticalGradient( + colors = listOf( + Color.Transparent, + Color.Black.copy(alpha = 0.75f) + ) + ) + ) + .padding(horizontal = 8.dp, vertical = 4.dp) + ) + } + } + ) + } + } + } + } + + PlayerView( + layoutState = rememberBottomSheetState(lowerBound = 64.dp, upperBound = maxHeight), + modifier = Modifier + .align(Alignment.BottomCenter) + ) + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/IntentVideoScreen.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/IntentVideoScreen.kt new file mode 100644 index 0000000..75b37a4 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/IntentVideoScreen.kt @@ -0,0 +1,104 @@ +package it.vfsfitvnm.vimusic.ui.screens + +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.produceState +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.dp +import androidx.media3.common.MediaItem +import com.valentinilk.shimmer.ShimmerBounds +import com.valentinilk.shimmer.rememberShimmer +import it.vfsfitvnm.route.RouteHandler +import it.vfsfitvnm.vimusic.Database +import it.vfsfitvnm.vimusic.ui.components.OutcomeItem +import it.vfsfitvnm.vimusic.ui.components.themed.NonQueuedMediaItemMenu +import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette +import it.vfsfitvnm.vimusic.ui.views.SongItem +import it.vfsfitvnm.vimusic.utils.LocalYoutubePlayer +import it.vfsfitvnm.vimusic.utils.asMediaItem +import it.vfsfitvnm.vimusic.utils.forcePlay +import it.vfsfitvnm.youtubemusic.Outcome +import it.vfsfitvnm.youtubemusic.YouTube +import it.vfsfitvnm.youtubemusic.toNullable +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +@ExperimentalAnimationApi +@Composable +fun IntentVideoScreen(videoId: String) { + val albumRoute = rememberAlbumRoute() + val artistRoute = rememberArtistRoute() + + RouteHandler(listenToGlobalEmitter = true) { + albumRoute { browseId -> + AlbumScreen( + browseId = browseId ?: error("browseId cannot be null") + ) + } + + artistRoute { browseId -> + ArtistScreen( + browseId = browseId ?: error("browseId cannot be null") + ) + } + + host { + val colorPalette = LocalColorPalette.current + val density = LocalDensity.current + val player = LocalYoutubePlayer.current + + val mediaItem by produceState>(initialValue = Outcome.Loading) { + value = withContext(Dispatchers.IO) { + Database.songWithInfo(videoId)?.let { songWithInfo -> + Outcome.Success(songWithInfo.asMediaItem) + } ?: YouTube.getQueue(videoId).toNullable() + ?.map(YouTube.Item.Song::asMediaItem) + ?: Outcome.Error.Network + } + } + + Column( + modifier = Modifier + .background(colorPalette.background) + .fillMaxSize() + ) { + OutcomeItem( + outcome = mediaItem, + onLoading = { + SmallSongItemShimmer( + shimmer = rememberShimmer(shimmerBounds = ShimmerBounds.View), + thumbnailSizeDp = 54.dp, + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 4.dp, horizontal = 16.dp) + ) + } + ) { mediaItem -> + SongItem( + mediaItem = mediaItem, + thumbnailSize = remember { + density.run { + 54.dp.roundToPx() + } + }, + onClick = { + player?.mediaController?.forcePlay(mediaItem) + pop() + }, + menuContent = { + NonQueuedMediaItemMenu(mediaItem = mediaItem) + } + ) + } + } + } + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/PlaylistScreen.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/PlaylistScreen.kt new file mode 100644 index 0000000..bd3e377 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/PlaylistScreen.kt @@ -0,0 +1,337 @@ +package it.vfsfitvnm.vimusic.ui.screens + +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.text.BasicText +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.hapticfeedback.HapticFeedbackType +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalHapticFeedback +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import androidx.media3.common.Player +import it.vfsfitvnm.reordering.rememberReorderingState +import it.vfsfitvnm.reordering.verticalDragAfterLongPressToReorder +import it.vfsfitvnm.route.RouteHandler +import it.vfsfitvnm.vimusic.Database +import it.vfsfitvnm.vimusic.R +import it.vfsfitvnm.vimusic.models.PlaylistWithSongs +import it.vfsfitvnm.vimusic.models.SongInPlaylist +import it.vfsfitvnm.vimusic.models.SongWithInfo +import it.vfsfitvnm.vimusic.ui.components.LocalMenuState +import it.vfsfitvnm.vimusic.ui.components.TopAppBar +import it.vfsfitvnm.vimusic.ui.components.themed.* +import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette +import it.vfsfitvnm.vimusic.ui.styling.LocalTypography +import it.vfsfitvnm.vimusic.ui.views.SongItem +import it.vfsfitvnm.vimusic.utils.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.launch + + +@ExperimentalAnimationApi +@Composable +fun LocalPlaylistScreen( + playlistId: Long, +) { + val playlistWithSongs by remember(playlistId) { + Database.playlistWithSongs(playlistId).map { it ?: PlaylistWithSongs.NotFound } + }.collectAsState(initial = PlaylistWithSongs.Empty, context = Dispatchers.IO) + + + val lazyListState = rememberLazyListState() + + val albumRoute = rememberAlbumRoute() + val artistRoute = rememberArtistRoute() + + RouteHandler(listenToGlobalEmitter = true) { + albumRoute { browseId -> + AlbumScreen( + browseId = browseId ?: error("browseId cannot be null") + ) + } + + artistRoute { browseId -> + ArtistScreen( + browseId = browseId ?: error("browseId cannot be null") + ) + } + + host { + val density = LocalDensity.current + val hapticFeedback = LocalHapticFeedback.current + val menuState = LocalMenuState.current + + val player = LocalYoutubePlayer.current + val colorPalette = LocalColorPalette.current + val typography = LocalTypography.current + + val thumbnailSize = remember { + density.run { + 54.dp.roundToPx() + } + } + + val coroutineScope = rememberCoroutineScope() + + val reorderingState = rememberReorderingState(playlistWithSongs.songs) + + var isRenaming by rememberSaveable { + mutableStateOf(false) + } + + if (isRenaming) { + TextFieldDialog( + hintText = "Enter the playlist name", + initialTextInput = playlistWithSongs.playlist.name, + onDismiss = { + isRenaming = false + }, + onDone = { text -> + coroutineScope.launch(Dispatchers.IO) { + Database.update(playlistWithSongs.playlist.copy(name = text)) + } + } + ) + } + + var isDeleting by rememberSaveable { + mutableStateOf(false) + } + + if (isDeleting) { + ConfirmationDialog( + text = "Do you really want to delete this playlist?", + onDismiss = { + isDeleting = false + }, + onConfirm = { + coroutineScope.launch(Dispatchers.IO) { + Database.delete(playlistWithSongs.playlist) + } + pop() + } + ) + } + + LazyColumn( + state = lazyListState, + contentPadding = PaddingValues(bottom = 64.dp), + modifier = Modifier + .background(colorPalette.background) + .fillMaxSize() + ) { + item { + TopAppBar( + modifier = Modifier + .height(52.dp) + ) { + Image( + painter = painterResource(R.drawable.chevron_back), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable(onClick = pop) + .padding(vertical = 8.dp, horizontal = 16.dp) + .size(24.dp) + ) + + Image( + painter = painterResource(R.drawable.ellipsis_horizontal), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable { + menuState.display { + Menu { + MenuCloseButton(onClick = menuState::hide) + + MenuEntry( + icon = R.drawable.time, + text = "Enqueue", + enabled = playlistWithSongs.songs.isNotEmpty() && player?.playbackState == Player.STATE_READY, + onClick = { + menuState.hide() + player?.mediaController?.enqueue( + playlistWithSongs.songs.map( + SongWithInfo::asMediaItem + ) + ) + } + ) + + MenuEntry( + icon = R.drawable.pencil, + text = "Rename", + onClick = { + menuState.hide() + isRenaming = true + } + ) + + MenuEntry( + icon = R.drawable.trash, + text = "Delete", + onClick = { + menuState.hide() + isDeleting = true + } + ) + } + } + } + .padding(horizontal = 16.dp, vertical = 8.dp) + .size(24.dp) + ) + } + } + + item { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier + .padding(top = 16.dp, bottom = 32.dp) + ) { + Column( + modifier = Modifier + .weight(1f) + .padding(horizontal = 16.dp) + ) { + BasicText( + text = playlistWithSongs.playlist.name, + style = typography.m.semiBold + ) + + BasicText( + text = "${playlistWithSongs.songs.size} songs", + style = typography.xxs.semiBold.secondary + ) + } + + Row( + horizontalArrangement = Arrangement.spacedBy(16.dp), + modifier = Modifier + .padding(horizontal = 16.dp) + ) { + Image( + painter = painterResource(R.drawable.shuffle), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable { + YoutubePlayer.Radio.reset() + player?.mediaController?.forcePlayFromBeginning( + playlistWithSongs.songs + .map(SongWithInfo::asMediaItem) + .shuffled() + ) + } + .shadow(elevation = 2.dp, shape = CircleShape) + .background( + color = colorPalette.elevatedBackground, + shape = CircleShape + ) + .padding(horizontal = 16.dp, vertical = 16.dp) + .size(20.dp) + ) + + Image( + painter = painterResource(R.drawable.play), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable { + YoutubePlayer.Radio.reset() + player?.mediaController?.forcePlayFromBeginning( + playlistWithSongs.songs.map( + SongWithInfo::asMediaItem + ) + ) + } + .shadow(elevation = 2.dp, shape = CircleShape) + .background( + color = colorPalette.elevatedBackground, + shape = CircleShape + ) + .padding(horizontal = 16.dp, vertical = 16.dp) + .size(20.dp) + ) + } + } + } + + + itemsIndexed(items = playlistWithSongs.songs, key = { _, song -> song.song.id }) { index, song -> + SongItem( + song = song, + thumbnailSize = thumbnailSize, + onClick = { + YoutubePlayer.Radio.reset() + player?.mediaController?.forcePlayAtIndex( + playlistWithSongs.songs.map( + SongWithInfo::asMediaItem + ), index + ) + }, + menuContent = { + InPlaylistMediaItemMenu( + playlistId = playlistId, + positionInPlaylist = index, + song = song + ) + }, + modifier = Modifier + .verticalDragAfterLongPressToReorder( + reorderingState = reorderingState, + index = index, + onDragStart = { + hapticFeedback.performHapticFeedback( + HapticFeedbackType.LongPress + ) + }, + onDragEnd = { reachedIndex -> + coroutineScope.launch(Dispatchers.IO) { + if (index > reachedIndex) { + Database.incrementSongPositions( + playlistId = playlistWithSongs.playlist.id, + fromPosition = reachedIndex, + toPosition = index - 1 + ) + } else if (index < reachedIndex) { + Database.decrementSongPositions( + playlistId = playlistWithSongs.playlist.id, + fromPosition = index + 1, + toPosition = reachedIndex + ) + } + + Database.update( + SongInPlaylist( + songId = playlistWithSongs.songs[index].song.id, + playlistId = playlistWithSongs.playlist.id, + position = reachedIndex + ) + ) + } + } + ) + ) + } + } + } + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchResultScreen.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchResultScreen.kt new file mode 100644 index 0000000..03dbe5b --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchResultScreen.kt @@ -0,0 +1,493 @@ +package it.vfsfitvnm.vimusic.ui.screens + +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicText +import androidx.compose.material.ripple.rememberRipple +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage +import com.valentinilk.shimmer.Shimmer +import com.valentinilk.shimmer.ShimmerBounds +import com.valentinilk.shimmer.rememberShimmer +import com.valentinilk.shimmer.shimmer +import it.vfsfitvnm.route.RouteHandler +import it.vfsfitvnm.vimusic.R +import it.vfsfitvnm.vimusic.ui.components.* +import it.vfsfitvnm.vimusic.ui.components.themed.NonQueuedMediaItemMenu +import it.vfsfitvnm.vimusic.ui.components.themed.TextPlaceholder +import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette +import it.vfsfitvnm.vimusic.ui.styling.LocalTypography +import it.vfsfitvnm.vimusic.ui.views.SongItem +import it.vfsfitvnm.vimusic.utils.* +import it.vfsfitvnm.youtubemusic.Outcome +import it.vfsfitvnm.youtubemusic.YouTube +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + + +@ExperimentalAnimationApi +@Composable +fun SearchResultScreen( + query: String, + onSearchAgain: () -> Unit, +) { + val density = LocalDensity.current + val colorPalette = LocalColorPalette.current + val typography = LocalTypography.current + val preferences = LocalPreferences.current + val player = LocalYoutubePlayer.current + + val lazyListState = rememberLazyListState() + + var continuation by remember(preferences.searchFilter) { + mutableStateOf>(Outcome.Initial) + } + + val items = remember(preferences.searchFilter) { + mutableStateListOf() + } + + val onLoad = relaunchableEffect(preferences.searchFilter) { + withContext(Dispatchers.Main) { + val token = continuation.valueOrNull + + continuation = Outcome.Loading + + continuation = withContext(Dispatchers.IO) { + YouTube.search(query, preferences.searchFilter, token) + }.map { searchResult -> + items.addAll(searchResult.items) + searchResult.continuation + }.recoverWith(token) + } + } + + val thumbnailSizePx = remember { + density.run { + 54.dp.roundToPx() + } + } + + val albumRoute = rememberAlbumRoute() + val artistRoute = rememberArtistRoute() + + RouteHandler( + listenToGlobalEmitter = true + ) { + albumRoute { browseId -> + AlbumScreen( + browseId = browseId ?: "browseId cannot be null" + ) + } + + artistRoute { browseId -> + ArtistScreen( + browseId = browseId ?: "browseId cannot be null" + ) + } + + host { + val shimmer = rememberShimmer(shimmerBounds = ShimmerBounds.Window) + + LazyColumn( + state = lazyListState, + horizontalAlignment = Alignment.CenterHorizontally, + contentPadding = PaddingValues(bottom = 64.dp), + modifier = Modifier + .background(colorPalette.background) + .fillMaxSize() + ) { + item { + TopAppBar( + modifier = Modifier + .height(52.dp) + ) { + Image( + painter = painterResource(R.drawable.chevron_back), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable(onClick = pop) + .padding(vertical = 8.dp) + .padding(horizontal = 16.dp) + .size(24.dp) + ) + + BasicText( + text = query, + style = typography.m.semiBold, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + onClick = onSearchAgain + ) + ) + + Spacer( + modifier = Modifier + .padding(vertical = 8.dp) + .padding(horizontal = 16.dp) + .size(24.dp) + ) + } + } + + item { + ChipGroup( + items = listOf( + ChipItem( + text = "Songs", + value = YouTube.Item.Song.Filter.value + ), + ChipItem( + text = "Albums", + value = YouTube.Item.Album.Filter.value + ), + ChipItem( + text = "Artists", + value = YouTube.Item.Artist.Filter.value + ), + ChipItem( + text = "Videos", + value = YouTube.Item.Video.Filter.value + ), + ), + value = preferences.searchFilter, + selectedBackgroundColor = colorPalette.primaryContainer, + unselectedBackgroundColor = colorPalette.lightBackground, + selectedTextStyle = typography.xs.medium.color(colorPalette.onPrimaryContainer), + unselectedTextStyle = typography.xs.medium, + shape = RoundedCornerShape(36.dp), + onValueChanged = { filter -> + preferences.searchFilter = filter + }, + modifier = Modifier + .padding(vertical = 8.dp) + .padding(horizontal = 16.dp) + .padding(bottom = 8.dp) + ) + } + + items(items) { item -> + SmallItem( + item = item, + thumbnailSizeDp = 54.dp, + thumbnailSizePx = thumbnailSizePx, + onClick = { + when (item) { + is YouTube.Item.Album -> albumRoute(item.info.endpoint!!.browseId) + is YouTube.Item.Artist -> artistRoute(item.info.endpoint!!.browseId) + is YouTube.Item.Song -> { + player?.mediaController?.forcePlay(item.asMediaItem) + item.info.endpoint?.let(YoutubePlayer.Radio::setup) + } + is YouTube.Item.Video -> { + player?.mediaController?.forcePlay(item.asMediaItem) + item.info.endpoint?.let(YoutubePlayer.Radio::setup) + } + } + } + ) + } + + when (val currentResult = continuation) { + is Outcome.Error -> item { + Error( + error = currentResult, + onRetry = onLoad, + modifier = Modifier + .padding(vertical = 16.dp) + ) + } + is Outcome.Recovered -> item { + Error( + error = currentResult.error, + onRetry = onLoad, + modifier = Modifier + .padding(vertical = 16.dp) + ) + } + is Outcome.Success -> { + if (items.isEmpty()) { + item { + Message( + text = "No results found", + modifier = Modifier + ) + } + } + + if (currentResult.value != null) { + item { + SideEffect(onLoad) + } + } + } + else -> {} + } + + if (continuation is Outcome.Loading || (continuation is Outcome.Success && continuation.valueOrNull != null)) { + items(count = if (items.isEmpty()) 8 else 3, key = { it }) { index -> + when (preferences.searchFilter) { + YouTube.Item.Artist.Filter.value -> SmallArtistItemShimmer( + shimmer = shimmer, + thumbnailSizeDp = 54.dp, + modifier = Modifier + .alpha(1f - index * 0.125f) + .fillMaxWidth() + .padding(vertical = 4.dp, horizontal = 16.dp) + ) + else -> SmallSongItemShimmer( + shimmer = shimmer, + thumbnailSizeDp = 54.dp, + modifier = Modifier + .alpha(1f - index * 0.125f) + .fillMaxWidth() + .padding(vertical = 4.dp, horizontal = 16.dp) + ) + } + } + } + } + } + } +} + +@Composable +fun SmallSongItemShimmer( + shimmer: Shimmer, + thumbnailSizeDp: Dp, + modifier: Modifier = Modifier +) { + val colorPalette = LocalColorPalette.current + + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp), + modifier = modifier + .shimmer(shimmer) + ) { + Spacer( + modifier = Modifier + .background(colorPalette.darkGray) + .size(thumbnailSizeDp) + ) + + Column { + TextPlaceholder() + TextPlaceholder() + } + } +} + +@Composable +fun SmallArtistItemShimmer( + shimmer: Shimmer, + thumbnailSizeDp: Dp, + modifier: Modifier = Modifier +) { + val colorPalette = LocalColorPalette.current + + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp), + modifier = modifier + .shimmer(shimmer) + ) { + Spacer( + modifier = Modifier + .background(color = colorPalette.darkGray, shape = CircleShape) + .size(thumbnailSizeDp) + ) + + TextPlaceholder() + } +} + +@ExperimentalAnimationApi +@Composable +fun SmallItem( + item: YouTube.Item, + thumbnailSizeDp: Dp, + thumbnailSizePx: Int, + onClick: () -> Unit, + modifier: Modifier = Modifier, +) { + when (item) { + is YouTube.Item.Artist -> SmallArtistItem( + artist = item, + thumbnailSizeDp = thumbnailSizeDp, + thumbnailSizePx = thumbnailSizePx, + modifier = modifier + .clickable( + indication = rememberRipple(bounded = true), + interactionSource = remember { MutableInteractionSource() }, + onClick = onClick + ) + .padding(vertical = 4.dp, horizontal = 16.dp) + ) + is YouTube.Item.Song -> SmallSongItem( + song = item, + thumbnailSizePx = thumbnailSizePx, + onClick = onClick, + modifier = modifier + ) + is YouTube.Item.Album -> SmallAlbumItem( + album = item, + thumbnailSizeDp = thumbnailSizeDp, + thumbnailSizePx = thumbnailSizePx, + modifier = modifier + .clickable( + indication = rememberRipple(bounded = true), + interactionSource = remember { MutableInteractionSource() }, + onClick = onClick + ) + + .padding(vertical = 4.dp, horizontal = 16.dp) + ) + is YouTube.Item.Video -> SmallVideoItem( + video = item, + thumbnailSizePx = thumbnailSizePx, + onClick = onClick, + modifier = modifier + ) + } +} + +@ExperimentalAnimationApi +@Composable +fun SmallSongItem( + song: YouTube.Item.Song, + thumbnailSizePx: Int, + onClick: () -> Unit, + modifier: Modifier = Modifier +) { + SongItem( + thumbnailModel = song.thumbnail.size(thumbnailSizePx), + title = song.info.name, + authors = song.authors.joinToString("") { it.name }, + durationText = song.durationText, + onClick = onClick, + menuContent = { + NonQueuedMediaItemMenu(mediaItem = song.asMediaItem) + }, + modifier = modifier + ) +} + +@ExperimentalAnimationApi +@Composable +fun SmallVideoItem( + video: YouTube.Item.Video, + thumbnailSizePx: Int, + onClick: () -> Unit, + modifier: Modifier = Modifier +) { + SongItem( + thumbnailModel = video.thumbnail.size(thumbnailSizePx), + title = video.info.name, + authors = video.views.joinToString("") { it.name }, + durationText = video.durationText, + onClick = onClick, + menuContent = { + NonQueuedMediaItemMenu(mediaItem = video.asMediaItem) + }, + modifier = modifier + ) +} + +@Composable +fun SmallAlbumItem( + album: YouTube.Item.Album, + thumbnailSizeDp: Dp, + thumbnailSizePx: Int, + modifier: Modifier = Modifier, +) { + val typography = LocalTypography.current + + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp), + modifier = modifier + ) { + AsyncImage( + model = album.thumbnail.size(thumbnailSizePx), + contentDescription = null, + modifier = Modifier + .size(thumbnailSizeDp) + ) + + Column( + modifier = Modifier + .weight(1f) + ) { + BasicText( + text = album.info.name, + style = typography.xs.semiBold, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + BasicText( + text = "${album.authors.joinToString("") { it.name }} • ${album.year}", + style = typography.xs, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + } +} + +@Composable +fun SmallArtistItem( + artist: YouTube.Item.Artist, + thumbnailSizeDp: Dp, + thumbnailSizePx: Int, + modifier: Modifier = Modifier, +) { + val typography = LocalTypography.current + + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp), + modifier = modifier + ) { + AsyncImage( + model = artist.thumbnail.size(thumbnailSizePx), + contentDescription = null, + modifier = Modifier + .clip(CircleShape) + .size(thumbnailSizeDp) + ) + + BasicText( + text = artist.info.name, + style = typography.xs.semiBold, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier + .weight(1f) + ) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchScreen.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchScreen.kt new file mode 100644 index 0000000..8b882c0 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/SearchScreen.kt @@ -0,0 +1,307 @@ +package it.vfsfitvnm.vimusic.ui.screens + +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.text.BasicText +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.ripple.rememberRipple +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.rotate +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextRange +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import it.vfsfitvnm.route.RouteHandler +import it.vfsfitvnm.vimusic.Database +import it.vfsfitvnm.vimusic.R +import it.vfsfitvnm.vimusic.ui.components.OutcomeItem +import it.vfsfitvnm.vimusic.ui.components.TopAppBar +import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette +import it.vfsfitvnm.vimusic.ui.styling.LocalTypography +import it.vfsfitvnm.vimusic.utils.medium +import it.vfsfitvnm.vimusic.utils.secondary +import it.vfsfitvnm.youtubemusic.Outcome +import it.vfsfitvnm.youtubemusic.YouTube +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +@ExperimentalAnimationApi +@Composable +fun SearchScreen( + initialTextInput: String, + onSearch: (String) -> Unit +) { + var textFieldValue by rememberSaveable(initialTextInput, stateSaver = TextFieldValue.Saver) { + mutableStateOf( + TextFieldValue( + text = initialTextInput, + selection = TextRange(initialTextInput.length) + ) + ) + } + + val focusRequester = remember { + FocusRequester() + } + + val searchSuggestions by produceState?>>( + initialValue = Outcome.Initial, + key1 = textFieldValue + ) { + value = if (textFieldValue.text.isNotEmpty()) { + withContext(Dispatchers.IO) { + YouTube.getSearchSuggestions(textFieldValue.text) + } + } else { + Outcome.Initial + } + } + + val history by remember(textFieldValue.text) { + Database.getRecentQueries("%${textFieldValue.text}%").distinctUntilChanged { old, new -> + old.size == new.size + } + }.collectAsState(initial = null, context = Dispatchers.IO) + + val albumRoute = rememberAlbumRoute() + val artistRoute = rememberArtistRoute() + + RouteHandler(listenToGlobalEmitter = true) { + albumRoute { browseId -> + AlbumScreen( + browseId = browseId ?: error("browseId cannot be null") + ) + } + + artistRoute { browseId -> + ArtistScreen( + browseId = browseId ?: error("browseId cannot be null") + ) + } + + host { + val colorPalette = LocalColorPalette.current + val typography = LocalTypography.current + + val coroutineScope = rememberCoroutineScope() + + LaunchedEffect(Unit) { + delay(300) + focusRequester.requestFocus() + } + + Column( + modifier = Modifier + .fillMaxSize() + ) { + TopAppBar( + modifier = Modifier + .height(52.dp) + ) { + BasicTextField( + value = textFieldValue, + onValueChange = { + textFieldValue = it + }, + textStyle = typography.m.medium, + singleLine = true, + maxLines = 1, + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search), + keyboardActions = KeyboardActions( + onSearch = { + if (textFieldValue.text.isNotEmpty()) { + onSearch(textFieldValue.text) + } + } + ), + cursorBrush = SolidColor(colorPalette.text), + decorationBox = { innerTextField -> + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + ) { + Image( + painter = painterResource(R.drawable.chevron_back), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable { + pop() + focusRequester.freeFocus() + } + .padding(vertical = 8.dp) + .padding(horizontal = 16.dp) + .size(24.dp) + ) + + Box( + modifier = Modifier + .weight(1f) + ) { + androidx.compose.animation.AnimatedVisibility( + visible = textFieldValue.text.isEmpty(), + enter = fadeIn(tween(100)), + exit = fadeOut(tween(100)), + ) { + BasicText( + text = "Enter a song, an album, an artist name...", + maxLines = 1, + overflow = TextOverflow.Ellipsis, + style = typography.m.secondary, + ) + } + + innerTextField() + } + } + }, + modifier = Modifier + .padding(end = 16.dp) + .weight(1f) + .focusRequester(focusRequester) + ) + } + + Column( + modifier = Modifier + .verticalScroll(rememberScrollState()) + .padding(bottom = 64.dp) + ) { + history?.forEach { searchQuery -> + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .clickable( + indication = rememberRipple(bounded = true), + interactionSource = remember { MutableInteractionSource() } + ) { + onSearch(searchQuery.query) + } + .fillMaxWidth() + .padding(vertical = 16.dp, horizontal = 8.dp) + ) { + Image( + painter = painterResource(R.drawable.time), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.darkGray), + modifier = Modifier + .padding(horizontal = 8.dp) + .size(20.dp) + ) + + BasicText( + text = searchQuery.query, + style = typography.s.secondary, + modifier = Modifier + .padding(horizontal = 8.dp) + .weight(1f) + ) + + Image( + painter = painterResource(R.drawable.close), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.darkGray), + modifier = Modifier + .clickable { + coroutineScope.launch(Dispatchers.IO) { + Database.delete(searchQuery) + } + } + .padding(horizontal = 8.dp) + .size(20.dp) + ) + + Image( + painter = painterResource(R.drawable.arrow_forward), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.darkGray), + modifier = Modifier + .clickable { + textFieldValue = TextFieldValue( + text = searchQuery.query, + selection = TextRange(searchQuery.query.length) + ) + } + .rotate(225f) + .padding(horizontal = 8.dp) + .size(20.dp) + ) + } + } + + OutcomeItem( + outcome = searchSuggestions + ) { suggestions -> + suggestions?.forEach { suggestion -> + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .clickable( + indication = rememberRipple(bounded = true), + interactionSource = remember { MutableInteractionSource() } + ) { + onSearch(suggestion) + } + .fillMaxWidth() + .padding(vertical = 16.dp, horizontal = 8.dp) + ) { + Spacer( + modifier = Modifier + .padding(horizontal = 8.dp) + .size(20.dp) + ) + + BasicText( + text = suggestion, + style = typography.s.secondary, + modifier = Modifier + .padding(horizontal = 8.dp) + .weight(1f) + ) + + + Image( + painter = painterResource(R.drawable.arrow_forward), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.darkGray), + modifier = Modifier + .clickable { + textFieldValue = TextFieldValue( + text = suggestion, + selection = TextRange(suggestion.length) + ) + } + .rotate(225f) + .padding(horizontal = 8.dp) + .size(22.dp) + ) + } + } + } + } + } + } + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/routes.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/routes.kt new file mode 100644 index 0000000..e904261 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/screens/routes.kt @@ -0,0 +1,82 @@ +package it.vfsfitvnm.vimusic.ui.screens + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import it.vfsfitvnm.route.Route0 +import it.vfsfitvnm.route.Route1 + +@Composable +fun rememberIntentVideoRoute(intentVideoId: String?): Route1 { + val videoId = rememberSaveable { + mutableStateOf(intentVideoId) + } + return remember { + Route1("rememberIntentVideoRoute", videoId) + } +} + +@Composable +fun rememberAlbumRoute(): Route1 { + val browseId = rememberSaveable { + mutableStateOf(null) + } + return remember { + Route1("AlbumRoute", browseId) + } +} + +@Composable +fun rememberArtistRoute(): Route1 { + val browseId = rememberSaveable { + mutableStateOf(null) + } + return remember { + Route1("ArtistRoute", browseId) + } +} + +@Composable +fun rememberLocalPlaylistRoute(): Route1 { + val playlistType = rememberSaveable { + mutableStateOf(null) + } + return remember { + Route1("LocalPlaylistRoute", playlistType) + } +} + +@Composable +fun rememberSearchRoute(): Route1 { + val initialTextInput = remember { + mutableStateOf("") + } + return remember { + Route1("SearchRoute", initialTextInput) + } +} + +@Composable +fun rememberCreatePlaylistRoute(): Route0 { + return remember { + Route0("CreatePlaylistRoute") + } +} + +@Composable +fun rememberSearchResultRoute(): Route1 { + val searchQuery = rememberSaveable { + mutableStateOf("") + } + return remember { + Route1("SearchResultRoute", searchQuery) + } +} + +@Composable +fun rememberLyricsRoute(): Route0 { + return remember { + Route0("LyricsRoute") + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/styling/ColorPalette.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/styling/ColorPalette.kt new file mode 100644 index 0000000..2031198 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/styling/ColorPalette.kt @@ -0,0 +1,78 @@ +package it.vfsfitvnm.vimusic.ui.styling + +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.runtime.* +import androidx.compose.ui.graphics.Color + +@Immutable +data class ColorPalette( + val background: Color, + val elevatedBackground: Color, + val lightBackground: Color, + val text: Color, + val textSecondary: Color, + val textDisabled: Color, + val lightGray: Color, + val gray: Color, + val darkGray: Color, + val blue: Color, + val red: Color, + val green: Color, + val orange: Color, + + val primaryContainer: Color, + val onPrimaryContainer: Color, + val iconOnPrimaryContainer: Color, +) + +val DarkColorPalette = ColorPalette( + background = Color(0xff16171d), + lightBackground = Color(0xff1f2029), + elevatedBackground = Color(0xff1f2029), + text = Color(0xffe1e1e2), + textSecondary = Color(0xffa3a4a6), + textDisabled = Color(0xff6f6f73), + lightGray = Color(0xfff8f8f8), + gray = Color(0xFFE5E5E5), + darkGray = Color(0xFF838383), + blue = Color(0xff4046bf), + red = Color(0xffbf4040), + green = Color(0xff7fbf40), + orange = Color(0xffe8820e), + + primaryContainer = Color(0xff4046bf), + onPrimaryContainer = Color.White, + iconOnPrimaryContainer = Color.White, +) + +val LightColorPalette = ColorPalette( + background = Color(0xfffdfdfe), + lightBackground = Color(0xFFf8f8fc), + elevatedBackground = Color(0xfffdfdfe), + lightGray = Color(0xfff8f8f8), + gray = Color(0xFFE5E5E5), + darkGray = Color(0xFF838383), + text = Color(0xff212121), + textSecondary = Color(0xFF656566), + textDisabled = Color(0xFF9d9d9d), + blue = Color(0xff4059bf), + red = Color(0xffbf4040), + green = Color(0xff7fbf40), + orange = Color(0xffe8730e), + + primaryContainer = Color(0xff4046bf), + onPrimaryContainer = Color.White, + iconOnPrimaryContainer = Color.White, +// primaryContainer = Color(0xffecedf9), +// onPrimaryContainer = Color(0xff121212), +// iconOnPrimaryContainer = Color(0xff2e30b8), +) + +val LocalColorPalette = staticCompositionLocalOf { LightColorPalette } + +@Composable +fun rememberColorPalette(isDarkTheme: Boolean = isSystemInDarkTheme()): ColorPalette { + return remember(isDarkTheme) { + if (isDarkTheme) DarkColorPalette else LightColorPalette + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/styling/Typography.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/styling/Typography.kt new file mode 100644 index 0000000..e369c15 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/styling/Typography.kt @@ -0,0 +1,74 @@ +package it.vfsfitvnm.vimusic.ui.styling + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable +import androidx.compose.runtime.remember +import androidx.compose.runtime.staticCompositionLocalOf +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.ExperimentalTextApi +import androidx.compose.ui.text.PlatformTextStyle +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.Font +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp +import it.vfsfitvnm.vimusic.R + +@Immutable +data class Typography( + val xxs: TextStyle, + val xs: TextStyle, + val s: TextStyle, + val m: TextStyle, + val l: TextStyle, +) + +val LocalTypography = staticCompositionLocalOf { TODO() } + +@ExperimentalTextApi +@Composable +fun rememberTypography(color: Color): Typography { + return remember(color) { + TextStyle( + fontFamily = FontFamily( + Font( + resId = R.font.poppins_w300, + weight = FontWeight.Light + ), + Font( + resId = R.font.poppins_w400, + weight = FontWeight.Normal + ), + Font( + resId = R.font.poppins_w400_italic, + weight = FontWeight.Normal, + style = FontStyle.Italic + ), + Font( + resId = R.font.poppins_w500, + weight = FontWeight.Medium + ), + Font( + resId = R.font.poppins_w600, + weight = FontWeight.SemiBold + ), + Font( + resId = R.font.poppins_w700, + weight = FontWeight.Bold + ), + ), + fontWeight = FontWeight.Normal, + color = color, + platformStyle = PlatformTextStyle(includeFontPadding = false) + ).run { + Typography( + xxs = copy(fontSize = 12.sp), + xs = copy(fontSize = 14.sp), + s = copy(fontSize = 16.sp), + m = copy(fontSize = 18.sp), + l = copy(fontSize = 20.sp), + ) + } + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/CurrentPlaylistView.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/CurrentPlaylistView.kt new file mode 100644 index 0000000..837a2bf --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/CurrentPlaylistView.kt @@ -0,0 +1,205 @@ +package it.vfsfitvnm.vimusic.ui.views + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.hapticfeedback.HapticFeedbackType +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalHapticFeedback +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import androidx.media3.common.Player +import com.valentinilk.shimmer.ShimmerBounds +import com.valentinilk.shimmer.rememberShimmer +import it.vfsfitvnm.vimusic.R +import it.vfsfitvnm.vimusic.ui.components.BottomSheetState +import it.vfsfitvnm.vimusic.ui.components.Error +import it.vfsfitvnm.vimusic.ui.components.MusicBars +import it.vfsfitvnm.vimusic.ui.components.themed.QueuedMediaItemMenu +import it.vfsfitvnm.vimusic.ui.screens.SmallSongItemShimmer +import it.vfsfitvnm.vimusic.ui.styling.LightColorPalette +import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette +import it.vfsfitvnm.vimusic.utils.LocalYoutubePlayer +import it.vfsfitvnm.vimusic.utils.YoutubePlayer +import it.vfsfitvnm.reordering.rememberReorderingState +import it.vfsfitvnm.reordering.verticalDragAfterLongPressToReorder +import it.vfsfitvnm.youtubemusic.Outcome +import kotlinx.coroutines.launch + + +@ExperimentalAnimationApi +@Composable +fun CurrentPlaylistView( + layoutState: BottomSheetState, + onGlobalRouteEmitted: () -> Unit, + modifier: Modifier = Modifier, +) { + val hapticFeedback = LocalHapticFeedback.current + val density = LocalDensity.current + val player = LocalYoutubePlayer.current + val colorPalette = LocalColorPalette.current + + val thumbnailSize = remember { + density.run { + 54.dp.roundToPx() + } + } + + val isPaused by derivedStateOf { + player?.playbackState == Player.STATE_ENDED || player?.playWhenReady == false + } + + val shimmer = rememberShimmer(shimmerBounds = ShimmerBounds.Window) + + val coroutineScope = rememberCoroutineScope() + + val lazyListState = + rememberLazyListState(initialFirstVisibleItemIndex = player?.mediaItemIndex ?: 0) + + val reorderingState = rememberReorderingState(player?.mediaItems ?: emptyList()) + + LazyColumn( + state = lazyListState, + modifier = modifier + .nestedScroll(remember { + layoutState.nestedScrollConnection(player?.mediaItemIndex == 0) + }) + ) { + itemsIndexed( + items = player?.mediaItems ?: emptyList() + ) { index, mediaItem -> + val isPlayingThisMediaItem by derivedStateOf { + player?.mediaItemIndex == index + } + + SongItem( + mediaItem = mediaItem, + thumbnailSize = thumbnailSize, + onClick = { + if (isPlayingThisMediaItem) { + if (isPaused) { + player?.mediaController?.play() + } else { + player?.mediaController?.pause() + } + } else { + player?.mediaController?.playWhenReady = true + player?.mediaController?.seekToDefaultPosition(index) + } + }, + menuContent = { + QueuedMediaItemMenu( + mediaItem = mediaItem, + indexInQueue = index, + onGlobalRouteEmitted = onGlobalRouteEmitted + ) + }, + onThumbnailContent = { + AnimatedVisibility( + visible = isPlayingThisMediaItem, + enter = fadeIn(), + exit = fadeOut(), + ) { + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .background(Color.Black.copy(alpha = 0.25f)) + .size(54.dp) + ) { + if (isPaused) { + Image( + painter = painterResource(R.drawable.play), + contentDescription = null, + colorFilter = ColorFilter.tint(LightColorPalette.background), + modifier = Modifier + .size(24.dp) + ) + } else { + MusicBars( + color = LightColorPalette.background, +// shape = RectangleShape, + modifier = Modifier + .height(24.dp) + ) + } + } + } + }, + backgroundColor = colorPalette.elevatedBackground, + modifier = Modifier + .verticalDragAfterLongPressToReorder( + reorderingState = reorderingState, + index = index, + onDragStart = { + hapticFeedback.performHapticFeedback( + HapticFeedbackType.LongPress + ) + }, + onDragEnd = { reachedIndex -> + player?.mediaController?.moveMediaItem(index, reachedIndex) + } + ) + ) + } + + if (YoutubePlayer.Radio.isActive && player != null) { + when (val nextContinuation = YoutubePlayer.Radio.nextContinuation) { + is Outcome.Loading, is Outcome.Success<*> -> { + if (nextContinuation is Outcome.Success<*>) { + item { + SideEffect { + coroutineScope.launch { + YoutubePlayer.Radio.process( + player.mediaController, + force = true + ) + } + } + } + } + + items(count = 3, key = { it }) { index -> + SmallSongItemShimmer( + shimmer = shimmer, + thumbnailSizeDp = 54.dp, + modifier = Modifier + .alpha(1f - index * 0.125f) + .fillMaxWidth() + .padding(vertical = 4.dp, horizontal = 16.dp) + ) + } + } + is Outcome.Error -> item { + Error( + error = nextContinuation + ) + } + is Outcome.Recovered<*> -> item { + Error( + error = nextContinuation.error, + onRetry = { + coroutineScope.launch { + YoutubePlayer.Radio.process(player.mediaController, force = true) + } + } + ) + } + else -> {} + } + } + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerBottomSheet.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerBottomSheet.kt new file mode 100644 index 0000000..0d6d32b --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerBottomSheet.kt @@ -0,0 +1,259 @@ +package it.vfsfitvnm.vimusic.ui.views + +import androidx.compose.animation.AnimatedContentScope +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.animation.animateColorAsState +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.with +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicText +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.ripple.rememberRipple +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.scale +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.unit.dp +import com.valentinilk.shimmer.shimmer +import it.vfsfitvnm.route.Route +import it.vfsfitvnm.route.RouteHandler +import it.vfsfitvnm.route.empty +import it.vfsfitvnm.route.rememberRoute +import it.vfsfitvnm.vimusic.R +import it.vfsfitvnm.vimusic.ui.components.BottomSheet +import it.vfsfitvnm.vimusic.ui.components.BottomSheetState +import it.vfsfitvnm.vimusic.ui.components.Message +import it.vfsfitvnm.vimusic.ui.components.OutcomeItem +import it.vfsfitvnm.vimusic.ui.components.themed.TextPlaceholder +import it.vfsfitvnm.vimusic.ui.screens.rememberLyricsRoute +import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette +import it.vfsfitvnm.vimusic.ui.styling.LocalTypography +import it.vfsfitvnm.vimusic.utils.LocalYoutubePlayer +import it.vfsfitvnm.vimusic.utils.center +import it.vfsfitvnm.vimusic.utils.color +import it.vfsfitvnm.vimusic.utils.medium +import it.vfsfitvnm.youtubemusic.Outcome +import it.vfsfitvnm.youtubemusic.YouTube +import it.vfsfitvnm.youtubemusic.isEvaluable +import it.vfsfitvnm.youtubemusic.toNotNull +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +@ExperimentalAnimationApi +@Composable +fun PlayerBottomSheet( + layoutState: BottomSheetState, + onGlobalRouteEmitted: () -> Unit, + modifier: Modifier = Modifier, +) { + val player = LocalYoutubePlayer.current ?: return + + val colorPalette = LocalColorPalette.current + val typography = LocalTypography.current + + val coroutineScope = rememberCoroutineScope() + + val lyricsRoute = rememberLyricsRoute() + + var route by rememberRoute() + + var nextOutcome by remember(player.mediaItem!!.mediaId) { + mutableStateOf>(Outcome.Initial) + } + + var lyricsOutcome by remember(player.mediaItem!!.mediaId) { + mutableStateOf>(Outcome.Initial) + } + + BottomSheet( + state = layoutState, + peekHeight = 128.dp, + elevation = 16.dp, + shape = RoundedCornerShape(topStart = 8.dp, topEnd = 8.dp), + handleOutsideInteractionsWhenExpanded = true, + modifier = modifier, + collapsedContent = { + Column( + verticalArrangement = Arrangement.SpaceEvenly, + modifier = Modifier + .fillMaxWidth() + .height(layoutState.lowerBound) + .background(colorPalette.elevatedBackground) + ) { + Spacer( + modifier = Modifier + .align(Alignment.CenterHorizontally) + .background(color = colorPalette.textDisabled, shape = RoundedCornerShape(16.dp)) + .width(36.dp) + .height(4.dp) + .padding(top = 8.dp) + ) + + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + ) { + @Composable + fun Element( + text: String, + targetRoute: Route? + ) { + val color by animateColorAsState( + if (targetRoute == route) { + colorPalette.text + } else { + colorPalette.textDisabled + } + ) + + val scale by animateFloatAsState( + if (targetRoute == route) { + 1f + } else { + 0.9f + } + ) + + BasicText( + text = text, + style = typography.xs.medium.color(color).center, + modifier = Modifier + .clickable( + indication = rememberRipple(bounded = true), + interactionSource = remember { MutableInteractionSource() } + ) { + route = targetRoute + coroutineScope.launch(Dispatchers.Main) { + layoutState.expand() + } + } + .padding(vertical = 8.dp) + .scale(scale) + .weight(1f) + ) + } + + Element( + text = "UP NEXT", + targetRoute = null + ) + + Element( + text = "LYRICS", + targetRoute = lyricsRoute + ) + } + } + } + ) { + RouteHandler( + route = route, + onRouteChanged = { + route = it + }, + handleBackPress = false, + transitionSpec = { + when (targetState.route) { + lyricsRoute -> slideIntoContainer(AnimatedContentScope.SlideDirection.Left) with + slideOutOfContainer(AnimatedContentScope.SlideDirection.Left) + else -> when (initialState.route) { + lyricsRoute -> slideIntoContainer(AnimatedContentScope.SlideDirection.Right) with + slideOutOfContainer(AnimatedContentScope.SlideDirection.Right) + else -> empty + } + } + }, + modifier = Modifier + .background(colorPalette.elevatedBackground) + .fillMaxSize() + ) { + lyricsRoute { + OutcomeItem( + outcome = lyricsOutcome, + onInitialize = { + lyricsOutcome = Outcome.Loading + + coroutineScope.launch(Dispatchers.Main) { + if (nextOutcome.isEvaluable) { + nextOutcome = Outcome.Loading + nextOutcome = withContext(Dispatchers.IO) { + YouTube.next( + player.mediaItem!!.mediaId, + player.mediaItem!!.mediaMetadata.extras?.getString("playlistId"), + player.mediaItemIndex + ) + } + } + + lyricsOutcome = nextOutcome.flatMap { + it.lyrics?.text().toNotNull() + } + } + }, + onLoading = { + LyricsShimmer( + modifier = Modifier + .shimmer() + ) + } + ) { lyrics -> + if (lyrics != null) { + BasicText( + text = lyrics, + style = typography.xs.center, + modifier = Modifier + .padding(top = 64.dp) + .nestedScroll(remember { layoutState.nestedScrollConnection() }) + .verticalScroll(rememberScrollState()) + .fillMaxWidth() + .padding(vertical = 16.dp) + .padding(horizontal = 48.dp) + ) + } else { + Message( + text = "Lyrics not available", + icon = R.drawable.text, + modifier = Modifier + .padding(top = 64.dp) + ) + } + } + } + + host { + CurrentPlaylistView( + layoutState = layoutState, + onGlobalRouteEmitted = onGlobalRouteEmitted, + modifier = Modifier + .padding(top = 64.dp) + ) + } + } + } +} + +@Composable +fun LyricsShimmer( + modifier: Modifier = Modifier +) { + Column( + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + modifier = modifier + ) { + repeat(16) { index -> + TextPlaceholder( + modifier = Modifier + .alpha(1f - index * 0.05f) + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerView.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerView.kt new file mode 100644 index 0000000..d0ae6a5 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlayerView.kt @@ -0,0 +1,466 @@ +package it.vfsfitvnm.vimusic.ui.views + +import android.text.format.DateUtils +import androidx.compose.animation.* +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.text.BasicText +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.drawWithCache +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.viewinterop.AndroidView +import androidx.media3.common.C +import androidx.media3.common.MediaItem +import androidx.media3.common.Player +import androidx.media3.ui.DefaultTimeBar +import androidx.media3.ui.TimeBar +import coil.compose.AsyncImage +import it.vfsfitvnm.vimusic.Database +import it.vfsfitvnm.vimusic.R +import it.vfsfitvnm.vimusic.ui.components.* +import it.vfsfitvnm.vimusic.ui.components.themed.QueuedMediaItemMenu +import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette +import it.vfsfitvnm.vimusic.ui.styling.LocalTypography +import it.vfsfitvnm.vimusic.utils.* +import it.vfsfitvnm.youtubemusic.Outcome +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.launch + + +@ExperimentalAnimationApi +@Composable +fun PlayerView( + layoutState: BottomSheetState, + modifier: Modifier = Modifier, +) { + val menuState = LocalMenuState.current + val preferences = LocalPreferences.current + val colorPalette = LocalColorPalette.current + val typography = LocalTypography.current + val density = LocalDensity.current + val configuration = LocalConfiguration.current + val player = LocalYoutubePlayer.current + + val coroutineScope = rememberCoroutineScope() + + player?.mediaItem ?: return + + val smallThumbnailSize = remember { + density.run { 64.dp.roundToPx() } + } + + val (thumbnailSizeDp, thumbnailSizePx) = remember { + val size = minOf(configuration.screenHeightDp, configuration.screenWidthDp).dp + size to density.run { size.minus(64.dp).roundToPx() } + } + + val song by remember(player.mediaItem?.mediaId) { + player.mediaItem?.mediaId?.let(Database::songFlow)?.distinctUntilChanged() ?: flowOf(null) + }.collectAsState(initial = null, context = Dispatchers.IO) + + + BottomSheet( + state = layoutState, + modifier = modifier, + collapsedContent = { + if (!layoutState.isExpanded) { + Row( + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .height(layoutState.lowerBound) + .fillMaxWidth() + .graphicsLayer { + alpha = 1f - (layoutState.progress * 16).coerceAtMost(1f) + } + .drawWithCache { + val offset = 64.dp.toPx() + val x = ((size.width - offset) * player.progress) + offset + + onDrawWithContent { + drawContent() + drawLine( + color = colorPalette.text, + start = Offset( + x = offset, + y = 1.dp.toPx() + ), + end = Offset( + x = x, + y = 1.dp.toPx() + ), + strokeWidth = 2.dp.toPx() + ) + } + } + .background(colorPalette.elevatedBackground) + ) { + AsyncImage( + model = "${player.mediaMetadata.artworkUri}-w$smallThumbnailSize-h$smallThumbnailSize", + contentDescription = null, + contentScale = ContentScale.Crop, + modifier = Modifier + .size(64.dp) + ) + + Column( + verticalArrangement = Arrangement.Center, + modifier = Modifier + .weight(1f) + ) { + BasicText( + text = player.mediaMetadata.title?.toString() ?: "", + style = typography.xs.semiBold, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + BasicText( + text = player.mediaMetadata.artist?.toString() ?: "", + style = typography.xs, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + + when { + player.playbackState == Player.STATE_ENDED || !player.playWhenReady -> Image( + painter = painterResource(R.drawable.play), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable { + if (player.playbackState == Player.STATE_IDLE) { + player.mediaController.prepare() + } + player.mediaController.play() + } + .padding(vertical = 8.dp) + .padding(horizontal = 16.dp) + .size(24.dp) + ) + else -> Image( + painter = painterResource(R.drawable.pause), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable { + player.mediaController.pause() + } + .padding(vertical = 8.dp) + .padding(horizontal = 16.dp) + .size(24.dp) + ) + } + } + } + } + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .background(colorPalette.background) + .padding(bottom = 72.dp) + .fillMaxSize() + ) { + var scrubbingPosition by remember { + mutableStateOf(null) + } + + TopAppBar { + Spacer( + modifier = Modifier + .padding(horizontal = 16.dp, vertical = 8.dp) + .size(24.dp) + ) + + Image( + painter = painterResource(R.drawable.ellipsis_horizontal), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable { + menuState.display { + QueuedMediaItemMenu( + mediaItem = player.mediaItem ?: MediaItem.EMPTY, + indexInQueue = player.mediaItemIndex, + onDismiss = menuState::hide, + onGlobalRouteEmitted = layoutState.collapse + ) + } + } + .padding(horizontal = 16.dp, vertical = 8.dp) + .size(24.dp) + ) + } + + if (player.error == null) { + AnimatedContent( + targetState = player.mediaItemIndex, + transitionSpec = { + val slideDirection = + if (targetState > initialState) AnimatedContentScope.SlideDirection.Left else AnimatedContentScope.SlideDirection.Right + + (slideIntoContainer(slideDirection) + fadeIn() with + slideOutOfContainer(slideDirection) + fadeOut()).using( + SizeTransform(clip = false) + ) + }, + modifier = Modifier + .weight(1f) + .align(Alignment.CenterHorizontally) + ) { + val artworkUri = remember(it) { + player.mediaController.getMediaItemAt(it).mediaMetadata.artworkUri + } + + AsyncImage( + model = "$artworkUri-w$thumbnailSizePx-h$thumbnailSizePx", + contentDescription = null, + modifier = Modifier + .padding(bottom = 32.dp) + .padding(horizontal = 32.dp) + .size(thumbnailSizeDp) + ) + } + } else { + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .align(Alignment.CenterHorizontally) + .padding(bottom = 32.dp) + .padding(horizontal = 32.dp) + .size(thumbnailSizeDp) + ) { +// BasicText( +// text = playerState.error?.message ?: "", +// style = typography.xs.medium +// ) + Error( + error = Outcome.Error.Unhandled(player.error!!), + onRetry = { + player.mediaController.playWhenReady = true + player.mediaController.prepare() + player.error = null + } + ) + } + } + + BasicText( + text = player.mediaMetadata.title?.toString() ?: "", + style = typography.l.bold, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier + .padding(horizontal = 32.dp) + ) + + + BasicText( + text = player.mediaMetadata.extras?.getStringArrayList("artistNames") + ?.joinToString("") ?: "", + style = typography.s.semiBold.secondary, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier + .padding(horizontal = 32.dp) + ) + + AndroidView( + factory = { context -> + DefaultTimeBar(context).also { + it.setPlayedColor(colorPalette.text.toArgb()) + it.setUnplayedColor(colorPalette.textDisabled.toArgb()) + it.setScrubberColor(colorPalette.text.toArgb()) + it.addListener(object : TimeBar.OnScrubListener { + override fun onScrubStart(timeBar: TimeBar, position: Long) = Unit + + override fun onScrubMove(timeBar: TimeBar, position: Long) { + scrubbingPosition = position + } + + override fun onScrubStop( + timeBar: TimeBar, + position: Long, + canceled: Boolean + ) { + if (!canceled) { + scrubbingPosition = position + player.mediaController.seekTo(position) + player.currentPosition = player.mediaController.currentPosition + } + scrubbingPosition = null + } + }) + } + }, + update = { + it.setDuration(player.duration) + it.setPosition(player.currentPosition) + }, + modifier = Modifier + .padding(top = 16.dp) + .padding(horizontal = 32.dp) + .fillMaxWidth() + ) + + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .padding(horizontal = 32.dp) + .fillMaxWidth() + .padding(bottom = 16.dp) + ) { + val text by remember { + derivedStateOf { + DateUtils.formatElapsedTime((scrubbingPosition ?: player.currentPosition) / 1000) + } + } + + BasicText( + text = text, + style = typography.xxs.semiBold, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + + if (player.duration != C.TIME_UNSET) { + BasicText( + text = DateUtils.formatElapsedTime(player.duration / 1000), + style = typography.xxs.semiBold, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + } + + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .padding(vertical = 32.dp) + ) { + Image( + painter = painterResource(R.drawable.heart), + contentDescription = null, + colorFilter = ColorFilter.tint( + song?.likedAt?.let { colorPalette.red } ?: colorPalette.textDisabled + ), + modifier = Modifier + .clickable { + coroutineScope.launch(Dispatchers.IO) { + Database.update( + (song ?: Database.insert(player.mediaItem!!)).toggleLike() + ) + } + } + .padding(horizontal = 16.dp) + .size(28.dp) + ) + + Image( + painter = painterResource(R.drawable.play_skip_back), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable { + player.mediaController.seekToPrevious() + } + .padding(horizontal = 16.dp) + .size(32.dp) + ) + + when { + player.playbackState == Player.STATE_ENDED || !player.playWhenReady -> Image( + painter = painterResource(R.drawable.play_circle), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable { + if (player.playbackState == Player.STATE_IDLE) { + player.mediaController.prepare() + } + + player.mediaController.play() + } + .size(64.dp) + ) + else -> Image( + painter = painterResource(R.drawable.pause_circle), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable { + player.mediaController.pause() + } + .size(64.dp) + ) + } + + Image( + painter = painterResource(R.drawable.play_skip_forward), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.text), + modifier = Modifier + .clickable { + player.mediaController.seekToNext() + } + .padding(horizontal = 16.dp) + .size(32.dp) + ) + + + Image( + painter = painterResource( + if (player.repeatMode == Player.REPEAT_MODE_ONE) { + R.drawable.repeat_one + } else { + R.drawable.repeat + } + ), + contentDescription = null, + colorFilter = ColorFilter.tint( + if (player.repeatMode == Player.REPEAT_MODE_OFF) { + colorPalette.textDisabled + } else { + colorPalette.text + } + ), + modifier = Modifier + .clickable { + player.mediaController.repeatMode = + (player.mediaController.repeatMode + 2) % 3 + preferences.repeatMode = player.mediaController.repeatMode + } + .padding(horizontal = 16.dp) + .size(28.dp) + ) + } + } + + PlayerBottomSheet( + layoutState = rememberBottomSheetState(64.dp, layoutState.upperBound - 128.dp), + onGlobalRouteEmitted = layoutState.collapse, + modifier = Modifier + .padding(bottom = 128.dp) + .align(Alignment.BottomCenter) + ) + } +} + diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlaylistPreviewItem.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlaylistPreviewItem.kt new file mode 100644 index 0000000..e50d2f0 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/PlaylistPreviewItem.kt @@ -0,0 +1,100 @@ +package it.vfsfitvnm.vimusic.ui.views + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.text.BasicText +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage +import it.vfsfitvnm.vimusic.Database +import it.vfsfitvnm.vimusic.models.PlaylistPreview +import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette +import it.vfsfitvnm.vimusic.ui.styling.LocalTypography +import it.vfsfitvnm.vimusic.utils.color +import it.vfsfitvnm.vimusic.utils.semiBold +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.distinctUntilChanged + +@Composable +fun PlaylistPreviewItem( + playlistPreview: PlaylistPreview, + modifier: Modifier = Modifier, + thumbnailSize: Dp = 54.dp, +) { + val colorPalette = LocalColorPalette.current + val typography = LocalTypography.current + val density = LocalDensity.current + + val thumbnailSizePx = density.run { + thumbnailSize.toPx().toInt() + } + + val thumbnails by remember(playlistPreview.playlist.id) { + Database.playlistThumbnailUrls(playlistPreview.playlist.id).distinctUntilChanged() + }.collectAsState(initial = emptyList(), context = Dispatchers.IO) + + Box( + modifier = modifier + .background(colorPalette.lightBackground) + .size(thumbnailSize * 2) + ) { + if (thumbnails.toSet().size == 1) { + AsyncImage( + model = "${thumbnails.first()}-w${thumbnailSizePx * 2}-h${thumbnailSizePx * 2}", + contentDescription = null, + contentScale = ContentScale.Crop, + modifier = Modifier + .size(thumbnailSize * 2) + ) + } else { + listOf( + Alignment.TopStart, + Alignment.TopEnd, + Alignment.BottomStart, + Alignment.BottomEnd + ).forEachIndexed { index, alignment -> + AsyncImage( + model = "${thumbnails.getOrNull(index)}-w$thumbnailSizePx-h$thumbnailSizePx", + contentDescription = null, + contentScale = ContentScale.Crop, + modifier = Modifier + .align(alignment) + .size(thumbnailSize) + ) + } + } + + BasicText( + text = playlistPreview.playlist.name, + style = typography.xxs.semiBold.color(Color.White), + maxLines = 2, + overflow = TextOverflow.Ellipsis, + modifier = Modifier + .fillMaxWidth() + .align(Alignment.BottomStart) + .background( + Brush.verticalGradient( + colors = listOf( + Color.Transparent, + Color.Black.copy(alpha = 0.75f) + ) + ) + ) + .padding(horizontal = 8.dp, vertical = 4.dp) + ) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/SongItem.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/SongItem.kt new file mode 100644 index 0000000..70a15ac --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/ui/views/SongItem.kt @@ -0,0 +1,199 @@ +package it.vfsfitvnm.vimusic.ui.views + +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.text.BasicText +import androidx.compose.material.ripple.rememberRipple +import androidx.compose.runtime.Composable +import androidx.compose.runtime.NonRestartableComposable +import androidx.compose.runtime.ReadOnlyComposable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.media3.common.MediaItem +import coil.compose.AsyncImage +import coil.request.ImageRequest +import it.vfsfitvnm.vimusic.ui.components.LocalMenuState +import it.vfsfitvnm.vimusic.R +import it.vfsfitvnm.vimusic.models.SongWithInfo +import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette +import it.vfsfitvnm.vimusic.ui.styling.LocalTypography +import it.vfsfitvnm.vimusic.utils.secondary +import it.vfsfitvnm.vimusic.utils.semiBold + + +@ExperimentalAnimationApi +@Composable +@NonRestartableComposable +fun SongItem( + mediaItem: MediaItem, + thumbnailSize: Int, + onClick: () -> Unit, + menuContent: @Composable () -> Unit, + modifier: Modifier = Modifier, + backgroundColor: Color? = null, + onThumbnailContent: (@Composable BoxScope.() -> Unit)? = null, +) { + SongItem( + thumbnailModel = ImageRequest.Builder(LocalContext.current) + .diskCacheKey(mediaItem.mediaId) + .data("${mediaItem.mediaMetadata.artworkUri}-w$thumbnailSize-h$thumbnailSize") + .build(), + title = mediaItem.mediaMetadata.title!!.toString(), + authors = mediaItem.mediaMetadata.artist.toString(), + durationText = mediaItem.mediaMetadata.extras?.getString("durationText") ?: "?", + menuContent = menuContent, + onClick = onClick, + onThumbnailContent = onThumbnailContent, + backgroundColor = backgroundColor, + modifier = modifier, + ) +} + +@ExperimentalAnimationApi +@Composable +@NonRestartableComposable +fun SongItem( + song: SongWithInfo, + thumbnailSize: Int, + onClick: () -> Unit, + menuContent: @Composable () -> Unit, + modifier: Modifier = Modifier, + backgroundColor: Color? = null, + onThumbnailContent: (@Composable BoxScope.() -> Unit)? = null, +) { + SongItem( + thumbnailModel = "${song.song.thumbnailUrl}-w$thumbnailSize-h$thumbnailSize", + title = song.song.title, + authors = song.authors?.joinToString("") { it.text } ?: "", + durationText = song.song.durationText, + menuContent = menuContent, + onClick = onClick, + onThumbnailContent = onThumbnailContent, + backgroundColor = backgroundColor, + modifier = modifier, + ) +} + + +@ExperimentalAnimationApi +@Composable +@NonRestartableComposable +fun SongItem( + thumbnailModel: Any?, + title: String, + authors: String, + durationText: String, + onClick: () -> Unit, + menuContent: @Composable () -> Unit, + modifier: Modifier = Modifier, + backgroundColor: Color? = null, + onThumbnailContent: (@Composable BoxScope.() -> Unit)? = null, +) { + SongItem( + title = title, + authors = authors, + durationText = durationText, + onClick = onClick, + startContent = { + Box( + modifier = Modifier + .size(54.dp) + ) { + AsyncImage( + model = thumbnailModel, + contentDescription = null, + contentScale = ContentScale.Crop, + modifier = Modifier + .fillMaxSize() + ) + + onThumbnailContent?.invoke(this) + } + }, + menuContent = menuContent, + backgroundColor = backgroundColor, + modifier = modifier, + ) +} + +@ExperimentalAnimationApi +@Composable +fun SongItem( + title: String, + authors: String, + durationText: String?, + onClick: () -> Unit, + startContent: @Composable () -> Unit, + menuContent: @Composable () -> Unit, + modifier: Modifier = Modifier, + backgroundColor: Color? = null, +) { + val menuState = LocalMenuState.current + val colorPalette = LocalColorPalette.current + val typography = LocalTypography.current + + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp), + modifier = modifier + .clickable( + indication = rememberRipple(bounded = true), + interactionSource = remember { MutableInteractionSource() }, + onClick = onClick + ) + .fillMaxWidth() + .padding(vertical = 4.dp) + .background(backgroundColor ?: colorPalette.background) + .padding(start = 16.dp, end = 8.dp) + ) { + startContent() + + Column( + modifier = Modifier + .weight(1f) + ) { + BasicText( + text = title, + style = typography.xs.semiBold, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + BasicText( + text = buildString { + append(authors) + if (authors.isNotEmpty() && durationText != null) { + append(" • ") + } + append(durationText) + }, + style = typography.xs.semiBold.secondary, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + + Image( + painter = painterResource(R.drawable.ellipsis_vertical), + contentDescription = null, + colorFilter = ColorFilter.tint(colorPalette.textSecondary), + modifier = Modifier + .clickable { + menuState.display(menuContent) + } + .padding(horizontal = 8.dp, vertical = 4.dp) + .size(20.dp) + ) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/Player.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/Player.kt new file mode 100644 index 0000000..0f09d39 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/Player.kt @@ -0,0 +1,44 @@ +package it.vfsfitvnm.vimusic.utils + +import androidx.media3.common.MediaItem +import androidx.media3.common.Player +import androidx.media3.common.Timeline + + +fun Player.forcePlay(mediaItem: MediaItem) { + setMediaItem(mediaItem, true) + playWhenReady = true + prepare() +} + +fun Player.forcePlayAtIndex(mediaItems: List, mediaItemIndex: Int) { + if (mediaItems.isEmpty()) return + + setMediaItems(mediaItems, true) + playWhenReady = true + seekToDefaultPosition(mediaItemIndex) + prepare() +} + +fun Player.forcePlayFromBeginning(mediaItems: List) = + forcePlayAtIndex(mediaItems, 0) + +val Player.lastMediaItem: MediaItem? + get() = mediaItemCount.takeIf { it > 0 }?.let { it - 1 }?.let(::getMediaItemAt) + +val Timeline.mediaItems: List + get() = (0 until windowCount).map { index -> + getWindow(index, Timeline.Window()).mediaItem + } + +fun Player.addNext(mediaItem: MediaItem) { + addMediaItem(currentMediaItemIndex + 1, mediaItem) +} + +fun Player.enqueue(mediaItem: MediaItem) { + addMediaItem(mediaItemCount, mediaItem) +} + +fun Player.enqueue(mediaItems: List) { + addMediaItems(mediaItemCount, mediaItems) +} \ No newline at end of file diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/PlayerState.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/PlayerState.kt new file mode 100644 index 0000000..7f832ec --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/PlayerState.kt @@ -0,0 +1,92 @@ +package it.vfsfitvnm.vimusic.utils + +import android.os.Handler +import android.os.Looper +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.media3.common.* +import androidx.media3.session.MediaController +import kotlin.math.absoluteValue + +open class PlayerState(val mediaController: MediaController) : Player.Listener { + private val handler = Handler(Looper.getMainLooper()) + + var currentPosition by mutableStateOf(mediaController.currentPosition) + + var duration by mutableStateOf(mediaController.duration) + private set + + val progress: Float + get() = currentPosition.toFloat() / duration.absoluteValue + + var playbackState by mutableStateOf(mediaController.playbackState) + private set + + var mediaItemIndex by mutableStateOf(mediaController.currentMediaItemIndex) + private set + + var mediaItem by mutableStateOf(mediaController.currentMediaItem) + private set + + var mediaMetadata by mutableStateOf(mediaController.mediaMetadata) + private set + + var isPlaying by mutableStateOf(mediaController.isPlaying) + private set + + var playWhenReady by mutableStateOf(mediaController.playWhenReady) + private set + + var repeatMode by mutableStateOf(mediaController.repeatMode) + private set + + var error by mutableStateOf(mediaController.playerError) + + var mediaItems by mutableStateOf(mediaController.currentTimeline.mediaItems) + private set + + init { + handler.post(object : Runnable { + override fun run() { + duration = mediaController.duration + currentPosition = mediaController.currentPosition + handler.postDelayed(this, 500) + } + }) + } + + override fun onPlaybackStateChanged(playbackState: Int) { + this.playbackState = playbackState + } + + override fun onMediaMetadataChanged(mediaMetadata: MediaMetadata) { + this.mediaMetadata = mediaMetadata + } + + override fun onIsPlayingChanged(isPlaying: Boolean) { + this.isPlaying = isPlaying + } + + override fun onPlayWhenReadyChanged(playWhenReady: Boolean, reason: Int) { + this.playWhenReady = playWhenReady + } + + override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) { + this.mediaItem = mediaItem + mediaItemIndex = mediaController.currentMediaItemIndex + } + + override fun onRepeatModeChanged(repeatMode: Int) { + this.repeatMode = repeatMode + } + + override fun onPlayerError(playbackException: PlaybackException) { + error = playbackException + } + + override fun onTimelineChanged(timeline: Timeline, reason: Int) { + mediaItems = timeline.mediaItems + mediaItemIndex = mediaController.currentMediaItemIndex + } +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/Preferences.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/Preferences.kt new file mode 100644 index 0000000..f38b2f3 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/Preferences.kt @@ -0,0 +1,108 @@ +package it.vfsfitvnm.vimusic.utils + +import android.content.Context +import android.content.SharedPreferences +import androidx.compose.runtime.* +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.TextUnit +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.core.content.edit +import androidx.media3.common.Player +import it.vfsfitvnm.vimusic.enums.SongCollection +import it.vfsfitvnm.youtubemusic.YouTube + +@Stable +class Preferences(holder: SharedPreferences) : SharedPreferences by holder { + var searchFilter by preference("searchFilter", YouTube.Item.Song.Filter.value) + var repeatMode by preference("repeatMode", Player.REPEAT_MODE_OFF) + var homePageSongCollection by preference("homePageSongCollection", SongCollection.MostPlayed) +} + +val LocalPreferences = staticCompositionLocalOf { TODO() } + +@Composable +fun rememberPreferences(): Preferences { + val context = LocalContext.current + return remember { + Preferences(context.getSharedPreferences("preferences", Context.MODE_PRIVATE)) + } +} + +private fun SharedPreferences.preference(key: String, defaultValue: Boolean) = + mutableStateOf(value = getBoolean(key, defaultValue)) { + edit { + putBoolean(key, it) + } + } + +private fun SharedPreferences.preference(key: String, defaultValue: Int) = + mutableStateOf(value = getInt(key, defaultValue)) { + edit { + putInt(key, it) + } + } + +private fun SharedPreferences.preference(key: String, defaultValue: Long) = + mutableStateOf(value = getLong(key, defaultValue)) { + edit { + putLong(key, it) + } + } + +private fun SharedPreferences.preference(key: String, defaultValue: Float) = + mutableStateOf(value = getFloat(key, defaultValue)) { + edit { + putFloat(key, it) + } + } + +private fun SharedPreferences.preference(key: String, defaultValue: String) = + mutableStateOf(value = getString(key, defaultValue)!!) { + edit { + putString(key, it) + } + } + +private fun SharedPreferences.preference(key: String, defaultValue: Set) = + mutableStateOf(value = getStringSet(key, defaultValue)!!) { + edit { + putStringSet(key, it) + } + } + +private fun SharedPreferences.preference(key: String, defaultValue: Dp) = + mutableStateOf(value = getFloat(key, defaultValue.value).dp) { + edit { + putFloat(key, it.value) + } + } + +private fun SharedPreferences.preference(key: String, defaultValue: TextUnit) = + mutableStateOf(value = getFloat(key, defaultValue.value).sp) { + edit { + putFloat(key, it.value) + } + } + +private inline fun > SharedPreferences.preference( + key: String, + defaultValue: T +) = + mutableStateOf(value = enumValueOf(getString(key, defaultValue.name)!!)) { + edit { + putString(key, it.name) + } + } + +private fun mutableStateOf(value: T, onStructuralInequality: (newValue: T) -> Unit) = + mutableStateOf( + value = value, + policy = object : SnapshotMutationPolicy { + override fun equivalent(a: T, b: T): Boolean { + val areEquals = a == b + if (!areEquals) onStructuralInequality(b) + return areEquals + } + }) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/RelaunchableEffect.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/RelaunchableEffect.kt new file mode 100644 index 0000000..74987a0 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/RelaunchableEffect.kt @@ -0,0 +1,19 @@ + +@file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") +@file:OptIn(InternalComposeApi::class) + +package it.vfsfitvnm.vimusic.utils + +import androidx.compose.runtime.* +import kotlinx.coroutines.CoroutineScope + +@Composable +@NonRestartableComposable +fun relaunchableEffect( + key1: Any?, + block: suspend CoroutineScope.() -> Unit +): () -> Unit { + val applyContext = currentComposer.applyCoroutineContext + val launchedEffect = remember(key1) { LaunchedEffectImpl(applyContext, block) } + return launchedEffect::onRemembered +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/RingBuffer.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/RingBuffer.kt new file mode 100644 index 0000000..64be0c3 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/RingBuffer.kt @@ -0,0 +1,11 @@ +package it.vfsfitvnm.vimusic.utils + +class RingBuffer(val size: Int, init: (index: Int) -> T) { + private val list = MutableList(2, init) + + private var index = 0 + + fun getOrNull(index: Int): T? = list.getOrNull(index) + + fun append(element: T) = list.set(index++ % size, element) +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/TextStyle.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/TextStyle.kt new file mode 100644 index 0000000..6002856 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/TextStyle.kt @@ -0,0 +1,43 @@ +package it.vfsfitvnm.vimusic.utils + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette + +fun TextStyle.style(style: FontStyle) = copy(fontStyle = style) + +fun TextStyle.weight(weight: FontWeight) = copy(fontWeight = weight) + +fun TextStyle.align(align: TextAlign) = copy(textAlign = align) + +fun TextStyle.color(color: Color) = copy(color = color) + +inline val TextStyle.italic: TextStyle + get() = style(FontStyle.Italic) + +inline val TextStyle.medium: TextStyle + get() = weight(FontWeight.Medium) + +inline val TextStyle.semiBold: TextStyle + get() = weight(FontWeight.SemiBold) + +inline val TextStyle.bold: TextStyle + get() = weight(FontWeight.Bold) + +inline val TextStyle.center: TextStyle + get() = align(TextAlign.Center) + +inline val TextStyle.secondary: TextStyle + @Composable + @ReadOnlyComposable + get() = color(LocalColorPalette.current.textSecondary) + +inline val TextStyle.disabled: TextStyle + @Composable + @ReadOnlyComposable + get() = color(LocalColorPalette.current.textDisabled) diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/YoutubePlayer.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/YoutubePlayer.kt new file mode 100644 index 0000000..efbdf14 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/YoutubePlayer.kt @@ -0,0 +1,129 @@ +package it.vfsfitvnm.vimusic.utils + +import androidx.compose.runtime.* +import androidx.media3.common.Player +import androidx.media3.session.MediaController +import com.google.common.util.concurrent.ListenableFuture +import it.vfsfitvnm.youtubemusic.Outcome +import it.vfsfitvnm.youtubemusic.YouTube +import it.vfsfitvnm.youtubemusic.models.NavigationEndpoint +import kotlinx.coroutines.* +import kotlinx.coroutines.guava.await +import kotlinx.coroutines.sync.Mutex + +class YoutubePlayer(mediaController: MediaController) : PlayerState(mediaController) { + object Radio { + var isActive by mutableStateOf(false) + + var listener: Listener? = null + + private var videoId: String? = null + private var playlistId: String? = null + private var playlistSetVideoId: String? = null + private var parameters: String? = null + + var nextContinuation by mutableStateOf>(Outcome.Initial) + + fun setup(videoId: String? = null, playlistId: String? = null, playlistSetVideoId: String? = null, parameters: String? = null) { + this.videoId = videoId + this.playlistId = playlistId + this.playlistSetVideoId = playlistSetVideoId + this.parameters = parameters + + isActive = true + nextContinuation = Outcome.Initial + } + + fun setup(watchEndpoint: NavigationEndpoint.Endpoint.Watch?) { + setup( + videoId = watchEndpoint?.videoId, + playlistId = watchEndpoint?.playlistId, + parameters = watchEndpoint?.params, + playlistSetVideoId = watchEndpoint?.playlistSetVideoId + ) + + listener?.process(true) + } + + suspend fun process(player: Player, force: Boolean = false, play: Boolean = false) { + if (!isActive) return + + if (!force && !play) { + val isFirstSong = withContext(Dispatchers.Main) { + player.mediaItemCount == 0 || (player.currentMediaItemIndex == 0 && player.mediaItemCount == 1) + } + val isNearEndSong = withContext(Dispatchers.Main) { + player.mediaItemCount - player.currentMediaItemIndex <= 3 + } + + if (!isFirstSong && !isNearEndSong) { + return + } + } + + val token = nextContinuation.valueOrNull + + nextContinuation = Outcome.Loading + + nextContinuation = withContext(Dispatchers.IO) { + YouTube.next( + videoId = videoId ?: withContext(Dispatchers.Main) { + player.lastMediaItem?.mediaId ?: error("This should not happen") + }, + playlistId = playlistId, + params = parameters, + playlistSetVideoId = playlistSetVideoId, + continuation = token + ) + }.map { nextResult -> + nextResult.items?.map(it.vfsfitvnm.youtubemusic.YouTube.Item.Song::asMediaItem)?.let { mediaItems -> + withContext(Dispatchers.Main) { + if (play) { + player.forcePlayFromBeginning(mediaItems) + } else { + player.addMediaItems(mediaItems.drop(if (token == null) 1 else 0)) + } + } + } + + nextResult.continuation?.takeUnless { token == nextResult.continuation } + }.recoverWith(token) + } + + fun reset() { + videoId = null + playlistId = null + playlistSetVideoId = null + parameters = null + isActive = false + nextContinuation = Outcome.Initial + } + + interface Listener { + fun process(play: Boolean) + } + } +} + +val LocalYoutubePlayer = compositionLocalOf { null } + +@Composable +fun rememberYoutubePlayer( + mediaControllerFuture: ListenableFuture, + repeatMode: Int +): YoutubePlayer? { + val mediaController by produceState(initialValue = null) { + value = mediaControllerFuture.await().also { + it.repeatMode = repeatMode + } + } + + val playerState = remember(mediaController) { + YoutubePlayer(mediaController ?: return@remember null).also { + // TODO: should we remove the listener later on? + mediaController?.addListener(it) + } + } + + return playerState +} diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/rememberHapticFeedback.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/rememberHapticFeedback.kt new file mode 100644 index 0000000..ef0fa42 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/rememberHapticFeedback.kt @@ -0,0 +1,24 @@ +package it.vfsfitvnm.vimusic.utils + +import android.view.HapticFeedbackConstants +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.hapticfeedback.HapticFeedback +import androidx.compose.ui.hapticfeedback.HapticFeedbackType +import androidx.compose.ui.platform.LocalView + +@Composable +fun rememberHapticFeedback(): HapticFeedback { + val view = LocalView.current + + return remember { + object : HapticFeedback { + override fun performHapticFeedback(hapticFeedbackType: HapticFeedbackType) { + view.performHapticFeedback( + HapticFeedbackConstants.LONG_PRESS, + HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/utils.kt b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/utils.kt new file mode 100644 index 0000000..d213886 --- /dev/null +++ b/app/src/main/kotlin/it/vfsfitvnm/vimusic/utils/utils.kt @@ -0,0 +1,172 @@ +package it.vfsfitvnm.vimusic.utils + +import android.content.Context +import android.content.Intent +import androidx.core.net.toUri +import androidx.core.os.bundleOf +import androidx.media3.common.MediaItem +import androidx.media3.common.MediaMetadata +import it.vfsfitvnm.vimusic.Database +import it.vfsfitvnm.vimusic.internal +import it.vfsfitvnm.vimusic.models.Info +import it.vfsfitvnm.vimusic.models.Song +import it.vfsfitvnm.vimusic.models.SongWithAuthors +import it.vfsfitvnm.vimusic.models.SongWithInfo +import it.vfsfitvnm.youtubemusic.YouTube + +fun Context.shareAsYouTubeSong(mediaItem: MediaItem) { + val sendIntent = Intent().apply { + action = Intent.ACTION_SEND + type = "text/plain" + putExtra(Intent.EXTRA_TEXT, "https://music.youtube.com/watch?v=${mediaItem.mediaId}") + } + + startActivity(Intent.createChooser(sendIntent, null)) +} + +fun Database.insert(mediaItem: MediaItem): Song { + return internal.runInTransaction { + Database.song(mediaItem.mediaId)?.let { + return@runInTransaction it + } + + val albumInfo = mediaItem.mediaMetadata.extras?.getString("albumId")?.let { albumId -> + Info( + text = mediaItem.mediaMetadata.albumTitle!!.toString(), + browseId = albumId + ) + } + + val albumInfoId = albumInfo?.let { insert(it) } + + val authorsInfo = + mediaItem.mediaMetadata.extras?.getStringArrayList("artistNames")?.let { artistNames -> + mediaItem.mediaMetadata.extras!!.getStringArrayList("artistIds")?.let { artistIds -> + artistNames.mapIndexed { index, artistName -> + Info( + text = artistName, + browseId = artistIds.getOrNull(index) + ) + } + } + } + + val song = Song( + id = mediaItem.mediaId, + title = mediaItem.mediaMetadata.title!!.toString(), + albumInfoId = albumInfoId, + durationText = mediaItem.mediaMetadata.extras?.getString("durationText")!!, + thumbnailUrl = mediaItem.mediaMetadata.artworkUri!!.toString() + ) + + insert(song) + + val authorsInfoId = authorsInfo?.let { insert(authorsInfo) } + + authorsInfoId?.forEach { authorInfoId -> + insert( + SongWithAuthors( + songId = mediaItem.mediaId, + authorInfoId = authorInfoId + ) + ) + } + + return@runInTransaction song + } +} + +val YouTube.Item.Song.asMediaItem: MediaItem + get() = MediaItem.Builder() + .setMediaId(info.endpoint!!.videoId) + .setUri(info.endpoint!!.videoId) + .setCustomCacheKey(info.endpoint!!.videoId) + .setMediaMetadata( + MediaMetadata.Builder() + .setTitle(info.name) + .setArtist(authors.joinToString("") { it.name }) + .setAlbumTitle(album?.name) + .setArtworkUri(thumbnail.url.toUri()) + .setExtras( + bundleOf( + "videoId" to info.endpoint!!.videoId, + "albumId" to album?.endpoint?.browseId, + "durationText" to durationText, + "artistNames" to authors.map { it.name }, + "artistIds" to authors.map { it.endpoint?.browseId }, + ) + ) + .build() + ) + .build() + +val YouTube.Item.Video.asMediaItem: MediaItem + get() = MediaItem.Builder() + .setMediaId(info.endpoint!!.videoId) + .setUri(info.endpoint!!.videoId) + .setCustomCacheKey(info.endpoint!!.videoId) + .setMediaMetadata( + MediaMetadata.Builder() + .setTitle(info.name) + .setArtist(authors.joinToString("") { it.name }) + .setArtworkUri(thumbnail.url.toUri()) + .setExtras( + bundleOf( + "videoId" to info.endpoint!!.videoId, + "durationText" to durationText, + "artistNames" to if (isOfficialMusicVideo) authors.map { it.name } else null, + "artistIds" to if (isOfficialMusicVideo) authors.map { it.endpoint?.browseId } else null, + ) + ) + .build() + ) + .build() + +val SongWithInfo.asMediaItem: MediaItem + get() = MediaItem.Builder() + .setMediaMetadata( + MediaMetadata.Builder() + .setTitle(song.title) + .setArtist(authors?.joinToString("") { it.text }) + .setAlbumTitle(album?.text) + .setArtworkUri(song.thumbnailUrl?.toUri()) + .setExtras( + bundleOf( + "videoId" to song.id, + "albumId" to album?.browseId, + "artistNames" to authors?.map { it.text }, + "artistIds" to authors?.map { it.browseId }, + "durationText" to song.durationText + ) + ) + .build() + ) + .setMediaId(song.id) + .build() + +fun YouTube.AlbumItem.toMediaItem( + albumId: String, + album: YouTube.Album +): MediaItem? { + return MediaItem.Builder() + .setMediaMetadata( + MediaMetadata.Builder() + .setTitle(info.name) + .setArtist((authors ?: album.authors).joinToString("") { it.name }) + .setAlbumTitle(album.title) + .setArtworkUri(album.thumbnail.url.toUri()) + .setExtras( + bundleOf( + "videoId" to info.endpoint?.videoId, + "playlistId" to info.endpoint?.playlistId, + "albumId" to albumId, + "durationText" to durationText, + "artistNames" to (authors ?: album.authors).map { it.name }, + "artistIds" to (authors ?: album.authors).map { it.endpoint?.browseId } + ) + ) + .build() + ) + .setMediaId(info.endpoint?.videoId ?: return null) + .build() +} \ No newline at end of file diff --git a/app/src/main/res/drawable/add.xml b/app/src/main/res/drawable/add.xml new file mode 100644 index 0000000..a522620 --- /dev/null +++ b/app/src/main/res/drawable/add.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/alert_circle.xml b/app/src/main/res/drawable/alert_circle.xml new file mode 100644 index 0000000..6300810 --- /dev/null +++ b/app/src/main/res/drawable/alert_circle.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/app_icon.xml b/app/src/main/res/drawable/app_icon.xml new file mode 100644 index 0000000..8cafd0a --- /dev/null +++ b/app/src/main/res/drawable/app_icon.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/drawable/arrow_forward.xml b/app/src/main/res/drawable/arrow_forward.xml new file mode 100644 index 0000000..386591b --- /dev/null +++ b/app/src/main/res/drawable/arrow_forward.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/chevron_back.xml b/app/src/main/res/drawable/chevron_back.xml new file mode 100644 index 0000000..1b7aef3 --- /dev/null +++ b/app/src/main/res/drawable/chevron_back.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/drawable/close.xml b/app/src/main/res/drawable/close.xml new file mode 100644 index 0000000..3b93ed8 --- /dev/null +++ b/app/src/main/res/drawable/close.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/disc.xml b/app/src/main/res/drawable/disc.xml new file mode 100644 index 0000000..6649e6f --- /dev/null +++ b/app/src/main/res/drawable/disc.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/disc_placeholder.xml b/app/src/main/res/drawable/disc_placeholder.xml new file mode 100644 index 0000000..64c4cb8 --- /dev/null +++ b/app/src/main/res/drawable/disc_placeholder.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ellipsis_horizontal.xml b/app/src/main/res/drawable/ellipsis_horizontal.xml new file mode 100644 index 0000000..2016bf8 --- /dev/null +++ b/app/src/main/res/drawable/ellipsis_horizontal.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ellipsis_vertical.xml b/app/src/main/res/drawable/ellipsis_vertical.xml new file mode 100644 index 0000000..595e74b --- /dev/null +++ b/app/src/main/res/drawable/ellipsis_vertical.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/heart.xml b/app/src/main/res/drawable/heart.xml new file mode 100644 index 0000000..01d5418 --- /dev/null +++ b/app/src/main/res/drawable/heart.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/heart_dislike.xml b/app/src/main/res/drawable/heart_dislike.xml new file mode 100644 index 0000000..be909f6 --- /dev/null +++ b/app/src/main/res/drawable/heart_dislike.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..18d9456 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/app/src/main/res/drawable/list.xml b/app/src/main/res/drawable/list.xml new file mode 100644 index 0000000..6deb54e --- /dev/null +++ b/app/src/main/res/drawable/list.xml @@ -0,0 +1,48 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/pause.xml b/app/src/main/res/drawable/pause.xml new file mode 100644 index 0000000..3280645 --- /dev/null +++ b/app/src/main/res/drawable/pause.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/pause_circle.xml b/app/src/main/res/drawable/pause_circle.xml new file mode 100644 index 0000000..bd2c5c7 --- /dev/null +++ b/app/src/main/res/drawable/pause_circle.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/pencil.xml b/app/src/main/res/drawable/pencil.xml new file mode 100644 index 0000000..c1c2df0 --- /dev/null +++ b/app/src/main/res/drawable/pencil.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/person.xml b/app/src/main/res/drawable/person.xml new file mode 100644 index 0000000..4fcfdc8 --- /dev/null +++ b/app/src/main/res/drawable/person.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/play.xml b/app/src/main/res/drawable/play.xml new file mode 100644 index 0000000..af49010 --- /dev/null +++ b/app/src/main/res/drawable/play.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/play_circle.xml b/app/src/main/res/drawable/play_circle.xml new file mode 100644 index 0000000..224b3eb --- /dev/null +++ b/app/src/main/res/drawable/play_circle.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/play_skip_back.xml b/app/src/main/res/drawable/play_skip_back.xml new file mode 100644 index 0000000..14602d8 --- /dev/null +++ b/app/src/main/res/drawable/play_skip_back.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/play_skip_forward.xml b/app/src/main/res/drawable/play_skip_forward.xml new file mode 100644 index 0000000..24f14c4 --- /dev/null +++ b/app/src/main/res/drawable/play_skip_forward.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/radio.xml b/app/src/main/res/drawable/radio.xml new file mode 100644 index 0000000..9511af1 --- /dev/null +++ b/app/src/main/res/drawable/radio.xml @@ -0,0 +1,27 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/repeat.xml b/app/src/main/res/drawable/repeat.xml new file mode 100644 index 0000000..65e522f --- /dev/null +++ b/app/src/main/res/drawable/repeat.xml @@ -0,0 +1,34 @@ + + + + + + diff --git a/app/src/main/res/drawable/repeat_one.xml b/app/src/main/res/drawable/repeat_one.xml new file mode 100644 index 0000000..26013d7 --- /dev/null +++ b/app/src/main/res/drawable/repeat_one.xml @@ -0,0 +1,41 @@ + + + + + + + diff --git a/app/src/main/res/drawable/sad.xml b/app/src/main/res/drawable/sad.xml new file mode 100644 index 0000000..502d7a0 --- /dev/null +++ b/app/src/main/res/drawable/sad.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/search.xml b/app/src/main/res/drawable/search.xml new file mode 100644 index 0000000..7a42efa --- /dev/null +++ b/app/src/main/res/drawable/search.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/share_social.xml b/app/src/main/res/drawable/share_social.xml new file mode 100644 index 0000000..3565911 --- /dev/null +++ b/app/src/main/res/drawable/share_social.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/shuffle.xml b/app/src/main/res/drawable/shuffle.xml new file mode 100644 index 0000000..439e8d6 --- /dev/null +++ b/app/src/main/res/drawable/shuffle.xml @@ -0,0 +1,41 @@ + + + + + + + diff --git a/app/src/main/res/drawable/text.xml b/app/src/main/res/drawable/text.xml new file mode 100644 index 0000000..0755fea --- /dev/null +++ b/app/src/main/res/drawable/text.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/time.xml b/app/src/main/res/drawable/time.xml new file mode 100644 index 0000000..13be868 --- /dev/null +++ b/app/src/main/res/drawable/time.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/trash.xml b/app/src/main/res/drawable/trash.xml new file mode 100644 index 0000000..9025eaa --- /dev/null +++ b/app/src/main/res/drawable/trash.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/font/poppins_w300.ttf b/app/src/main/res/font/poppins_w300.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2ab022196b0fad3910d38ae050ab6814be931799 GIT binary patch literal 159848 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/font/poppins_w400.ttf b/app/src/main/res/font/poppins_w400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9f0c71b70a49664ced448c63edc9c4ff2bf8cf4a GIT binary patch literal 158240 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

    ?;_d7QR+e3!@*M~gh!9Dwgr*NHqmUgQ}MAnciU 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%0AC7VmlS@LZ-TEZV}oirP&oT11@@uCp8_l( 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 + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..7353dbd --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..afe9f1c8560d1669b90ca4492d24f4edb876d591 GIT binary patch literal 1639 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..2246402c47cc919cac203ba065b1bc45e5a50868 GIT binary patch literal 5219 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..377fe4460fd4cadf60779762d2ec81189c2647d7 GIT binary patch literal 3605 zcmahMc{CL6wwT5?$dW>3=ckMd!&0$Nc~3N!2f2B9Qn6Jz7R!b02}P&7)HF+ilko8*~V zMSdbVXkwEqUBc3!@Gh?~>jQ0QK&B}adq=|=>Ki5eglYV;fG(R}!D<6*Y)N?+*SUI0 zU#&dPzHj}~wNr|+5!JtngP9jP8d1Q5Wrjh&0I>onS%xa&;Nxh0kD(^yGRjR1BhMb) zN_FC~d1tbIgD)EVEOd2&bwrK(Iq4Fg%U?VA!2{;&vS4wy5-y#(7avv3?Slehh~^^S zWD2B2&@cyFWOBJ4wp#}6GU3@LrSdu(`0!fBGqlrKCRT0Fr>It+6m+|D8Tu7#8CE?y zns!^gDP3Y?Rr*nwX_fdbuja6)FFvZi&(-^hKL!4BAw`1;?7E<(Dn3ENM{bwzsRfjE4&@y%2)7b6dTgng$d~j*!J(|dR#ol*z3A?bo1^XqJh2LqNjgf#pL;8_0N|JYp>5Pv&#Aiqs7At zb?~h@>qPC3SLEDoIn=mk-Bt^7az8rLWJ!N_eql4HJV?gf=-nY_n-P-Nr6wGX*?;k8I z&wl=^lP9Zc*73|f9L9eiPNoS{#*~E_ugk+fM7=OLeefE0pje>oowK6lOq{w|aYgRJ zMY$@__vzAnpic?v@}z8POUijCPSmFCFPAXN&rHQ8jD6NQneOXN`q4*(F9{%}&33cE zLMV=KPfwc~Y;6i8@xPEiOUUJn1Z;?|o>ph(cJhd1S4Om28HN-N345i&ZCU-0Yu6MD~!F;*+jc=2qApP3Xaf_njQtzFrC@^D{0q0+Ga_5zDQ$#{K-zcVYPBrWn{-`_HKqOJ&ojSzoc*=sU{*Wl`p zgMC_de9W~pkeSwUW4z3@%1pOrN1LCIj4exC_=bekh`R1bv?l|?MYKw@(>eIPD;Q|4 zsG|OO0D~j^|qa)VI0n3^>WZ10z!E&0=j5D$ZlX)z+uRG~hEm_l4{L&zC%K zGlHx~EF|c`NjZFD2NcB~-G`foI^+=qr7Z00P?8~1j6YI6l8^*8xkJL0tHHL0zq%RV z&>aqbBaZ`T5Ws!UwA#}0K2@k)IF*ueTnwV>ALN4oztV1Hb(gs*$WjCK@*J!8L>SKi zMiCpNxPgq~B5kScU^r2?l>m`0vWP!?$GC#z&-YUL=h!8{ZLN}ew*fxb;*G_x}Jrh{C#P{02B9W|t-j>(#5yr;hb|#`b;jKr_ zze6tgQ8qfW5V$)jhqhK78EXUq<0=&0mKKA+lDf?x>`>0aTpK5uSN_AG#6^>?JGnxN zX)c+--a+-%=&k9d4yf_gxchClCoXd~Rm-d8 z!~s5;%$x_)*kjzAam~3BgKJ3qxn-?=rZ?yrQ$ z^WK*^`o1uK4Y%DhZQ*xvJ69E=TT`CO=QS8SgQeLemRTBP#JtSUaicU5mL7npS>rQW z!YrT{3fzZ(GA1jAn!S5RD1mTJrk#rd3R7G1$d;1?PP6VvWR}VPf=C;_`ZR?0+~oj= zCw03C(q_7TqBwm@?scqo;J-%O_o4_(U<2!2Nw@{ejF3IW`DNW^-`eZR`?eHzIeP67 zs<(P~3;njjdPa`=nip%r!CWeYF2{^N)4!5HulUXUtK48XTGrh8t3eYLh|9juEC#c~ zC=p#2Tib2gS76~Sqo2@=C@CM|V#3q6*ZgRHlw&LV@z;};)wPd$1%7;g_w@?BYf1EN zzILex}Wwb zdVX~)6=D1VWKo_8M@HYswZ&*DL+|~#NUN^>7#G8FHt50soe2K>)F9dgY^{fxAi^#) z@&Dr*A@I*&UB{RA3k@*=K`F>8`(Pe;02zGmZZW{66+@qP)Yy3ij|0ap!OSj#%)Pz5 zhSdO?&%Jt2km3!&os(rBWLH_oo=9u&2b&aMY-HBv9ba&|2DR|$rcV0Ai z1x=B_t2Jf<{Qp!LWq^47ordl~@CT9&AtT*W3{$MmOcDYHkSO$gPeJL+si;)b39Ijl z>H2OrJL8O&A{@DGobX6f3j@QZRvu?VNL0YmsLCH?hEnKcol7tr*A~3HT*TjnS*yBW zmbvtXl&pR`pXu{fLi4T@%EGcg@u4g@U02XgSlk6n?|bq0;cMjj-8EI(<+_JX+*l*? z(owt#I(kYD@;ySL-@=U>KerV7Ec)lhH->;7W!xp_Rwd;wUFP3e0h`VS2GgT?LZzC~ zc^Z|7HIhxzypHdNSo`y$(!>##I|<3LRtFm7a6;!i2S%!mVZe2&F)}dF=tvATnrfhi z`6{be=gSFS`!s!Vysf8SA|BX3w0`~rE^2m`v%-5pr@ZYxQHrB8#tQ}SuQ`N{9eO)t z?x6FEzc%(ffwdT3*!rF!gXn1)$a*q8)(|+-UU&p{{-%O+)9m}x zgca8&?_}SC7|o8izw>2in9c9f6%3$~R#bBC4i68Lp&V-V0=7?X+f(h`b7a%gRkv6T zca{*ebwwU7uaYxLNR?q?dDbibhNOoNvD%UUm`90~u`{8gq3&O3I1$x!P-`giY?v4I7o`i5uXzW^Je=b``r literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..07d8d8ad7ced539f6d56e6f77387eac6619bbd42 GIT binary patch literal 8244 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 z + + + + diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..ce20861 --- /dev/null +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #4046BF + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..4a5ddb4 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,18 @@ + + + + + diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..f20ff45 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,16 @@ +buildscript { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } + + dependencies { + classpath("com.android.tools.build", "gradle", "7.2.0") + classpath(kotlin("gradle-plugin", "1.6.21")) + } +} + +tasks.register("clean", Delete::class) { + delete(rootProject.buildDir) +} diff --git a/compose-reordering/.gitignore b/compose-reordering/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/compose-reordering/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/compose-reordering/build.gradle.kts b/compose-reordering/build.gradle.kts new file mode 100644 index 0000000..616e2e7 --- /dev/null +++ b/compose-reordering/build.gradle.kts @@ -0,0 +1,46 @@ +plugins { + id("com.android.library") + kotlin("android") +} + +android { + namespace = "it.vfsfitvnm.reordering" + compileSdk = 32 + + defaultConfig { + minSdk = 21 + targetSdk = 32 + } + + buildTypes { + release { + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt")) + } + } + + sourceSets.all { + kotlin.srcDir("src/$name/kotlin") + } + + buildFeatures { + compose = true + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + composeOptions { + kotlinCompilerExtensionVersion = libs.versions.compose.get() + } + + kotlinOptions { + jvmTarget = "1.8" + } +} + +dependencies { + implementation(libs.compose.foundation) +} \ No newline at end of file diff --git a/compose-reordering/src/main/AndroidManifest.xml b/compose-reordering/src/main/AndroidManifest.xml new file mode 100644 index 0000000..10728cc --- /dev/null +++ b/compose-reordering/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/compose-reordering/src/main/kotlin/it/vfsfitvnm/reordering/ReorderingState.kt b/compose-reordering/src/main/kotlin/it/vfsfitvnm/reordering/ReorderingState.kt new file mode 100644 index 0000000..4e2e6f7 --- /dev/null +++ b/compose-reordering/src/main/kotlin/it/vfsfitvnm/reordering/ReorderingState.kt @@ -0,0 +1,65 @@ +package it.vfsfitvnm.reordering + +import androidx.compose.animation.core.Animatable +import androidx.compose.animation.core.AnimationVector1D +import androidx.compose.animation.core.VectorConverter +import androidx.compose.animation.core.animateIntAsState +import androidx.compose.runtime.* + +class ReorderingState( + draggingIndexState: MutableState, + reachedIndexState: MutableState, + draggingItemSizeState: MutableState, + internal val offset: Animatable, + internal val lastIndex: Int, + internal val areEquals: (Int, Int) -> Boolean +) { + internal var draggingIndex by draggingIndexState + internal var reachedIndex by reachedIndexState + internal var draggingItemSize by draggingItemSizeState + + @Composable + internal fun translationFor(index: Int): State = when (draggingIndex) { + -1 -> derivedStateOf { 0 } + index -> offset.asState() + else -> animateIntAsState( + when (index) { + in (draggingIndex + 1)..reachedIndex -> -draggingItemSize + in reachedIndex until draggingIndex -> draggingItemSize + else -> 0 + } + ) + } +} + +@Composable +fun rememberReorderingState(items: List): ReorderingState { + val draggingIndexState = remember(items) { + mutableStateOf(-1) + } + + val reachedIndexState = remember(items) { + mutableStateOf(-1) + } + + val draggingItemHeightState = remember { + mutableStateOf(0) + } + + val offset = remember(items) { + Animatable(0, Int.VectorConverter) + } + + return remember(items) { + ReorderingState( + draggingIndexState = draggingIndexState, + reachedIndexState = reachedIndexState, + draggingItemSizeState = draggingItemHeightState, + offset = offset, + lastIndex = items.lastIndex, + areEquals = { i, j -> + items[i] == items[j] + } + ) + } +} diff --git a/compose-reordering/src/main/kotlin/it/vfsfitvnm/reordering/dragToReorder.kt b/compose-reordering/src/main/kotlin/it/vfsfitvnm/reordering/dragToReorder.kt new file mode 100644 index 0000000..11f22e9 --- /dev/null +++ b/compose-reordering/src/main/kotlin/it/vfsfitvnm/reordering/dragToReorder.kt @@ -0,0 +1,208 @@ +package it.vfsfitvnm.reordering + +import androidx.compose.foundation.gestures.Orientation +import androidx.compose.foundation.gestures.detectDragGestures +import androidx.compose.foundation.gestures.detectDragGesturesAfterLongPress +import androidx.compose.foundation.layout.offset +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.composed +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.input.pointer.PointerInputChange +import androidx.compose.ui.input.pointer.PointerInputScope +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.zIndex +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import kotlin.math.roundToInt +import kotlin.reflect.KSuspendFunction5 + +private fun Modifier.dragToReorder( + reorderingState: ReorderingState, + index: Int, + orientation: Orientation, + function: KSuspendFunction5 Unit, () -> Unit, () -> Unit, (change: PointerInputChange, dragAmount: Offset) -> Unit, Unit>, + onDragStart: (() -> Unit)? = null, + onMove: (() -> Unit)? = null, + onDragEnd: ((Int) -> Unit)? = null +): Modifier = composed { + val coroutineScope = rememberCoroutineScope() + val translation by reorderingState.translationFor(index) + + pointerInput(reorderingState) { +// require(index in 0..reorderingState.lastIndex) + + var previousItemSize = 0 + var nextItemSize = 0 + + function( + this, + { + onDragStart?.invoke() + reorderingState.draggingIndex = index + reorderingState.reachedIndex = index + reorderingState.draggingItemSize = size.height + + nextItemSize = reorderingState.draggingItemSize + previousItemSize = -reorderingState.draggingItemSize + + reorderingState.offset.updateBounds( + lowerBound = -index * reorderingState.draggingItemSize, + upperBound = (reorderingState.lastIndex - index) * reorderingState.draggingItemSize + ) + }, + { + coroutineScope.launch { + reorderingState.offset.animateTo((previousItemSize + nextItemSize) / 2) + + withContext(Dispatchers.Main) { + onDragEnd?.invoke(reorderingState.reachedIndex) + } + + if (reorderingState.areEquals( + reorderingState.draggingIndex, + reorderingState.reachedIndex + ) + ) { + reorderingState.draggingIndex = -1 + reorderingState.reachedIndex = -1 + reorderingState.draggingItemSize = 0 + reorderingState.offset.snapTo(0) + } + } + }, + {}, + { _, offset -> + val delta = when (orientation) { + Orientation.Vertical -> offset.y + Orientation.Horizontal -> offset.x + }.roundToInt() + + val targetOffset = reorderingState.offset.value + delta + + if (targetOffset > nextItemSize) { + if (reorderingState.reachedIndex < reorderingState.lastIndex) { + reorderingState.reachedIndex += 1 + nextItemSize += reorderingState.draggingItemSize + previousItemSize += reorderingState.draggingItemSize + onMove?.invoke() + } + } else if (targetOffset < previousItemSize) { + if (reorderingState.reachedIndex > 0) { + reorderingState.reachedIndex -= 1 + previousItemSize -= reorderingState.draggingItemSize + nextItemSize -= reorderingState.draggingItemSize + onMove?.invoke() + } + } + + coroutineScope.launch { + reorderingState.offset.snapTo(targetOffset) + } + }, + ) + } + .offset { + when (orientation) { + Orientation.Vertical -> IntOffset(0, translation) + Orientation.Horizontal -> IntOffset(translation, 0) + } + } + .zIndex(if (reorderingState.draggingIndex == index) 1f else 0f) +} + +fun Modifier.dragToReorder( + reorderingState: ReorderingState, + index: Int, + orientation: Orientation, + onDragStart: (() -> Unit)? = null, + onMove: (() -> Unit)? = null, + onDragEnd: ((Int) -> Unit)? = null +): Modifier = dragToReorder( + reorderingState = reorderingState, + index = index, + orientation = orientation, + function = PointerInputScope::detectDragGestures, + onDragStart = onDragStart, + onMove = onMove, + onDragEnd = onDragEnd, +) + +fun Modifier.verticalDragToReorder( + reorderingState: ReorderingState, + index: Int, + onDragStart: (() -> Unit)? = null, + onMove: (() -> Unit)? = null, + onDragEnd: ((Int) -> Unit)? = null +): Modifier = dragToReorder( + reorderingState = reorderingState, + index = index, + orientation = Orientation.Vertical, + onDragStart = onDragStart, + onMove = onMove, + onDragEnd = onDragEnd, +) + +fun Modifier.horizontalDragToReorder( + reorderingState: ReorderingState, + index: Int, + onDragStart: (() -> Unit)? = null, + onMove: (() -> Unit)? = null, + onDragEnd: ((Int) -> Unit)? = null +): Modifier = dragToReorder( + reorderingState = reorderingState, + index = index, + orientation = Orientation.Horizontal, + onDragStart = onDragStart, + onMove = onMove, + onDragEnd = onDragEnd, +) + +fun Modifier.dragAfterLongPressToReorder( + reorderingState: ReorderingState, + index: Int, + orientation: Orientation, + onDragStart: (() -> Unit)? = null, + onMove: (() -> Unit)? = null, + onDragEnd: ((Int) -> Unit)? = null +): Modifier = dragToReorder( + reorderingState = reorderingState, + index = index, + orientation = orientation, + function = PointerInputScope::detectDragGesturesAfterLongPress, + onDragStart = onDragStart, + onMove = onMove, + onDragEnd = onDragEnd, +) + +fun Modifier.verticalDragAfterLongPressToReorder( + reorderingState: ReorderingState, + index: Int, + onDragStart: (() -> Unit)? = null, + onMove: (() -> Unit)? = null, + onDragEnd: ((Int) -> Unit)? = null +): Modifier = dragAfterLongPressToReorder( + reorderingState = reorderingState, + index = index, + orientation = Orientation.Vertical, + onDragStart = onDragStart, + onMove = onMove, + onDragEnd = onDragEnd, +) + +fun Modifier.horizontalDragAfterLongPressToReorder( + reorderingState: ReorderingState, + index: Int, + onDragStart: (() -> Unit)? = null, + onMove: (() -> Unit)? = null, + onDragEnd: ((Int) -> Unit)? = null +): Modifier = dragAfterLongPressToReorder( + reorderingState = reorderingState, + index = index, + orientation = Orientation.Horizontal, + onDragStart = onDragStart, + onMove = onMove, + onDragEnd = onDragEnd, +) diff --git a/compose-routing/.gitignore b/compose-routing/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/compose-routing/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/compose-routing/build.gradle.kts b/compose-routing/build.gradle.kts new file mode 100644 index 0000000..89bfbb2 --- /dev/null +++ b/compose-routing/build.gradle.kts @@ -0,0 +1,48 @@ +plugins { + id("com.android.library") + kotlin("android") +} + +android { + namespace = "it.vfsfitvnm.route" + compileSdk = 32 + + defaultConfig { + minSdk = 21 + targetSdk = 32 + } + + buildTypes { + release { + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt")) + } + } + + sourceSets.all { + kotlin.srcDir("src/$name/kotlin") + } + + buildFeatures { + compose = true + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + composeOptions { + kotlinCompilerExtensionVersion = libs.versions.compose.get() + } + + kotlinOptions { + freeCompilerArgs += "-Xcontext-receivers" + jvmTarget = "1.8" + } +} + +dependencies { + implementation(libs.compose.activity) + implementation(libs.compose.foundation) +} \ No newline at end of file diff --git a/compose-routing/src/main/AndroidManifest.xml b/compose-routing/src/main/AndroidManifest.xml new file mode 100644 index 0000000..10728cc --- /dev/null +++ b/compose-routing/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/compose-routing/src/main/kotlin/it/vfsfitvnm/route/Route.kt b/compose-routing/src/main/kotlin/it/vfsfitvnm/route/Route.kt new file mode 100644 index 0000000..df0fc47 --- /dev/null +++ b/compose-routing/src/main/kotlin/it/vfsfitvnm/route/Route.kt @@ -0,0 +1,111 @@ +package it.vfsfitvnm.route + +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.SaverScope +import androidx.compose.runtime.saveable.rememberSaveable + +@Stable +open class Route internal constructor(val tag: String) { + override fun equals(other: Any?): Boolean { + return when { + this === other -> true + other is Route -> tag == other.tag + else -> false + } + } + + override fun hashCode(): Int { + return tag.hashCode() + } + + object GlobalEmitter { + var listener: ((Route) -> Unit)? = null + } + + object Saver : androidx.compose.runtime.saveable.Saver { + override fun restore(value: String): Route? = value.takeIf(String::isNotEmpty)?.let(::Route) + override fun SaverScope.save(value: Route?): String = value?.tag ?: "" + } +} + +@Composable +fun rememberRoute(route: Route? = null): MutableState { + return rememberSaveable(stateSaver = Route.Saver) { + mutableStateOf(route) + } +} + +@Stable +class Route0( + tag: String +) : Route(tag) { + context(RouteHandlerScope) + @Composable + inline operator fun invoke(content: @Composable () -> Unit) { + if (this == route) { + content() + } + } + + fun global() { + GlobalEmitter.listener?.invoke(this) + } +} + +@Stable +class Route1( + tag: String, + state0: MutableState +) : Route(tag) { + var p0 by state0 + + context(RouteHandlerScope) + @Composable + inline operator fun invoke(content: @Composable (P0) -> Unit) { + if (this == route) { + if (route is Route1<*>) { + @Suppress("UNCHECKED_CAST") + (route as Route1).let { route -> + this.p0 = route.p0 + } + } + content(this.p0) + } + } + + fun global(p0: P0 = this.p0) { + this.p0 = p0 + GlobalEmitter.listener?.invoke(this) + } +} + +@Stable +class Route2( + tag: String, + state0: MutableState, + state1: MutableState +) : Route(tag) { + var p0 by state0 + var p1 by state1 + + context(RouteHandlerScope) + @Composable + inline operator fun invoke(content: @Composable (P0, P1) -> Unit) { + if (this == route) { + if (route is Route2<*, *>) { + @Suppress("UNCHECKED_CAST") + (route as Route2).let { route -> + this.p0 = route.p0 + this.p1 = route.p1 + } + } + content(this.p0, this.p1) + } + } + + fun global(p0: P0 = this.p0, p1: P1 = this.p1) { + this.p0 = p0 + this.p1 = p1 + GlobalEmitter.listener?.invoke(this) + } +} diff --git a/compose-routing/src/main/kotlin/it/vfsfitvnm/route/RouteHandler.kt b/compose-routing/src/main/kotlin/it/vfsfitvnm/route/RouteHandler.kt new file mode 100644 index 0000000..2ff315d --- /dev/null +++ b/compose-routing/src/main/kotlin/it/vfsfitvnm/route/RouteHandler.kt @@ -0,0 +1,73 @@ +package it.vfsfitvnm.route + +import androidx.activity.compose.BackHandler +import androidx.activity.compose.LocalOnBackPressedDispatcherOwner +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.AnimatedContentScope +import androidx.compose.animation.ContentTransform +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.animation.core.updateTransition +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier + +@ExperimentalAnimationApi +@Composable +fun RouteHandler( + modifier: Modifier = Modifier, + listenToGlobalEmitter: Boolean = false, + handleBackPress: Boolean = true, + transitionSpec: AnimatedContentScope.() -> ContentTransform = { fastFade }, + content: @Composable RouteHandlerScope.() -> Unit +) { + var route by rememberRoute() + + RouteHandler( + route = route, + onRouteChanged = { route = it }, + listenToGlobalEmitter = listenToGlobalEmitter, + handleBackPress = handleBackPress, + transitionSpec = transitionSpec, + modifier = modifier, + content = content + ) +} + +@ExperimentalAnimationApi +@Composable +fun RouteHandler( + route: Route?, + onRouteChanged: (Route?) -> Unit, + modifier: Modifier = Modifier, + listenToGlobalEmitter: Boolean = false, + handleBackPress: Boolean = true, + transitionSpec: AnimatedContentScope.() -> ContentTransform = { fastFade }, + content: @Composable RouteHandlerScope.() -> Unit +) { + val backDispatcher = LocalOnBackPressedDispatcherOwner.current?.onBackPressedDispatcher + + val scope = remember(route) { + RouteHandlerScope( + route = route, + push = onRouteChanged, + pop = { if (handleBackPress) backDispatcher?.onBackPressed() else onRouteChanged(null) } + ) + } + + if (listenToGlobalEmitter) { + LaunchedEffect(route) { + Route.GlobalEmitter.listener = if (route == null) onRouteChanged else null + } + } + + BackHandler(enabled = handleBackPress && route != null) { + onRouteChanged(null) + } + + updateTransition(targetState = scope, label = null).AnimatedContent( + transitionSpec = transitionSpec, + contentKey = { it.route?.tag }, + modifier = modifier, + ) { + it.content() + } +} diff --git a/compose-routing/src/main/kotlin/it/vfsfitvnm/route/RouteHandlerScope.kt b/compose-routing/src/main/kotlin/it/vfsfitvnm/route/RouteHandlerScope.kt new file mode 100644 index 0000000..549bc9b --- /dev/null +++ b/compose-routing/src/main/kotlin/it/vfsfitvnm/route/RouteHandlerScope.kt @@ -0,0 +1,40 @@ +package it.vfsfitvnm.route + +import android.annotation.SuppressLint +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable + +@Immutable +class RouteHandlerScope( + val route: Route?, + private val push: (Route?) -> Unit, + val pop: () -> Unit, +) { + @SuppressLint("ComposableNaming") + @Composable + inline fun host(content: @Composable () -> Unit) { + if (route == null) { + content() + } + } + + operator fun Route0.invoke() { + push(this) + } + + operator fun Route1.invoke( + p0: P0 = this.p0 + ) { + this.p0 = p0 + push(this) + } + + operator fun Route2.invoke( + p0: P0 = this.p0, + p1: P1 = this.p1 + ) { + this.p0 = p0 + this.p1 = p1 + push(this) + } +} diff --git a/compose-routing/src/main/kotlin/it/vfsfitvnm/route/Transitions.kt b/compose-routing/src/main/kotlin/it/vfsfitvnm/route/Transitions.kt new file mode 100644 index 0000000..36d128a --- /dev/null +++ b/compose-routing/src/main/kotlin/it/vfsfitvnm/route/Transitions.kt @@ -0,0 +1,13 @@ +package it.vfsfitvnm.route + +import androidx.compose.animation.* +import androidx.compose.animation.core.tween + + +@ExperimentalAnimationApi +val AnimatedContentScope.fastFade: ContentTransform + get() = fadeIn(tween(200)) with fadeOut(tween(200)) + +@ExperimentalAnimationApi +val AnimatedContentScope.empty: ContentTransform + get() = EnterTransition.None with ExitTransition.None diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..a0153bd --- /dev/null +++ b/gradle.properties @@ -0,0 +1,5 @@ +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +android.useAndroidX=true +android.enableJetifier=false +kotlin.code.style=official +android.enableR8.fullMode=true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

    K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..55b4b2c --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Apr 20 21:22:44 CEST 2022 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/ktor-client-brotli/.gitignore b/ktor-client-brotli/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/ktor-client-brotli/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/ktor-client-brotli/build.gradle.kts b/ktor-client-brotli/build.gradle.kts new file mode 100644 index 0000000..564d1d3 --- /dev/null +++ b/ktor-client-brotli/build.gradle.kts @@ -0,0 +1,12 @@ +plugins { + kotlin("jvm") +} + +sourceSets.all { + java.srcDir("src/$name/kotlin") +} + +dependencies { + implementation(libs.ktor.client.encoding) + implementation(libs.brotli) +} \ No newline at end of file diff --git a/ktor-client-brotli/src/main/kotlin/io/ktor/client/plugins/compression/BrotliEncoder.kt b/ktor-client-brotli/src/main/kotlin/io/ktor/client/plugins/compression/BrotliEncoder.kt new file mode 100644 index 0000000..87df655 --- /dev/null +++ b/ktor-client-brotli/src/main/kotlin/io/ktor/client/plugins/compression/BrotliEncoder.kt @@ -0,0 +1,16 @@ +package io.ktor.client.plugins.compression + +import io.ktor.utils.io.* +import io.ktor.utils.io.jvm.javaio.* +import kotlinx.coroutines.CoroutineScope +import org.brotli.dec.BrotliInputStream + +internal object BrotliEncoder : ContentEncoder { + override val name: String = "br" + + override fun CoroutineScope.encode(source: ByteReadChannel) = + error("BrotliOutputStream not available (https://github.com/google/brotli/issues/715)") + + override fun CoroutineScope.decode(source: ByteReadChannel): ByteReadChannel = + BrotliInputStream(source.toInputStream()).toByteReadChannel() +} diff --git a/ktor-client-brotli/src/main/kotlin/io/ktor/client/plugins/compression/brotli.kt b/ktor-client-brotli/src/main/kotlin/io/ktor/client/plugins/compression/brotli.kt new file mode 100644 index 0000000..4344a5a --- /dev/null +++ b/ktor-client-brotli/src/main/kotlin/io/ktor/client/plugins/compression/brotli.kt @@ -0,0 +1,5 @@ +package io.ktor.client.plugins.compression + +fun ContentEncoding.Config.brotli(quality: Float? = null) { + customEncoder(BrotliEncoder, quality) +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..a7128a7 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,69 @@ +enableFeaturePreview("VERSION_CATALOGS") +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + + repositories { + google() + mavenCentral() + } + + versionCatalogs { + create("libs") { + version("kotlin", "1.6.21") + alias("kotlin-serialization").toPluginId("org.jetbrains.kotlin.plugin.serialization").versionRef("kotlin") + + alias("android-media").to("androidx.media", "media").version("1.6.0") + + version("compose", "1.2.0-beta03") + alias("compose-foundation").to("androidx.compose.foundation", "foundation").versionRef("compose") + alias("compose-ui").to("androidx.compose.ui", "ui").versionRef("compose") + alias("compose-ui-util").to("androidx.compose.ui", "ui-util").versionRef("compose") + alias("compose-ripple").to("androidx.compose.material", "material-ripple").versionRef("compose") + + alias("compose-shimmer").to("com.valentinilk.shimmer", "compose-shimmer").version("1.0.2") + + alias("compose-activity").to("androidx.activity", "activity-compose").version("1.5.0-alpha03") + + alias("compose-coil").to("io.coil-kt", "coil-compose").version("2.0.0-rc03") + + version("accompanist", "0.24.9-beta") + alias("accompanist-systemuicontroller").to("com.google.accompanist", "accompanist-systemuicontroller").versionRef("accompanist") + alias("accompanist-flowlayout").to("com.google.accompanist", "accompanist-flowlayout").versionRef("accompanist") + + version("room", "2.5.0-alpha01") + alias("room").to("androidx.room", "room-ktx").versionRef("room") + alias("room-compiler").to("androidx.room", "room-compiler").versionRef("room") + + version("media3", "1.0.0-alpha03") + alias("media3-ui").to("androidx.media3", "media3-ui").versionRef("media3") + alias("media3-session").to("androidx.media3", "media3-session").versionRef("media3") + alias("media3-exoplayer").to("androidx.media3", "media3-exoplayer").versionRef("media3") + bundle("media3", listOf("media3-ui", "media3-session", "media3-exoplayer")) + + version("ktor", "2.0.1") + alias("ktor-client-core").to("io.ktor", "ktor-client-core").versionRef("ktor") + alias("ktor-client-cio").to("io.ktor", "ktor-client-cio").versionRef("ktor") + alias("ktor-client-content-negotiation").to("io.ktor", "ktor-client-content-negotiation").versionRef("ktor") + alias("ktor-client-encoding").to("io.ktor", "ktor-client-encoding").versionRef("ktor") + alias("ktor-client-serialization").to("io.ktor", "ktor-client-serialization").versionRef("ktor") + alias("ktor-serialization-json").to("io.ktor", "ktor-serialization-kotlinx-json").versionRef("ktor") + + alias("brotli").to("org.brotli", "dec").version("0.1.2") + + alias("guava-coroutines").to("org.jetbrains.kotlinx", "kotlinx-coroutines-guava").version("1.6.0") + } + + create("testLibs") { + alias("junit").to("junit", "junit").version("4.13.2") + } + } +} + +rootProject.name = "ViMusic" +include(":app") +include(":compose-routing") +include(":compose-reordering") +include(":youtube-music") +include(":ktor-client-brotli") diff --git a/youtube-music/.gitignore b/youtube-music/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/youtube-music/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/youtube-music/build.gradle.kts b/youtube-music/build.gradle.kts new file mode 100644 index 0000000..3450816 --- /dev/null +++ b/youtube-music/build.gradle.kts @@ -0,0 +1,21 @@ +plugins { + kotlin("jvm") + kotlin("plugin.serialization") version "1.6.21" +} + +sourceSets.all { + java.srcDir("src/$name/kotlin") +} + +dependencies { + implementation(projects.ktorClientBrotli) + + implementation(libs.ktor.client.core) + implementation(libs.ktor.client.cio) + implementation(libs.ktor.client.content.negotiation) + implementation(libs.ktor.client.encoding) + implementation(libs.ktor.client.serialization) + implementation(libs.ktor.serialization.json) + + testImplementation(testLibs.junit) +} \ No newline at end of file diff --git a/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/Extensions.kt b/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/Extensions.kt new file mode 100644 index 0000000..e1e8753 --- /dev/null +++ b/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/Extensions.kt @@ -0,0 +1,42 @@ +package it.vfsfitvnm.youtubemusic + +import io.ktor.client.* +import io.ktor.client.call.* +import io.ktor.client.request.* +import io.ktor.client.statement.* +import io.ktor.util.network.* +import io.ktor.utils.io.* + + +suspend inline fun Outcome.bodyCatching(): Outcome { + return when (this) { + is Outcome.Success -> value.bodyCatching() + is Outcome.Recovered -> value.bodyCatching() + is Outcome.Initial -> this + is Outcome.Loading -> this + is Outcome.Error -> this + } +} + +suspend inline fun HttpClient.postCatching( + urlString: String, + block: HttpRequestBuilder.() -> Unit = {} +): Outcome { + return runCatching { + Outcome.Success(post(urlString, block)) + }.getOrElse { throwable -> + when (throwable) { + is CancellationException -> Outcome.Loading + is UnresolvedAddressException -> Outcome.Error.Network + else -> Outcome.Error.Unhandled(throwable) + } + } +} + +suspend inline fun HttpResponse.bodyCatching(): Outcome { + return runCatching { + Outcome.Success(body()) + }.getOrElse { throwable -> + Outcome.Error.Unhandled(throwable) + } +} \ No newline at end of file diff --git a/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/Outcome.kt b/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/Outcome.kt new file mode 100644 index 0000000..735beca --- /dev/null +++ b/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/Outcome.kt @@ -0,0 +1,68 @@ +package it.vfsfitvnm.youtubemusic + + +sealed class Outcome { + val valueOrNull: T? + get() = when (this) { + is Success -> value + is Recovered -> value + else -> null + } + + fun recoverWith(value: @UnsafeVariance T): Outcome { + return when (this) { + is Error -> Recovered(value, this) + else -> this + } + } + + inline fun map(block: (T) -> R): Outcome { + return when (this) { + is Success -> Success(block(value)) + is Recovered -> Success(block(value)) + is Initial -> this + is Loading -> this + is Error -> this + } + } + + inline fun flatMap(block: (T) -> Outcome): Outcome { + return when (this) { + is Success -> block(value) + is Recovered -> block(value) + is Initial -> this + is Loading -> this + is Error -> this + } + } + + object Initial : Outcome() + + object Loading : Outcome() + + sealed class Error : Outcome() { + object Network : Error() + class Unhandled(val throwable: Throwable) : Error() + } + + class Recovered(val value: T, val error: Error) : Outcome() + + class Success(val value: T) : Outcome() +} + +fun Outcome?.toNotNull(): Outcome { + return when (this) { + null -> Outcome.Success(null) + else -> this + } +} + +fun Outcome.toNullable(): Outcome? { + return valueOrNull?.let { + Outcome.Success(it) + } +} + +val Outcome<*>.isEvaluable: Boolean + get() = this !is Outcome.Success && this !is Outcome.Loading + diff --git a/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/YouTube.kt b/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/YouTube.kt new file mode 100644 index 0000000..ebf57df --- /dev/null +++ b/youtube-music/src/main/kotlin/it/vfsfitvnm/youtubemusic/YouTube.kt @@ -0,0 +1,659 @@ +package it.vfsfitvnm.youtubemusic + +import io.ktor.client.* +import io.ktor.client.engine.cio.* +import io.ktor.client.plugins.* +import io.ktor.client.plugins.compression.* +import io.ktor.client.plugins.contentnegotiation.* +import io.ktor.client.request.* +import io.ktor.http.* +import io.ktor.serialization.kotlinx.json.* +import it.vfsfitvnm.youtubemusic.models.* +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json + + +object YouTube { + private const val Key = "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8" + + @OptIn(ExperimentalSerializationApi::class) + val client = HttpClient(CIO) { + BrowserUserAgent() + + expectSuccess = true + + install(ContentNegotiation) { + json(Json { + ignoreUnknownKeys = true + explicitNulls = false + encodeDefaults = true + }) + } + + install(ContentEncoding) { + brotli() + } + + defaultRequest { + url("https://music.youtube.com") + } + } + + @Serializable + data class BrowseBody( + val context: Context, + val browseId: String, + ) + + @Serializable + data class SearchBody( + val context: Context, + val query: String, + val params: String + ) + + @Serializable + data class PlayerBody( + val context: Context, + val videoId: String, + val playlistId: String? + ) + + @Serializable + data class GetQueueBody( + val context: Context, + val videoIds: List + ) + + @Serializable + data class NextBody( + val context: Context, + val isAudioOnly: Boolean, + val videoId: String, + val playlistId: String?, + val tunerSettingValue: String, + val index: Int?, + val params: String?, + val playlistSetVideoId: String?, + val continuation: String?, + val watchEndpointMusicSupportedConfigs: WatchEndpointMusicSupportedConfigs + ) { + @Serializable + data class WatchEndpointMusicSupportedConfigs( + val musicVideoType: String + ) + } + + @Serializable + data class GetSearchSuggestionsBody( + val context: Context, + val input: String + ) + + @Serializable + data class Context( + val client: Client, + val thirdParty: ThirdParty? = null, + ) { + @Serializable + data class Client( + val clientName: String, + val clientVersion: String, + val visitorData: String?, +// val gl: String = "US", + val hl: String = "en", + ) + + @Serializable + data class ThirdParty( + val embedUrl: String, + ) + + companion object { + val DefaultWeb = Context( + client = Client( + clientName = "WEB_REMIX", + clientVersion = "1.20220328.01.00", + visitorData = "CgtsZG1ySnZiQWtSbyiMjuGSBg%3D%3D" + ) + ) + val DefaultAndroid = Context( + client = Client( + clientName = "ANDROID", + clientVersion = "16.50", + visitorData = null, + ) + ) + } + } + + data class Info( + val name: String, + val endpoint: T? + ) { + companion object { + inline fun from(run: Runs.Run): Info { + return Info( + name = run.text, + endpoint = run.navigationEndpoint?.endpoint as T? + ) + } + } + } + + sealed class Item { + abstract val thumbnail: ThumbnailRenderer.MusicThumbnailRenderer.Thumbnail.Thumbnail + + data class Song( + val info: Info, + val authors: List>, + val album: Info?, + val durationText: String, + override val thumbnail: ThumbnailRenderer.MusicThumbnailRenderer.Thumbnail.Thumbnail + ) : Item() { + companion object : FromMusicShelfRendererContent { + val Filter = Filter("EgWKAQIIAWoKEAkQBRAKEAMQBA%3D%3D") + + override fun from(content: MusicShelfRenderer.Content): Song { + val (mainRuns, otherRuns) = content.runs + + return Song( + info = Info.from(mainRuns.first()), + authors = otherRuns.getOrNull(otherRuns.lastIndex - 2) + ?.map(Info.Companion::from) ?: emptyList(), + album = otherRuns.getOrNull(otherRuns.lastIndex - 1)?.firstOrNull()?.let( + Info.Companion::from + ), + durationText = otherRuns.getOrNull(otherRuns.lastIndex)?.first()?.text + ?: "?", + thumbnail = content.thumbnail + ) + } + } + } + + + data class Video( + val info: Info, + val authors: List>, + val views: List>, + val durationText: String, + override val thumbnail: ThumbnailRenderer.MusicThumbnailRenderer.Thumbnail.Thumbnail + ) : Item() { + val isOfficialMusicVideo: Boolean + get() = info.endpoint?.watchEndpointMusicSupportedConfigs?.watchEndpointMusicConfig?.musicVideoType == "MUSIC_VIDEO_TYPE_OMV" + + val isUserGeneratedContent: Boolean + get() = info.endpoint?.watchEndpointMusicSupportedConfigs?.watchEndpointMusicConfig?.musicVideoType == "MUSIC_VIDEO_TYPE_UGC" + + companion object : FromMusicShelfRendererContent