Skip to content

Commit 19bbded

Browse files
committed
Move continuations off main thread for firebase-appcheck-playintegrity.
1 parent 68c0da8 commit 19bbded

File tree

4 files changed

+43
-28
lines changed

4 files changed

+43
-28
lines changed

appcheck/firebase-appcheck-playintegrity/src/main/java/com/google/firebase/appcheck/playintegrity/FirebaseAppCheckPlayIntegrityRegistrar.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import com.google.android.gms.common.annotation.KeepForSdk;
1818
import com.google.firebase.FirebaseApp;
1919
import com.google.firebase.annotations.concurrent.Blocking;
20+
import com.google.firebase.annotations.concurrent.Lightweight;
2021
import com.google.firebase.appcheck.playintegrity.internal.PlayIntegrityAppCheckProvider;
2122
import com.google.firebase.components.Component;
2223
import com.google.firebase.components.ComponentRegistrar;
@@ -39,17 +40,21 @@ public class FirebaseAppCheckPlayIntegrityRegistrar implements ComponentRegistra
3940

4041
@Override
4142
public List<Component<?>> getComponents() {
43+
Qualified<Executor> liteExecutor = Qualified.qualified(Lightweight.class, Executor.class);
4244
Qualified<Executor> blockingExecutor = Qualified.qualified(Blocking.class, Executor.class);
4345

4446
return Arrays.asList(
4547
Component.builder(PlayIntegrityAppCheckProvider.class)
4648
.name(LIBRARY_NAME)
4749
.add(Dependency.required(FirebaseApp.class))
50+
.add(Dependency.required(liteExecutor))
4851
.add(Dependency.required(blockingExecutor))
4952
.factory(
5053
(container) ->
5154
new PlayIntegrityAppCheckProvider(
52-
container.get(FirebaseApp.class), container.get(blockingExecutor)))
55+
container.get(FirebaseApp.class),
56+
container.get(liteExecutor),
57+
container.get(blockingExecutor)))
5358
.build(),
5459
LibraryVersionComponent.create(LIBRARY_NAME, BuildConfig.VERSION_NAME));
5560
}

appcheck/firebase-appcheck-playintegrity/src/main/java/com/google/firebase/appcheck/playintegrity/internal/PlayIntegrityAppCheckProvider.java

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
package com.google.firebase.appcheck.playintegrity.internal;
1616

17-
import android.annotation.SuppressLint;
1817
import androidx.annotation.NonNull;
1918
import androidx.annotation.VisibleForTesting;
2019
import com.google.android.gms.tasks.Task;
@@ -25,6 +24,7 @@
2524
import com.google.android.play.core.integrity.IntegrityTokenResponse;
2625
import com.google.firebase.FirebaseApp;
2726
import com.google.firebase.annotations.concurrent.Blocking;
27+
import com.google.firebase.annotations.concurrent.Lightweight;
2828
import com.google.firebase.appcheck.AppCheckProvider;
2929
import com.google.firebase.appcheck.AppCheckToken;
3030
import com.google.firebase.appcheck.internal.DefaultAppCheckToken;
@@ -39,15 +39,19 @@ public class PlayIntegrityAppCheckProvider implements AppCheckProvider {
3939
private final String projectNumber;
4040
private final IntegrityManager integrityManager;
4141
private final NetworkClient networkClient;
42+
private final Executor liteExecutor;
4243
private final Executor blockingExecutor;
4344
private final RetryManager retryManager;
4445

4546
public PlayIntegrityAppCheckProvider(
46-
@NonNull FirebaseApp firebaseApp, @Blocking Executor blockingExecutor) {
47+
@NonNull FirebaseApp firebaseApp,
48+
@Lightweight Executor liteExecutor,
49+
@Blocking Executor blockingExecutor) {
4750
this(
4851
firebaseApp.getOptions().getGcmSenderId(),
4952
IntegrityManagerFactory.create(firebaseApp.getApplicationContext()),
5053
new NetworkClient(firebaseApp),
54+
liteExecutor,
5155
blockingExecutor,
5256
new RetryManager());
5357
}
@@ -57,22 +61,23 @@ public PlayIntegrityAppCheckProvider(
5761
@NonNull String projectNumber,
5862
@NonNull IntegrityManager integrityManager,
5963
@NonNull NetworkClient networkClient,
64+
@NonNull Executor liteExecutor,
6065
@NonNull Executor blockingExecutor,
6166
@NonNull RetryManager retryManager) {
6267
this.projectNumber = projectNumber;
6368
this.integrityManager = integrityManager;
6469
this.networkClient = networkClient;
70+
this.liteExecutor = liteExecutor;
6571
this.blockingExecutor = blockingExecutor;
6672
this.retryManager = retryManager;
6773
}
6874

69-
// TODO(b/261013814): Use an explicit executor in continuations.
70-
@SuppressLint("TaskMainThread")
7175
@NonNull
7276
@Override
7377
public Task<AppCheckToken> getToken() {
7478
return getPlayIntegrityAttestation()
7579
.onSuccessTask(
80+
liteExecutor,
7681
integrityTokenResponse -> {
7782
ExchangePlayIntegrityTokenRequest request =
7883
new ExchangePlayIntegrityTokenRequest(integrityTokenResponse.token());
@@ -85,32 +90,30 @@ public Task<AppCheckToken> getToken() {
8590
retryManager));
8691
})
8792
.onSuccessTask(
88-
appCheckTokenResponse -> {
89-
return Tasks.forResult(
90-
DefaultAppCheckToken.constructFromAppCheckTokenResponse(appCheckTokenResponse));
91-
});
93+
liteExecutor,
94+
appCheckTokenResponse ->
95+
Tasks.forResult(
96+
DefaultAppCheckToken.constructFromAppCheckTokenResponse(
97+
appCheckTokenResponse)));
9298
}
9399

94-
// TODO(b/261013814): Use an explicit executor in continuations.
95-
@SuppressLint("TaskMainThread")
96100
@NonNull
97101
private Task<IntegrityTokenResponse> getPlayIntegrityAttestation() {
98102
GeneratePlayIntegrityChallengeRequest generateChallengeRequest =
99103
new GeneratePlayIntegrityChallengeRequest();
100-
Task<GeneratePlayIntegrityChallengeResponse> generateChallengeTask =
101-
Tasks.call(
104+
return Tasks.call(
102105
blockingExecutor,
103106
() ->
104107
GeneratePlayIntegrityChallengeResponse.fromJsonString(
105108
networkClient.generatePlayIntegrityChallenge(
106-
generateChallengeRequest.toJsonString().getBytes(UTF_8), retryManager)));
107-
return generateChallengeTask.onSuccessTask(
108-
generatePlayIntegrityChallengeResponse -> {
109-
return integrityManager.requestIntegrityToken(
110-
IntegrityTokenRequest.builder()
111-
.setCloudProjectNumber(Long.parseLong(projectNumber))
112-
.setNonce(generatePlayIntegrityChallengeResponse.getChallenge())
113-
.build());
114-
});
109+
generateChallengeRequest.toJsonString().getBytes(UTF_8), retryManager)))
110+
.onSuccessTask(
111+
liteExecutor,
112+
generatePlayIntegrityChallengeResponse ->
113+
integrityManager.requestIntegrityToken(
114+
IntegrityTokenRequest.builder()
115+
.setCloudProjectNumber(Long.parseLong(projectNumber))
116+
.setNonce(generatePlayIntegrityChallengeResponse.getChallenge())
117+
.build()));
115118
}
116119
}

appcheck/firebase-appcheck-playintegrity/src/test/java/com/google/firebase/appcheck/playintegrity/FirebaseAppCheckPlayIntegrityRegistrarTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.google.firebase.FirebaseApp;
2020
import com.google.firebase.annotations.concurrent.Blocking;
21+
import com.google.firebase.annotations.concurrent.Lightweight;
2122
import com.google.firebase.components.Component;
2223
import com.google.firebase.components.Dependency;
2324
import com.google.firebase.components.Qualified;
@@ -40,6 +41,7 @@ public void testGetComponents() {
4041
assertThat(appCheckPlayIntegrityComponent.getDependencies())
4142
.containsExactly(
4243
Dependency.required(FirebaseApp.class),
44+
Dependency.required(Qualified.qualified(Lightweight.class, Executor.class)),
4345
Dependency.required(Qualified.qualified(Blocking.class, Executor.class)));
4446
assertThat(appCheckPlayIntegrityComponent.isLazy()).isTrue();
4547
}

appcheck/firebase-appcheck-playintegrity/src/test/java/com/google/firebase/appcheck/playintegrity/internal/PlayIntegrityAppCheckProviderTest.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public class PlayIntegrityAppCheckProviderTest {
7272
@Captor private ArgumentCaptor<byte[]> exchangePlayIntegrityTokenRequestCaptor;
7373

7474
// TODO(b/258273630): Use TestOnlyExecutors instead of MoreExecutors.directExecutor().
75-
private Executor backgroundExecutor = MoreExecutors.directExecutor();
75+
private Executor executor = MoreExecutors.directExecutor();
7676

7777
@Before
7878
public void setup() {
@@ -87,7 +87,8 @@ public void testPublicConstructor_nullFirebaseApp_expectThrows() {
8787
assertThrows(
8888
NullPointerException.class,
8989
() -> {
90-
new PlayIntegrityAppCheckProvider(null, TestOnlyExecutors.blocking());
90+
new PlayIntegrityAppCheckProvider(
91+
null, TestOnlyExecutors.lite(), TestOnlyExecutors.blocking());
9192
});
9293
}
9394

@@ -106,7 +107,8 @@ public void getToken_onSuccess_setsTaskResult() throws Exception {
106107
PROJECT_NUMBER,
107108
mockIntegrityManager,
108109
mockNetworkClient,
109-
backgroundExecutor,
110+
/* liteExecutor= */ executor,
111+
/* blockingExecutor= */ executor,
110112
mockRetryManager);
111113
Task<AppCheckToken> task = provider.getToken();
112114

@@ -141,7 +143,8 @@ public void getToken_generateChallengeFails_setsTaskException() throws Exception
141143
PROJECT_NUMBER,
142144
mockIntegrityManager,
143145
mockNetworkClient,
144-
backgroundExecutor,
146+
/* liteExecutor= */ executor,
147+
/* blockingExecutor= */ executor,
145148
mockRetryManager);
146149
Task<AppCheckToken> task = provider.getToken();
147150

@@ -165,7 +168,8 @@ public void getToken_requestIntegrityTokenFails_setsTaskException() throws Excep
165168
PROJECT_NUMBER,
166169
mockIntegrityManager,
167170
mockNetworkClient,
168-
backgroundExecutor,
171+
/* liteExecutor= */ executor,
172+
/* blockingExecutor= */ executor,
169173
mockRetryManager);
170174
Task<AppCheckToken> task = provider.getToken();
171175

@@ -196,7 +200,8 @@ public void getToken_tokenExchangeFails_setsTaskException() throws Exception {
196200
PROJECT_NUMBER,
197201
mockIntegrityManager,
198202
mockNetworkClient,
199-
backgroundExecutor,
203+
/* liteExecutor= */ executor,
204+
/* blockingExecutor= */ executor,
200205
mockRetryManager);
201206
Task<AppCheckToken> task = provider.getToken();
202207

0 commit comments

Comments
 (0)