diff --git a/.gitignore b/.gitignore index 13ebdb4710059e9f4a7c1e0616b295433540fb82..631e800dbfc1b324ce57a1d341e268c54da5556e 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 cfad9e053393c9a59575fe969042929ad761091e..398103772f68aea9bb33ef7a154d386e9e31dbe4 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 0000000000000000000000000000000000000000..360d61d7faea77dd081adbcaf3cc5f6f145d6bd6 --- /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 5d833a3e938e0dd8309b7c2bcc43ca49ecfef5e7..633eb6091dd54c52f56129e64ac353e5796d385f 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 @@ import java.util.UUID; 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 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) 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 e0d20bdea703f01111542617f0944b1110fa5e5c..80cb74f468719801c7176994aa444dac7549d081 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 class MessagingService extends FirebaseMessagingService { 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