From 8a54d91069f3b306b238988d5f426aabeb3351b8 Mon Sep 17 00:00:00 2001 From: sondremare Date: Fri, 14 Oct 2016 16:03:29 +0200 Subject: [PATCH 1/2] feature(android): add support for badge count (#1) Using Leolin's ShortcutBadger we are able to support any badge counts that are sent as part of the notifications data-payload. --- android/build.gradle | 5 ++++ .../evollu/react/fcm/MessagingService.java | 27 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/android/build.gradle b/android/build.gradle index cfad9e05..39810377 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -12,10 +12,15 @@ android { } } +repositories { + mavenCentral() +} + dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.facebook.react:react-native:+' compile 'com.google.firebase:firebase-core:+' compile 'com.google.firebase:firebase-messaging:+' + compile 'me.leolin:ShortcutBadger:1.1.10@aar' } 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 e0d20bde..805196c0 100644 --- a/android/src/main/java/com/evollu/react/fcm/MessagingService.java +++ b/android/src/main/java/com/evollu/react/fcm/MessagingService.java @@ -1,7 +1,9 @@ package com.evollu.react.fcm; +import java.util.Map; import android.content.Intent; import android.util.Log; +import me.leolin.shortcutbadger.ShortcutBadger; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; @@ -16,6 +18,31 @@ public void onMessageReceived(RemoteMessage remoteMessage) { Log.d(TAG, "Remote message received"); Intent i = new Intent("com.evollu.react.fcm.ReceiveNotification"); i.putExtra("data", remoteMessage); + handleBadge(remoteMessage); sendOrderedBroadcast(i, null); } + + public void handleBadge(RemoteMessage remoteMessage) { + if (remoteMessage.getData() == null) { + return; + } + + Map data = remoteMessage.getData(); + if (data.get("badge") == null) { + return; + } + + try { + int badgeCount = Integer.parseInt((String)data.get("badge")); + if (badgeCount == 0) { + ShortcutBadger.removeCount(this); + Log.d(TAG, "Remove count"); + } else { + ShortcutBadger.applyCount(this, badgeCount); + Log.d(TAG, "Apply count: " + badgeCount); + } + } catch (Exception e) { + Log.e(TAG, "Badge count needs to be an integer", e); + } + } } From ff536bc4ce0ac706f4eb99723c43560fc4f60596 Mon Sep 17 00:00:00 2001 From: sondremare Date: Thu, 1 Dec 2016 13:26:46 +0100 Subject: [PATCH 2/2] refactor(android): expand badge support (#3) --- .gitignore | 1 + .../com/evollu/react/fcm/BadgeHelper.java | 43 +++++++++++++++++++ .../evollu/react/fcm/FIRMessagingModule.java | 12 ++++++ .../evollu/react/fcm/MessagingService.java | 11 ++--- 4 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 android/src/main/java/com/evollu/react/fcm/BadgeHelper.java diff --git a/.gitignore b/.gitignore index 13ebdb47..631e800d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules build xcuserdata +.idea/ \ No newline at end of file diff --git a/android/src/main/java/com/evollu/react/fcm/BadgeHelper.java b/android/src/main/java/com/evollu/react/fcm/BadgeHelper.java new file mode 100644 index 00000000..360d61d7 --- /dev/null +++ b/android/src/main/java/com/evollu/react/fcm/BadgeHelper.java @@ -0,0 +1,43 @@ +package com.evollu.react.fcm; + +import android.content.Context; +import android.content.SharedPreferences; +import android.util.Log; + +import me.leolin.shortcutbadger.ShortcutBadger; + +public class BadgeHelper { + + private static final String TAG = "BadgeHelper"; + private static final String PREFERENCES_FILE = "BadgeCountFile"; + private static final String BADGE_COUNT_KEY = "BadgeCount"; + + private Context mContext; + private SharedPreferences sharedPreferences = null; + + public BadgeHelper(Context context) { + mContext = context; + sharedPreferences = (SharedPreferences) mContext.getSharedPreferences(PREFERENCES_FILE, Context.MODE_PRIVATE); + } + + public int getBadgeCount() { + return sharedPreferences.getInt(BADGE_COUNT_KEY, 0); + } + + public void setBadgeCount(int badgeCount) { + storeBadgeCount(badgeCount); + if (badgeCount == 0) { + ShortcutBadger.removeCount(mContext); + Log.d(TAG, "Remove count"); + } else { + ShortcutBadger.applyCount(mContext, badgeCount); + Log.d(TAG, "Apply count: " + badgeCount); + } + } + + private void storeBadgeCount(int badgeCount) { + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putInt(BADGE_COUNT_KEY, badgeCount); + editor.apply(); + } +} 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 5d833a3e..633eb609 100644 --- a/android/src/main/java/com/evollu/react/fcm/FIRMessagingModule.java +++ b/android/src/main/java/com/evollu/react/fcm/FIRMessagingModule.java @@ -36,10 +36,12 @@ public class FIRMessagingModule extends ReactContextBaseJavaModule implements LifecycleEventListener, ActivityEventListener { 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()); + mBadgeHelper = new BadgeHelper(reactContext.getApplicationContext()); getReactApplicationContext().addLifecycleEventListener(this); getReactApplicationContext().addActivityEventListener(this); registerTokenRefreshHandler(); @@ -113,6 +115,16 @@ public void getScheduledLocalNotifications(Promise promise){ 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) 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 805196c0..80cb74f4 100644 --- a/android/src/main/java/com/evollu/react/fcm/MessagingService.java +++ b/android/src/main/java/com/evollu/react/fcm/MessagingService.java @@ -23,6 +23,7 @@ public void onMessageReceived(RemoteMessage remoteMessage) { } public void handleBadge(RemoteMessage remoteMessage) { + BadgeHelper badgeHelper = new BadgeHelper(this); if (remoteMessage.getData() == null) { return; } @@ -34,15 +35,9 @@ public void handleBadge(RemoteMessage remoteMessage) { try { int badgeCount = Integer.parseInt((String)data.get("badge")); - if (badgeCount == 0) { - ShortcutBadger.removeCount(this); - Log.d(TAG, "Remove count"); - } else { - ShortcutBadger.applyCount(this, badgeCount); - Log.d(TAG, "Apply count: " + badgeCount); - } + badgeHelper.setBadgeCount(badgeCount); } catch (Exception e) { Log.e(TAG, "Badge count needs to be an integer", e); } } -} +} \ No newline at end of file