diff --git a/app/build.gradle b/app/build.gradle
index ff9700096..530476f3e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -434,6 +434,8 @@ dependencies {
implementation libs.conscrypt.android
implementation libs.signal.aesgcmprovider
+ implementation libs.audioswitch
+
implementation project(':libsignal-service')
implementation project(':paging')
implementation project(':core-util')
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager.kt b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager.kt
index 499dea8a2..5da0d8821 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager.kt
@@ -14,6 +14,8 @@ import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
+import com.twilio.audioswitch.AudioDevice
+import com.twilio.audioswitch.AudioSwitch
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.util.ServiceUtil
import java.util.concurrent.TimeUnit
@@ -40,6 +42,7 @@ class VoiceNoteProximityWakeLockManager(
private val mediaControllerCallback = MediaControllerCallback()
private val hardwareSensorEventListener = HardwareSensorEventListener()
+ private val audioSwitch: AudioSwitch? = if (Build.VERSION.SDK_INT < 31) AudioSwitch(activity.applicationContext) else null
private var startTime: Long = -1
@@ -50,12 +53,25 @@ class VoiceNoteProximityWakeLockManager(
}
override fun onResume(owner: LifecycleOwner) {
+ if (audioSwitch == null) {
+ startListening()
+ } else {
+ audioSwitch.start { _, selectedAudioDevice -> onFocusedAudioDeviceChanged(selectedAudioDevice) }
+ }
+ }
+
+ override fun onPause(owner: LifecycleOwner) {
+ audioSwitch?.stop()
+ stopListening()
+ }
+
+ private fun startListening() {
if (proximitySensor != null) {
mediaController.registerCallback(mediaControllerCallback)
}
}
- override fun onPause(owner: LifecycleOwner) {
+ private fun stopListening() {
if (proximitySensor != null) {
unregisterCallbacksAndRelease()
}
@@ -68,10 +84,19 @@ class VoiceNoteProximityWakeLockManager(
fun unregisterFromLifecycle() {
if (proximitySensor != null) {
+ stopListening()
activity.lifecycle.removeObserver(this)
}
}
+ private fun onFocusedAudioDeviceChanged(audioDevice: AudioDevice?) {
+ if (audioDevice is AudioDevice.BluetoothHeadset) {
+ stopListening()
+ } else {
+ startListening()
+ }
+ }
+
private fun isActivityResumed() = activity.lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)
private fun isPlayerActive() = mediaController.playbackState.state == PlaybackStateCompat.STATE_BUFFERING ||
diff --git a/dependencies.gradle b/dependencies.gradle
index 883bd3b20..b3030279b 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -113,6 +113,7 @@ dependencyResolutionManagement {
alias('lottie').to('com.airbnb.android:lottie:3.6.0')
alias('stickyheadergrid').to('com.codewaves.stickyheadergrid:stickyheadergrid:0.9.4')
alias('dnsjava').to('dnsjava:dnsjava:2.1.9')
+ alias('audioswitch').to('com.twilio:audioswitch:1.1.4')
// Mp4Parser
alias('mp4parser-isoparser').to('org.mp4parser', 'isoparser').versionRef('mp4parser')
diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml
index 2b37bbdba..015f1a486 100644
--- a/gradle/verification-metadata.xml
+++ b/gradle/verification-metadata.xml
@@ -59,6 +59,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
+
+
+
+
+
+
+
+
@@ -2127,6 +2135,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
+
+
+
+
+