From b182f73415c513cef89145bf8d213d194789fa32 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Tue, 20 Oct 2020 15:15:37 -0300 Subject: [PATCH] Fix wakelock release exception. --- .../voice/VoiceNotePlaybackService.java | 2 +- .../voice/VoiceNoteProximityManager.java | 49 ++++++++++++++----- .../notifications/DefaultMessageNotifier.java | 5 ++ .../notifications/MessageNotifier.java | 1 + .../OptimizedMessageNotifier.java | 5 ++ 5 files changed, 48 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService.java b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService.java index 34c187efeb..8db03d3cd7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNotePlaybackService.java @@ -89,7 +89,7 @@ public class VoiceNotePlaybackService extends MediaBrowserServiceCompat { VoiceNoteMediaSourceFactory mediaSourceFactory = new VoiceNoteMediaSourceFactory(this); voiceNotePlaybackPreparer = new VoiceNotePlaybackPreparer(this, player, queueDataAdapter, mediaSourceFactory); - voiceNoteProximityManager = new VoiceNoteProximityManager(this, player); + voiceNoteProximityManager = new VoiceNoteProximityManager(this, player, queueDataAdapter); mediaSession.setPlaybackState(stateBuilder.build()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteProximityManager.java b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteProximityManager.java index b8881e57c2..ca7da07c0f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteProximityManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteProximityManager.java @@ -8,6 +8,7 @@ import android.hardware.SensorManager; import android.media.AudioManager; import android.os.Build; import android.os.PowerManager; +import android.support.v4.media.MediaDescriptionCompat; import androidx.annotation.NonNull; @@ -17,6 +18,7 @@ import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.util.Util; +import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.util.ServiceUtil; @@ -28,19 +30,24 @@ class VoiceNoteProximityManager implements SensorEventListener { private static final float PROXIMITY_THRESHOLD = 5f; - private final SimpleExoPlayer player; - private final AudioManager audioManager; - private final SensorManager sensorManager; - private final Sensor proximitySensor; - private final PowerManager.WakeLock wakeLock; + private final SimpleExoPlayer player; + private final AudioManager audioManager; + private final SensorManager sensorManager; + private final Sensor proximitySensor; + private final PowerManager.WakeLock wakeLock; + private final VoiceNoteQueueDataAdapter queueDataAdapter; private long startTime; - VoiceNoteProximityManager(@NonNull Context context, @NonNull SimpleExoPlayer player) { - this.player = player; - this.audioManager = ServiceUtil.getAudioManager(context); - this.sensorManager = ServiceUtil.getSensorManager(context); - this.proximitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); + VoiceNoteProximityManager(@NonNull Context context, + @NonNull SimpleExoPlayer player, + @NonNull VoiceNoteQueueDataAdapter queueDataAdapter) + { + this.player = player; + this.audioManager = ServiceUtil.getAudioManager(context); + this.sensorManager = ServiceUtil.getSensorManager(context); + this.proximitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); + this.queueDataAdapter = queueDataAdapter; if (Build.VERSION.SDK_INT >= 21) { this.wakeLock = ServiceUtil.getPowerManager(context).newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, TAG); @@ -81,11 +88,24 @@ class VoiceNoteProximityManager implements SensorEventListener { final int currentStreamType = Util.getStreamTypeForAudioUsage(player.getAudioAttributes().usage); + final long threadId; + final int windowIndex = player.getCurrentWindowIndex(); + + if (queueDataAdapter.isEmpty() || windowIndex == C.INDEX_UNSET) { + threadId = -1; + } else { + MediaDescriptionCompat mediaDescriptionCompat = queueDataAdapter.getMediaDescription(windowIndex); + + threadId = mediaDescriptionCompat.getExtras().getLong(VoiceNoteMediaDescriptionCompatFactory.EXTRA_THREAD_ID, -1); + } + if (desiredStreamType == AudioManager.STREAM_VOICE_CALL && desiredStreamType != currentStreamType && - !audioManager.isWiredHeadsetOn()) + !audioManager.isWiredHeadsetOn() && + threadId != -1 && + ApplicationDependencies.getMessageNotifier().getVisibleThread() == threadId) { - if (wakeLock != null) { + if (wakeLock != null && !wakeLock.isHeld()) { wakeLock.acquire(TimeUnit.MINUTES.toMillis(30)); } @@ -102,7 +122,10 @@ class VoiceNoteProximityManager implements SensorEventListener { System.currentTimeMillis() - startTime > 500) { if (wakeLock != null) { - wakeLock.release(); + if (wakeLock.isHeld()) { + wakeLock.release(); + } + player.setPlayWhenReady(false); player.setAudioAttributes(new AudioAttributes.Builder() .setContentType(C.CONTENT_TYPE_MUSIC) diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java index 947938ae14..6be502e81e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java @@ -109,6 +109,11 @@ public class DefaultMessageNotifier implements MessageNotifier { visibleThread = threadId; } + @Override + public long getVisibleThread() { + return visibleThread; + } + @Override public void clearVisibleThread() { setVisibleThread(-1); diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/MessageNotifier.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/MessageNotifier.java index 98a903be71..fece5ba61f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/MessageNotifier.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/MessageNotifier.java @@ -12,6 +12,7 @@ import org.thoughtcrime.securesms.util.concurrent.SignalExecutors; public interface MessageNotifier { void setVisibleThread(long threadId); + long getVisibleThread(); void clearVisibleThread(); void setLastDesktopActivityTimestamp(long timestamp); void notifyMessageDeliveryFailed(Context context, Recipient recipient, long threadId); diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/OptimizedMessageNotifier.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/OptimizedMessageNotifier.java index 4e109ef665..e463132501 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/OptimizedMessageNotifier.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/OptimizedMessageNotifier.java @@ -30,6 +30,11 @@ public class OptimizedMessageNotifier implements MessageNotifier { wrapped.setVisibleThread(threadId); } + @Override + public long getVisibleThread() { + return wrapped.getVisibleThread(); + } + @Override public void clearVisibleThread() { wrapped.clearVisibleThread();