From abd35aba7fdfdd25061cf1c704d9c705633ca512 Mon Sep 17 00:00:00 2001 From: qdpham Date: Thu, 28 Mar 2024 22:53:17 +0000 Subject: [PATCH] Add shared AtomicBoolean between ConfigRealtimeHttpClient and ConfigAutoFetch --- .../remoteconfig/internal/ConfigAutoFetch.java | 8 ++++++-- .../internal/ConfigRealtimeHttpClient.java | 14 ++++++++------ .../remoteconfig/FirebaseRemoteConfigTest.java | 4 +++- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/firebase-config/src/main/java/com/google/firebase/remoteconfig/internal/ConfigAutoFetch.java b/firebase-config/src/main/java/com/google/firebase/remoteconfig/internal/ConfigAutoFetch.java index 81016602532..eac3eeab98b 100644 --- a/firebase-config/src/main/java/com/google/firebase/remoteconfig/internal/ConfigAutoFetch.java +++ b/firebase-config/src/main/java/com/google/firebase/remoteconfig/internal/ConfigAutoFetch.java @@ -35,6 +35,7 @@ import java.util.Set; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import org.json.JSONException; import org.json.JSONObject; @@ -54,6 +55,7 @@ public class ConfigAutoFetch { private final ConfigUpdateListener retryCallback; private final ScheduledExecutorService scheduledExecutorService; private final Random random; + private AtomicBoolean isInBackground; public ConfigAutoFetch( HttpURLConnection httpURLConnection, @@ -61,7 +63,8 @@ public ConfigAutoFetch( ConfigCacheClient activatedCache, Set eventListeners, ConfigUpdateListener retryCallback, - ScheduledExecutorService scheduledExecutorService) { + ScheduledExecutorService scheduledExecutorService, + AtomicBoolean isInBackground) { this.httpURLConnection = httpURLConnection; this.configFetchHandler = configFetchHandler; this.activatedCache = activatedCache; @@ -69,6 +72,7 @@ public ConfigAutoFetch( this.retryCallback = retryCallback; this.scheduledExecutorService = scheduledExecutorService; this.random = new Random(); + this.isInBackground = isInBackground; } private synchronized void propagateErrors(FirebaseRemoteConfigException exception) { @@ -126,7 +130,7 @@ private void handleNotifications(InputStream inputStream) throws IOException { // Multiple config update messages can be sent through this loop. Each message comes in line by // line as partialConfigUpdateMessage and are accumulated together into // currentConfigUpdateMessage. - while ((partialConfigUpdateMessage = reader.readLine()) != null) { + while ((partialConfigUpdateMessage = reader.readLine()) != null && !isInBackground.get()) { // Accumulate all the partial parts of the message until we have a full message. currentConfigUpdateMessage += partialConfigUpdateMessage; diff --git a/firebase-config/src/main/java/com/google/firebase/remoteconfig/internal/ConfigRealtimeHttpClient.java b/firebase-config/src/main/java/com/google/firebase/remoteconfig/internal/ConfigRealtimeHttpClient.java index ef0ef2defc5..9e445fb2cfe 100644 --- a/firebase-config/src/main/java/com/google/firebase/remoteconfig/internal/ConfigRealtimeHttpClient.java +++ b/firebase-config/src/main/java/com/google/firebase/remoteconfig/internal/ConfigRealtimeHttpClient.java @@ -57,6 +57,7 @@ import java.util.Set; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.json.JSONObject; @@ -98,7 +99,7 @@ public class ConfigRealtimeHttpClient { private boolean isRealtimeDisabled; /** Flag to indicate whether or not the app is in the background or not. */ - private boolean isInBackground; + private AtomicBoolean isInBackground; private final int ORIGINAL_RETRIES = 8; private final ScheduledExecutorService scheduledExecutorService; @@ -144,7 +145,7 @@ public ConfigRealtimeHttpClient( this.namespace = namespace; this.metadataClient = metadataClient; this.isRealtimeDisabled = false; - this.isInBackground = false; + this.isInBackground = new AtomicBoolean(false); } private static String extractProjectNumberFromAppId(String gmpAppId) { @@ -286,7 +287,7 @@ private synchronized boolean canMakeHttpStreamConnection() { return !listeners.isEmpty() && !isHttpConnectionRunning && !isRealtimeDisabled - && !isInBackground; + && !isInBackground.get(); } private String getRealtimeURL(String namespace) { @@ -383,7 +384,7 @@ public void run() { }, retryMilliseconds, TimeUnit.MILLISECONDS); - } else if (!isInBackground) { + } else if (!isInBackground.get()) { propagateErrors( new FirebaseRemoteConfigClientException( "Unable to connect to the server. Check your connection and try again.", @@ -392,7 +393,7 @@ public void run() { } void setRealtimeBackgroundState(boolean backgroundState) { - isInBackground = backgroundState; + isInBackground.set(backgroundState); } private synchronized void resetRetryCount() { @@ -429,7 +430,8 @@ public void onError(@NonNull FirebaseRemoteConfigException error) { activatedCache, listeners, retryCallback, - scheduledExecutorService); + scheduledExecutorService, + isInBackground); } // HTTP status code that the Realtime client should retry on. diff --git a/firebase-config/src/test/java/com/google/firebase/remoteconfig/FirebaseRemoteConfigTest.java b/firebase-config/src/test/java/com/google/firebase/remoteconfig/FirebaseRemoteConfigTest.java index 74ea6c98c3b..d8e697b2afc 100644 --- a/firebase-config/src/test/java/com/google/firebase/remoteconfig/FirebaseRemoteConfigTest.java +++ b/firebase-config/src/test/java/com/google/firebase/remoteconfig/FirebaseRemoteConfigTest.java @@ -95,6 +95,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -348,7 +349,8 @@ public void onError(@NonNull FirebaseRemoteConfigException error) { mockActivatedCache, listeners, mockRetryListener, - scheduledExecutorService); + scheduledExecutorService, + new AtomicBoolean(false)); realtimeMetadataClient = new ConfigMetadataClient(context.getSharedPreferences("test_file", Context.MODE_PRIVATE)); configRealtimeHttpClient =