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 | 34 +++++++++++-------- .../securesms/gcm/FcmReceiveService.java | 10 +++++- 2 files changed, 29 insertions(+), 15 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 d62e7c363d..156ebef9c6 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 class FcmFetchService extends Service { } private void fetch() { - BackgroundMessageRetriever retriever = ApplicationDependencies.getBackgroundMessageRetriever(); - boolean success = retriever.retrieveMessages(this, 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); - } else { - Log.w(TAG, "Failed to retrieve messages. Scheduling on JobManager (API " + Build.VERSION.SDK_INT + ")."); - ApplicationDependencies.getJobManager().add(new PushNotificationReceiveJob(this)); - } - } + 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(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(context); + } else { + Log.w(TAG, "Failed to retrieve messages. Scheduling on JobManager (API " + Build.VERSION.SDK_INT + ")."); + ApplicationDependencies.getJobManager().add(new PushNotificationReceiveJob(context)); + } + } + } } 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 4b7d48fab3..1d96a66b81 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 @@ package org.thoughtcrime.securesms.gcm; import android.content.Context; import android.content.Intent; +import android.os.Build; import androidx.annotation.NonNull; @@ -10,7 +11,9 @@ import com.google.firebase.messaging.RemoteMessage; 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 class FcmReceiveService extends FirebaseMessagingService { } 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) {