353 lines
16 KiB
Java
353 lines
16 KiB
Java
package com.google.firebase.messaging;
|
|
|
|
import android.content.Context;
|
|
import android.util.Log;
|
|
import com.google.android.gms.tasks.Task;
|
|
import com.google.android.gms.tasks.TaskCompletionSource;
|
|
import com.google.android.gms.tasks.Tasks;
|
|
import java.io.IOException;
|
|
import java.util.ArrayDeque;
|
|
import java.util.Map;
|
|
import java.util.concurrent.Callable;
|
|
import java.util.concurrent.ExecutionException;
|
|
import java.util.concurrent.ScheduledExecutorService;
|
|
import java.util.concurrent.TimeUnit;
|
|
import java.util.concurrent.TimeoutException;
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
/* loaded from: classes3.dex */
|
|
public class TopicsSubscriber {
|
|
static final String ERROR_INTERNAL_SERVER_ERROR = "INTERNAL_SERVER_ERROR";
|
|
static final String ERROR_SERVICE_NOT_AVAILABLE = "SERVICE_NOT_AVAILABLE";
|
|
private static final long MAX_DELAY_SEC = TimeUnit.HOURS.toSeconds(8);
|
|
private static final long MIN_DELAY_SEC = 30;
|
|
private static final long RPC_TIMEOUT_SEC = 30;
|
|
private final Context context;
|
|
private final FirebaseMessaging firebaseMessaging;
|
|
private final Metadata metadata;
|
|
private final GmsRpc rpc;
|
|
private final TopicsStore store;
|
|
private final ScheduledExecutorService syncExecutor;
|
|
private final Map<String, ArrayDeque<TaskCompletionSource<Void>>> pendingOperations = new s.j(0);
|
|
private boolean syncScheduledOrRunning = false;
|
|
|
|
/* JADX WARN: Type inference failed for: r0v0, types: [java.util.Map<java.lang.String, java.util.ArrayDeque<com.google.android.gms.tasks.TaskCompletionSource<java.lang.Void>>>, s.j] */
|
|
private TopicsSubscriber(FirebaseMessaging firebaseMessaging, Metadata metadata, TopicsStore topicsStore, GmsRpc gmsRpc, Context context, ScheduledExecutorService scheduledExecutorService) {
|
|
this.firebaseMessaging = firebaseMessaging;
|
|
this.metadata = metadata;
|
|
this.store = topicsStore;
|
|
this.rpc = gmsRpc;
|
|
this.context = context;
|
|
this.syncExecutor = scheduledExecutorService;
|
|
}
|
|
|
|
private void addToPendingOperations(TopicOperation topicOperation, TaskCompletionSource<Void> taskCompletionSource) {
|
|
ArrayDeque<TaskCompletionSource<Void>> arrayDeque;
|
|
synchronized (this.pendingOperations) {
|
|
try {
|
|
String serialize = topicOperation.serialize();
|
|
if (this.pendingOperations.containsKey(serialize)) {
|
|
arrayDeque = this.pendingOperations.get(serialize);
|
|
} else {
|
|
ArrayDeque<TaskCompletionSource<Void>> arrayDeque2 = new ArrayDeque<>();
|
|
this.pendingOperations.put(serialize, arrayDeque2);
|
|
arrayDeque = arrayDeque2;
|
|
}
|
|
arrayDeque.add(taskCompletionSource);
|
|
} catch (Throwable th) {
|
|
throw th;
|
|
}
|
|
}
|
|
}
|
|
|
|
private static <T> void awaitTask(Task<T> task) throws IOException {
|
|
try {
|
|
Tasks.await(task, 30L, TimeUnit.SECONDS);
|
|
} catch (InterruptedException | TimeoutException e4) {
|
|
throw new IOException(ERROR_SERVICE_NOT_AVAILABLE, e4);
|
|
} catch (ExecutionException e5) {
|
|
Throwable cause = e5.getCause();
|
|
if (cause instanceof IOException) {
|
|
throw ((IOException) cause);
|
|
}
|
|
if (!(cause instanceof RuntimeException)) {
|
|
throw new IOException(e5);
|
|
}
|
|
throw ((RuntimeException) cause);
|
|
}
|
|
}
|
|
|
|
private void blockingSubscribeToTopic(String str) throws IOException {
|
|
awaitTask(this.rpc.subscribeToTopic(this.firebaseMessaging.blockingGetToken(), str));
|
|
}
|
|
|
|
private void blockingUnsubscribeFromTopic(String str) throws IOException {
|
|
awaitTask(this.rpc.unsubscribeFromTopic(this.firebaseMessaging.blockingGetToken(), str));
|
|
}
|
|
|
|
public static Task<TopicsSubscriber> createInstance(final FirebaseMessaging firebaseMessaging, final Metadata metadata, final GmsRpc gmsRpc, final Context context, final ScheduledExecutorService scheduledExecutorService) {
|
|
return Tasks.call(scheduledExecutorService, new Callable() { // from class: com.google.firebase.messaging.o
|
|
@Override // java.util.concurrent.Callable
|
|
public final Object call() {
|
|
TopicsSubscriber lambda$createInstance$0;
|
|
lambda$createInstance$0 = TopicsSubscriber.lambda$createInstance$0(context, scheduledExecutorService, firebaseMessaging, metadata, gmsRpc);
|
|
return lambda$createInstance$0;
|
|
}
|
|
});
|
|
}
|
|
|
|
public static boolean isDebugLogEnabled() {
|
|
return Log.isLoggable(Constants.TAG, 3);
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public static /* synthetic */ TopicsSubscriber lambda$createInstance$0(Context context, ScheduledExecutorService scheduledExecutorService, FirebaseMessaging firebaseMessaging, Metadata metadata, GmsRpc gmsRpc) throws Exception {
|
|
return new TopicsSubscriber(firebaseMessaging, metadata, TopicsStore.getInstance(context, scheduledExecutorService), gmsRpc, context, scheduledExecutorService);
|
|
}
|
|
|
|
private void markCompletePendingOperation(TopicOperation topicOperation) {
|
|
synchronized (this.pendingOperations) {
|
|
try {
|
|
String serialize = topicOperation.serialize();
|
|
if (this.pendingOperations.containsKey(serialize)) {
|
|
ArrayDeque<TaskCompletionSource<Void>> arrayDeque = this.pendingOperations.get(serialize);
|
|
TaskCompletionSource<Void> poll = arrayDeque.poll();
|
|
if (poll != null) {
|
|
poll.setResult(null);
|
|
}
|
|
if (arrayDeque.isEmpty()) {
|
|
this.pendingOperations.remove(serialize);
|
|
}
|
|
}
|
|
} catch (Throwable th) {
|
|
throw th;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void startSync() {
|
|
if (isSyncScheduledOrRunning()) {
|
|
return;
|
|
}
|
|
syncWithDelaySecondsInternal(0L);
|
|
}
|
|
|
|
public TopicsStore getStore() {
|
|
return this.store;
|
|
}
|
|
|
|
public boolean hasPendingOperation() {
|
|
return this.store.getNextTopicOperation() != null;
|
|
}
|
|
|
|
public synchronized boolean isSyncScheduledOrRunning() {
|
|
return this.syncScheduledOrRunning;
|
|
}
|
|
|
|
/* JADX WARN: Removed duplicated region for block: B:11:0x0037 */
|
|
/* JADX WARN: Removed duplicated region for block: B:20:0x0078 A[Catch: IOException -> 0x0025, TryCatch #0 {IOException -> 0x0025, blocks: (B:3:0x0009, B:12:0x0039, B:14:0x003f, B:17:0x0054, B:19:0x0061, B:20:0x0078, B:22:0x0085, B:23:0x001b, B:26:0x0028), top: B:2:0x0009 }] */
|
|
/*
|
|
Code decompiled incorrectly, please refer to instructions dump.
|
|
To view partially-correct add '--show-bad-code' argument
|
|
*/
|
|
public boolean performTopicOperation(com.google.firebase.messaging.TopicOperation r10) throws java.io.IOException {
|
|
/*
|
|
r9 = this;
|
|
java.lang.String r0 = "FirebaseMessaging"
|
|
java.lang.String r1 = "Unknown topic operation"
|
|
java.lang.String r2 = "Subscribe to topic: "
|
|
java.lang.String r3 = "Unsubscribe from topic: "
|
|
r4 = 0
|
|
java.lang.String r5 = r10.getOperation() // Catch: java.io.IOException -> L25
|
|
int r6 = r5.hashCode() // Catch: java.io.IOException -> L25
|
|
r7 = 83
|
|
r8 = 1
|
|
if (r6 == r7) goto L28
|
|
r7 = 85
|
|
if (r6 == r7) goto L1b
|
|
goto L32
|
|
L1b:
|
|
java.lang.String r6 = "U"
|
|
boolean r5 = r5.equals(r6) // Catch: java.io.IOException -> L25
|
|
if (r5 == 0) goto L32
|
|
r5 = r8
|
|
goto L33
|
|
L25:
|
|
r9 = move-exception
|
|
goto L9c
|
|
L28:
|
|
java.lang.String r6 = "S"
|
|
boolean r5 = r5.equals(r6) // Catch: java.io.IOException -> L25
|
|
if (r5 == 0) goto L32
|
|
r5 = r4
|
|
goto L33
|
|
L32:
|
|
r5 = -1
|
|
L33:
|
|
java.lang.String r6 = " succeeded."
|
|
if (r5 == 0) goto L78
|
|
if (r5 == r8) goto L54
|
|
boolean r9 = isDebugLogEnabled() // Catch: java.io.IOException -> L25
|
|
if (r9 == 0) goto L9b
|
|
java.lang.StringBuilder r9 = new java.lang.StringBuilder // Catch: java.io.IOException -> L25
|
|
r9.<init>(r1) // Catch: java.io.IOException -> L25
|
|
r9.append(r10) // Catch: java.io.IOException -> L25
|
|
java.lang.String r10 = "."
|
|
r9.append(r10) // Catch: java.io.IOException -> L25
|
|
java.lang.String r9 = r9.toString() // Catch: java.io.IOException -> L25
|
|
android.util.Log.d(r0, r9) // Catch: java.io.IOException -> L25
|
|
goto L9b
|
|
L54:
|
|
java.lang.String r1 = r10.getTopic() // Catch: java.io.IOException -> L25
|
|
r9.blockingUnsubscribeFromTopic(r1) // Catch: java.io.IOException -> L25
|
|
boolean r9 = isDebugLogEnabled() // Catch: java.io.IOException -> L25
|
|
if (r9 == 0) goto L9b
|
|
java.lang.StringBuilder r9 = new java.lang.StringBuilder // Catch: java.io.IOException -> L25
|
|
r9.<init>(r3) // Catch: java.io.IOException -> L25
|
|
java.lang.String r10 = r10.getTopic() // Catch: java.io.IOException -> L25
|
|
r9.append(r10) // Catch: java.io.IOException -> L25
|
|
r9.append(r6) // Catch: java.io.IOException -> L25
|
|
java.lang.String r9 = r9.toString() // Catch: java.io.IOException -> L25
|
|
android.util.Log.d(r0, r9) // Catch: java.io.IOException -> L25
|
|
goto L9b
|
|
L78:
|
|
java.lang.String r1 = r10.getTopic() // Catch: java.io.IOException -> L25
|
|
r9.blockingSubscribeToTopic(r1) // Catch: java.io.IOException -> L25
|
|
boolean r9 = isDebugLogEnabled() // Catch: java.io.IOException -> L25
|
|
if (r9 == 0) goto L9b
|
|
java.lang.StringBuilder r9 = new java.lang.StringBuilder // Catch: java.io.IOException -> L25
|
|
r9.<init>(r2) // Catch: java.io.IOException -> L25
|
|
java.lang.String r10 = r10.getTopic() // Catch: java.io.IOException -> L25
|
|
r9.append(r10) // Catch: java.io.IOException -> L25
|
|
r9.append(r6) // Catch: java.io.IOException -> L25
|
|
java.lang.String r9 = r9.toString() // Catch: java.io.IOException -> L25
|
|
android.util.Log.d(r0, r9) // Catch: java.io.IOException -> L25
|
|
L9b:
|
|
return r8
|
|
L9c:
|
|
java.lang.String r10 = "SERVICE_NOT_AVAILABLE"
|
|
java.lang.String r1 = r9.getMessage()
|
|
boolean r10 = r10.equals(r1)
|
|
if (r10 != 0) goto Lc2
|
|
java.lang.String r10 = "INTERNAL_SERVER_ERROR"
|
|
java.lang.String r1 = r9.getMessage()
|
|
boolean r10 = r10.equals(r1)
|
|
if (r10 == 0) goto Lb5
|
|
goto Lc2
|
|
Lb5:
|
|
java.lang.String r10 = r9.getMessage()
|
|
if (r10 != 0) goto Lc1
|
|
java.lang.String r9 = "Topic operation failed without exception message. Will retry Topic operation."
|
|
android.util.Log.e(r0, r9)
|
|
return r4
|
|
Lc1:
|
|
throw r9
|
|
Lc2:
|
|
java.lang.StringBuilder r10 = new java.lang.StringBuilder
|
|
java.lang.String r1 = "Topic operation failed: "
|
|
r10.<init>(r1)
|
|
java.lang.String r9 = r9.getMessage()
|
|
r10.append(r9)
|
|
java.lang.String r9 = ". Will retry Topic operation."
|
|
r10.append(r9)
|
|
java.lang.String r9 = r10.toString()
|
|
android.util.Log.e(r0, r9)
|
|
return r4
|
|
*/
|
|
throw new UnsupportedOperationException("Method not decompiled: com.google.firebase.messaging.TopicsSubscriber.performTopicOperation(com.google.firebase.messaging.TopicOperation):boolean");
|
|
}
|
|
|
|
public void scheduleSyncTaskWithDelaySeconds(Runnable runnable, long j4) {
|
|
this.syncExecutor.schedule(runnable, j4, TimeUnit.SECONDS);
|
|
}
|
|
|
|
public Task<Void> scheduleTopicOperation(TopicOperation topicOperation) {
|
|
this.store.addTopicOperation(topicOperation);
|
|
TaskCompletionSource<Void> taskCompletionSource = new TaskCompletionSource<>();
|
|
addToPendingOperations(topicOperation, taskCompletionSource);
|
|
return taskCompletionSource.getTask();
|
|
}
|
|
|
|
public synchronized void setSyncScheduledOrRunning(boolean z3) {
|
|
this.syncScheduledOrRunning = z3;
|
|
}
|
|
|
|
public void startTopicsSyncIfNecessary() {
|
|
if (hasPendingOperation()) {
|
|
startSync();
|
|
}
|
|
}
|
|
|
|
public Task<Void> subscribeToTopic(String str) {
|
|
Task<Void> scheduleTopicOperation = scheduleTopicOperation(TopicOperation.subscribe(str));
|
|
startTopicsSyncIfNecessary();
|
|
return scheduleTopicOperation;
|
|
}
|
|
|
|
/* JADX WARN: Code restructure failed: missing block: B:14:0x000d, code lost:
|
|
|
|
if (isDebugLogEnabled() == false) goto L10;
|
|
*/
|
|
/* JADX WARN: Code restructure failed: missing block: B:15:0x000f, code lost:
|
|
|
|
android.util.Log.d(com.google.firebase.messaging.Constants.TAG, "topic sync succeeded");
|
|
*/
|
|
/* JADX WARN: Code restructure failed: missing block: B:18:0x001b, code lost:
|
|
|
|
return true;
|
|
*/
|
|
/*
|
|
Code decompiled incorrectly, please refer to instructions dump.
|
|
To view partially-correct add '--show-bad-code' argument
|
|
*/
|
|
public boolean syncTopics() throws java.io.IOException {
|
|
/*
|
|
r2 = this;
|
|
L0:
|
|
monitor-enter(r2)
|
|
com.google.firebase.messaging.TopicsStore r0 = r2.store // Catch: java.lang.Throwable -> L17
|
|
com.google.firebase.messaging.TopicOperation r0 = r0.getNextTopicOperation() // Catch: java.lang.Throwable -> L17
|
|
if (r0 != 0) goto L1c
|
|
boolean r0 = isDebugLogEnabled() // Catch: java.lang.Throwable -> L17
|
|
if (r0 == 0) goto L19
|
|
java.lang.String r0 = "FirebaseMessaging"
|
|
java.lang.String r1 = "topic sync succeeded"
|
|
android.util.Log.d(r0, r1) // Catch: java.lang.Throwable -> L17
|
|
goto L19
|
|
L17:
|
|
r0 = move-exception
|
|
goto L2e
|
|
L19:
|
|
r0 = 1
|
|
monitor-exit(r2) // Catch: java.lang.Throwable -> L17
|
|
return r0
|
|
L1c:
|
|
monitor-exit(r2) // Catch: java.lang.Throwable -> L17
|
|
boolean r1 = r2.performTopicOperation(r0)
|
|
if (r1 != 0) goto L25
|
|
r2 = 0
|
|
return r2
|
|
L25:
|
|
com.google.firebase.messaging.TopicsStore r1 = r2.store
|
|
r1.removeTopicOperation(r0)
|
|
r2.markCompletePendingOperation(r0)
|
|
goto L0
|
|
L2e:
|
|
monitor-exit(r2) // Catch: java.lang.Throwable -> L17
|
|
throw r0
|
|
*/
|
|
throw new UnsupportedOperationException("Method not decompiled: com.google.firebase.messaging.TopicsSubscriber.syncTopics():boolean");
|
|
}
|
|
|
|
public void syncWithDelaySecondsInternal(long j4) {
|
|
scheduleSyncTaskWithDelaySeconds(new TopicsSyncTask(this, this.context, this.metadata, Math.min(Math.max(30L, 2 * j4), MAX_DELAY_SEC)), j4);
|
|
setSyncScheduledOrRunning(true);
|
|
}
|
|
|
|
public Task<Void> unsubscribeFromTopic(String str) {
|
|
Task<Void> scheduleTopicOperation = scheduleTopicOperation(TopicOperation.unsubscribe(str));
|
|
startTopicsSyncIfNecessary();
|
|
return scheduleTopicOperation;
|
|
}
|
|
}
|