From dda28f8c245b85a396c5cf8c910b5b9ecccc8c67 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Tue, 5 Jul 2022 11:32:42 -0400 Subject: [PATCH] Improve resiliance of FCM fetch. --- .../thoughtcrime/securesms/gcm/FcmFetchManager.kt | 8 +++++++- .../securesms/gcm/FcmReceiveService.java | 13 ++++++++++--- .../thoughtcrime/securesms/jobs/FcmRefreshJob.java | 6 +++--- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchManager.kt b/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchManager.kt index 483768b3139..e9c20742c1f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmFetchManager.kt @@ -40,8 +40,11 @@ object FcmFetchManager { @Volatile private var startedForeground = false + /** + * @return True if a service was successfully started, otherwise false. + */ @JvmStatic - fun enqueue(context: Context, foreground: Boolean) { + fun enqueue(context: Context, foreground: Boolean): Boolean { synchronized(this) { try { if (foreground) { @@ -63,8 +66,11 @@ object FcmFetchManager { } } catch (e: IllegalStateException) { Log.w(TAG, "Failed to start service!", e) + return false } } + + return true } private fun fetch(context: 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 808dc07d2c9..d401cad034e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmReceiveService.java +++ b/app/src/main/java/org/thoughtcrime/securesms/gcm/FcmReceiveService.java @@ -78,18 +78,25 @@ public void onSendError(@NonNull String s, @NonNull Exception e) { } private static void handleReceivedNotification(Context context, @Nullable RemoteMessage remoteMessage) { + boolean enqueueSuccessful; + try { long timeSinceLastRefresh = System.currentTimeMillis() - SignalStore.misc().getLastFcmForegroundServiceTime(); Log.d(TAG, String.format(Locale.US, "[handleReceivedNotification] API: %s, FeatureFlag: %s, RemoteMessagePriority: %s, TimeSinceLastRefresh: %s ms", Build.VERSION.SDK_INT, FeatureFlags.useFcmForegroundService(), remoteMessage != null ? remoteMessage.getPriority() : "n/a", timeSinceLastRefresh)); if (FeatureFlags.useFcmForegroundService() && Build.VERSION.SDK_INT >= 31 && remoteMessage != null && remoteMessage.getPriority() == RemoteMessage.PRIORITY_HIGH && timeSinceLastRefresh > FCM_FOREGROUND_INTERVAL) { - FcmFetchManager.enqueue(context, true); + enqueueSuccessful = FcmFetchManager.enqueue(context, true); SignalStore.misc().setLastFcmForegroundServiceTime(System.currentTimeMillis()); } else { - FcmFetchManager.enqueue(context, false); + enqueueSuccessful = FcmFetchManager.enqueue(context, false); } } catch (Exception e) { - Log.w(TAG, "Failed to start service. Falling back to legacy approach.", e); + Log.w(TAG, "Failed to start service.", e); + enqueueSuccessful = false; + } + + if (!enqueueSuccessful) { + Log.w(TAG, "Failed to start service. Falling back to legacy approach."); FcmFetchManager.retrieveMessages(context); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java index d1a6f862503..f1504d0ec2c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java @@ -56,8 +56,8 @@ public FcmRefreshJob() { this(new Job.Parameters.Builder() .setQueue("FcmRefreshJob") .addConstraint(NetworkConstraint.KEY) - .setMaxAttempts(1) - .setLifespan(TimeUnit.MINUTES.toMillis(5)) + .setMaxAttempts(3) + .setLifespan(TimeUnit.HOURS.toMillis(6)) .setMaxInstancesForFactory(1) .build()); } @@ -109,7 +109,7 @@ public void onRun() throws Exception { @Override public void onFailure() { - Log.w(TAG, "GCM reregistration failed after retry attempt exhaustion!"); + Log.w(TAG, "FCM reregistration failed after retry attempt exhaustion!"); } @Override