From 6402f88b0e55134d7a90b01b2babad653902c693 Mon Sep 17 00:00:00 2001 From: Libin Lu Date: Thu, 30 Nov 2017 10:52:59 -0500 Subject: [PATCH] use local intents --- .../evollu/react/fcm/FIRMessagingModule.java | 79 ++++++++++--------- .../evollu/react/fcm/InstanceIdService.java | 3 +- .../evollu/react/fcm/MessagingService.java | 5 +- .../react/fcm/SendNotificationTask.java | 3 +- 4 files changed, 47 insertions(+), 43 deletions(-) diff --git a/android/src/main/java/com/evollu/react/fcm/FIRMessagingModule.java b/android/src/main/java/com/evollu/react/fcm/FIRMessagingModule.java index 88c06eb..a50f0bb 100644 --- a/android/src/main/java/com/evollu/react/fcm/FIRMessagingModule.java +++ b/android/src/main/java/com/evollu/react/fcm/FIRMessagingModule.java @@ -25,6 +25,7 @@ import com.google.firebase.messaging.RemoteMessage.Notification; import android.app.Application; import android.os.Bundle; import android.support.v4.app.NotificationManagerCompat; +import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import android.content.Context; @@ -38,7 +39,7 @@ public class FIRMessagingModule extends ReactContextBaseJavaModule implements Li private final static String TAG = FIRMessagingModule.class.getCanonicalName(); private FIRLocalMessagingHelper mFIRLocalMessagingHelper; private BadgeHelper mBadgeHelper; - + public FIRMessagingModule(ReactApplicationContext reactContext) { super(reactContext); mFIRLocalMessagingHelper = new FIRLocalMessagingHelper((Application) reactContext.getApplicationContext()); @@ -49,12 +50,12 @@ public class FIRMessagingModule extends ReactContextBaseJavaModule implements Li registerMessageHandler(); registerLocalMessageHandler(); } - + @Override public String getName() { return "RNFIRMessaging"; } - + @ReactMethod public void getInitialNotification(Promise promise){ Activity activity = getCurrentActivity(); @@ -64,7 +65,7 @@ public class FIRMessagingModule extends ReactContextBaseJavaModule implements Li } promise.resolve(parseIntent(activity.getIntent())); } - + @ReactMethod public void requestPermissions(Promise promise){ if(NotificationManagerCompat.from(getReactApplicationContext()).areNotificationsEnabled()){ @@ -73,7 +74,7 @@ public class FIRMessagingModule extends ReactContextBaseJavaModule implements Li promise.reject(null, "Notification disabled"); } } - + @ReactMethod public void getFCMToken(Promise promise) { try { @@ -84,7 +85,7 @@ public class FIRMessagingModule extends ReactContextBaseJavaModule implements Li promise.reject(null,e.getMessage()); } } - + @ReactMethod public void deleteInstanceId(Promise promise){ try { @@ -95,19 +96,19 @@ public class FIRMessagingModule extends ReactContextBaseJavaModule implements Li promise.reject(null,e.getMessage()); } } - + @ReactMethod public void presentLocalNotification(ReadableMap details) { Bundle bundle = Arguments.toBundle(details); mFIRLocalMessagingHelper.sendNotification(bundle); } - + @ReactMethod public void scheduleLocalNotification(ReadableMap details) { Bundle bundle = Arguments.toBundle(details); mFIRLocalMessagingHelper.sendNotificationScheduled(bundle); } - + @ReactMethod public void cancelLocalNotification(String notificationID) { mFIRLocalMessagingHelper.cancelLocalNotification(notificationID); @@ -116,27 +117,27 @@ public class FIRMessagingModule extends ReactContextBaseJavaModule implements Li public void cancelAllLocalNotifications() { mFIRLocalMessagingHelper.cancelAllLocalNotifications(); } - + @ReactMethod public void removeDeliveredNotification(String notificationID) { mFIRLocalMessagingHelper.removeDeliveredNotification(notificationID); } - + @ReactMethod public void removeAllDeliveredNotifications(){ mFIRLocalMessagingHelper.removeAllDeliveredNotifications(); } - + @ReactMethod public void subscribeToTopic(String topic){ FirebaseMessaging.getInstance().subscribeToTopic(topic); } - + @ReactMethod public void unsubscribeFromTopic(String topic){ FirebaseMessaging.getInstance().unsubscribeFromTopic(topic); } - + @ReactMethod public void getScheduledLocalNotifications(Promise promise){ ArrayList bundles = mFIRLocalMessagingHelper.getScheduledLocalNotifications(); @@ -146,26 +147,26 @@ public class FIRMessagingModule extends ReactContextBaseJavaModule implements Li } promise.resolve(array); } - + @ReactMethod public void setBadgeNumber(int badgeNumber) { mBadgeHelper.setBadgeCount(badgeNumber); } - + @ReactMethod public void getBadgeNumber(Promise promise) { promise.resolve(mBadgeHelper.getBadgeCount()); } - + private void sendEvent(String eventName, Object params) { getReactApplicationContext() .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) .emit(eventName, params); } - + private void registerTokenRefreshHandler() { IntentFilter intentFilter = new IntentFilter("com.evollu.react.fcm.FCMRefreshToken"); - getReactApplicationContext().registerReceiver(new BroadcastReceiver() { + LocalBroadcastManager.getInstance(getReactApplicationContext()).registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (getReactApplicationContext().hasActiveCatalystInstance()) { @@ -175,13 +176,13 @@ public class FIRMessagingModule extends ReactContextBaseJavaModule implements Li } }, intentFilter); } - + @ReactMethod public void send(String senderId, ReadableMap payload) throws Exception { FirebaseMessaging fm = FirebaseMessaging.getInstance(); RemoteMessage.Builder message = new RemoteMessage.Builder(senderId + "@gcm.googleapis.com") .setMessageId(UUID.randomUUID().toString()); - + ReadableMapKeySetIterator iterator = payload.keySetIterator(); while (iterator.hasNextKey()) { String key = iterator.nextKey(); @@ -190,7 +191,7 @@ public class FIRMessagingModule extends ReactContextBaseJavaModule implements Li } fm.send(message.build()); } - + private String getStringFromReadableMap(ReadableMap map, String key) throws Exception { switch (map.getType(key)) { case String: @@ -207,18 +208,18 @@ public class FIRMessagingModule extends ReactContextBaseJavaModule implements Li throw new Exception("Unknown data type: " + map.getType(key).name() + " for message key " + key ); } } - + private void registerMessageHandler() { IntentFilter intentFilter = new IntentFilter("com.evollu.react.fcm.ReceiveNotification"); - - getReactApplicationContext().registerReceiver(new BroadcastReceiver() { + + LocalBroadcastManager.getInstance(getReactApplicationContext()).registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (getReactApplicationContext().hasActiveCatalystInstance()) { RemoteMessage message = intent.getParcelableExtra("data"); WritableMap params = Arguments.createMap(); WritableMap fcmData = Arguments.createMap(); - + if (message.getNotification() != null) { Notification notification = message.getNotification(); fcmData.putString("title", notification.getTitle()); @@ -233,7 +234,7 @@ public class FIRMessagingModule extends ReactContextBaseJavaModule implements Li params.putString("from", message.getFrom()); params.putString("google.message_id", message.getMessageId()); params.putDouble("google.sent_time", message.getSentTime()); - + if(message.getData() != null){ Map data = message.getData(); Set keysIterator = data.keySet(); @@ -242,16 +243,16 @@ public class FIRMessagingModule extends ReactContextBaseJavaModule implements Li } } sendEvent("FCMNotificationReceived", params); - + } } }, intentFilter); } - + private void registerLocalMessageHandler() { IntentFilter intentFilter = new IntentFilter("com.evollu.react.fcm.ReceiveLocalNotification"); - - getReactApplicationContext().registerReceiver(new BroadcastReceiver() { + + LocalBroadcastManager.getInstance(getReactApplicationContext()).registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (getReactApplicationContext().hasActiveCatalystInstance()) { @@ -260,7 +261,7 @@ public class FIRMessagingModule extends ReactContextBaseJavaModule implements Li } }, intentFilter); } - + private WritableMap parseIntent(Intent intent){ WritableMap params; Bundle extras = intent.getExtras(); @@ -277,30 +278,30 @@ public class FIRMessagingModule extends ReactContextBaseJavaModule implements Li WritableMap fcm = Arguments.createMap(); fcm.putString("action", intent.getAction()); params.putMap("fcm", fcm); - + params.putInt("opened_from_tray", 1); return params; } - + @Override public void onHostResume() { mFIRLocalMessagingHelper.setApplicationForeground(true); } - + @Override public void onHostPause() { mFIRLocalMessagingHelper.setApplicationForeground(false); } - + @Override public void onHostDestroy() { - + } - + @Override public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { } - + @Override public void onNewIntent(Intent intent){ sendEvent("FCMNotificationReceived", parseIntent(intent)); diff --git a/android/src/main/java/com/evollu/react/fcm/InstanceIdService.java b/android/src/main/java/com/evollu/react/fcm/InstanceIdService.java index e7da8a1..9ac9ef5 100644 --- a/android/src/main/java/com/evollu/react/fcm/InstanceIdService.java +++ b/android/src/main/java/com/evollu/react/fcm/InstanceIdService.java @@ -2,6 +2,7 @@ package com.evollu.react.fcm; import android.content.Intent; import android.os.Bundle; +import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import com.google.firebase.iid.FirebaseInstanceId; @@ -29,6 +30,6 @@ public class InstanceIdService extends FirebaseInstanceIdService { Bundle bundle = new Bundle(); bundle.putString("token", refreshedToken); i.putExtras(bundle); - sendBroadcast(i); + LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i); } } diff --git a/android/src/main/java/com/evollu/react/fcm/MessagingService.java b/android/src/main/java/com/evollu/react/fcm/MessagingService.java index 4d9f161..cca8190 100644 --- a/android/src/main/java/com/evollu/react/fcm/MessagingService.java +++ b/android/src/main/java/com/evollu/react/fcm/MessagingService.java @@ -5,6 +5,7 @@ import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Looper; +import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import com.facebook.react.ReactApplication; @@ -41,12 +42,12 @@ public class MessagingService extends FirebaseMessagingService { ReactContext context = mReactInstanceManager.getCurrentReactContext(); // If it's constructed, send a notification if (context != null) { - context.sendOrderedBroadcast(message, null); + LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(message); } else { // Otherwise wait for construction, then send the notification mReactInstanceManager.addReactInstanceEventListener(new ReactInstanceManager.ReactInstanceEventListener() { public void onReactContextInitialized(ReactContext context) { - context.sendOrderedBroadcast(message, null); + LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(message); } }); if (!mReactInstanceManager.hasStartedCreatingInitialContext()) { diff --git a/android/src/main/java/com/evollu/react/fcm/SendNotificationTask.java b/android/src/main/java/com/evollu/react/fcm/SendNotificationTask.java index 48bf878..e34c5a3 100644 --- a/android/src/main/java/com/evollu/react/fcm/SendNotificationTask.java +++ b/android/src/main/java/com/evollu/react/fcm/SendNotificationTask.java @@ -17,6 +17,7 @@ import android.os.Build; import android.os.Bundle; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationManagerCompat; +import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import java.io.IOException; @@ -191,7 +192,7 @@ public class SendNotificationTask extends AsyncTask { Log.d(TAG, "broadcast intent if it is a scheduled notification"); Intent i = new Intent("com.evollu.react.fcm.ReceiveLocalNotification"); i.putExtras(bundle); - mContext.sendOrderedBroadcast(i, null); + LocalBroadcastManager.getInstance(mContext).sendBroadcast(i); } if(!mIsForeground || bundle.getBoolean("show_in_foreground")){ -- 2.26.2