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")