Skip to content

Commit 8c69256

Browse files
authored
Add dynamic module support to Remote Config. (#2547)
1 parent d18cc40 commit 8c69256

File tree

8 files changed

+31
-27
lines changed

8 files changed

+31
-27
lines changed

firebase-config/src/main/java/com/google/firebase/remoteconfig/RemoteConfigComponent.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.google.firebase.FirebaseApp;
2727
import com.google.firebase.abt.FirebaseABTesting;
2828
import com.google.firebase.analytics.connector.AnalyticsConnector;
29+
import com.google.firebase.inject.Provider;
2930
import com.google.firebase.installations.FirebaseInstallationsApi;
3031
import com.google.firebase.remoteconfig.internal.ConfigCacheClient;
3132
import com.google.firebase.remoteconfig.internal.ConfigFetchHandler;
@@ -78,7 +79,7 @@ public class RemoteConfigComponent {
7879
private final FirebaseApp firebaseApp;
7980
private final FirebaseInstallationsApi firebaseInstallations;
8081
private final FirebaseABTesting firebaseAbt;
81-
@Nullable private final AnalyticsConnector analyticsConnector;
82+
@Nullable private final Provider<AnalyticsConnector> analyticsConnector;
8283

8384
private final String appId;
8485

@@ -91,7 +92,7 @@ public class RemoteConfigComponent {
9192
FirebaseApp firebaseApp,
9293
FirebaseInstallationsApi firebaseInstallations,
9394
FirebaseABTesting firebaseAbt,
94-
@Nullable AnalyticsConnector analyticsConnector) {
95+
Provider<AnalyticsConnector> analyticsConnector) {
9596
this(
9697
context,
9798
Executors.newCachedThreadPool(),
@@ -110,7 +111,7 @@ protected RemoteConfigComponent(
110111
FirebaseApp firebaseApp,
111112
FirebaseInstallationsApi firebaseInstallations,
112113
FirebaseABTesting firebaseAbt,
113-
@Nullable AnalyticsConnector analyticsConnector,
114+
Provider<AnalyticsConnector> analyticsConnector,
114115
boolean loadGetDefault) {
115116
this.context = context;
116117
this.executorService = executorService;
@@ -265,10 +266,8 @@ static ConfigMetadataClient getMetadataClient(Context context, String appId, Str
265266

266267
@Nullable
267268
private static Personalization getPersonalization(
268-
FirebaseApp firebaseApp, String namespace, @Nullable AnalyticsConnector analyticsConnector) {
269-
if (isPrimaryApp(firebaseApp)
270-
&& namespace.equals(DEFAULT_NAMESPACE)
271-
&& analyticsConnector != null) {
269+
FirebaseApp firebaseApp, String namespace, Provider<AnalyticsConnector> analyticsConnector) {
270+
if (isPrimaryApp(firebaseApp) && namespace.equals(DEFAULT_NAMESPACE)) {
272271
return new Personalization(analyticsConnector);
273272
}
274273
return null;

firebase-config/src/main/java/com/google/firebase/remoteconfig/RemoteConfigRegistrar.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,15 @@ public List<Component<?>> getComponents() {
4545
.add(Dependency.required(FirebaseApp.class))
4646
.add(Dependency.required(FirebaseInstallationsApi.class))
4747
.add(Dependency.required(AbtComponent.class))
48-
.add(Dependency.optional(AnalyticsConnector.class))
48+
.add(Dependency.optionalProvider(AnalyticsConnector.class))
4949
.factory(
5050
container ->
5151
new RemoteConfigComponent(
5252
container.get(Context.class),
5353
container.get(FirebaseApp.class),
5454
container.get(FirebaseInstallationsApi.class),
5555
container.get(AbtComponent.class).get(OriginService.REMOTE_CONFIG),
56-
container.get(AnalyticsConnector.class)))
56+
container.getProvider(AnalyticsConnector.class)))
5757
.eagerInDefaultApp()
5858
.build(),
5959
LibraryVersionComponent.create("fire-rc", BuildConfig.VERSION_NAME));

firebase-config/src/main/java/com/google/firebase/remoteconfig/internal/ConfigFetchHandler.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.google.android.gms.tasks.Task;
3636
import com.google.android.gms.tasks.Tasks;
3737
import com.google.firebase.analytics.connector.AnalyticsConnector;
38+
import com.google.firebase.inject.Provider;
3839
import com.google.firebase.installations.FirebaseInstallationsApi;
3940
import com.google.firebase.installations.InstallationTokenResult;
4041
import com.google.firebase.remoteconfig.FirebaseRemoteConfigClientException;
@@ -79,7 +80,7 @@ public class ConfigFetchHandler {
7980
@VisibleForTesting static final int HTTP_TOO_MANY_REQUESTS = 429;
8081

8182
private final FirebaseInstallationsApi firebaseInstallations;
82-
@Nullable private final AnalyticsConnector analyticsConnector;
83+
private final Provider<AnalyticsConnector> analyticsConnector;
8384

8485
private final Executor executor;
8586
private final Clock clock;
@@ -93,7 +94,7 @@ public class ConfigFetchHandler {
9394
/** FRC Fetch Handler constructor. */
9495
public ConfigFetchHandler(
9596
FirebaseInstallationsApi firebaseInstallations,
96-
@Nullable AnalyticsConnector analyticsConnector,
97+
Provider<AnalyticsConnector> analyticsConnector,
9798
Executor executor,
9899
Clock clock,
99100
Random randomGenerator,
@@ -497,21 +498,21 @@ private void updateLastFetchStatusAndTime(
497498
@WorkerThread
498499
private Map<String, String> getUserProperties() {
499500
Map<String, String> userPropertiesMap = new HashMap<>();
500-
if (analyticsConnector == null) {
501+
AnalyticsConnector connector = this.analyticsConnector.get();
502+
if (connector == null) {
501503
return userPropertiesMap;
502504
}
503505

504506
for (Map.Entry<String, Object> userPropertyEntry :
505-
analyticsConnector.getUserProperties(/*includeInternal=*/ false).entrySet()) {
507+
connector.getUserProperties(/*includeInternal=*/ false).entrySet()) {
506508
userPropertiesMap.put(userPropertyEntry.getKey(), userPropertyEntry.getValue().toString());
507509
}
508510
return userPropertiesMap;
509511
}
510512

511513
/** Used to verify that the fetch handler is getting Analytics as expected. */
512514
@VisibleForTesting
513-
@Nullable
514-
public AnalyticsConnector getAnalyticsConnector() {
515+
public Provider<AnalyticsConnector> getAnalyticsConnector() {
515516
return analyticsConnector;
516517
}
517518

firebase-config/src/main/java/com/google/firebase/remoteconfig/internal/Personalization.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import android.os.Bundle;
1818
import androidx.annotation.NonNull;
1919
import com.google.firebase.analytics.connector.AnalyticsConnector;
20+
import com.google.firebase.inject.Provider;
2021
import java.util.Collections;
2122
import java.util.HashMap;
2223
import java.util.Map;
@@ -41,14 +42,13 @@ public class Personalization {
4142
public static final String INTERNAL_CHOICE_ID_PARAM = "_fpid";
4243

4344
/** The app's Firebase Analytics client. */
44-
private final AnalyticsConnector analyticsConnector;
45+
private final Provider<AnalyticsConnector> analyticsConnector;
4546

4647
/** Remote Config parameter key and choice ID pairs that have already been logged to Analytics. */
47-
private final Map<String, String> loggedChoiceIds =
48-
Collections.synchronizedMap(new HashMap<String, String>());
48+
private final Map<String, String> loggedChoiceIds = Collections.synchronizedMap(new HashMap<>());
4949

5050
/** Creates an instance of {@code Personalization}. */
51-
public Personalization(@NonNull AnalyticsConnector analyticsConnector) {
51+
public Personalization(Provider<AnalyticsConnector> analyticsConnector) {
5252
this.analyticsConnector = analyticsConnector;
5353
}
5454

@@ -61,6 +61,11 @@ public Personalization(@NonNull AnalyticsConnector analyticsConnector) {
6161
* key}
6262
*/
6363
public void logArmActive(@NonNull String rcParameter, @NonNull ConfigContainer configContainer) {
64+
AnalyticsConnector connector = this.analyticsConnector.get();
65+
if (connector == null) {
66+
return;
67+
}
68+
6469
JSONObject ids = configContainer.getPersonalizationMetadata();
6570
if (ids.length() < 1) {
6671
return;
@@ -94,11 +99,10 @@ public void logArmActive(@NonNull String rcParameter, @NonNull ConfigContainer c
9499
logParams.putString(EXTERNAL_PERSONALIZATION_ID_PARAM, metadata.optString(PERSONALIZATION_ID));
95100
logParams.putInt(EXTERNAL_ARM_INDEX_PARAM, metadata.optInt(ARM_INDEX, -1));
96101
logParams.putString(EXTERNAL_GROUP_PARAM, metadata.optString(GROUP));
97-
analyticsConnector.logEvent(ANALYTICS_ORIGIN_PERSONALIZATION, EXTERNAL_EVENT, logParams);
102+
connector.logEvent(ANALYTICS_ORIGIN_PERSONALIZATION, EXTERNAL_EVENT, logParams);
98103

99104
Bundle internalLogParams = new Bundle();
100105
internalLogParams.putString(INTERNAL_CHOICE_ID_PARAM, choiceId);
101-
analyticsConnector.logEvent(
102-
ANALYTICS_ORIGIN_PERSONALIZATION, INTERNAL_EVENT, internalLogParams);
106+
connector.logEvent(ANALYTICS_ORIGIN_PERSONALIZATION, INTERNAL_EVENT, internalLogParams);
103107
}
104108
}

firebase-config/src/test/java/com/google/firebase/remoteconfig/FirebaseRemoteConfigTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ public void setUp() throws Exception {
163163
Context context = RuntimeEnvironment.application;
164164
FirebaseApp firebaseApp = initializeFirebaseApp(context);
165165

166-
Personalization personalization = new Personalization(mockAnalyticsConnector);
166+
Personalization personalization = new Personalization(() -> mockAnalyticsConnector);
167167
ConfigGetParameterHandler parameterHandler =
168168
new ConfigGetParameterHandler(directExecutor, mockActivatedCache, mockDefaultsCache);
169169
parameterHandler.addListener(personalization::logArmActive);

firebase-config/src/test/java/com/google/firebase/remoteconfig/RemoteConfigComponentTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ private RemoteConfigComponent getNewFrcComponent() {
172172
mockFirebaseApp,
173173
mockFirebaseInstallations,
174174
mockFirebaseAbt,
175-
mockAnalyticsConnector,
175+
() -> mockAnalyticsConnector,
176176
/* loadGetDefault= */ true);
177177
}
178178

@@ -183,7 +183,7 @@ private RemoteConfigComponent getNewFrcComponentWithoutLoadingDefault() {
183183
mockFirebaseApp,
184184
mockFirebaseInstallations,
185185
mockFirebaseAbt,
186-
mockAnalyticsConnector,
186+
() -> mockAnalyticsConnector,
187187
/* loadGetDefault= */ false);
188188
}
189189

firebase-config/src/test/java/com/google/firebase/remoteconfig/internal/ConfigFetchHandlerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -714,7 +714,7 @@ private ConfigFetchHandler getNewFetchHandler(AnalyticsConnector analyticsConnec
714714
spy(
715715
new ConfigFetchHandler(
716716
mockFirebaseInstallations,
717-
analyticsConnector,
717+
() -> analyticsConnector,
718718
directExecutor,
719719
mockClock,
720720
mockRandom,

firebase-config/src/test/java/com/google/firebase/remoteconfig/internal/PersonalizationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public void setUp() {
110110
.when(mockAnalyticsConnector)
111111
.logEvent(eq(ANALYTICS_ORIGIN_PERSONALIZATION), anyString(), any(Bundle.class));
112112

113-
personalization = new Personalization(mockAnalyticsConnector);
113+
personalization = new Personalization(() -> mockAnalyticsConnector);
114114

115115
FAKE_LOGS.clear();
116116
}

0 commit comments

Comments
 (0)