From 1b791074ec108d6126dfe091b728a399936caec2 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Sat, 5 Mar 2022 20:34:12 -0700 Subject: [PATCH] playback: replace headset focus with headset autoplay Turn the headset focus setting into the headset autoplay setting. The way auxio handles headsets is...odd. Sometimes the MediaSession handles it and Auxio could not care less, and sometimes Auxio actually needs to handle it. As a result, the idea of being able to disable headset focus is more or less moot because it will only apply to some devices and not others. On the other end, the way Auxio automatically begins playback once a headset is plugged in is also quite weird. It only works on wired headsets, and when it does, it overrides all other apps that might also be playing audio. It's not to say that it's a bad feature, but it's also one that I don't want to make the defualt. Auxio should still play along within the confines of Android's expectations, after all. Replacing the existing "Headset focus" setting with a new "Headset autoplay" setting solves both of these issues, as it prevents a mis-guided disabling of the setting that doesn't actually disable the feature and it relegates the quirky autoplay behavior to an setting not enabled by default. --- CHANGELOG.md | 1 + app/build.gradle | 4 +- .../oxycblt/auxio/detail/DetailFragment.kt | 1 - .../playback/system/PlaybackNotification.kt | 1 + .../auxio/playback/system/PlaybackService.kt | 68 ++++++++++------- .../oxycblt/auxio/settings/SettingsManager.kt | 76 +++++++++---------- .../java/org/oxycblt/auxio/util/DbUtil.kt | 9 --- .../main/res/layout/view_shuffle_button.xml | 19 ----- app/src/main/res/values-ar-rIQ/strings.xml | 4 +- app/src/main/res/values-cs/strings.xml | 2 - app/src/main/res/values-de/strings.xml | 7 +- app/src/main/res/values-es/strings.xml | 4 +- app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-hi/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 2 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 4 +- app/src/main/res/values-zh-rCN/strings.xml | 4 +- app/src/main/res/values-zh-rTW/strings.xml | 1 - app/src/main/res/values/integers.xml | 2 +- app/src/main/res/values/strings.xml | 10 +-- app/src/main/res/xml/prefs_main.xml | 8 +- prebuild.py | 70 ++++++++++------- 29 files changed, 140 insertions(+), 166 deletions(-) delete mode 100644 app/src/main/res/layout/view_shuffle_button.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fae24304..3708c39a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ from the system theme was used [#80] #### What's Changed - All cover art is now cropped to a 1:1 aspect ratio +- Headset focus has been replaced with headset autoplay. It can no longer be disabled. #### Dev/Meta - Enabled elevation drop shadows below Android P for consistency diff --git a/app/build.gradle b/app/build.gradle index 5884b7570..6aa143f0c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -103,7 +103,7 @@ dependencies { implementation 'io.coil-kt:coil:2.0.0-alpha09' // Material - implementation 'com.google.android.material:material:1.6.0-alpha02' + implementation 'com.google.android.material:material:1.6.0-alpha03' // --- DEBUG --- @@ -115,7 +115,6 @@ task ktlint(type: JavaExec, group: "verification") { description = "Check Kotlin code style." mainClass.set("com.pinterest.ktlint.Main") classpath = configurations.ktlint - args "src/**/*.kt" } check.dependsOn ktlint @@ -124,6 +123,5 @@ task ktlintFormat(type: JavaExec, group: "formatting") { description = "Fix Kotlin code style deviations." mainClass.set("com.pinterest.ktlint.Main") classpath = configurations.ktlint - args "-F", "src/**/*.kt" } diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailFragment.kt index bf7ae2c49..a3a5c643b 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailFragment.kt @@ -23,7 +23,6 @@ import androidx.appcompat.widget.PopupMenu import androidx.core.view.children import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels -import androidx.navigation.Navigation.findNavController import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.RecyclerView import org.oxycblt.auxio.R diff --git a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackNotification.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackNotification.kt index d8a49490e..d0fca446f 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackNotification.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackNotification.kt @@ -51,6 +51,7 @@ class PlaybackNotification private constructor( setCategory(NotificationCompat.CATEGORY_SERVICE) setShowWhen(false) setSilent(true) + setBadgeIconType(NotificationCompat.BADGE_ICON_NONE) setContentIntent(context.newMainIntent()) setVisibility(NotificationCompat.VISIBILITY_PUBLIC) diff --git a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt index 9630d50e2..03cac948b 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt @@ -444,34 +444,38 @@ class PlaybackService : Service(), Player.Listener, PlaybackStateManager.Callbac /** * A [BroadcastReceiver] for receiving general playback events from the system. - * TODO: Don't fire when the service initially starts? */ private inner class PlaybackReceiver : BroadcastReceiver() { - private var handledInitialHeadsetPlug = false + private var initialHeadsetPlugEventHandled = false override fun onReceive(context: Context, intent: Intent) { when (intent.action) { // --- SYSTEM EVENTS --- + + // Technically the MediaSession seems to handle bluetooth events on their + // own, but keep this around as a fallback in the case that the former fails + // for whatever reason. AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED -> { when (intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1)) { - AudioManager.SCO_AUDIO_STATE_CONNECTED -> resumeFromPlug() AudioManager.SCO_AUDIO_STATE_DISCONNECTED -> pauseFromPlug() + AudioManager.SCO_AUDIO_STATE_CONNECTED -> maybeResumeFromPlug() } } - AudioManager.ACTION_AUDIO_BECOMING_NOISY -> pauseFromPlug() - + // MediaSession does not handle wired headsets for some reason, so also include + // this. Gotta love Android having two actions for more or less the same thing. AudioManager.ACTION_HEADSET_PLUG -> { - if (handledInitialHeadsetPlug) { - when (intent.getIntExtra("state", -1)) { - 0 -> pauseFromPlug() - 1 -> resumeFromPlug() - } + when (intent.getIntExtra("state", -1)) { + 0 -> pauseFromPlug() + 1 -> maybeResumeFromPlug() } - handledInitialHeadsetPlug = true + initialHeadsetPlugEventHandled = true } + // I have never seen this ever happen but it might be useful + AudioManager.ACTION_AUDIO_BECOMING_NOISY -> pauseFromPlug() + // --- AUXIO EVENTS --- ACTION_PLAY_PAUSE -> playbackManager.setPlaying( !playbackManager.isPlaying @@ -496,25 +500,35 @@ class PlaybackService : Service(), Player.Listener, PlaybackStateManager.Callbac WidgetProvider.ACTION_WIDGET_UPDATE -> widgets.update() } } - } - /** - * Resume from a headset plug event, as long as its allowed. - */ - private fun resumeFromPlug() { - if (playbackManager.song != null && settingsManager.doPlugMgt) { - logD("Device connected, resuming") - playbackManager.setPlaying(true) + /** + * Resume from a headset plug event in the case that the quirk is enabled. + * This functionality remains a quirk for two reasons: + * 1. Automatically resuming more or less overrides all other audio streams, which + * is not that friendly + * 2. There is a bug where playback will always start when this service starts, mostly + * due to AudioManager.ACTION_HEADSET_PLUG always firing on startup. This is fixed, but + * I fear that it may not work on OEM skins that for whatever reason don't make this + * action fire. + */ + private fun maybeResumeFromPlug() { + if (playbackManager.song != null && + settingsManager.headsetAutoplay && + initialHeadsetPlugEventHandled + ) { + logD("Device connected, resuming") + playbackManager.setPlaying(true) + } } - } - /** - * Pause from a headset plug, as long as its allowed. - */ - private fun pauseFromPlug() { - if (playbackManager.song != null && settingsManager.doPlugMgt) { - logD("Device disconnected, pausing") - playbackManager.setPlaying(false) + /** + * Pause from a headset plug. + */ + private fun pauseFromPlug() { + if (playbackManager.song != null) { + logD("Device disconnected, pausing") + playbackManager.setPlaying(false) + } } } diff --git a/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt b/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt index 8557cabc2..47678c1b6 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt @@ -37,27 +37,27 @@ import org.oxycblt.auxio.ui.Sort class SettingsManager private constructor(context: Context) : SharedPreferences.OnSharedPreferenceChangeListener { - private val sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context) + private val prefs = PreferenceManager.getDefaultSharedPreferences(context) init { - sharedPrefs.registerOnSharedPreferenceChangeListener(this) + prefs.registerOnSharedPreferenceChangeListener(this) } // --- VALUES --- /** The current theme */ val theme: Int - get() = sharedPrefs.getInt(KEY_THEME, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) + get() = prefs.getInt(KEY_THEME, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) /** Whether the dark theme should be black or not */ val useBlackTheme: Boolean - get() = sharedPrefs.getBoolean(KEY_BLACK_THEME, false) + get() = prefs.getBoolean(KEY_BLACK_THEME, false) /** The current accent. */ var accent: Accent - get() = handleAccentCompat(sharedPrefs) + get() = handleAccentCompat(prefs) set(value) { - sharedPrefs.edit { + prefs.edit { putInt(KEY_ACCENT, value.index) apply() } @@ -68,14 +68,14 @@ class SettingsManager private constructor(context: Context) : * False if loop, true if shuffle. */ val useAltNotifAction: Boolean - get() = sharedPrefs.getBoolean(KEY_USE_ALT_NOTIFICATION_ACTION, false) + get() = prefs.getBoolean(KEY_USE_ALT_NOTIFICATION_ACTION, false) /** The current library tabs preferred by the user. */ var libTabs: Array - get() = Tab.fromSequence(sharedPrefs.getInt(KEY_LIB_TABS, Tab.SEQUENCE_DEFAULT)) + get() = Tab.fromSequence(prefs.getInt(KEY_LIB_TABS, Tab.SEQUENCE_DEFAULT)) ?: Tab.fromSequence(Tab.SEQUENCE_DEFAULT)!! set(value) { - sharedPrefs.edit { + prefs.edit { putInt(KEY_LIB_TABS, Tab.toSequence(value)) apply() } @@ -83,51 +83,51 @@ class SettingsManager private constructor(context: Context) : /** Whether to load embedded covers */ val showCovers: Boolean - get() = sharedPrefs.getBoolean(KEY_SHOW_COVERS, true) + get() = prefs.getBoolean(KEY_SHOW_COVERS, true) /** Whether to ignore MediaStore covers */ val useQualityCovers: Boolean - get() = sharedPrefs.getBoolean(KEY_QUALITY_COVERS, false) + get() = prefs.getBoolean(KEY_QUALITY_COVERS, false) /** Whether to round album covers */ val roundCovers: Boolean - get() = sharedPrefs.getBoolean(KEY_ROUND_COVERS, false) + get() = prefs.getBoolean(KEY_ROUND_COVERS, false) /** Whether to do Audio focus. */ val doAudioFocus: Boolean - get() = sharedPrefs.getBoolean(KEY_AUDIO_FOCUS, true) + get() = prefs.getBoolean(KEY_AUDIO_FOCUS, true) - /** Whether to resume/stop playback when a headset is connected/disconnected. */ - val doPlugMgt: Boolean - get() = sharedPrefs.getBoolean(KEY_PLUG_MANAGEMENT, true) + /** Whether to resume playback when a headset is connected (may not work well in all cases) */ + val headsetAutoplay: Boolean + get() = prefs.getBoolean(KEY_HEADSET_AUTOPLAY, false) /** The current ReplayGain configuration */ val replayGainMode: ReplayGainMode - get() = ReplayGainMode.fromInt(sharedPrefs.getInt(KEY_REPLAY_GAIN, Int.MIN_VALUE)) + get() = ReplayGainMode.fromInt(prefs.getInt(KEY_REPLAY_GAIN, Int.MIN_VALUE)) ?: ReplayGainMode.OFF /** What queue to create when a song is selected (ex. From All Songs or Search) */ val songPlaybackMode: PlaybackMode - get() = PlaybackMode.fromInt(sharedPrefs.getInt(KEY_SONG_PLAYBACK_MODE, Int.MIN_VALUE)) + get() = PlaybackMode.fromInt(prefs.getInt(KEY_SONG_PLAYBACK_MODE, Int.MIN_VALUE)) ?: PlaybackMode.ALL_SONGS /** Whether shuffle should stay on when a new song is selected. */ val keepShuffle: Boolean - get() = sharedPrefs.getBoolean(KEY_KEEP_SHUFFLE, true) + get() = prefs.getBoolean(KEY_KEEP_SHUFFLE, true) /** Whether to rewind when the back button is pressed. */ val rewindWithPrev: Boolean - get() = sharedPrefs.getBoolean(KEY_PREV_REWIND, true) + get() = prefs.getBoolean(KEY_PREV_REWIND, true) /** Whether [org.oxycblt.auxio.playback.state.LoopMode.TRACK] should pause when the track repeats */ val pauseOnLoop: Boolean - get() = sharedPrefs.getBoolean(KEY_LOOP_PAUSE, false) + get() = prefs.getBoolean(KEY_LOOP_PAUSE, false) /** The current filter mode of the search tab */ var searchFilterMode: DisplayMode? - get() = DisplayMode.fromFilterInt(sharedPrefs.getInt(KEY_SEARCH_FILTER_MODE, Int.MIN_VALUE)) + get() = DisplayMode.fromFilterInt(prefs.getInt(KEY_SEARCH_FILTER_MODE, Int.MIN_VALUE)) set(value) { - sharedPrefs.edit { + prefs.edit { putInt(KEY_SEARCH_FILTER_MODE, DisplayMode.toFilterInt(value)) apply() } @@ -135,10 +135,10 @@ class SettingsManager private constructor(context: Context) : /** The song sort mode on HomeFragment **/ var libSongSort: Sort - get() = Sort.fromInt(sharedPrefs.getInt(KEY_LIB_SONGS_SORT, Int.MIN_VALUE)) + get() = Sort.fromInt(prefs.getInt(KEY_LIB_SONGS_SORT, Int.MIN_VALUE)) ?: Sort.ByName(true) set(value) { - sharedPrefs.edit { + prefs.edit { putInt(KEY_LIB_SONGS_SORT, value.toInt()) apply() } @@ -146,10 +146,10 @@ class SettingsManager private constructor(context: Context) : /** The album sort mode on HomeFragment **/ var libAlbumSort: Sort - get() = Sort.fromInt(sharedPrefs.getInt(KEY_LIB_ALBUMS_SORT, Int.MIN_VALUE)) + get() = Sort.fromInt(prefs.getInt(KEY_LIB_ALBUMS_SORT, Int.MIN_VALUE)) ?: Sort.ByName(true) set(value) { - sharedPrefs.edit { + prefs.edit { putInt(KEY_LIB_ALBUMS_SORT, value.toInt()) apply() } @@ -157,10 +157,10 @@ class SettingsManager private constructor(context: Context) : /** The artist sort mode on HomeFragment **/ var libArtistSort: Sort - get() = Sort.fromInt(sharedPrefs.getInt(KEY_LIB_ARTISTS_SORT, Int.MIN_VALUE)) + get() = Sort.fromInt(prefs.getInt(KEY_LIB_ARTISTS_SORT, Int.MIN_VALUE)) ?: Sort.ByName(true) set(value) { - sharedPrefs.edit { + prefs.edit { putInt(KEY_LIB_ARTISTS_SORT, value.toInt()) apply() } @@ -168,10 +168,10 @@ class SettingsManager private constructor(context: Context) : /** The genre sort mode on HomeFragment **/ var libGenreSort: Sort - get() = Sort.fromInt(sharedPrefs.getInt(KEY_LIB_GENRES_SORT, Int.MIN_VALUE)) + get() = Sort.fromInt(prefs.getInt(KEY_LIB_GENRES_SORT, Int.MIN_VALUE)) ?: Sort.ByName(true) set(value) { - sharedPrefs.edit { + prefs.edit { putInt(KEY_LIB_GENRES_SORT, value.toInt()) apply() } @@ -179,10 +179,10 @@ class SettingsManager private constructor(context: Context) : /** The detail album sort mode **/ var detailAlbumSort: Sort - get() = Sort.fromInt(sharedPrefs.getInt(KEY_DETAIL_ALBUM_SORT, Int.MIN_VALUE)) + get() = Sort.fromInt(prefs.getInt(KEY_DETAIL_ALBUM_SORT, Int.MIN_VALUE)) ?: Sort.ByName(true) set(value) { - sharedPrefs.edit { + prefs.edit { putInt(KEY_DETAIL_ALBUM_SORT, value.toInt()) apply() } @@ -190,10 +190,10 @@ class SettingsManager private constructor(context: Context) : /** The detail artist sort mode **/ var detailArtistSort: Sort - get() = Sort.fromInt(sharedPrefs.getInt(KEY_DETAIL_ARTIST_SORT, Int.MIN_VALUE)) + get() = Sort.fromInt(prefs.getInt(KEY_DETAIL_ARTIST_SORT, Int.MIN_VALUE)) ?: Sort.ByYear(false) set(value) { - sharedPrefs.edit { + prefs.edit { putInt(KEY_DETAIL_ARTIST_SORT, value.toInt()) apply() } @@ -201,10 +201,10 @@ class SettingsManager private constructor(context: Context) : /** The detail genre sort mode **/ var detailGenreSort: Sort - get() = Sort.fromInt(sharedPrefs.getInt(KEY_DETAIL_GENRE_SORT, Int.MIN_VALUE)) + get() = Sort.fromInt(prefs.getInt(KEY_DETAIL_GENRE_SORT, Int.MIN_VALUE)) ?: Sort.ByName(true) set(value) { - sharedPrefs.edit { + prefs.edit { putInt(KEY_DETAIL_GENRE_SORT, value.toInt()) apply() } @@ -281,7 +281,7 @@ class SettingsManager private constructor(context: Context) : const val KEY_USE_ALT_NOTIFICATION_ACTION = "KEY_ALT_NOTIF_ACTION" const val KEY_AUDIO_FOCUS = "KEY_AUDIO_FOCUS" - const val KEY_PLUG_MANAGEMENT = "KEY_PLUG_MGT" + const val KEY_HEADSET_AUTOPLAY = "auxio_headset_autoplay" const val KEY_REPLAY_GAIN = "auxio_replay_gain" const val KEY_SONG_PLAYBACK_MODE = "KEY_SONG_PLAY_MODE2" diff --git a/app/src/main/java/org/oxycblt/auxio/util/DbUtil.kt b/app/src/main/java/org/oxycblt/auxio/util/DbUtil.kt index 5d09b5096..f47c88d32 100644 --- a/app/src/main/java/org/oxycblt/auxio/util/DbUtil.kt +++ b/app/src/main/java/org/oxycblt/auxio/util/DbUtil.kt @@ -37,12 +37,3 @@ fun assertBackgroundThread() { "This operation must be ran on a background thread" } } - -/** - * Assert that we are on a foreground thread. - */ -fun assertMainThread() { - check(Looper.myLooper() == Looper.getMainLooper()) { - "This operation must be ran on the main thread" - } -} diff --git a/app/src/main/res/layout/view_shuffle_button.xml b/app/src/main/res/layout/view_shuffle_button.xml deleted file mode 100644 index 2065d961c..000000000 --- a/app/src/main/res/layout/view_shuffle_button.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/values-ar-rIQ/strings.xml b/app/src/main/res/values-ar-rIQ/strings.xml index bff4fce1b..d173c98fe 100644 --- a/app/src/main/res/values-ar-rIQ/strings.xml +++ b/app/src/main/res/values-ar-rIQ/strings.xml @@ -83,10 +83,8 @@ صوتيات تركيز الصوت ايقاف مؤقت عند تشغيل صوت آخر (كالمكالمات) - تركيز السماعة - تشغيل/ايقاف مؤقت عند حدوث تغيير في اتصال السماعة صخب الصوت (تجريبي) - اطفاء + اطفاء تفضيل المقطع تفضيل الالبوم ديناميكي diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 4d7a96d28..be8f00f18 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -67,8 +67,6 @@ "Zvuk" "Zaměření zvuku" Pozastavit při přehrávání jiného zvuku (např. hovor) - "Zaměření sluchátek" - "Přehrát/pozastavit při změně připojení sluchátek" "Chování" "Když je vybrána skladba" "Zapamatovat si náhodné přehrávání" diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index b3e8db030..affb20ab7 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -71,10 +71,8 @@ Audio Audiofokus Pausieren wenn andere Töne abspielt wird [Bsp. Anrufe] - Kopfhörerfokus - Abspielen/Pausieren wenn sich die Kopfhörerverbindung ändert ReplayGain (Experimentell) - Aus + Aus Titel bevorzugen Album bevorzugen @@ -151,7 +149,7 @@ %d Alben Ein einfacher, rationaler Musikplayer für Android. - Spielende Musik anzeigen und kontrollieren + Musikwiedergabe anzeigen und kontrollieren Künstler Album Jahr @@ -173,5 +171,4 @@ Lied in der Warteschlange löschen Tab versetzen Unbekannter Künstler - \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 853849424..df4e05eb1 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -83,10 +83,8 @@ Sonido Enfoque de sonido Pausar cuando se reproduce otro sonido (Ej: llamadas) - Enfoque de auriculares - Reproducir/Pausar dependiendo de la conexión de auriculares ReplayGain (Experimental) - Desactivado + Desactivado Por pista Por álbum Dinámico diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index bcd920982..de7e762e1 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -50,7 +50,6 @@ Audio Audio Focus - Branchement du casque Comportement diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 288b00bc7..e3d0eec06 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -41,7 +41,6 @@ ऑडियो ऑडियो फोकस - हेडसेट प्लग चाल चलन diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index ff105e669..2241b99c8 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -49,7 +49,6 @@ Hang Hangfókusz - Fejhallgató csatlakozó Működés diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index ba13e7cb5..0f9ddec2d 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -50,7 +50,6 @@ Audio Focus audio - Inserimento cuffie Comportamento Ricorda casuale diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 928c6a0ff..5b504fc5e 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -48,7 +48,6 @@ 오디오 오디오 포커스 - 헤드셋 연결 동작 diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 52c0ca205..b52e19cbe 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -72,8 +72,6 @@ Audio Audiofocus Pauze wanneer andere audio speelt (ex. Gesprekken) - Headset-pluggen - Afspelen/Pauzeren wanneer de headsetaansluiting verandert Gedrag Wanneer een liedje is geselecteerd diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 851606073..0d49e2c45 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -49,7 +49,6 @@ Dźwięk Wyciszanie otoczenia - Podłączanie słuchawek Zachowanie diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index a9f059dc7..51d7540fb 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -49,7 +49,6 @@ Áudio Foco do áudio - Entrada do fone de ouvido Comportamento Memorizar aleatorização diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index a9701d224..26c346d5e 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -50,7 +50,6 @@ Áudio Foco de áudio - Entrada do fone de ouvido Comportamento Memorizar aleatorização diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 700cff133..c9f02a1bc 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -50,7 +50,6 @@ Audio Concentrare audio - Conexiune cu cască Comportament diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index ef49e0786..7f5680dec 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -83,10 +83,8 @@ Звук Аудио-фокус Ставить на паузу при звонках - Гарнитурный фокус - Ставить на паузу при отключении гарнитуры ReplayGain (экспериментально) - Выкл. + Выкл. По треку По альбому Динамический diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 25a5c4b8e..67d3c24e2 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -83,10 +83,8 @@ 音频 音频焦点 有其它音频播放(比如电话)时暂停 - 设备焦点 - 设备连接状态改变时播放/暂停 回放增益 - + 偏好曲目 偏好专辑 动态 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 2b9a9f9e1..5aa7b7261 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -48,7 +48,6 @@ 音訊 音頻焦點 - 耳機插頭 行為 記住隨機播放 diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml index ef9360ddf..e89cba798 100644 --- a/app/src/main/res/values/integers.xml +++ b/app/src/main/res/values/integers.xml @@ -30,7 +30,7 @@ - @string/set_replay_gain_off + @string/set_off @string/set_replay_gain_track @string/set_replay_gain_album @string/set_replay_gain_dynamic diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cb039b406..051c52fc9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,10 +1,9 @@ - A simple, rational music player for android. Music Playback - View and control playing music + View and control music playback Retry @@ -83,10 +82,9 @@ Audio Audio focus Pause when other audio plays (ex. Calls) - Headset focus - Play/Pause when the headset connection changes + Headset autoplay + Always start playing when a headset is connected (may not work on all devices) ReplayGain (Experimental) - Off Prefer track Prefer album Dynamic @@ -108,6 +106,8 @@ Excluded folders The content of excluded folders is hidden from your library + Off + No music found Music loading failed diff --git a/app/src/main/res/xml/prefs_main.xml b/app/src/main/res/xml/prefs_main.xml index 209de6d6b..afe8be5d4 100644 --- a/app/src/main/res/xml/prefs_main.xml +++ b/app/src/main/res/xml/prefs_main.xml @@ -87,11 +87,11 @@ app:title="@string/set_focus" /> + app:key="auxio_headset_autoplay" + app:summary="@string/set_headset_autoplay_desc" + app:title="@string/set_headset_autoplay" /> 0: - print(WARN + "warn:" + NC + " NDK_PATH was not set or invalid. multiple candidates were found however:") - + print(WARN + "warn:" + NC + " NDK_PATH was not set or invalid. multiple " + + "candidates were found however:") for i, candidate in enumerate(candidates): print("[" + str(i) + "] " + candidate) @@ -70,9 +84,12 @@ if ndk_path is None or not os.path.isfile(os.path.join(ndk_path, "ndk-build")): except: ndk_path = candidates[0] else: - print(FATAL + "fatal:" + NC + " the android ndk was not installed at a recognized location.") + print(FATAL + "fatal:" + NC + " the android ndk was not installed at a " + + "recognized location.") system.exit(1) +ndk_build_path = os.path.join(ndk_path, "ndk-build") + # Now try to install ExoPlayer. sh("rm -rf " + exoplayer_path) sh("rm -rf " + libs_path) @@ -82,18 +99,15 @@ sh("git clone https://github.com/google/ExoPlayer.git " + exoplayer_path) os.chdir(exoplayer_path) sh("git checkout r" + EXO_VERSION) -print(INFO + "info:" + NC + " installing flac extension...") +print(INFO + "info:" + NC + " assembling flac extension...") +flac_ext_aar_path = os.path.join(exoplayer_path, "extensions", "flac", + "buildout", "outputs", "aar", "extension-flac-release.aar") flac_ext_jni_path = os.path.join("extensions", "flac", "src", "main", "jni") -ndk_build_path = os.path.join(ndk_path, "ndk-build") -os.chdir(flac_ext_jni_path) -sh('curl "https://ftp.osuosl.org/pub/xiph/releases/flac/flac-' + FLAC_VERSION + '.tar.xz" | tar xJ && mv "flac-' + FLAC_VERSION + '" flac') -sh(ndk_build_path + " APP_ABI=all -j4") -print(INFO + "info:" + NC + " assembling libraries") -flac_ext_aar_path = os.path.join( - exoplayer_path, "extensions", "flac", "buildout", - "outputs", "aar", "extension-flac-release.aar" -) +os.chdir(flac_ext_jni_path) +sh('curl "https://ftp.osuosl.org/pub/xiph/releases/flac/flac-' + FLAC_VERSION + + '.tar.xz" | tar xJ && mv "flac-' + FLAC_VERSION + '" flac') +sh(ndk_build_path + " APP_ABI=all -j4") os.chdir(exoplayer_path) sh("./gradlew extension-flac:bundleReleaseAar") @@ -102,4 +116,4 @@ os.chdir(start_path) sh("mkdir " + libs_path) sh("cp " + flac_ext_aar_path + " " + libs_path) -print(OK + "success:" + NC + " completed pre-build.") +print(OK + "success:" + NC + " completed pre-build")