diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f31072e4..32a1a60ac 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,11 @@ + + + + + + + + + + + + = Build.VERSION_CODES.S) { + val settings = Settings(this) + if (settings.bluetoothAutoplay) { + ActivityCompat.requestPermissions( + this, + arrayOf(android.Manifest.permission.BLUETOOTH_CONNECT), + BLUETOOTH_PERMISSION_REQUEST_ID + ) + } + } } override fun onNewIntent(intent: Intent?) { @@ -141,5 +154,6 @@ class MainActivity : AppCompatActivity() { companion object { private const val KEY_INTENT_USED = BuildConfig.APPLICATION_ID + ".key.FILE_INTENT_USED" + private const val BLUETOOTH_PERMISSION_REQUEST_ID = 1337 * 42; } } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/system/BluetoothConnectReceiver.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/BluetoothConnectReceiver.kt new file mode 100644 index 000000000..0e33563cb --- /dev/null +++ b/app/src/main/java/org/oxycblt/auxio/playback/system/BluetoothConnectReceiver.kt @@ -0,0 +1,33 @@ +package org.oxycblt.auxio.playback.system + +import android.bluetooth.BluetoothProfile +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.os.Build +import org.oxycblt.auxio.playback.state.InternalPlayer +import org.oxycblt.auxio.playback.state.PlaybackStateManager +import org.oxycblt.auxio.settings.Settings + +class BluetoothConnectReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (intent.action == android.bluetooth.BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED) { + val newState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, BluetoothProfile.STATE_DISCONNECTED) + if (newState == BluetoothProfile.STATE_CONNECTED) { + val settings = Settings(context) + if (settings.bluetoothAutoplay) { + // make sure required services are up and running + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.startForegroundService(Intent(context, PlaybackService::class.java)) + } else { + context.startService(Intent(context, PlaybackService::class.java)) + } + // start playback + val playbackManager = PlaybackStateManager.getInstance() + playbackManager.startAction(InternalPlayer.Action.RestoreState) + playbackManager.changePlaying(true) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/oxycblt/auxio/settings/Settings.kt b/app/src/main/java/org/oxycblt/auxio/settings/Settings.kt index 1e3d91949..d24ea8047 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/Settings.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/Settings.kt @@ -135,6 +135,10 @@ class Settings(private val context: Context, private val callback: Callback? = n val headsetAutoplay: Boolean get() = inner.getBoolean(context.getString(R.string.set_key_headset_autoplay), false) + /** Whether a connected bluetooth device should cause Auxio to spawn and start playback */ + val bluetoothAutoplay: Boolean + get() = inner.getBoolean(context.getString(R.string.set_key_bluetooth_autoplay), false) + /** The current ReplayGain configuration */ val replayGainMode: ReplayGainMode get() = diff --git a/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt b/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt index 4fa3cf5fe..9aff89489 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt @@ -17,6 +17,8 @@ package org.oxycblt.auxio.settings +import android.app.Activity +import android.os.Build import android.os.Bundle import android.view.View import androidx.annotation.DrawableRes @@ -44,6 +46,8 @@ import org.oxycblt.auxio.util.isNight import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.showToast import org.oxycblt.auxio.util.systemBarInsetsCompat +import java.security.Permission +import java.util.jar.Manifest /** * The actual fragment containing the settings menu. Inherits [PreferenceFragmentCompat]. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 03574d3f7..1c0843ba8 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -57,6 +57,8 @@ Audio Kopfhörer: automatische Wiedergabe Beginne die Wiedergabe immer, wenn Kopfhörer verbunden sind (funktioniert nicht auf allen Geräten) + Bluetooth: automatische Wiedergabe + Auxio starten und Wiedergabe fortführen, sobald ein Bluetooth Audio fähiges Gerät verbunden wurde ReplayGain-Strategie ReplayGain-Prälautverstärkung Während der Musikwiedergabe, trifft die Prälautverstärkung dem aktuellem Abgleich zu diff --git a/app/src/main/res/values/settings.xml b/app/src/main/res/values/settings.xml index af188e1b3..8fe855736 100644 --- a/app/src/main/res/values/settings.xml +++ b/app/src/main/res/values/settings.xml @@ -15,6 +15,7 @@ KEY_ALT_NOTIF_ACTION auxio_headset_autoplay + auxio_bluetooth_autoplay auxio_replay_gain auxio_pre_amp auxio_pre_amp_with diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bd1cc44a8..94b9bf0e3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -180,6 +180,8 @@ Audio Headset autoplay Always start playing when a headset is connected (may not work on all devices) + Bluetooth autoplay + A connected bluetooth audio device causes Auxio to spawn and start playback ReplayGain strategy Prefer track Prefer album diff --git a/app/src/main/res/xml/prefs_main.xml b/app/src/main/res/xml/prefs_main.xml index 214d186eb..dddb959d7 100644 --- a/app/src/main/res/xml/prefs_main.xml +++ b/app/src/main/res/xml/prefs_main.xml @@ -74,6 +74,11 @@ app:summary="@string/set_headset_autoplay_desc" app:title="@string/set_headset_autoplay" /> + +