From acb48752cee1d4058bb117f9748bb2a652cd1198 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Tue, 23 Jul 2019 09:23:52 -0400 Subject: [PATCH] Fix possible crash in RevealableMessageManager. The crash happened because #getNextClosestEvent was called when mmsDatabase was null, which would normally be impossible. However, it seems implied that somehow #getNextClosestEvent was being called in the parent constructor before the child class was fully initialized. That would imply that the looper was called synchronously in some freak scenario, but it's the only explanation. So I added a delay to the call in the parent constructor. ```java java.lang.NullPointerException: at org.thoughtcrime.securesms.revealable.RevealableMessageManager.getNextClosestEvent (RevealableMessageManager.java:40) at org.thoughtcrime.securesms.revealable.RevealableMessageManager.getNextClosestEvent (RevealableMessageManager.java:23) at org.thoughtcrime.securesms.service.TimedEventManager.lambda$scheduleIfNecessary$1 (TimedEventManager.java:44) at org.thoughtcrime.securesms.service.-$$Lambda$TimedEventManager$kZDO3F2WBQVtGx-SkAgEDt8jCeU.run (Unknown Source:2) at android.os.Handler.handleCallback (Handler.java:873) at android.os.Handler.dispatchMessage (Handler.java:99) at android.os.Looper.loop (Looper.java:193) at android.os.HandlerThread.run (HandlerThread.java:65) ``` --- src/org/thoughtcrime/securesms/service/TimedEventManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/org/thoughtcrime/securesms/service/TimedEventManager.java b/src/org/thoughtcrime/securesms/service/TimedEventManager.java index 5cbbdf0a79..9778ecab4e 100644 --- a/src/org/thoughtcrime/securesms/service/TimedEventManager.java +++ b/src/org/thoughtcrime/securesms/service/TimedEventManager.java @@ -30,7 +30,9 @@ public abstract class TimedEventManager { this.application = application; this.handler = new Handler(handlerThread.getLooper()); - scheduleIfNecessary(); + // XXX Have to delay it because some devices will run the resulting handler#post synchronously, + // triggering a method call to an uninitialized child class. + handler.postDelayed(this::scheduleIfNecessary, 5); } /**