Skip to content

Commit 905eeb8

Browse files
authored
Update FirebaseMessagingDirectBootReceiver to match FCM's FirebaseInstanceIdReceiver. (#3912)
* Changed FirebaseMessagingDirectBootReceiver to match the FCM SDK version of FirebaseInstanceIdReceiver, using FCM's methods in order to remove dependency on firebase-iid. * Cleaned up dependencies. * Updated minSdkVersion to 19 to match FCM SDK's minSdkVersion.
1 parent 310ce36 commit 905eeb8

File tree

2 files changed

+23
-79
lines changed

2 files changed

+23
-79
lines changed

firebase-messaging-directboot/firebase-messaging-directboot.gradle

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ android {
3333

3434
compileSdkVersion project.targetSdkVersion
3535
defaultConfig {
36-
minSdkVersion 16
36+
minSdkVersion 19
3737
targetSdkVersion project.targetSdkVersion
3838
versionName version
3939

@@ -47,26 +47,8 @@ android {
4747
}
4848

4949
dependencies {
50-
implementation project(':firebase-common')
51-
implementation project(':firebase-components')
52-
implementation project(':firebase-installations-interop')
53-
implementation project(':firebase-datatransport')
54-
implementation project(':transport:transport-api')
55-
implementation project(':transport:transport-runtime')
56-
implementation project(':transport:transport-backend-cct')
57-
implementation project(':encoders:firebase-encoders')
58-
implementation project(':encoders:firebase-encoders-json')
50+
implementation project(':firebase-messaging')
5951

60-
implementation 'androidx.annotation:annotation:1.1.0'
61-
implementation "com.google.android.gms:play-services-tasks:18.0.1"
62-
implementation "com.google.android.gms:play-services-basement:18.0.0"
63-
implementation 'com.google.android.gms:play-services-base:18.0.1'
64-
implementation ("com.google.firebase:firebase-iid:20.2.3") {
65-
exclude group: "com.google.firebase", module: "firebase-common"
66-
exclude group: "com.google.firebase", module: "firebase-components"
67-
exclude group: "com.google.firebase", module: "firebase-installations-interop"
68-
}
69-
implementation 'com.google.firebase:firebase-measurement-connector:18.0.0'
70-
implementation "com.google.firebase:firebase-iid-interop:17.0.0"
52+
implementation 'com.google.android.gms:play-services-cloud-messaging:17.0.2'
7153
implementation "com.google.errorprone:error_prone_annotations:2.9.0"
7254
}

firebase-messaging-directboot/src/main/java/com/google/firebase/messaging/directboot/FirebaseMessagingDirectBootReceiver.java

Lines changed: 20 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,20 @@
1414
package com.google.firebase.messaging.directboot;
1515

1616
import android.content.Context;
17-
import android.content.Intent;
1817
import android.util.Log;
19-
import androidx.legacy.content.WakefulBroadcastReceiver;
20-
import com.google.android.gms.common.util.concurrent.NamedThreadFactory;
21-
import com.google.firebase.iid.FcmBroadcastProcessor;
22-
import com.google.firebase.iid.ServiceStarter;
23-
import com.google.firebase.messaging.directboot.threads.PoolableExecutors;
24-
import com.google.firebase.messaging.directboot.threads.ThreadPriority;
25-
import java.util.concurrent.ExecutorService;
18+
import androidx.annotation.NonNull;
19+
import androidx.annotation.WorkerThread;
20+
import com.google.android.gms.cloudmessaging.CloudMessage;
21+
import com.google.android.gms.cloudmessaging.CloudMessagingReceiver;
22+
import com.google.android.gms.tasks.Tasks;
23+
import com.google.firebase.messaging.FcmBroadcastProcessor;
24+
import com.google.firebase.messaging.ServiceStarter;
25+
import java.util.concurrent.ExecutionException;
2626

2727
/**
28-
* WakefulBroadcastReceiver that receives FirebaseMessaging events and delivers them to the
29-
* application-specific {@link com.google.firebase.iid.FirebaseInstanceIdService} subclass in direct
30-
* boot mode.
28+
* BroadcastReceiver that receives FirebaseMessaging events and delivers them to the
29+
* application-specific {@link com.google.firebase.messaging.FirebaseMessagingService} subclass in
30+
* direct boot mode.
3131
*
3232
* <p>This receiver is automatically added to your application's manifest file via manifest merge.
3333
* If necessary it can be manually declared via:
@@ -49,58 +49,20 @@
4949
*
5050
* @hide
5151
*/
52-
public final class FirebaseMessagingDirectBootReceiver extends WakefulBroadcastReceiver {
52+
public final class FirebaseMessagingDirectBootReceiver extends CloudMessagingReceiver {
5353

5454
/** TAG for log statements coming from FCM */
5555
static final String TAG = "FCM";
5656

57-
/** Action for FCM direct boot message intents */
58-
private static final String ACTION_DIRECT_BOOT_REMOTE_INTENT =
59-
"com.google.firebase.messaging.RECEIVE_DIRECT_BOOT";
60-
61-
/** All broadcasts get processed on this executor. */
62-
private final ExecutorService processorExecutor =
63-
PoolableExecutors.factory()
64-
.newSingleThreadExecutor(
65-
new NamedThreadFactory("fcm-db-intent-handle"), ThreadPriority.LOW_POWER);
66-
57+
/** @hide */
6758
@Override
68-
public void onReceive(Context context, Intent intent) {
69-
if (intent == null) {
70-
return;
71-
}
72-
if (!ACTION_DIRECT_BOOT_REMOTE_INTENT.equals(intent.getAction())) {
73-
Log.d(TAG, "Unexpected intent: " + intent.getAction());
74-
return;
59+
@WorkerThread
60+
protected int onMessageReceive(@NonNull Context context, @NonNull CloudMessage message) {
61+
try {
62+
return Tasks.await(new FcmBroadcastProcessor(context).process(message.getIntent()));
63+
} catch (ExecutionException | InterruptedException e) {
64+
Log.e(TAG, "Failed to send message to service.", e);
65+
return ServiceStarter.ERROR_UNKNOWN;
7566
}
76-
77-
// Just pass the intent to the service mostly unchanged.
78-
// Clear the component and ensure package name is set so that the standard dispatching
79-
// mechanism will find the right service in the app.
80-
intent.setComponent(null);
81-
intent.setPackage(context.getPackageName());
82-
83-
// We don't actually want to process this broadcast on the main thread, so we're going to use
84-
// goAsync to deal with this in the background. Unfortunately, we need to check whether the
85-
// broadcast was ordered (and thus needs a result) before calling goAsync, because once we've
86-
// called goAsync then isOrderedBroadcast will always return false.
87-
boolean needsResult = isOrderedBroadcast();
88-
PendingResult pendingBroadcastResult = goAsync();
89-
90-
new FcmBroadcastProcessor(context, processorExecutor)
91-
.process(intent)
92-
.addOnCompleteListener(
93-
processorExecutor,
94-
resultCodeTask -> {
95-
// If we call setResultCode on a non-ordered broadcast it'll throw, so only set the
96-
// result if the broadcast was ordered
97-
if (needsResult) {
98-
pendingBroadcastResult.setResultCode(
99-
resultCodeTask.isSuccessful()
100-
? resultCodeTask.getResult()
101-
: ServiceStarter.ERROR_UNKNOWN);
102-
}
103-
pendingBroadcastResult.finish();
104-
});
10567
}
10668
}

0 commit comments

Comments
 (0)