From c4ec0c98979e164de3bc0e86ed3b2f5d28ff8c8b Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Mon, 1 Jun 2020 11:51:00 -0400 Subject: [PATCH] Handle devices disallowing start of FcmFetchService. Some devices are overzealous with battery management and disallow starting services even when they're in response to a high-priority FCM message (which should be allowed). So in these situations, we just fall back to what we were doing before. --- .../securesms/gcm/FcmFetchService.java | 22 ++++++++++++------- .../securesms/gcm/FcmReceiveService.java | 10 ++++++++- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchService.java b/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchService.java index d62e7c363d6..156ebef9c64 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchService.java +++ b/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchService.java @@ -1,10 +1,12 @@ package org.thoughtcrime.securesms.gcm; import android.app.Service; +import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.IBinder; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.google.firebase.messaging.RemoteMessage; @@ -70,25 +72,29 @@ public void onDestroy() { } private void fetch() { + retrieveMessages(this); + + if (activeCount.decrementAndGet() == 0) { + Log.e(TAG, "stopping"); + stopSelf(); + } + } + + static void retrieveMessages(@NonNull Context context) { BackgroundMessageRetriever retriever = ApplicationDependencies.getBackgroundMessageRetriever(); - boolean success = retriever.retrieveMessages(this, new RestStrategy(), new RestStrategy()); + boolean success = retriever.retrieveMessages(context, new RestStrategy(), new RestStrategy()); if (success) { Log.i(TAG, "Successfully retrieved messages."); } else { if (Build.VERSION.SDK_INT >= 26) { Log.w(TAG, "Failed to retrieve messages. Scheduling on the system JobScheduler (API " + Build.VERSION.SDK_INT + ")."); - FcmJobService.schedule(this); + FcmJobService.schedule(context); } else { Log.w(TAG, "Failed to retrieve messages. Scheduling on JobManager (API " + Build.VERSION.SDK_INT + ")."); - ApplicationDependencies.getJobManager().add(new PushNotificationReceiveJob(this)); + ApplicationDependencies.getJobManager().add(new PushNotificationReceiveJob(context)); } } - - if (activeCount.decrementAndGet() == 0) { - Log.e(TAG, "stopping"); - stopSelf(); - } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmReceiveService.java b/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmReceiveService.java index 4b7d48fab37..1d96a66b814 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmReceiveService.java +++ b/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmReceiveService.java @@ -2,6 +2,7 @@ import android.content.Context; import android.content.Intent; +import android.os.Build; import androidx.annotation.NonNull; @@ -10,7 +11,9 @@ import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobs.FcmRefreshJob; +import org.thoughtcrime.securesms.jobs.PushNotificationReceiveJob; import org.thoughtcrime.securesms.logging.Log; +import org.thoughtcrime.securesms.messages.RestStrategy; import org.thoughtcrime.securesms.registration.PushChallengeRequest; import org.thoughtcrime.securesms.util.TextSecurePreferences; @@ -43,7 +46,12 @@ public void onNewToken(String token) { } private static void handleReceivedNotification(Context context) { - context.startService(new Intent(context, FcmFetchService.class)); + try { + context.startService(new Intent(context, FcmFetchService.class)); + } catch (Exception e) { + Log.w(TAG, "Failed to start service. Falling back to legacy approach."); + FcmFetchService.retrieveMessages(context); + } } private static void handlePushChallenge(@NonNull String challenge) {