Skip to content

Commit 61a536c

Browse files
committed
Move continuations off main thread for firebase-appcheck-debug.
1 parent c51d35d commit 61a536c

File tree

4 files changed

+37
-18
lines changed

4 files changed

+37
-18
lines changed

appcheck/firebase-appcheck-debug/src/main/java/com/google/firebase/appcheck/debug/FirebaseAppCheckDebugRegistrar.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.google.firebase.FirebaseApp;
1919
import com.google.firebase.annotations.concurrent.Background;
2020
import com.google.firebase.annotations.concurrent.Blocking;
21+
import com.google.firebase.annotations.concurrent.Lightweight;
2122
import com.google.firebase.appcheck.debug.internal.DebugAppCheckProvider;
2223
import com.google.firebase.components.Component;
2324
import com.google.firebase.components.ComponentRegistrar;
@@ -40,6 +41,7 @@ public class FirebaseAppCheckDebugRegistrar implements ComponentRegistrar {
4041

4142
@Override
4243
public List<Component<?>> getComponents() {
44+
Qualified<Executor> liteExecutor = Qualified.qualified(Lightweight.class, Executor.class);
4345
Qualified<Executor> backgroundExecutor = Qualified.qualified(Background.class, Executor.class);
4446
Qualified<Executor> blockingExecutor = Qualified.qualified(Blocking.class, Executor.class);
4547

@@ -48,13 +50,15 @@ public List<Component<?>> getComponents() {
4850
.name(LIBRARY_NAME)
4951
.add(Dependency.required(FirebaseApp.class))
5052
.add(Dependency.optionalProvider(InternalDebugSecretProvider.class))
53+
.add(Dependency.required(liteExecutor))
5154
.add(Dependency.required(backgroundExecutor))
5255
.add(Dependency.required(blockingExecutor))
5356
.factory(
5457
(container) ->
5558
new DebugAppCheckProvider(
5659
container.get(FirebaseApp.class),
5760
container.getProvider(InternalDebugSecretProvider.class),
61+
container.get(liteExecutor),
5862
container.get(backgroundExecutor),
5963
container.get(blockingExecutor)))
6064
.build(),

appcheck/firebase-appcheck-debug/src/main/java/com/google/firebase/appcheck/debug/internal/DebugAppCheckProvider.java

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
import static com.google.android.gms.common.internal.Preconditions.checkNotNull;
1818

19-
import android.annotation.SuppressLint;
2019
import android.util.Log;
2120
import androidx.annotation.NonNull;
2221
import androidx.annotation.VisibleForTesting;
@@ -26,6 +25,7 @@
2625
import com.google.firebase.FirebaseApp;
2726
import com.google.firebase.annotations.concurrent.Background;
2827
import com.google.firebase.annotations.concurrent.Blocking;
28+
import com.google.firebase.annotations.concurrent.Lightweight;
2929
import com.google.firebase.appcheck.AppCheckProvider;
3030
import com.google.firebase.appcheck.AppCheckToken;
3131
import com.google.firebase.appcheck.debug.InternalDebugSecretProvider;
@@ -42,17 +42,20 @@ public class DebugAppCheckProvider implements AppCheckProvider {
4242
private static final String UTF_8 = "UTF-8";
4343

4444
private final NetworkClient networkClient;
45+
private final Executor liteExecutor;
4546
private final Executor blockingExecutor;
4647
private final RetryManager retryManager;
4748
private final Task<String> debugSecretTask;
4849

4950
public DebugAppCheckProvider(
5051
@NonNull FirebaseApp firebaseApp,
5152
@NonNull Provider<InternalDebugSecretProvider> debugSecretProvider,
53+
@Lightweight Executor liteExecutor,
5254
@Background Executor backgroundExecutor,
5355
@Blocking Executor blockingExecutor) {
5456
checkNotNull(firebaseApp);
5557
this.networkClient = new NetworkClient(firebaseApp);
58+
this.liteExecutor = liteExecutor;
5659
this.blockingExecutor = blockingExecutor;
5760
this.retryManager = new RetryManager();
5861

@@ -70,9 +73,11 @@ public DebugAppCheckProvider(
7073
DebugAppCheckProvider(
7174
@NonNull String debugSecret,
7275
@NonNull NetworkClient networkClient,
76+
@NonNull Executor liteExecutor,
7377
@NonNull Executor blockingExecutor,
7478
@NonNull RetryManager retryManager) {
7579
this.networkClient = networkClient;
80+
this.liteExecutor = liteExecutor;
7681
this.blockingExecutor = blockingExecutor;
7782
this.retryManager = retryManager;
7883
this.debugSecretTask = Tasks.forResult(debugSecret);
@@ -102,15 +107,14 @@ static Task<String> determineDebugSecret(
102107
return taskCompletionSource.getTask();
103108
}
104109

105-
// TODO(b/261013814): Use an explicit executor in continuations.
106-
@SuppressLint("TaskMainThread")
107110
@NonNull
108111
@Override
109112
public Task<AppCheckToken> getToken() {
110113
return debugSecretTask
111-
.continueWithTask(
112-
task -> {
113-
ExchangeDebugTokenRequest request = new ExchangeDebugTokenRequest(task.getResult());
114+
.onSuccessTask(
115+
liteExecutor,
116+
debugSecret -> {
117+
ExchangeDebugTokenRequest request = new ExchangeDebugTokenRequest(debugSecret);
114118
return Tasks.call(
115119
blockingExecutor,
116120
() ->
@@ -119,14 +123,9 @@ public Task<AppCheckToken> getToken() {
119123
NetworkClient.DEBUG,
120124
retryManager));
121125
})
122-
.continueWithTask(
123-
task -> {
124-
if (task.isSuccessful()) {
125-
return Tasks.forResult(
126-
DefaultAppCheckToken.constructFromAppCheckTokenResponse(task.getResult()));
127-
}
128-
// TODO: Surface more error details.
129-
return Tasks.forException(task.getException());
130-
});
126+
.onSuccessTask(
127+
liteExecutor,
128+
response ->
129+
Tasks.forResult(DefaultAppCheckToken.constructFromAppCheckTokenResponse(response)));
131130
}
132131
}

appcheck/firebase-appcheck-debug/src/test/java/com/google/firebase/appcheck/debug/FirebaseAppCheckDebugRegistrarTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.google.firebase.FirebaseApp;
2020
import com.google.firebase.annotations.concurrent.Background;
2121
import com.google.firebase.annotations.concurrent.Blocking;
22+
import com.google.firebase.annotations.concurrent.Lightweight;
2223
import com.google.firebase.components.Component;
2324
import com.google.firebase.components.Dependency;
2425
import com.google.firebase.components.Qualified;
@@ -42,6 +43,7 @@ public void testGetComponents() {
4243
.containsExactly(
4344
Dependency.required(FirebaseApp.class),
4445
Dependency.optionalProvider(InternalDebugSecretProvider.class),
46+
Dependency.required(Qualified.qualified(Lightweight.class, Executor.class)),
4547
Dependency.required(Qualified.qualified(Background.class, Executor.class)),
4648
Dependency.required(Qualified.qualified(Blocking.class, Executor.class)));
4749
assertThat(appCheckDebugComponent.isLazy()).isTrue();

appcheck/firebase-appcheck-debug/src/test/java/com/google/firebase/appcheck/debug/internal/DebugAppCheckProviderTest.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,11 @@ public void testPublicConstructor_nullFirebaseApp_expectThrows() {
103103
NullPointerException.class,
104104
() -> {
105105
new DebugAppCheckProvider(
106-
null, null, TestOnlyExecutors.background(), TestOnlyExecutors.blocking());
106+
null,
107+
null,
108+
TestOnlyExecutors.lite(),
109+
TestOnlyExecutors.background(),
110+
TestOnlyExecutors.blocking());
107111
});
108112
}
109113

@@ -137,7 +141,12 @@ public void exchangeDebugToken_onSuccess_setsTaskResult() throws Exception {
137141
when(mockAppCheckTokenResponse.getTimeToLive()).thenReturn(TIME_TO_LIVE);
138142

139143
DebugAppCheckProvider provider =
140-
new DebugAppCheckProvider(DEBUG_SECRET, mockNetworkClient, executor, mockRetryManager);
144+
new DebugAppCheckProvider(
145+
DEBUG_SECRET,
146+
mockNetworkClient,
147+
/* liteExecutor= */ executor,
148+
/* blockingExecutor= */ executor,
149+
mockRetryManager);
141150
Task<AppCheckToken> task = provider.getToken();
142151

143152
verify(mockNetworkClient)
@@ -155,7 +164,12 @@ public void exchangeDebugToken_onFailure_setsTaskException() throws Exception {
155164
.thenThrow(new IOException());
156165

157166
DebugAppCheckProvider provider =
158-
new DebugAppCheckProvider(DEBUG_SECRET, mockNetworkClient, executor, mockRetryManager);
167+
new DebugAppCheckProvider(
168+
DEBUG_SECRET,
169+
mockNetworkClient,
170+
/* liteExecutor= */ executor,
171+
/* blockingExecutor= */ executor,
172+
mockRetryManager);
159173
Task<AppCheckToken> task = provider.getToken();
160174

161175
verify(mockNetworkClient)

0 commit comments

Comments
 (0)