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/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/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 e0d20bde..80cb74f4 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,26 @@ 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) { + BadgeHelper badgeHelper = new BadgeHelper(this); + if (remoteMessage.getData() == null) { + return; + } + + Map data = remoteMessage.getData(); + if (data.get("badge") == null) { + return; + } + + try { + int badgeCount = Integer.parseInt((String)data.get("badge")); + badgeHelper.setBadgeCount(badgeCount); + } catch (Exception e) { + Log.e(TAG, "Badge count needs to be an integer", e); + } + } +} \ No newline at end of file