From e4a3cc5290c6a13a85d370d166a31db7437be301 Mon Sep 17 00:00:00 2001 From: ISO-B <3048685+ISO-B@users.noreply.github.com> Date: Mon, 16 Sep 2024 23:06:49 +0300 Subject: [PATCH] Added Android Auto browsing settings --- .../audiobookshelf/app/data/DeviceClasses.kt | 10 +++- .../app/device/DeviceManager.kt | 10 ++++ .../app/player/PlayerNotificationService.kt | 8 +-- pages/settings.vue | 55 ++++++++++++++++++- strings/en-us.json | 7 +++ 5 files changed, 83 insertions(+), 7 deletions(-) diff --git a/android/app/src/main/java/com/audiobookshelf/app/data/DeviceClasses.kt b/android/app/src/main/java/com/audiobookshelf/app/data/DeviceClasses.kt index a002c141..f1831770 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/data/DeviceClasses.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/data/DeviceClasses.kt @@ -133,7 +133,10 @@ data class DeviceSettings( var disableSleepTimerResetFeedback: Boolean, var languageCode: String, var downloadUsingCellular: DownloadUsingCellularSetting, - var streamingUsingCellular: StreamingUsingCellularSetting + var streamingUsingCellular: StreamingUsingCellularSetting, + var androidAutoBrowseForceGrouping: Boolean, + var androidAutoBrowseTopLevelLimitForGrouping: Int, + var androidAutoBrowseLimitForGrouping: Int ) { companion object { // Static method to get default device settings @@ -159,7 +162,10 @@ data class DeviceSettings( disableSleepTimerResetFeedback = false, languageCode = "en-us", downloadUsingCellular = DownloadUsingCellularSetting.ALWAYS, - streamingUsingCellular = StreamingUsingCellularSetting.ALWAYS + streamingUsingCellular = StreamingUsingCellularSetting.ALWAYS, + androidAutoBrowseForceGrouping = false, + androidAutoBrowseTopLevelLimitForGrouping = 100, + androidAutoBrowseLimitForGrouping = 50 ) } } diff --git a/android/app/src/main/java/com/audiobookshelf/app/device/DeviceManager.kt b/android/app/src/main/java/com/audiobookshelf/app/device/DeviceManager.kt index 37e81cf0..f14654dc 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/device/DeviceManager.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/device/DeviceManager.kt @@ -61,6 +61,16 @@ object DeviceManager { if (deviceData.deviceSettings?.streamingUsingCellular == null) { deviceData.deviceSettings?.streamingUsingCellular = StreamingUsingCellularSetting.ALWAYS } + + if (deviceData.deviceSettings?.androidAutoBrowseForceGrouping == null) { + deviceData.deviceSettings?.androidAutoBrowseForceGrouping = false + } + if (deviceData.deviceSettings?.androidAutoBrowseTopLevelLimitForGrouping == null) { + deviceData.deviceSettings?.androidAutoBrowseTopLevelLimitForGrouping = 100 + } + if (deviceData.deviceSettings?.androidAutoBrowseLimitForGrouping == null) { + deviceData.deviceSettings?.androidAutoBrowseLimitForGrouping = 50 + } } fun getBase64Id(id:String):String { diff --git a/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt b/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt index 2e16954f..4a606789 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt @@ -1148,7 +1148,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() { Log.d(tag, "Loading series from library ${mediaIdParts[2]} with paging ${mediaIdParts[4]}") mediaManager.loadLibrarySeriesWithAudio(mediaIdParts[2], mediaIdParts[4]) { seriesItems -> Log.d(tag, "Received ${seriesItems.size} series") - if (seriesItems.size > 500) { + if (seriesItems.size > DeviceManager.deviceData.deviceSettings!!.androidAutoBrowseLimitForGrouping) { val seriesLetters = seriesItems.groupingBy { iwb -> iwb.title.substring(0, mediaIdParts[4].length + 1).uppercase() }.eachCount() val children = seriesLetters.map { (seriesLetter, seriesCount) -> MediaBrowserCompat.MediaItem( @@ -1173,7 +1173,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() { Log.d(tag, "Loading series from library ${mediaIdParts[2]}") mediaManager.loadLibrarySeriesWithAudio(mediaIdParts[2]) { seriesItems -> Log.d(tag, "Received ${seriesItems.size} series") - if (seriesItems.size > 1000) { + if (DeviceManager.deviceData.deviceSettings!!.androidAutoBrowseForceGrouping || seriesItems.size > DeviceManager.deviceData.deviceSettings!!.androidAutoBrowseTopLevelLimitForGrouping) { val seriesLetters = seriesItems.groupingBy { iwb -> iwb.title.first().uppercaseChar() }.eachCount() val children = seriesLetters.map { (seriesLetter, seriesCount) -> MediaBrowserCompat.MediaItem( @@ -1215,7 +1215,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() { Log.d(tag, "Loading authors from library ${mediaIdParts[2]} with paging ${mediaIdParts[4]}") mediaManager.loadAuthorsWithBooks(mediaIdParts[2], mediaIdParts[4]) { authorItems -> Log.d(tag, "Received ${authorItems.size} authors") - if (authorItems.size > 100) { + if (authorItems.size > DeviceManager.deviceData.deviceSettings!!.androidAutoBrowseLimitForGrouping) { val authorLetters = authorItems.groupingBy { iwb -> iwb.name.substring(0, mediaIdParts[4].length + 1).uppercase() }.eachCount() val children = authorLetters.map { (authorLetter, authorCount) -> MediaBrowserCompat.MediaItem( @@ -1240,7 +1240,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() { Log.d(tag, "Loading authors from library ${mediaIdParts[2]}") mediaManager.loadAuthorsWithBooks(mediaIdParts[2]) { authorItems -> Log.d(tag, "Received ${authorItems.size} authors") - if (authorItems.size > 1000) { + if (DeviceManager.deviceData.deviceSettings!!.androidAutoBrowseForceGrouping || authorItems.size > DeviceManager.deviceData.deviceSettings!!.androidAutoBrowseTopLevelLimitForGrouping) { val authorLetters = authorItems.groupingBy { iwb -> iwb.name.first().uppercaseChar() }.eachCount() val children = authorLetters.map { (authorLetter, authorCount) -> MediaBrowserCompat.MediaItem( diff --git a/pages/settings.vue b/pages/settings.vue index c1d09b6b..724dc3b1 100644 --- a/pages/settings.vue +++ b/pages/settings.vue @@ -150,6 +150,28 @@ + + +
@@ -193,7 +215,10 @@ export default { autoSleepTimerAutoRewindTime: 300000, // 5 minutes languageCode: 'en-us', downloadUsingCellular: 'ALWAYS', - streamingUsingCellular: 'ALWAYS' + streamingUsingCellular: 'ALWAYS', + androidAutoBrowseForceGrouping: false, + androidAutoBrowseTopLevelLimitForGrouping: 100, + androidAutoBrowseLimitForGrouping: 50 }, theme: 'dark', lockCurrentOrientation: false, @@ -221,6 +246,14 @@ export default { enableMp3IndexSeeking: { name: this.$strings.LabelEnableMp3IndexSeeking, message: this.$strings.LabelEnableMp3IndexSeekingHelp + }, + androidAutoBrowseForceGrouping: { + name: this.$strings.LabelAndroidAutoBrowseForceGrouping, + message: this.$strings.LabelAndroidAutoBrowseForceGroupingHelp + }, + androidAutoBrowseTopLevelLimitForGrouping: { + name: this.$strings.LabelAndroidAutoBrowseTopLevelLimitForGrouping, + message: this.$strings.LabelAndroidAutoBrowseTopLevelLimitForGroupingHelp } }, hapticFeedbackItems: [ @@ -451,6 +484,18 @@ export default { if (!val) return // invalid times return falsy this.saveSettings() }, + androidAutoBrowseTopLevelLimitForGroupingUpdated(val) { + if (!val) return // invalid times return falsy + if (val > 1000) val = 1000 + if (val < 20) val = 20 + this.saveSettings() + }, + androidAutoBrowseLimitForGroupingUpdated(val) { + if (!val) return // invalid times return falsy + if (val > 1000) val = 1000 + if (val < 20) val = 20 + this.saveSettings() + }, hapticFeedbackUpdated(val) { this.$store.commit('globals/setHapticFeedback', val) this.saveSettings() @@ -493,6 +538,10 @@ export default { this.settings.disableShakeToResetSleepTimer = !this.settings.disableShakeToResetSleepTimer this.saveSettings() }, + toggleAndroidAutoBrowseForceGrouping() { + this.settings.androidAutoBrowseForceGrouping = !this.settings.androidAutoBrowseForceGrouping + this.saveSettings() + }, toggleDisableSleepTimerResetFeedback() { this.settings.disableSleepTimerResetFeedback = !this.settings.disableSleepTimerResetFeedback this.saveSettings() @@ -576,6 +625,10 @@ export default { this.settings.downloadUsingCellular = deviceSettings.downloadUsingCellular || 'ALWAYS' this.settings.streamingUsingCellular = deviceSettings.streamingUsingCellular || 'ALWAYS' + + this.settings.androidAutoBrowseForceGrouping = deviceSettings.androidAutoBrowseForceGrouping + this.settings.androidAutoBrowseTopLevelLimitForGrouping = deviceSettings.androidAutoBrowseTopLevelLimitForGrouping + this.settings.androidAutoBrowseLimitForGrouping = deviceSettings.androidAutoBrowseLimitForGrouping }, async init() { this.loading = true diff --git a/strings/en-us.json b/strings/en-us.json index 24fb35ef..3c3081b3 100644 --- a/strings/en-us.json +++ b/strings/en-us.json @@ -52,6 +52,7 @@ "ButtonYes": "Yes", "HeaderAccount": "Account", "HeaderAdvanced": "Advanced", + "HeaderAndroidAutoSettings": "Android Auto Settings", "HeaderAudioTracks": "Audio Tracks", "HeaderChapters": "Chapters", "HeaderCollection": "Collection", @@ -90,6 +91,12 @@ "LabelAll": "All", "LabelAllowSeekingOnMediaControls": "Allow position seeking on media notification controls", "LabelAlways": "Always", + "LabelAndroidAutoBrowseForceGrouping": "Force alphabetical drawdown", + "LabelAndroidAutoBrowseForceGroupingHelp": "Forces alphabetical drawdown while browsing library and series in Android Auto", + "LabelAndroidAutoBrowseLimitForGrouping": "Alphabetical drawdown stopitems", + "LabelAndroidAutoBrowseLimitForGroupingHelp": "Stop alphabetical drawdown when there is less than this amount of items to show", + "LabelAndroidAutoBrowseTopLevelLimitForGrouping": "Alphabetical drawdown start items", + "LabelAndroidAutoBrowseTopLevelLimitForGroupingHelp": "If top-level has more items than this alphabetical drawdown will be used", "LabelAskConfirmation": "Ask for confirmation", "LabelAuthor": "Author", "LabelAuthorFirstLast": "Author (First Last)",