package com.dieam.reactnativepushnotification.helpers; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import com.facebook.common.logging.FLog; import me.leolin.shortcutbadger.Badger; import me.leolin.shortcutbadger.ShortcutBadger; import me.leolin.shortcutbadger.impl.SamsungHomeBadger; /** * Helper for setting application launcher icon badge counts. * <p> * This is a wrapper around {@link ShortcutBadger}, with a couple enhancements: * <p> * - If the first attempt fails, don't retry. This keeps logs clean, as failed attempts are noisy. * - Test and apply a separate method for older Samsung devices, which ShortcutBadger has * (perhaps over-aggressively) deprecated. ref: https://github.com/leolin310148/ShortcutBadger/issues/40 */ public class ApplicationBadgeHelper { public static final ApplicationBadgeHelper INSTANCE = new ApplicationBadgeHelper(); private static final String LOG_TAG = "ApplicationBadgeHelper"; private static final Badger LEGACY_SAMSUNG_BADGER = new SamsungHomeBadger(); private Boolean applyAutomaticBadger; private Boolean applySamsungBadger; private ComponentName componentName; private ApplicationBadgeHelper() { } public void setApplicationIconBadgeNumber(Context context, int number) { if (null == componentName) { componentName = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()).getComponent(); } tryAutomaticBadge(context, number); tryLegacySamsungBadge(context, number); } private void tryAutomaticBadge(Context context, int number) { if (null == applyAutomaticBadger) { applyAutomaticBadger = ShortcutBadger.applyCount(context, number); if (applyAutomaticBadger) { FLog.i(LOG_TAG, "First attempt to use automatic badger succeeded; permanently enabling method."); } else { FLog.i(LOG_TAG, "First attempt to use automatic badger failed; permanently disabling method."); } return; } else if (!applyAutomaticBadger) { return; } ShortcutBadger.applyCount(context, number); } private void tryLegacySamsungBadge(Context context, int number) { // First attempt to apply legacy samsung badge. Check if eligible, then attempt it. if (null == applySamsungBadger) { applySamsungBadger = isLegacySamsungLauncher(context) && applyLegacySamsungBadge(context, number); if (applySamsungBadger) { FLog.i(LOG_TAG, "First attempt to use legacy Samsung badger succeeded; permanently enabling method."); } else { FLog.w(LOG_TAG, "First attempt to use legacy Samsung badger failed; permanently disabling method."); } return; } else if (!applySamsungBadger) { return; } applyLegacySamsungBadge(context, number); } private boolean isLegacySamsungLauncher(Context context) { Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); ResolveInfo resolveInfo = context.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); if (resolveInfo == null || resolveInfo.activityInfo.name.toLowerCase().contains("resolver")) { return false; } String currentHomePackage = resolveInfo.activityInfo.packageName; return LEGACY_SAMSUNG_BADGER.getSupportLaunchers().contains(currentHomePackage); } private boolean applyLegacySamsungBadge(Context context, int number) { try { LEGACY_SAMSUNG_BADGER.executeBadge(context, componentName, number); return true; } catch (Exception e) { FLog.w(LOG_TAG, "Legacy Samsung badger failed", e); return false; } } }