package me.leolin.shortcutbadger; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Build; import android.util.Log; import me.leolin.shortcutbadger.impl.*; import java.lang.reflect.Constructor; import java.util.LinkedList; import java.util.List; /** * @author Leo Lin */ public abstract class ShortcutBadger { private static final String LOG_TAG = ShortcutBadger.class.getSimpleName(); private static final List<Class<? extends ShortcutBadger>> BADGERS = new LinkedList<Class<? extends ShortcutBadger>>(); static { BADGERS.add(AdwHomeBadger.class); BADGERS.add(ApexHomeBadger.class); BADGERS.add(NewHtcHomeBadger.class); BADGERS.add(NovaHomeBadger.class); BADGERS.add(SolidHomeBadger.class); BADGERS.add(SonyHomeBadger.class); BADGERS.add(XiaomiHomeBadger.class); BADGERS.add(AsusHomeLauncher.class); // BADGERS.add(LGHomeBadger.class); // BADGERS.add(SamsungHomeBadger.class); } private static ShortcutBadger mShortcutBadger; public static ShortcutBadger with(Context context) { return getShortcutBadger(context); } public static void setBadge(Context context, int badgeCount) throws ShortcutBadgeException { try { getShortcutBadger(context).executeBadge(badgeCount); } catch (Throwable e) { throw new ShortcutBadgeException("Unable to execute badge:" + e.getMessage()); } } private static ShortcutBadger getShortcutBadger(Context context) { if (mShortcutBadger != null) { return mShortcutBadger; } Log.d(LOG_TAG, "Finding badger"); //find the home launcher Package try { Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); ResolveInfo resolveInfo = context.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); String currentHomePackage = resolveInfo.activityInfo.packageName; for (Class<? extends ShortcutBadger> badger : BADGERS) { Constructor<? extends ShortcutBadger> constructor = badger.getConstructor(Context.class); ShortcutBadger shortcutBadger = constructor.newInstance(context); if (shortcutBadger.getSupportLaunchers().contains(currentHomePackage)) { mShortcutBadger = shortcutBadger; break; } } if (mShortcutBadger == null && Build.MANUFACTURER.equalsIgnoreCase("Xiaomi")) { mShortcutBadger = new XiaomiHomeBadger(context); } } catch (Exception e) { Log.e(LOG_TAG, e.getMessage(), e); } if (mShortcutBadger == null) { mShortcutBadger = new DefaultBadger(context); } Log.d(LOG_TAG, "Returning badger:" + mShortcutBadger.getClass().getCanonicalName()); return mShortcutBadger; } private ShortcutBadger() { } protected Context mContext; protected ShortcutBadger(Context context) { this.mContext = context; } protected abstract void executeBadge(int badgeCount) throws ShortcutBadgeException; protected abstract List<String> getSupportLaunchers(); protected String getEntryActivityName() { ComponentName componentName = mContext.getPackageManager().getLaunchIntentForPackage(mContext.getPackageName()).getComponent(); return componentName.getClassName(); } protected String getContextPackageName() { return mContext.getPackageName(); } public void count(int count) { try { executeBadge(count); } catch (Exception e) { Log.e(LOG_TAG, e.getMessage(), e); } } public void remove() { count(0); } }