Skip to content

Commit 261ad66

Browse files
authored
Integrate FIS into FIAM Headless (#1332)
Integrate FIS and correctly implement executor pattern for experiment tracking via GA
1 parent 5440af4 commit 261ad66

20 files changed

+267
-304
lines changed

firebase-inappmessaging/firebase-inappmessaging.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,17 +116,17 @@ dependencies {
116116
implementation project(':protolite-well-known-types')
117117
implementation project(':transport:transport-api')
118118
implementation project(':firebase-datatransport')
119+
implementation project(':firebase-installations-interop')
120+
runtimeOnly project(':firebase-installations')
119121

122+
implementation 'com.google.android.gms:play-services-tasks:17.0.0'
120123
implementation 'io.grpc:grpc-stub:1.21.0'
121124
implementation 'io.grpc:grpc-protobuf-lite:1.21.0'
122125
implementation 'io.grpc:grpc-okhttp:1.21.0'
123126
implementation 'com.google.dagger:dagger:2.24'
124127
implementation 'io.reactivex.rxjava2:rxjava:2.1.14'
125128
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
126129
implementation 'com.google.auto.value:auto-value-annotations:1.6.5'
127-
implementation ('com.google.firebase:firebase-iid:20.0.1') {
128-
exclude group: "com.google.firebase", module: "firebase-common"
129-
}
130130

131131
implementation('com.google.firebase:firebase-measurement-connector:18.0.0') {
132132
exclude group: 'com.google.firebase', module: 'firebase-common'

firebase-inappmessaging/src/androidTest/java/com/google/firebase/inappmessaging/FirebaseInAppMessagingFlowableTest.java

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
import android.os.Bundle;
4545
import android.os.Looper;
4646
import android.util.Log;
47-
import androidx.annotation.NonNull;
4847
import androidx.test.InstrumentationRegistry;
4948
import androidx.test.runner.AndroidJUnit4;
5049
import com.google.android.gms.tasks.Task;
@@ -53,8 +52,6 @@
5352
import com.google.firebase.FirebaseOptions;
5453
import com.google.firebase.analytics.connector.AnalyticsConnector;
5554
import com.google.firebase.events.Subscriber;
56-
import com.google.firebase.iid.FirebaseInstanceId;
57-
import com.google.firebase.iid.InstanceIdResult;
5855
import com.google.firebase.inappmessaging.CommonTypesProto.Event;
5956
import com.google.firebase.inappmessaging.CommonTypesProto.Priority;
6057
import com.google.firebase.inappmessaging.CommonTypesProto.TriggeringCondition;
@@ -72,6 +69,8 @@
7269
import com.google.firebase.inappmessaging.model.BannerMessage;
7370
import com.google.firebase.inappmessaging.model.CampaignMetadata;
7471
import com.google.firebase.inappmessaging.model.InAppMessage;
72+
import com.google.firebase.installations.FirebaseInstallationsApi;
73+
import com.google.firebase.installations.InstallationTokenResult;
7574
import com.google.internal.firebase.inappmessaging.v1.CampaignProto.ThickContent;
7675
import com.google.internal.firebase.inappmessaging.v1.CampaignProto.VanillaCampaignPayload;
7776
import com.google.internal.firebase.inappmessaging.v1.sdkserving.CampaignImpression;
@@ -113,8 +112,10 @@
113112
@RunWith(AndroidJUnit4.class)
114113
public class FirebaseInAppMessagingFlowableTest {
115114

116-
public static final String PROJECT_NUMBER = "gcm-sender-id";
117-
public static final String APP_ID = "app-id";
115+
private static final String PROJECT_NUMBER = "gcm-sender-id";
116+
private static final String APP_ID = "app-id";
117+
private static final String INSTANCE_ID = "instance-id";
118+
private static final String INSTANCE_TOKEN = "token";
118119
private static final long PAST = 1000000;
119120
private static final long NOW = PAST + 100000;
120121
private static final long FUTURE = NOW + 1000000;
@@ -167,7 +168,7 @@ public class FirebaseInAppMessagingFlowableTest {
167168
@Mock
168169
private MetricsLoggerClient.EngagementMetricsLoggerInterface engagementMetricsLoggerInterface;
169170

170-
@Mock private FirebaseInstanceId instanceId;
171+
@Mock private FirebaseInstallationsApi firebaseInstallations;
171172
@Mock private TestDeviceHelper testDeviceHelper;
172173
@Mock private Subscriber firebaseEventSubscriber;
173174
@Mock private AbtIntegrationHelper abtIntegrationHelper;
@@ -223,24 +224,16 @@ public void setUp() {
223224
clearProtoDiskCache(InstrumentationRegistry.getTargetContext());
224225
application =
225226
spy((Application) InstrumentationRegistry.getTargetContext().getApplicationContext());
226-
String id = FirebaseInstanceId.getInstance().getId();
227-
when(instanceId.getId()).thenReturn(id);
228-
when(instanceId.getInstanceId())
227+
when(firebaseInstallations.getId()).thenReturn(Tasks.forResult(INSTANCE_ID));
228+
when(firebaseInstallations.getToken(false))
229229
.thenReturn(
230230
Tasks.forResult(
231-
new InstanceIdResult() {
232-
@NonNull
233-
@Override
234-
public String getId() {
235-
return id;
236-
}
237-
238-
@NonNull
239-
@Override
240-
public String getToken() {
241-
return "token";
242-
}
243-
}));
231+
InstallationTokenResult.builder()
232+
.setToken(INSTANCE_TOKEN)
233+
.setTokenCreationTimestamp(1)
234+
.setTokenExpirationTimestamp(1)
235+
.build()));
236+
244237
when(testDeviceHelper.isAppInstallFresh()).thenReturn(false);
245238
when(testDeviceHelper.isDeviceInTestMode()).thenReturn(false);
246239

@@ -272,7 +265,7 @@ public String getToken() {
272265
.grpcClientModule(new GrpcClientModule(app))
273266
.testApiClientModule(
274267
new TestApiClientModule(
275-
app, instanceId, testDeviceHelper, universalComponent.clock()));
268+
app, firebaseInstallations, testDeviceHelper, universalComponent.clock()));
276269
TestAppComponent appComponent = appComponentBuilder.build();
277270

278271
instance = appComponent.providesFirebaseInAppMessaging();
@@ -712,7 +705,7 @@ public void logImpression_writesExpectedLogToEngagementMetrics()
712705
.setClientTimestampMillis(NOW)
713706
.setClientApp(
714707
ClientAppInfo.newBuilder()
715-
.setFirebaseInstanceId(FirebaseInstanceId.getInstance().getId())
708+
.setFirebaseInstanceId(INSTANCE_ID)
716709
.setGoogleAppId(APP_ID))
717710
.setEventType(EventType.IMPRESSION_EVENT_TYPE)
718711
.build();
@@ -742,7 +735,7 @@ public void logAction_writesExpectedLogToEngagementMetrics()
742735
.setClientTimestampMillis(NOW)
743736
.setClientApp(
744737
ClientAppInfo.newBuilder()
745-
.setFirebaseInstanceId(FirebaseInstanceId.getInstance().getId())
738+
.setFirebaseInstanceId(INSTANCE_ID)
746739
.setGoogleAppId(APP_ID))
747740
.setEventType(EventType.IMPRESSION_EVENT_TYPE)
748741
.build();
@@ -773,7 +766,7 @@ public void logRenderError_writesExpectedLogToEngagementMetrics()
773766
.setClientTimestampMillis(NOW)
774767
.setClientApp(
775768
ClientAppInfo.newBuilder()
776-
.setFirebaseInstanceId(FirebaseInstanceId.getInstance().getId())
769+
.setFirebaseInstanceId(INSTANCE_ID)
777770
.setGoogleAppId(APP_ID))
778771
.setRenderErrorReason(RenderErrorReason.IMAGE_DISPLAY_ERROR)
779772
.build();
@@ -804,7 +797,7 @@ public void logDismiss_writesExpectedLogToEngagementMetrics()
804797
.setClientTimestampMillis(NOW)
805798
.setClientApp(
806799
ClientAppInfo.newBuilder()
807-
.setFirebaseInstanceId(FirebaseInstanceId.getInstance().getId())
800+
.setFirebaseInstanceId(INSTANCE_ID)
808801
.setGoogleAppId(APP_ID))
809802
.setDismissType(DismissType.AUTO)
810803
.build();

firebase-inappmessaging/src/androidTest/java/com/google/firebase/inappmessaging/TestApiClientModule.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import android.app.Application;
1818
import com.google.firebase.FirebaseApp;
1919
import com.google.firebase.events.Subscriber;
20-
import com.google.firebase.iid.FirebaseInstanceId;
2120
import com.google.firebase.inappmessaging.internal.ApiClient;
2221
import com.google.firebase.inappmessaging.internal.DataCollectionHelper;
2322
import com.google.firebase.inappmessaging.internal.GrpcClient;
@@ -26,6 +25,7 @@
2625
import com.google.firebase.inappmessaging.internal.TestDeviceHelper;
2726
import com.google.firebase.inappmessaging.internal.injection.scopes.FirebaseAppScope;
2827
import com.google.firebase.inappmessaging.internal.time.Clock;
28+
import com.google.firebase.installations.FirebaseInstallationsApi;
2929
import dagger.Lazy;
3030
import dagger.Module;
3131
import dagger.Provides;
@@ -36,26 +36,26 @@
3636
public class TestApiClientModule {
3737

3838
private final FirebaseApp firebaseApp;
39-
private final FirebaseInstanceId firebaseInstanceId;
39+
private final FirebaseInstallationsApi firebaseInstallations;
4040
private SharedPreferencesUtils sharedPreferencesUtils;
4141
private TestDeviceHelper testDeviceHelper;
4242
private Clock clock;
4343

4444
public TestApiClientModule(
4545
FirebaseApp firebaseApp,
46-
FirebaseInstanceId instanceId,
46+
FirebaseInstallationsApi firebaseInstallations,
4747
TestDeviceHelper testDeviceHelper,
4848
Clock clock) {
4949
this.firebaseApp = firebaseApp;
50-
this.firebaseInstanceId = instanceId;
50+
this.firebaseInstallations = firebaseInstallations;
5151
this.testDeviceHelper = testDeviceHelper;
5252
this.sharedPreferencesUtils = new SharedPreferencesUtils(firebaseApp);
5353
this.clock = clock;
5454
}
5555

5656
@Provides
57-
FirebaseInstanceId providesFirebaseInstanceId() {
58-
return firebaseInstanceId;
57+
FirebaseInstallationsApi providesFirebaseInstallations() {
58+
return firebaseInstallations;
5959
}
6060

6161
@Provides
@@ -66,8 +66,7 @@ public FirebaseApp providesfirebaseApp() {
6666

6767
@Provides
6868
DataCollectionHelper providesDataCollectionHelper(Subscriber firebaseEventSubscriber) {
69-
return new DataCollectionHelper(
70-
firebaseApp, sharedPreferencesUtils, firebaseInstanceId, firebaseEventSubscriber);
69+
return new DataCollectionHelper(firebaseApp, sharedPreferencesUtils, firebaseEventSubscriber);
7170
}
7271

7372
@Provides
@@ -86,7 +85,7 @@ ApiClient providesApiClient(
8685
grpcClient,
8786
firebaseApp,
8887
application,
89-
firebaseInstanceId,
88+
firebaseInstallations,
9089
dataCollectionHelper,
9190
clock,
9291
providerInstaller);

firebase-inappmessaging/src/androidTest/java/com/google/firebase/inappmessaging/TestEngagementMetricsLoggerClientModule.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@
1616

1717
import com.google.firebase.FirebaseApp;
1818
import com.google.firebase.analytics.connector.AnalyticsConnector;
19-
import com.google.firebase.iid.FirebaseInstanceId;
2019
import com.google.firebase.inappmessaging.internal.DeveloperListenerManager;
2120
import com.google.firebase.inappmessaging.internal.MetricsLoggerClient;
2221
import com.google.firebase.inappmessaging.internal.MetricsLoggerClient.EngagementMetricsLoggerInterface;
2322
import com.google.firebase.inappmessaging.internal.injection.scopes.FirebaseAppScope;
2423
import com.google.firebase.inappmessaging.internal.time.Clock;
24+
import com.google.firebase.installations.FirebaseInstallationsApi;
2525
import dagger.Module;
2626
import dagger.Provides;
2727

@@ -38,16 +38,16 @@ public TestEngagementMetricsLoggerClientModule(
3838

3939
@Provides
4040
@FirebaseAppScope
41-
public MetricsLoggerClient providesApiClient(
42-
FirebaseInstanceId firebaseInstanceId,
41+
public MetricsLoggerClient providesMetricLoggerClient(
42+
FirebaseInstallationsApi firebaseInstallations,
4343
AnalyticsConnector analyticsConnector,
4444
Clock clock,
4545
DeveloperListenerManager developerListenerManager) {
4646
return new MetricsLoggerClient(
4747
engagementMetricsLoggerInterface,
4848
analyticsConnector,
4949
firebaseApp,
50-
firebaseInstanceId,
50+
firebaseInstallations,
5151
clock,
5252
developerListenerManager);
5353
}

firebase-inappmessaging/src/main/java/com/google/firebase/inappmessaging/FirebaseInAppMessaging.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import com.google.android.gms.common.annotation.KeepForSdk;
2020
import com.google.android.gms.common.util.VisibleForTesting;
2121
import com.google.firebase.FirebaseApp;
22-
import com.google.firebase.iid.FirebaseInstanceId;
2322
import com.google.firebase.inappmessaging.internal.DataCollectionHelper;
2423
import com.google.firebase.inappmessaging.internal.DeveloperListenerManager;
2524
import com.google.firebase.inappmessaging.internal.DisplayCallbacksFactory;
@@ -29,6 +28,7 @@
2928
import com.google.firebase.inappmessaging.internal.injection.qualifiers.ProgrammaticTrigger;
3029
import com.google.firebase.inappmessaging.internal.injection.scopes.FirebaseAppScope;
3130
import com.google.firebase.inappmessaging.model.TriggeredInAppMessage;
31+
import com.google.firebase.installations.FirebaseInstallationsApi;
3232
import io.reactivex.disposables.Disposable;
3333
import java.util.concurrent.Executor;
3434
import javax.inject.Inject;
@@ -47,7 +47,7 @@
4747
* </ul>
4848
*
4949
* <p>To delete the Instance ID and the data associated with it, see {@link
50-
* com.google.firebase.iid.FirebaseInstanceId#deleteInstanceId}.
50+
* FirebaseInstallationsApi.#delete}.
5151
*/
5252
@FirebaseAppScope
5353
public class FirebaseInAppMessaging {
@@ -56,6 +56,7 @@ public class FirebaseInAppMessaging {
5656
private final DataCollectionHelper dataCollectionHelper;
5757
private final DisplayCallbacksFactory displayCallbacksFactory;
5858
private final DeveloperListenerManager developerListenerManager;
59+
private final FirebaseInstallationsApi firebaseInstallations;
5960
private final ProgramaticContextualTriggers programaticContextualTriggers;
6061

6162
private boolean areMessagesSuppressed;
@@ -67,18 +68,21 @@ public class FirebaseInAppMessaging {
6768
InAppMessageStreamManager inAppMessageStreamManager,
6869
@ProgrammaticTrigger ProgramaticContextualTriggers programaticContextualTriggers,
6970
DataCollectionHelper dataCollectionHelper,
71+
FirebaseInstallationsApi firebaseInstallations,
7072
DisplayCallbacksFactory displayCallbacksFactory,
7173
DeveloperListenerManager developerListenerManager) {
7274
this.inAppMessageStreamManager = inAppMessageStreamManager;
75+
this.firebaseInstallations = firebaseInstallations;
7376
this.programaticContextualTriggers = programaticContextualTriggers;
7477
this.dataCollectionHelper = dataCollectionHelper;
7578
this.areMessagesSuppressed = false;
7679
this.displayCallbacksFactory = displayCallbacksFactory;
7780
this.developerListenerManager = developerListenerManager;
7881

79-
Logging.logi(
80-
"Starting InAppMessaging runtime with Instance ID "
81-
+ FirebaseInstanceId.getInstance().getId());
82+
firebaseInstallations
83+
.getId()
84+
.addOnSuccessListener(
85+
id -> Logging.logi("Starting InAppMessaging runtime with Installation ID " + id));
8286

8387
Disposable unused =
8488
inAppMessageStreamManager
@@ -114,9 +118,8 @@ public boolean isAutomaticDataCollectionEnabled() {
114118
*
115119
* <p>When enabled, generates a registration token on app startup if there is no valid one and
116120
* generates a new token when it is deleted (which prevents {@link
117-
* com.google.firebase.iid.FirebaseInstanceId#deleteInstanceId} from stopping the periodic sending
118-
* of data). This setting is persisted across app restarts and overrides the setting specified in
119-
* your manifest.
121+
* FirebaseInstallationsApi.#delete} from stopping the periodic sending of data). This setting is
122+
* persisted across app restarts and overrides the setting specified in your manifest.
120123
*
121124
* <p>By default, auto-initialization is enabled. If you need to change the default, (for example,
122125
* because you want to prompt the user before generates/refreshes a registration token on app

firebase-inappmessaging/src/main/java/com/google/firebase/inappmessaging/FirebaseInAppMessagingRegistrar.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,19 @@
2727
import com.google.firebase.components.ComponentRegistrar;
2828
import com.google.firebase.components.Dependency;
2929
import com.google.firebase.events.Subscriber;
30-
import com.google.firebase.iid.FirebaseInstanceId;
30+
import com.google.firebase.inappmessaging.internal.AbtIntegrationHelper;
3131
import com.google.firebase.inappmessaging.internal.ProgramaticContextualTriggers;
3232
import com.google.firebase.inappmessaging.internal.injection.components.AppComponent;
3333
import com.google.firebase.inappmessaging.internal.injection.components.DaggerAppComponent;
3434
import com.google.firebase.inappmessaging.internal.injection.components.DaggerUniversalComponent;
3535
import com.google.firebase.inappmessaging.internal.injection.components.UniversalComponent;
36-
import com.google.firebase.inappmessaging.internal.injection.modules.AbTestingModule;
3736
import com.google.firebase.inappmessaging.internal.injection.modules.AnalyticsEventsModule;
3837
import com.google.firebase.inappmessaging.internal.injection.modules.ApiClientModule;
3938
import com.google.firebase.inappmessaging.internal.injection.modules.AppMeasurementModule;
4039
import com.google.firebase.inappmessaging.internal.injection.modules.ApplicationModule;
4140
import com.google.firebase.inappmessaging.internal.injection.modules.GrpcClientModule;
4241
import com.google.firebase.inappmessaging.internal.injection.modules.ProgrammaticContextualTriggerFlowableModule;
42+
import com.google.firebase.installations.FirebaseInstallationsApi;
4343
import com.google.firebase.platforminfo.LibraryVersionComponent;
4444
import java.util.Arrays;
4545
import java.util.List;
@@ -57,7 +57,7 @@ public List<Component<?>> getComponents() {
5757
return Arrays.asList(
5858
Component.builder(FirebaseInAppMessaging.class)
5959
.add(Dependency.required(Context.class))
60-
.add(Dependency.required(FirebaseInstanceId.class))
60+
.add(Dependency.required(FirebaseInstallationsApi.class))
6161
.add(Dependency.required(FirebaseApp.class))
6262
.add(Dependency.required(AbtComponent.class))
6363
.add(Dependency.optional(AnalyticsConnector.class))
@@ -71,10 +71,8 @@ public List<Component<?>> getComponents() {
7171

7272
private FirebaseInAppMessaging providesFirebaseInAppMessaging(ComponentContainer container) {
7373
FirebaseApp firebaseApp = container.get(FirebaseApp.class);
74-
FirebaseInstanceId firebaseInstanceId = container.get(FirebaseInstanceId.class);
74+
FirebaseInstallationsApi firebaseInstallations = container.get(FirebaseInstallationsApi.class);
7575
AnalyticsConnector analyticsConnector = container.get(AnalyticsConnector.class);
76-
FirebaseABTesting abTesting =
77-
container.get(AbtComponent.class).get(FirebaseABTesting.OriginService.INAPP_MESSAGING);
7876
Subscriber firebaseEventsSubscriber = container.get(Subscriber.class);
7977

8078
Application application = (Application) firebaseApp.getApplicationContext();
@@ -92,9 +90,13 @@ private FirebaseInAppMessaging providesFirebaseInAppMessaging(ComponentContainer
9290

9391
AppComponent instance =
9492
DaggerAppComponent.builder()
95-
.abTestingModule(new AbTestingModule(abTesting))
93+
.abtIntegrationHelper(
94+
new AbtIntegrationHelper(
95+
container
96+
.get(AbtComponent.class)
97+
.get(FirebaseABTesting.OriginService.INAPP_MESSAGING)))
9698
.apiClientModule(
97-
new ApiClientModule(firebaseApp, firebaseInstanceId, universalComponent.clock()))
99+
new ApiClientModule(firebaseApp, firebaseInstallations, universalComponent.clock()))
98100
.grpcClientModule(new GrpcClientModule(firebaseApp))
99101
.universalComponent(universalComponent)
100102
.transportFactory(container.get(TransportFactory.class))

0 commit comments

Comments
 (0)