-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement handling of Android actions in background
There are some cases when local notification action should be handled in background eg. snoozing the reminder. In case of it launching app UI is not necessary and would be confusing for the end user. Therefore there should be a way to handle local notification action in background. For this reason new property 'runInBackground' was added to the AndroidAction class and TypeScript type. Also new broadcast receiver and service were implemented to handle properly background actions. In order to run particular action in background user need to set its 'runInBackground' property to 'true', eg: ... .android.addAction(new firebase.notifications.Android.Action("snooze", "ic_snooze", "Snooze").setRunInBackground(true)) Then create a background asynchronous handler: const handleAsyncTask = async (notificationOpen: NotifficationOpen) => { if (notificationOpen && notificationOpen.notification) { const action = notificationOpen.action; const notificationId = notificationOpen.notification.notificationId; if (action === "snooze") { console.log("Reschedule notification for later time", notificationId); } else { console.log("unsupported action", action); } // hide the notification firebase.notifications().removeDeliveredNotification(notificationId); } } Next hander should be registered to an headless handler: AppRegistry.registerHeadlessTask('RNFirebaseBackgroundNotification', () => handleAsyncTask); Finally AndroidManifest.xml file must be modified, to include receiver and service definition: <receiver android:name="io.invertase.firebase.notifications.RNFirebaseBackgroundNotificationReceiver" android:exported="true"> <intent-filter> <action android:name="io.invertase.firebase.notifications.BackgroundAction"/> </intent-filter> </receiver> <service android:name="io.invertase.firebase.notifications.RNFirebaseBackgroundNotificationsService"/> Now when ever 'Snooze' action is pressed it will launch 'handleAsyncTask' function in the background and reschedule the notification for the later time.
- Loading branch information
Showing
6 changed files
with
117 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
47 changes: 47 additions & 0 deletions
47
...in/java/io/invertase/firebase/notifications/RNFirebaseBackgroundNotificationReceiver.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
package io.invertase.firebase.notifications; | ||
|
||
import android.app.ActivityManager; | ||
import android.content.BroadcastReceiver; | ||
import android.content.Context; | ||
import android.content.Intent; | ||
import android.util.Log; | ||
|
||
import com.facebook.react.HeadlessJsTaskService; | ||
|
||
import java.util.List; | ||
|
||
public class RNFirebaseBackgroundNotificationReceiver extends BroadcastReceiver { | ||
|
||
@Override | ||
public void onReceive(Context context, Intent intent) { | ||
Intent serviceIntent = new Intent(context, RNFirebaseBackgroundNotificationsService.class); | ||
serviceIntent.putExtras(intent.getExtras()); | ||
context.startService(serviceIntent); | ||
|
||
if (!isAppOnForeground((context))) { | ||
HeadlessJsTaskService.acquireWakeLockNow(context); | ||
} | ||
} | ||
|
||
private boolean isAppOnForeground(Context context) { | ||
/* | ||
We need to check if app is in foreground otherwise the app will crash. | ||
http://stackoverflow.com/questions/8489993/check-android-application-is-in-foreground-or-not | ||
*/ | ||
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); | ||
List<ActivityManager.RunningAppProcessInfo> appProcesses = | ||
activityManager.getRunningAppProcesses(); | ||
if (appProcesses == null) { | ||
return false; | ||
} | ||
final String packageName = context.getPackageName(); | ||
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) { | ||
if (appProcess.importance == | ||
ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND && | ||
appProcess.processName.equals(packageName)) { | ||
return true; | ||
} | ||
} | ||
return false; | ||
} | ||
} |
32 changes: 32 additions & 0 deletions
32
...in/java/io/invertase/firebase/notifications/RNFirebaseBackgroundNotificationsService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
package io.invertase.firebase.notifications; | ||
|
||
import android.content.Intent; | ||
import android.os.Bundle; | ||
import android.util.Log; | ||
|
||
import com.facebook.react.HeadlessJsTaskService; | ||
import com.facebook.react.bridge.Arguments; | ||
import com.facebook.react.bridge.WritableMap; | ||
import com.facebook.react.jstasks.HeadlessJsTaskConfig; | ||
import com.google.firebase.messaging.RemoteMessage; | ||
|
||
import javax.annotation.Nullable; | ||
|
||
import io.invertase.firebase.messaging.MessagingSerializer; | ||
|
||
public class RNFirebaseBackgroundNotificationsService extends HeadlessJsTaskService { | ||
@Override | ||
protected @Nullable HeadlessJsTaskConfig getTaskConfig(Intent intent) { | ||
Bundle extras = intent.getExtras(); | ||
if (extras != null) { | ||
WritableMap notificationMap = Arguments.makeNativeMap(intent.getExtras()); | ||
return new HeadlessJsTaskConfig( | ||
"RNFirebaseBackgroundNotification", | ||
notificationMap, | ||
60000, | ||
true | ||
); | ||
} | ||
return null; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters