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 1fa4e212fb..2b3ad2be55 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 @@ -15,7 +15,9 @@ import androidx.media3.common.Player import androidx.media3.session.MediaController import androidx.media3.session.SessionCommand import org.signal.core.util.logging.Log +import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.util.ServiceUtil +import org.thoughtcrime.securesms.webrtc.audio.AudioManagerCompat import java.util.concurrent.TimeUnit private val TAG = Log.tag(VoiceNoteProximityWakeLockManager::class.java) @@ -31,6 +33,7 @@ class VoiceNoteProximityWakeLockManager( private val wakeLock: PowerManager.WakeLock? = ServiceUtil.getPowerManager(activity.applicationContext).newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, TAG) + private val audioManager: AudioManagerCompat = AppDependencies.androidCallAudioManager private val sensorManager: SensorManager = ServiceUtil.getSensorManager(activity) private val proximitySensor: Sensor? = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY) @@ -98,13 +101,17 @@ class VoiceNoteProximityWakeLockManager( if (player.isPlaying) { if (startTime == -1L) { - Log.d(TAG, "[onPlaybackStateChanged] Player became active with start time $startTime, registering sensor listener.") - startTime = System.currentTimeMillis() - if (wakeLock?.isHeld == false) { - Log.d(TAG, "[onPlaybackStateChanged] Acquiring wakelock") - wakeLock.acquire(TimeUnit.MINUTES.toMillis(30)) + if (audioManager.isHeadsetConnected) { + Log.d(TAG, "[onPlaybackStateChanged] Headset connected, skipping proximity sensor registration.") + } else { + Log.d(TAG, "[onPlaybackStateChanged] Player became active with start time $startTime, registering sensor listener.") + startTime = System.currentTimeMillis() + if (wakeLock?.isHeld == false) { + Log.d(TAG, "[onPlaybackStateChanged] Acquiring wakelock") + wakeLock.acquire(TimeUnit.MINUTES.toMillis(30)) + } + sensorManager.registerListener(hardwareSensorEventListener, proximitySensor, SensorManager.SENSOR_DELAY_NORMAL) } - sensorManager.registerListener(hardwareSensorEventListener, proximitySensor, SensorManager.SENSOR_DELAY_NORMAL) } else { Log.d(TAG, "[onPlaybackStateChanged] Player became active without start time, skipping sensor registration") } @@ -122,7 +129,8 @@ class VoiceNoteProximityWakeLockManager( System.currentTimeMillis() - startTime <= 500 || !isActivityResumed() || !mediaController.isPlaying || - event.sensor.type != Sensor.TYPE_PROXIMITY + event.sensor.type != Sensor.TYPE_PROXIMITY || + audioManager.isHeadsetConnected() ) { return } diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/AudioManagerCompat.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/AudioManagerCompat.java index e815e227d7..490d46e429 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/AudioManagerCompat.java +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/audio/AudioManagerCompat.java @@ -211,6 +211,22 @@ public abstract class AudioManagerCompat { } return false; } + + public boolean isHeadsetConnected() { + AudioDeviceInfo[] devices = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS); + for (AudioDeviceInfo device : devices) { + final int type = device.getType(); + if (type == AudioDeviceInfo.TYPE_WIRED_HEADSET || + type == AudioDeviceInfo.TYPE_WIRED_HEADPHONES || + type == AudioDeviceInfo.TYPE_USB_HEADSET || + type == AudioDeviceInfo.TYPE_BLUETOOTH_A2DP || + type == AudioDeviceInfo.TYPE_BLUETOOTH_SCO) { + Log.i(TAG, "Headset connected: " + type); + return true; + } + } + return false; + } public float ringVolumeWithMinimum() { int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING);