From a0b9e738a5ec4f20c05f81adf0ed77c5deb09466 Mon Sep 17 00:00:00 2001 From: Alex Katlein Date: Wed, 2 Aug 2023 19:43:55 +0200 Subject: [PATCH 1/7] Using android.R.color.transparent instead of empty drawable for the placeholder - For some reason Android Auto displays a square with a white fill color where the empty space should be - Got rid of empty drawable --- .../moire/ultrasonic/playback/AutoMediaBrowserCallback.kt | 2 +- ultrasonic/src/main/res/drawable/empty.xml | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) delete mode 100644 ultrasonic/src/main/res/drawable/empty.xml diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/playback/AutoMediaBrowserCallback.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/playback/AutoMediaBrowserCallback.kt index d7abb1bb..0154a05a 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/playback/AutoMediaBrowserCallback.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/playback/AutoMediaBrowserCallback.kt @@ -276,7 +276,7 @@ class AutoMediaBrowserCallback : MediaLibraryService.MediaLibrarySession.Callbac private fun getPlaceholderButton() = CommandButton.Builder() .setDisplayName("Placeholder") - .setIconResId(R.drawable.empty) + .setIconResId(android.R.color.transparent) .setSessionCommand( SessionCommand( PlaybackService.CUSTOM_COMMAND_PLACEHOLDER, diff --git a/ultrasonic/src/main/res/drawable/empty.xml b/ultrasonic/src/main/res/drawable/empty.xml deleted file mode 100644 index a4762a86..00000000 --- a/ultrasonic/src/main/res/drawable/empty.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - From e9fdbd924bf8c32c631b518474ec7f5be182660a Mon Sep 17 00:00:00 2001 From: tzugen Date: Thu, 3 Aug 2023 14:28:22 +0200 Subject: [PATCH 2/7] Don't skip around when doing "Play Next" while music is playing --- .../kotlin/org/moire/ultrasonic/service/MediaPlayerManager.kt | 2 +- .../kotlin/org/moire/ultrasonic/subsonic/DownloadHandler.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerManager.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerManager.kt index 93588750..d07b4c52 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerManager.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerManager.kt @@ -460,7 +460,7 @@ class MediaPlayerManager( // We can't just use play(0,0) then all random playlists will start with the first track. // Additionally the shuffle order becomes clear on after some time, so we need to wait for // the right event, and can start playback only then. - if (autoPlay) { + if (autoPlay && controller?.isPlaying != true) { if (isShufflePlayEnabled) { deferredPlay = { val start = controller?.currentTimeline diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/DownloadHandler.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/DownloadHandler.kt index 207c9141..a0b4c156 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/DownloadHandler.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/DownloadHandler.kt @@ -169,7 +169,7 @@ class DownloadHandler( ) if (Settings.shouldTransitionOnPlayback && - (insertionMode == MediaPlayerManager.InsertionMode.CLEAR || autoPlay) + insertionMode == MediaPlayerManager.InsertionMode.CLEAR ) { fragment.findNavController().popBackStack(R.id.playerFragment, true) fragment.findNavController().navigate(R.id.playerFragment) From 818cb96eb569fcc4cf18e8f7e636c2afff4ad65f Mon Sep 17 00:00:00 2001 From: tzugen Date: Thu, 3 Aug 2023 18:24:54 +0200 Subject: [PATCH 3/7] Release 4.7.0 --- fastlane/metadata/android/en-US/changelogs/130.txt | 9 +++++++++ ultrasonic/build.gradle | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/130.txt diff --git a/fastlane/metadata/android/en-US/changelogs/130.txt b/fastlane/metadata/android/en-US/changelogs/130.txt new file mode 100644 index 00000000..3d2ccf81 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/130.txt @@ -0,0 +1,9 @@ +### Features +- Added custom buttons for shuffling the current queue and setting repeat mode (Android Auto) +- Properly handling nested directory structures (Android Auto) +- Add a toast when adding tracks to the playlist +- Allow pinning when offline + +### Dependencies +- Update koin +- Update media3 to v1.1.0 \ No newline at end of file diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle index 004d151c..cea9d70f 100644 --- a/ultrasonic/build.gradle +++ b/ultrasonic/build.gradle @@ -12,8 +12,8 @@ android { defaultConfig { applicationId "org.moire.ultrasonic" - versionCode 126 - versionName "4.6.3" + versionCode 128 + versionName "4.7.0" minSdkVersion versions.minSdk targetSdkVersion versions.targetSdk From d2a98a3022772997189322fbaac6d1e6271d0af5 Mon Sep 17 00:00:00 2001 From: Alex Katlein Date: Wed, 9 Aug 2023 21:16:52 +0200 Subject: [PATCH 4/7] Utilize CarConnection to determine whether to set repeat mode to ALL --- gradle/libs.versions.toml | 4 +- ultrasonic/build.gradle | 1 + ultrasonic/src/main/AndroidManifest.xml | 2 + .../playback/AutoMediaBrowserCallback.kt | 44 ++++++++++++++++++- 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6137c2c9..9b704ce0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,6 +4,7 @@ gradle = "8.1.1" navigation = "2.6.0" gradlePlugin = "8.1.0" +androidxcar = "1.2.0" androidxcore = "1.10.1" ktlint = "0.43.2" ktlintGradle = "11.5.0" @@ -49,6 +50,7 @@ kotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin" ktlintGradle = { module = "org.jlleitschuh.gradle:ktlint-gradle", version.ref = "ktlintGradle" } detekt = { module = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin", version.ref = "detekt" } +car = { module = "androidx.car.app:app", version.ref = "androidxcar" } core = { module = "androidx.core:core-ktx", version.ref = "androidxcore" } design = { module = "com.google.android.material:material", version.ref = "materialDesign" } annotations = { module = "androidx.annotation:annotation", version.ref = "androidSupport" } @@ -103,4 +105,4 @@ apacheCodecs = { module = "commons-codec:commons-codec", version.ref robolectric = { module = "org.robolectric:robolectric", version.ref = "robolectric" } [plugins] -ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } \ No newline at end of file +ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle index cea9d70f..de0ec940 100644 --- a/ultrasonic/build.gradle +++ b/ultrasonic/build.gradle @@ -100,6 +100,7 @@ dependencies { exclude group: "com.android.support" } + implementation libs.car implementation libs.core implementation libs.design implementation libs.multidex diff --git a/ultrasonic/src/main/AndroidManifest.xml b/ultrasonic/src/main/AndroidManifest.xml index 711f13e2..0d25405d 100644 --- a/ultrasonic/src/main/AndroidManifest.xml +++ b/ultrasonic/src/main/AndroidManifest.xml @@ -12,6 +12,8 @@ + + = Build.VERSION_CODES.M) { + Timber.d("Car app library available, observing CarConnection") + + val originalRepeatMode = player.repeatMode + + var lastCarConnectionType = -1 + + CarConnection(applicationContext).type.observeForever { + if (lastCarConnectionType == it) + return@observeForever + + lastCarConnectionType = it + + Timber.d("CarConnection type changed to %s", it) + + when (it) { + CarConnection.CONNECTION_TYPE_PROJECTION -> + if (!customRepeatModeSet) { + Timber.d("[CarConnection] Setting repeat mode to ALL") + player.repeatMode = Player.REPEAT_MODE_ALL + customRepeatModeSet = true + } + + CarConnection.CONNECTION_TYPE_NOT_CONNECTED -> + if (customRepeatModeSet) { + Timber.d("[CarConnection] Resetting repeat mode") + player.repeatMode = originalRepeatMode + customRepeatModeSet = false + } + } + } + } else + Timber.d("Car app library not available") + } + override fun onPostConnect(session: MediaSession, controller: MediaSession.ControllerInfo) { if (controller.controllerVersion != 0) { // Let Media3 controller (for instance the MediaNotificationProvider) @@ -369,6 +410,7 @@ class AutoMediaBrowserCallback : MediaLibraryService.MediaLibrarySession.Callbac PlaybackService.CUSTOM_COMMAND_REPEAT_MODE -> { customCommandFuture = Futures.immediateFuture(SessionResult(RESULT_SUCCESS)) + customRepeatModeSet = true session.player.setNextRepeatMode() session.updateCustomCommands() From 09e87ce8a0b1bf88ff5dc9cc994cb84ec0b69fcd Mon Sep 17 00:00:00 2001 From: birdbird <6892457-tzugen@users.noreply.gitlab.com> Date: Tue, 22 Aug 2023 10:08:53 +0000 Subject: [PATCH 5/7] Disable a lint --- ultrasonic/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle index de0ec940..40c72e39 100644 --- a/ultrasonic/build.gradle +++ b/ultrasonic/build.gradle @@ -81,6 +81,7 @@ android { disable 'ObsoleteLintCustomCheck' // We manage dependencies on Gitlab with RenovateBot disable 'GradleDependency' + disable 'AndroidGradlePluginVersion' textReport true checkDependencies true } From f2b47a257d610d87f4fa272a48cdbe8af439b4ea Mon Sep 17 00:00:00 2001 From: tzugen Date: Wed, 23 Aug 2023 10:59:36 +0200 Subject: [PATCH 6/7] Release 4.7.1 --- .../android/en-US/changelogs/{130.txt => 128.txt} | 0 fastlane/metadata/android/en-US/changelogs/129.txt | 12 ++++++++++++ ultrasonic/build.gradle | 4 ++-- 3 files changed, 14 insertions(+), 2 deletions(-) rename fastlane/metadata/android/en-US/changelogs/{130.txt => 128.txt} (100%) create mode 100644 fastlane/metadata/android/en-US/changelogs/129.txt diff --git a/fastlane/metadata/android/en-US/changelogs/130.txt b/fastlane/metadata/android/en-US/changelogs/128.txt similarity index 100% rename from fastlane/metadata/android/en-US/changelogs/130.txt rename to fastlane/metadata/android/en-US/changelogs/128.txt diff --git a/fastlane/metadata/android/en-US/changelogs/129.txt b/fastlane/metadata/android/en-US/changelogs/129.txt new file mode 100644 index 00000000..99df21de --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/129.txt @@ -0,0 +1,12 @@ +### Fixes +- Fix a bug in 4.7.0 that repeat mode was activated by default. + +### Features +- Added custom buttons for shuffling the current queue and setting repeat mode (Android Auto) +- Properly handling nested directory structures (Android Auto) +- Add a toast when adding tracks to the playlist +- Allow pinning when offline + +### Dependencies +- Update koin +- Update media3 to v1.1.0 \ No newline at end of file diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle index 40c72e39..5f9420ae 100644 --- a/ultrasonic/build.gradle +++ b/ultrasonic/build.gradle @@ -12,8 +12,8 @@ android { defaultConfig { applicationId "org.moire.ultrasonic" - versionCode 128 - versionName "4.7.0" + versionCode 129 + versionName "4.7.1" minSdkVersion versions.minSdk targetSdkVersion versions.targetSdk From 69fc9b955ad406b7ce28995c61db94d1fccbb9e7 Mon Sep 17 00:00:00 2001 From: tzugen Date: Wed, 18 Oct 2023 12:48:32 +0200 Subject: [PATCH 7/7] RC 4.8.0 --- fastlane/metadata/android/en-US/changelogs/130.txt | 12 ++++-------- ultrasonic/build.gradle | 4 ++-- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/fastlane/metadata/android/en-US/changelogs/130.txt b/fastlane/metadata/android/en-US/changelogs/130.txt index 3d2ccf81..b787ae47 100644 --- a/fastlane/metadata/android/en-US/changelogs/130.txt +++ b/fastlane/metadata/android/en-US/changelogs/130.txt @@ -1,9 +1,5 @@ ### Features -- Added custom buttons for shuffling the current queue and setting repeat mode (Android Auto) -- Properly handling nested directory structures (Android Auto) -- Add a toast when adding tracks to the playlist -- Allow pinning when offline - -### Dependencies -- Update koin -- Update media3 to v1.1.0 \ No newline at end of file +- Improved display of rating stars +- Completely modernize all older code parts +- Updates for Android 14 +- Update dependencies \ No newline at end of file diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle index 5f9420ae..15f1f6d7 100644 --- a/ultrasonic/build.gradle +++ b/ultrasonic/build.gradle @@ -12,8 +12,8 @@ android { defaultConfig { applicationId "org.moire.ultrasonic" - versionCode 129 - versionName "4.7.1" + versionCode 130 + versionName "4.8.0" minSdkVersion versions.minSdk targetSdkVersion versions.targetSdk