diff --git a/app/src/main/java/org/thoughtcrime/securesms/DatabaseMigrationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/DatabaseMigrationActivity.java index fce61e3c5..06cd92f66 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/DatabaseMigrationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/DatabaseMigrationActivity.java @@ -9,6 +9,7 @@ import android.content.ServiceConnection; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; +import android.os.Looper; import android.os.Message; import android.os.Parcelable; import android.view.View; @@ -158,6 +159,11 @@ public class DatabaseMigrationActivity extends PassphraseRequiredActivity { } private class ImportStateHandler extends Handler { + + public ImportStateHandler() { + super(Looper.getMainLooper()); + } + @Override public void handleMessage(Message message) { switch (message.what) { 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 ff070976f..df0ef955e 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 @@ -5,6 +5,7 @@ import android.media.AudioManager; import android.net.Uri; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.os.Message; import android.os.RemoteException; import android.support.v4.media.MediaBrowserCompat; @@ -208,17 +209,20 @@ public class VoiceNoteMediaController implements DefaultLifecycleObserver { private static class ProgressEventHandler extends Handler { - private final MediaControllerCompat mediaController; - private final MutableLiveData voiceNotePlaybackState; + private final MediaControllerCompat mediaController; + private final MutableLiveData voiceNotePlaybackState; private ProgressEventHandler(@NonNull MediaControllerCompat mediaController, - @NonNull MutableLiveData voiceNotePlaybackState) { + @NonNull MutableLiveData voiceNotePlaybackState) + { + super(Looper.getMainLooper()); + this.mediaController = mediaController; this.voiceNotePlaybackState = voiceNotePlaybackState; } @Override - public void handleMessage(Message msg) { + public void handleMessage(@NonNull Message msg) { MediaMetadataCompat mediaMetadataCompat = mediaController.getMetadata(); if (isPlayerActive(mediaController.getPlaybackState()) && mediaMetadataCompat != null && diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationStickerViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationStickerViewModel.java index 10d0f4826..4c0f8ec1f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationStickerViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationStickerViewModel.java @@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.conversation; import android.app.Application; import android.database.ContentObserver; import android.os.Handler; +import android.os.Looper; import android.text.TextUtils; import androidx.annotation.NonNull; @@ -35,7 +36,7 @@ class ConversationStickerViewModel extends ViewModel { this.stickers = new MutableLiveData<>(); this.stickersAvailable = new MutableLiveData<>(); this.availabilityThrottler = new Throttler(500); - this.packObserver = new ContentObserver(new Handler()) { + this.packObserver = new ContentObserver(new Handler(Looper.getMainLooper())) { @Override public void onChange(boolean selfChange) { availabilityThrottler.publish(() -> repository.getStickerFeatureAvailability(stickersAvailable::postValue)); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerFragment.java index 550b2ea57..b8846e902 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerFragment.java @@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.conversation.ui.mentions; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -32,7 +33,7 @@ public class MentionsPickerFragment extends LoggingFragment { private BottomSheetBehavior behavior; private MentionsPickerViewModel viewModel; private final Runnable lockSheetAfterListUpdate = () -> behavior.setHideable(false); - private final Handler handler = new Handler(); + private final Handler handler = new Handler(Looper.getMainLooper()); @Override public @Nullable View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageViewModel.java index 20c2cb30c..61dba86bd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/longmessage/LongMessageViewModel.java @@ -4,6 +4,7 @@ import android.app.Application; import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; +import android.os.Looper; import androidx.annotation.NonNull; import androidx.lifecycle.LiveData; @@ -30,7 +31,7 @@ class LongMessageViewModel extends ViewModel { this.messageId = messageId; this.isMms = isMms; this.message = new MutableLiveData<>(); - this.messageObserver = new MessageObserver(new Handler()); + this.messageObserver = new MessageObserver(new Handler(Looper.getMainLooper())); repository.getMessage(application, messageId, isMms, longMessage -> { if (longMessage.isPresent()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java index 430b4c038..fcdc02f29 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java @@ -19,6 +19,7 @@ package org.thoughtcrime.securesms.mediaoverview; import android.content.Context; import android.net.Uri; import android.os.Handler; +import android.os.Looper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -332,7 +333,7 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter { itemView.setOnClickListener(view -> itemClickListener.onMediaClicked(mediaRecord)); itemView.setOnLongClickListener(view -> onLongClick()); selectForMarque = () -> line1.setSelected(true); - handler = new Handler(); + handler = new Handler(Looper.getMainLooper()); handler.postDelayed(selectForMarque, 2500); LiveRecipient from = mediaRecord.isOutgoing() ? Recipient.self().live() : Recipient.live(mediaRecord.getRecipientId()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendVideoFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendVideoFragment.java index 212eb271b..3b2a8683d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendVideoFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendVideoFragment.java @@ -4,6 +4,7 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -34,7 +35,7 @@ public class MediaSendVideoFragment extends Fragment implements VideoEditorHud.E private static final String KEY_MAX_SEND = "max_send_size"; private final Throttler videoScanThrottle = new Throttler(150); - private final Handler handler = new Handler(); + private final Handler handler = new Handler(Looper.getMainLooper()); private Controller controller; private Data data = new Data(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageViewModel.java index b1dcd723f..4c1c93ccb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageViewModel.java @@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.revealable; import android.app.Application; import android.database.ContentObserver; import android.net.Uri; -import android.os.Handler; import androidx.annotation.NonNull; import androidx.lifecycle.LiveData; @@ -33,7 +32,7 @@ class ViewOnceMessageViewModel extends ViewModel { this.application = application; this.repository = repository; this.message = new MutableLiveData<>(); - this.observer = new ContentObserver(new Handler()) { + this.observer = new ContentObserver(null) { @Override public void onChange(boolean selfChange) { repository.getMessage(messageId, optionalMessage -> onMessageRetrieved(optionalMessage)); diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardPageViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardPageViewModel.java index 808596832..4c664c595 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardPageViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardPageViewModel.java @@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.stickers; import android.app.Application; import android.database.ContentObserver; import android.os.Handler; +import android.os.Looper; import androidx.annotation.NonNull; import androidx.lifecycle.LiveData; @@ -33,7 +34,7 @@ final class StickerKeyboardPageViewModel extends ViewModel { this.repository = repository; this.stickers = new MutableLiveData<>(); this.observerThrottler = new Throttler(500); - this.observer = new ContentObserver(new Handler()) { + this.observer = new ContentObserver(new Handler(Looper.getMainLooper())) { @Override public void onChange(boolean selfChange) { observerThrottler.publish(() -> getStickers(packId)); diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardViewModel.java index 78214548c..febcfb5bd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerKeyboardViewModel.java @@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.stickers; import android.app.Application; import android.database.ContentObserver; import android.os.Handler; +import android.os.Looper; import androidx.annotation.NonNull; import androidx.lifecycle.LiveData; @@ -25,7 +26,7 @@ final class StickerKeyboardViewModel extends ViewModel { this.application = application; this.packs = new MutableLiveData<>(); this.observerThrottler = new Throttler(500); - this.observer = new ContentObserver(new Handler()) { + this.observer = new ContentObserver(new Handler(Looper.getMainLooper())) { @Override public void onChange(boolean selfChange) { observerThrottler.publish(() -> repository.getPackList(packs::postValue)); diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementViewModel.java index 208d9336c..d33b3aab9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementViewModel.java @@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.stickers; import android.app.Application; import android.database.ContentObserver; -import android.os.Handler; import androidx.annotation.NonNull; import androidx.lifecycle.LiveData; @@ -27,7 +26,7 @@ final class StickerManagementViewModel extends ViewModel { this.application = application; this.repository = repository; this.packs = new MutableLiveData<>(); - this.observer = new ContentObserver(new Handler()) { + this.observer = new ContentObserver(null) { @Override public void onChange(boolean selfChange) { repository.deleteOrphanedStickerPacks(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewViewModel.java index 39d98e5f3..c8b804141 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewViewModel.java @@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.stickers; import android.app.Application; import android.database.ContentObserver; -import android.os.Handler; import android.text.TextUtils; import androidx.annotation.NonNull; @@ -34,7 +33,7 @@ final class StickerPackPreviewViewModel extends ViewModel { this.previewRepository = previewRepository; this.managementRepository = managementRepository; this.stickerManifest = new MutableLiveData<>(); - this.packObserver = new ContentObserver(new Handler()) { + this.packObserver = new ContentObserver(null) { @Override public void onChange(boolean selfChange) { if (!TextUtils.isEmpty(packId) && !TextUtils.isEmpty(packKey)) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/ThrottledDebouncer.java b/app/src/main/java/org/thoughtcrime/securesms/util/ThrottledDebouncer.java index c7fd28c99..e384f4326 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/ThrottledDebouncer.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/ThrottledDebouncer.java @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms.util; import android.os.Handler; +import android.os.Looper; import android.os.Message; import androidx.annotation.MainThread; @@ -52,6 +53,10 @@ public class ThrottledDebouncer { private static class OverflowHandler extends Handler { + public OverflowHandler() { + super(Looper.getMainLooper()); + } + private Runnable runnable; @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/Throttler.java b/app/src/main/java/org/thoughtcrime/securesms/util/Throttler.java index 0c26946b4..66ef9d70f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/Throttler.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/Throttler.java @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms.util; import android.os.Handler; +import android.os.Looper; /** * A class that will throttle the number of runnables executed to be at most once every specified @@ -26,7 +27,7 @@ public class Throttler { * {@code threshold} milliseconds. */ public Throttler(long threshold) { - this.handler = new Handler(); + this.handler = new Handler(Looper.getMainLooper()); this.threshold = threshold; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/livedata/LiveDataUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/livedata/LiveDataUtil.java index f86a3da05..cfce98db1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/livedata/LiveDataUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/livedata/LiveDataUtil.java @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms.util.livedata; import android.os.Handler; +import android.os.Looper; import androidx.annotation.NonNull; import androidx.lifecycle.LiveData; @@ -162,7 +163,7 @@ public final class LiveDataUtil { @Override protected void onActive() { if (emittedValue) return; - new Handler().postDelayed(() -> setValue(value), delay); + new Handler(Looper.getMainLooper()).postDelayed(() -> setValue(value), delay); emittedValue = true; } }; diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/locks/AccelerometerListener.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/locks/AccelerometerListener.java index 34618689c..5c30bfb60 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/webrtc/locks/AccelerometerListener.java +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/locks/AccelerometerListener.java @@ -22,6 +22,7 @@ import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Handler; +import android.os.Looper; import android.os.Message; import org.signal.core.util.logging.Log; @@ -141,7 +142,7 @@ public final class AccelerometerListener { } }; - Handler mHandler = new Handler() { + Handler mHandler = new Handler(Looper.getMainLooper()) { public void handleMessage(Message msg) { switch (msg.what) { case ORIENTATION_CHANGED: