From ef7233da11b12d148a6c4a59d1002294da7a6f76 Mon Sep 17 00:00:00 2001 From: Philippe Laporte Date: Thu, 8 Dec 2022 16:31:09 -0500 Subject: [PATCH 1/4] leaner VoiceNotePlaybackService footprint --- .../voice/VoiceNoteMediaController.java | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteMediaController.java b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteMediaController.java index 617d22b04fd..b62abe76891 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteMediaController.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteMediaController.java @@ -56,6 +56,7 @@ public class VoiceNoteMediaController implements DefaultLifecycleObserver { private VoiceNoteProximityWakeLockManager voiceNoteProximityWakeLockManager; private final MediaControllerCompatCallback mediaControllerCompatCallback = new MediaControllerCompatCallback(); + private Runnable onConnectRunnable; public VoiceNoteMediaController(@NonNull FragmentActivity activity) { this.activity = activity; @@ -103,12 +104,6 @@ public LiveData> getVoiceNotePlayerViewState return voiceNotePlayerViewState; } - @Override - public void onResume(@NonNull LifecycleOwner owner) { - mediaBrowser.disconnect(); - mediaBrowser.connect(); - } - @Override public void onPause(@NonNull LifecycleOwner owner) { clearProgressEventHandler(); @@ -116,8 +111,6 @@ public void onPause(@NonNull LifecycleOwner owner) { if (MediaControllerCompat.getMediaController(activity) != null) { MediaControllerCompat.getMediaController(activity).unregisterCallback(mediaControllerCompatCallback); } - - mediaBrowser.disconnect(); } @Override @@ -153,17 +146,28 @@ private static boolean isPlayerStopped(@NonNull PlaybackStateCompat playbackStat } } - public void startConsecutivePlayback(@NonNull Uri audioSlideUri, long messageId, double progress) { - startPlayback(audioSlideUri, messageId, -1, progress, false); + onConnectRunnable = () -> startPlayback(audioSlideUri, messageId, -1, progress, false); + if (mediaBrowser.isConnected()) { + mediaBrowser.disconnect(); + } + mediaBrowser.connect(); } public void startSinglePlayback(@NonNull Uri audioSlideUri, long messageId, double progress) { - startPlayback(audioSlideUri, messageId, -1, progress, true); + onConnectRunnable = () -> startPlayback(audioSlideUri, messageId, -1, progress, true); + if (mediaBrowser.isConnected()) { + mediaBrowser.disconnect(); + } + mediaBrowser.connect(); } public void startSinglePlaybackForDraft(@NonNull Uri draftUri, long threadId, double progress) { - startPlayback(draftUri, -1, threadId, progress, true); + onConnectRunnable = () -> startPlayback(draftUri, -1, threadId, progress, true); + if (mediaBrowser.isConnected()) { + mediaBrowser.disconnect(); + } + mediaBrowser.connect(); } /** @@ -365,6 +369,11 @@ public void onConnected() { mediaController.registerCallback(mediaControllerCompatCallback); mediaControllerCompatCallback.onPlaybackStateChanged(mediaController.getPlaybackState()); + + if (onConnectRunnable != null) { + onConnectRunnable.run(); + onConnectRunnable = null; + } } @Override @@ -377,6 +386,7 @@ public void onConnectionSuspended() { public void onConnectionFailed() { Log.d(TAG, "Voice note MediaBrowser connection failed."); cleanUpOldProximityWakeLockManager(); + onConnectRunnable = null; } private void cleanUpOldProximityWakeLockManager() { From 356c18fa583c028de7dcf973ec6fef3e5b1e0688 Mon Sep 17 00:00:00 2001 From: Philippe Laporte Date: Wed, 29 Mar 2023 15:45:13 -0400 Subject: [PATCH 2/4] changes re-applied after upstream merge --- .../voice/VoiceNoteMediaController.java | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteMediaController.java b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteMediaController.java index ff341da3cd9..1eaa43ae629 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteMediaController.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteMediaController.java @@ -58,6 +58,7 @@ public class VoiceNoteMediaController implements DefaultLifecycleObserver { private boolean isMediaBrowserCreationPostponed; private final MediaControllerCompatCallback mediaControllerCompatCallback = new MediaControllerCompatCallback(); + private Runnable onConnectRunnable; public VoiceNoteMediaController(@NonNull FragmentActivity activity) { this(activity, false); @@ -133,8 +134,6 @@ public void onResume(@NonNull LifecycleOwner owner) { } ensureMediaBrowser(); - mediaBrowser.disconnect(); - mediaBrowser.connect(); } @Override @@ -145,9 +144,6 @@ public void onPause(@NonNull LifecycleOwner owner) { MediaControllerCompat.getMediaController(activity).unregisterCallback(mediaControllerCompatCallback); } - if (mediaBrowser != null) { - mediaBrowser.disconnect(); - } } @Override @@ -185,15 +181,27 @@ private static boolean isPlayerStopped(@NonNull PlaybackStateCompat playbackStat public void startConsecutivePlayback(@NonNull Uri audioSlideUri, long messageId, double progress) { - startPlayback(audioSlideUri, messageId, -1, progress, false); + onConnectRunnable = () -> startPlayback(audioSlideUri, messageId, -1, progress, false); + if (mediaBrowser.isConnected()) { + mediaBrowser.disconnect(); + } + mediaBrowser.connect(); } public void startSinglePlayback(@NonNull Uri audioSlideUri, long messageId, double progress) { - startPlayback(audioSlideUri, messageId, -1, progress, true); + onConnectRunnable = () -> startPlayback(audioSlideUri, messageId, -1, progress, true); + if (mediaBrowser.isConnected()) { + mediaBrowser.disconnect(); + } + mediaBrowser.connect(); } public void startSinglePlaybackForDraft(@NonNull Uri draftUri, long threadId, double progress) { - startPlayback(draftUri, -1, threadId, progress, true); + onConnectRunnable = () -> startPlayback(draftUri, -1, threadId, progress, true); + if (mediaBrowser.isConnected()) { + mediaBrowser.disconnect(); + } + mediaBrowser.connect(); } /** @@ -395,6 +403,11 @@ public void onConnected() { mediaController.registerCallback(mediaControllerCompatCallback); mediaControllerCompatCallback.onPlaybackStateChanged(mediaController.getPlaybackState()); + + if (onConnectRunnable != null) { + onConnectRunnable.run(); + onConnectRunnable = null; + } } @Override @@ -407,6 +420,7 @@ public void onConnectionSuspended() { public void onConnectionFailed() { Log.d(TAG, "Voice note MediaBrowser connection failed."); cleanUpOldProximityWakeLockManager(); + onConnectRunnable = null; } private void cleanUpOldProximityWakeLockManager() { From c66aab118d4ed09112d8ab7f8ae507c4fbe70ccf Mon Sep 17 00:00:00 2001 From: Philippe Laporte Date: Thu, 30 Mar 2023 16:22:23 -0400 Subject: [PATCH 3/4] cleanup --- .../components/voice/VoiceNoteMediaController.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteMediaController.java b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteMediaController.java index 1eaa43ae629..55920a1b1bd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteMediaController.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteMediaController.java @@ -99,7 +99,7 @@ public VoiceNoteMediaController(@NonNull FragmentActivity activity, boolean post }); } - public void ensureMediaBrowser() { + private void ensureMediaBrowser() { if (mediaBrowser != null) { return; } @@ -127,14 +127,6 @@ public void finishPostpone() { } } - @Override - public void onResume(@NonNull LifecycleOwner owner) { - if (mediaBrowser == null && isMediaBrowserCreationPostponed) { - return; - } - - ensureMediaBrowser(); - } @Override public void onPause(@NonNull LifecycleOwner owner) { @@ -182,6 +174,7 @@ private static boolean isPlayerStopped(@NonNull PlaybackStateCompat playbackStat public void startConsecutivePlayback(@NonNull Uri audioSlideUri, long messageId, double progress) { onConnectRunnable = () -> startPlayback(audioSlideUri, messageId, -1, progress, false); + ensureMediaBrowser(); if (mediaBrowser.isConnected()) { mediaBrowser.disconnect(); } @@ -190,6 +183,7 @@ public void startConsecutivePlayback(@NonNull Uri audioSlideUri, long messageId, public void startSinglePlayback(@NonNull Uri audioSlideUri, long messageId, double progress) { onConnectRunnable = () -> startPlayback(audioSlideUri, messageId, -1, progress, true); + ensureMediaBrowser(); if (mediaBrowser.isConnected()) { mediaBrowser.disconnect(); } @@ -198,6 +192,7 @@ public void startSinglePlayback(@NonNull Uri audioSlideUri, long messageId, doub public void startSinglePlaybackForDraft(@NonNull Uri draftUri, long threadId, double progress) { onConnectRunnable = () -> startPlayback(draftUri, -1, threadId, progress, true); + ensureMediaBrowser(); if (mediaBrowser.isConnected()) { mediaBrowser.disconnect(); } From 353e15ebadba036c170b56e75624ff7b16d2c631 Mon Sep 17 00:00:00 2001 From: Philippe Laporte Date: Thu, 30 Mar 2023 16:31:38 -0400 Subject: [PATCH 4/4] finishPostpone is too eager to start the voice note service --- .../thoughtcrime/securesms/MainActivity.java | 2 +- .../voice/VoiceNoteMediaController.java | 17 +---------------- .../ConversationParentFragment.java | 3 +-- .../ConversationListFragment.java | 1 - 4 files changed, 3 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.java b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.java index d29e3c2e8d2..412018be5e9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.java @@ -74,7 +74,7 @@ public boolean onPreDraw() { }); - mediaController = new VoiceNoteMediaController(this, true); + mediaController = new VoiceNoteMediaController(this); ConversationListTabRepository repository = new ConversationListTabRepository(); ConversationListTabsViewModel.Factory factory = new ConversationListTabsViewModel.Factory(repository); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteMediaController.java b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteMediaController.java index 55920a1b1bd..c0301d8e7eb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteMediaController.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/voice/VoiceNoteMediaController.java @@ -55,18 +55,13 @@ public class VoiceNoteMediaController implements DefaultLifecycleObserver { private MutableLiveData voiceNotePlaybackState = new MutableLiveData<>(VoiceNotePlaybackState.NONE); private LiveData> voiceNotePlayerViewState; private VoiceNoteProximityWakeLockManager voiceNoteProximityWakeLockManager; - private boolean isMediaBrowserCreationPostponed; private final MediaControllerCompatCallback mediaControllerCompatCallback = new MediaControllerCompatCallback(); private Runnable onConnectRunnable; - public VoiceNoteMediaController(@NonNull FragmentActivity activity) { - this(activity, false); - } - public VoiceNoteMediaController(@NonNull FragmentActivity activity, boolean postponeMediaBrowserCreation) { + public VoiceNoteMediaController(@NonNull FragmentActivity activity) { this.activity = activity; - this.isMediaBrowserCreationPostponed = postponeMediaBrowserCreation; activity.getLifecycle().addObserver(this); @@ -118,15 +113,6 @@ public LiveData> getVoiceNotePlayerViewState return voiceNotePlayerViewState; } - public void finishPostpone() { - isMediaBrowserCreationPostponed = false; - if (activity != null && mediaBrowser == null && activity.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) { - ensureMediaBrowser(); - mediaBrowser.disconnect(); - mediaBrowser.connect(); - } - } - @Override public void onPause(@NonNull LifecycleOwner owner) { @@ -135,7 +121,6 @@ public void onPause(@NonNull LifecycleOwner owner) { if (MediaControllerCompat.getMediaController(activity) != null) { MediaControllerCompat.getMediaController(activity).unregisterCallback(mediaControllerCompatCallback); } - } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java index 00a800224c6..e6beabe66db 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -513,7 +513,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat return; } - voiceNoteMediaController = new VoiceNoteMediaController(requireActivity(), true); + voiceNoteMediaController = new VoiceNoteMediaController(requireActivity()); voiceRecorderWakeLock = new VoiceRecorderWakeLock(requireActivity()); // TODO [alex] LargeScreenSupport -- Should be removed once we move to multi-pane layout. @@ -3924,7 +3924,6 @@ public void onFirstRender() { if (getActivity() != null) { requireActivity().supportStartPostponedEnterTransition(); } - voiceNoteMediaController.finishPostpone(); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java index daade19a720..3d6bfd08860 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java @@ -985,7 +985,6 @@ private void onFirstRender() { AppStartup.getInstance().onCriticalRenderEventEnd(); startupStopwatch.split("first-render"); startupStopwatch.stop(TAG); - mediaControllerOwner.getVoiceNoteMediaController().finishPostpone(); if (getParentFragment() != null) { requireCallback().getSearchToolbar().get();