Skip to content

Commit 19130fb

Browse files
manny-jimenezManny Jimenez
and
Manny Jimenez
authored
Making firebase installations lazy to initialize (#3272)
* Making firebase installations lazy to initialize * Change main class to take in a provider * Passing provider down to classes * Fixing tests * responding to comments renaming fields * Changing gradle file * Changing gradle file to not have path in the dependencies Co-authored-by: Manny Jimenez <[email protected]>
1 parent 9fb2b87 commit 19130fb

File tree

7 files changed

+42
-27
lines changed

7 files changed

+42
-27
lines changed

firebase-app-distribution/firebase-app-distribution.gradle

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ android {
3939

4040
dependencies {
4141
implementation 'org.jetbrains:annotations:15.0'
42-
implementation project(path: ':firebase-components')
43-
implementation project(path: ':firebase-installations-interop')
44-
implementation project(path: ':firebase-common')
45-
implementation project(path: ':firebase-installations')
42+
implementation project(':firebase-components')
43+
implementation project(':firebase-installations-interop')
44+
implementation project(':firebase-common')
45+
runtimeOnly project(':firebase-installations')
4646

4747
testImplementation 'junit:junit:4.13.2'
4848
testImplementation "org.robolectric:robolectric:$robolectricVersion"

firebase-app-distribution/src/main/java/com/google/firebase/app/distribution/FirebaseAppDistribution.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.google.firebase.app.distribution.internal.LogWrapper;
3535
import com.google.firebase.app.distribution.internal.SignInResultActivity;
3636
import com.google.firebase.app.distribution.internal.SignInStorage;
37+
import com.google.firebase.inject.Provider;
3738
import com.google.firebase.installations.FirebaseInstallationsApi;
3839

3940
public class FirebaseAppDistribution {
@@ -84,14 +85,16 @@ public class FirebaseAppDistribution {
8485
/** Constructor for FirebaseAppDistribution */
8586
FirebaseAppDistribution(
8687
@NonNull FirebaseApp firebaseApp,
87-
@NonNull FirebaseInstallationsApi firebaseInstallationsApi,
88+
@NonNull Provider<FirebaseInstallationsApi> firebaseInstallationsApiProvider,
8889
@NonNull SignInStorage signInStorage,
8990
@NonNull FirebaseAppDistributionLifecycleNotifier lifecycleNotifier) {
9091
this(
9192
firebaseApp,
92-
new TesterSignInManager(firebaseApp, firebaseInstallationsApi, signInStorage),
93+
new TesterSignInManager(firebaseApp, firebaseInstallationsApiProvider, signInStorage),
9394
new NewReleaseFetcher(
94-
firebaseApp, new FirebaseAppDistributionTesterApiClient(), firebaseInstallationsApi),
95+
firebaseApp,
96+
new FirebaseAppDistributionTesterApiClient(),
97+
firebaseInstallationsApiProvider),
9598
new ApkUpdater(firebaseApp, new ApkInstaller()),
9699
new AabUpdater(),
97100
signInStorage,
@@ -101,10 +104,10 @@ firebaseApp, new FirebaseAppDistributionTesterApiClient(), firebaseInstallations
101104
/** Constructor for FirebaseAppDistribution */
102105
FirebaseAppDistribution(
103106
@NonNull FirebaseApp firebaseApp,
104-
@NonNull FirebaseInstallationsApi firebaseInstallationsApi) {
107+
@NonNull Provider<FirebaseInstallationsApi> firebaseInstallationsApiProvider) {
105108
this(
106109
firebaseApp,
107-
firebaseInstallationsApi,
110+
firebaseInstallationsApiProvider,
108111
new SignInStorage(firebaseApp.getApplicationContext()),
109112
FirebaseAppDistributionLifecycleNotifier.getInstance());
110113
}

firebase-app-distribution/src/main/java/com/google/firebase/app/distribution/FirebaseAppDistributionRegistrar.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,17 @@ public class FirebaseAppDistributionRegistrar implements ComponentRegistrar {
4343
return Arrays.asList(
4444
Component.builder(FirebaseAppDistribution.class)
4545
.add(Dependency.required(FirebaseApp.class))
46-
.add(Dependency.required(FirebaseInstallationsApi.class))
46+
.add(Dependency.requiredProvider(FirebaseInstallationsApi.class))
4747
.factory(this::buildFirebaseAppDistribution)
4848
.build(),
4949
LibraryVersionComponent.create("fire-app-distribution", BuildConfig.VERSION_NAME));
5050
}
5151

5252
private FirebaseAppDistribution buildFirebaseAppDistribution(ComponentContainer container) {
5353
FirebaseApp firebaseApp = container.get(FirebaseApp.class);
54-
FirebaseInstallationsApi firebaseInstallations = container.get(FirebaseInstallationsApi.class);
5554
FirebaseAppDistribution appDistribution =
56-
new FirebaseAppDistribution(firebaseApp, firebaseInstallations);
55+
new FirebaseAppDistribution(
56+
firebaseApp, container.getProvider(FirebaseInstallationsApi.class));
5757
FirebaseAppDistributionLifecycleNotifier lifecycleNotifier =
5858
FirebaseAppDistributionLifecycleNotifier.getInstance();
5959

firebase-app-distribution/src/main/java/com/google/firebase/app/distribution/NewReleaseFetcher.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.google.android.gms.tasks.Tasks;
2727
import com.google.firebase.FirebaseApp;
2828
import com.google.firebase.app.distribution.internal.LogWrapper;
29+
import com.google.firebase.inject.Provider;
2930
import com.google.firebase.installations.FirebaseInstallationsApi;
3031
import com.google.firebase.installations.InstallationTokenResult;
3132
import java.io.File;
@@ -44,7 +45,7 @@ class NewReleaseFetcher {
4445

4546
private final FirebaseApp firebaseApp;
4647
private final FirebaseAppDistributionTesterApiClient firebaseAppDistributionTesterApiClient;
47-
private final FirebaseInstallationsApi firebaseInstallationsApi;
48+
private final Provider<FirebaseInstallationsApi> firebaseInstallationsApiProvider;
4849
// Maintain an in-memory mapping from source file to APK hash to avoid re-calculating the hash
4950
private static final ConcurrentMap<String, String> cachedApkHashes = new ConcurrentHashMap<>();
5051

@@ -54,21 +55,21 @@ class NewReleaseFetcher {
5455
NewReleaseFetcher(
5556
@NonNull FirebaseApp firebaseApp,
5657
@NonNull FirebaseAppDistributionTesterApiClient firebaseAppDistributionTesterApiClient,
57-
@NonNull FirebaseInstallationsApi firebaseInstallationsApi) {
58+
@NonNull Provider<FirebaseInstallationsApi> firebaseInstallationsApiProvider) {
5859
this.firebaseApp = firebaseApp;
5960
this.firebaseAppDistributionTesterApiClient = firebaseAppDistributionTesterApiClient;
60-
this.firebaseInstallationsApi = firebaseInstallationsApi;
61+
this.firebaseInstallationsApiProvider = firebaseInstallationsApiProvider;
6162
this.taskExecutor = Executors.newSingleThreadExecutor();
6263
}
6364

6465
NewReleaseFetcher(
6566
@NonNull FirebaseApp firebaseApp,
6667
@NonNull FirebaseAppDistributionTesterApiClient firebaseAppDistributionTesterApiClient,
67-
@NonNull FirebaseInstallationsApi firebaseInstallationsApi,
68+
@NonNull Provider<FirebaseInstallationsApi> firebaseInstallationsApiProvider,
6869
@NonNull Executor executor) {
6970
this.firebaseApp = firebaseApp;
7071
this.firebaseAppDistributionTesterApiClient = firebaseAppDistributionTesterApiClient;
71-
this.firebaseInstallationsApi = firebaseInstallationsApi;
72+
this.firebaseInstallationsApiProvider = firebaseInstallationsApiProvider;
7273
this.taskExecutor = executor;
7374
}
7475

@@ -79,10 +80,10 @@ public synchronized Task<AppDistributionReleaseInternal> checkForNewRelease() {
7980
return cachedCheckForNewRelease;
8081
}
8182

82-
Task<String> installationIdTask = firebaseInstallationsApi.getId();
83+
Task<String> installationIdTask = firebaseInstallationsApiProvider.get().getId();
8384
// forceRefresh is false to get locally cached token if available
8485
Task<InstallationTokenResult> installationAuthTokenTask =
85-
firebaseInstallationsApi.getToken(false);
86+
firebaseInstallationsApiProvider.get().getToken(false);
8687

8788
this.cachedCheckForNewRelease =
8889
Tasks.whenAllSuccess(installationIdTask, installationAuthTokenTask)

firebase-app-distribution/src/main/java/com/google/firebase/app/distribution/TesterSignInManager.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import com.google.firebase.app.distribution.internal.LogWrapper;
4040
import com.google.firebase.app.distribution.internal.SignInResultActivity;
4141
import com.google.firebase.app.distribution.internal.SignInStorage;
42+
import com.google.firebase.inject.Provider;
4243
import com.google.firebase.installations.FirebaseInstallationsApi;
4344
import java.util.List;
4445

@@ -49,7 +50,7 @@ class TesterSignInManager {
4950
"https://appdistribution.firebase.google.com/pub/testerapps/%s/installations/%s/buildalerts?appName=%s&packageName=%s";
5051

5152
private final FirebaseApp firebaseApp;
52-
private final FirebaseInstallationsApi firebaseInstallationsApi;
53+
private final Provider<FirebaseInstallationsApi> firebaseInstallationsApiProvider;
5354
private final SignInStorage signInStorage;
5455
private final FirebaseAppDistributionLifecycleNotifier lifecycleNotifier;
5556

@@ -62,23 +63,23 @@ class TesterSignInManager {
6263

6364
TesterSignInManager(
6465
@NonNull FirebaseApp firebaseApp,
65-
@NonNull FirebaseInstallationsApi firebaseInstallationsApi,
66+
@NonNull Provider<FirebaseInstallationsApi> firebaseInstallationsApiProvider,
6667
@NonNull final SignInStorage signInStorage) {
6768
this(
6869
firebaseApp,
69-
firebaseInstallationsApi,
70+
firebaseInstallationsApiProvider,
7071
signInStorage,
7172
FirebaseAppDistributionLifecycleNotifier.getInstance());
7273
}
7374

7475
@VisibleForTesting
7576
TesterSignInManager(
7677
@NonNull FirebaseApp firebaseApp,
77-
@NonNull FirebaseInstallationsApi firebaseInstallationsApi,
78+
@NonNull Provider<FirebaseInstallationsApi> firebaseInstallationsApiProvider,
7879
@NonNull final SignInStorage signInStorage,
7980
@NonNull FirebaseAppDistributionLifecycleNotifier lifecycleNotifier) {
8081
this.firebaseApp = firebaseApp;
81-
this.firebaseInstallationsApi = firebaseInstallationsApi;
82+
this.firebaseInstallationsApiProvider = firebaseInstallationsApiProvider;
8283
this.signInStorage = signInStorage;
8384
this.lifecycleNotifier = lifecycleNotifier;
8485

@@ -166,7 +167,8 @@ private AlertDialog getSignInAlertDialog(Activity currentActivity) {
166167
AlertDialog.BUTTON_POSITIVE,
167168
context.getString(R.string.singin_yes_button),
168169
(dialogInterface, i) -> {
169-
firebaseInstallationsApi
170+
firebaseInstallationsApiProvider
171+
.get()
170172
.getId()
171173
.addOnSuccessListener(getFidGenerationOnSuccessListener(currentActivity))
172174
.addOnFailureListener(

firebase-app-distribution/src/test/java/com/google/firebase/app/distribution/NewReleaseFetcherTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import com.google.android.gms.tasks.Tasks;
4242
import com.google.firebase.FirebaseApp;
4343
import com.google.firebase.FirebaseOptions;
44+
import com.google.firebase.inject.Provider;
4445
import com.google.firebase.installations.FirebaseInstallationsApi;
4546
import com.google.firebase.installations.InstallationTokenResult;
4647
import java.util.concurrent.Executor;
@@ -74,6 +75,7 @@ public class NewReleaseFetcherTest {
7475
private ShadowPackageManager shadowPackageManager;
7576
private Context applicationContext;
7677

78+
@Mock private Provider<FirebaseInstallationsApi> mockFirebaseInstallationsProvider;
7779
@Mock private FirebaseInstallationsApi mockFirebaseInstallations;
7880
@Mock private FirebaseAppDistributionTesterApiClient mockFirebaseAppDistributionTesterApiClient;
7981
@Mock private InstallationTokenResult mockInstallationTokenResult;
@@ -95,6 +97,7 @@ public void setup() {
9597
.setApiKey(TEST_API_KEY)
9698
.build());
9799

100+
when(mockFirebaseInstallationsProvider.get()).thenReturn(mockFirebaseInstallations);
98101
when(mockFirebaseInstallations.getId()).thenReturn(Tasks.forResult(TEST_FID_1));
99102
when(mockFirebaseInstallations.getToken(false))
100103
.thenReturn(Tasks.forResult(mockInstallationTokenResult));
@@ -126,7 +129,7 @@ public void setup() {
126129
new NewReleaseFetcher(
127130
firebaseApp,
128131
mockFirebaseAppDistributionTesterApiClient,
129-
mockFirebaseInstallations,
132+
mockFirebaseInstallationsProvider,
130133
testExecutor));
131134
}
132135

firebase-app-distribution/src/test/java/com/google/firebase/app/distribution/TesterSignInManagerTest.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import com.google.firebase.app.distribution.FirebaseAppDistributionTest.TestActivity;
4444
import com.google.firebase.app.distribution.internal.SignInResultActivity;
4545
import com.google.firebase.app.distribution.internal.SignInStorage;
46+
import com.google.firebase.inject.Provider;
4647
import com.google.firebase.installations.FirebaseInstallationsApi;
4748
import com.google.firebase.installations.InstallationTokenResult;
4849
import org.junit.Before;
@@ -79,6 +80,7 @@ public class TesterSignInManagerTest {
7980
private ShadowActivity shadowActivity;
8081
private ShadowPackageManager shadowPackageManager;
8182

83+
@Mock private Provider<FirebaseInstallationsApi> mockFirebaseInstallationsProvider;
8284
@Mock private FirebaseInstallationsApi mockFirebaseInstallations;
8385
@Mock private InstallationTokenResult mockInstallationTokenResult;
8486
@Mock private SignInStorage mockSignInStorage;
@@ -100,6 +102,7 @@ public void setUp() {
100102
.setApiKey(TEST_API_KEY)
101103
.build());
102104

105+
when(mockFirebaseInstallationsProvider.get()).thenReturn(mockFirebaseInstallations);
103106
when(mockFirebaseInstallations.getId()).thenReturn(Tasks.forResult(TEST_FID_1));
104107
when(mockFirebaseInstallations.getToken(false))
105108
.thenReturn(Tasks.forResult(mockInstallationTokenResult));
@@ -129,7 +132,10 @@ public void setUp() {
129132

130133
testerSignInManager =
131134
new TesterSignInManager(
132-
firebaseApp, mockFirebaseInstallations, mockSignInStorage, mockLifecycleNotifier);
135+
firebaseApp,
136+
mockFirebaseInstallationsProvider,
137+
mockSignInStorage,
138+
mockLifecycleNotifier);
133139
}
134140

135141
@Test

0 commit comments

Comments
 (0)