package me.leolin.shortcutbadger.impl; import android.annotation.TargetApi; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Collections; import java.util.List; import me.leolin.shortcutbadger.Badger; import me.leolin.shortcutbadger.ShortcutBadgeException; import me.leolin.shortcutbadger.util.BroadcastHelper; import me.leolin.shortcutbadger.util.CloseHelper; /** * Created by NingSo on 2016/10/14.上午10:09 * * @author: NingSo * Email: ningso.ping@gmail.com * <p> * OPPO R9 not supported * Version number 6 applies only to chat-type apps */ public class OPPOHomeBader implements Badger { private static final String PROVIDER_CONTENT_URI = "content://com.android.badge/badge"; private static final String INTENT_ACTION = "com.oppo.unsettledevent"; private static final String INTENT_EXTRA_PACKAGENAME = "pakeageName"; private static final String INTENT_EXTRA_BADGE_COUNT = "number"; private static final String INTENT_EXTRA_BADGE_UPGRADENUMBER = "upgradeNumber"; private static final String INTENT_EXTRA_BADGEUPGRADE_COUNT = "app_badge_count"; private static int ROMVERSION = -1; @TargetApi(Build.VERSION_CODES.HONEYCOMB) @Override public void executeBadge(Context context, ComponentName componentName, int badgeCount) throws ShortcutBadgeException { if (badgeCount == 0) { badgeCount = -1; } Intent intent = new Intent(INTENT_ACTION); intent.putExtra(INTENT_EXTRA_PACKAGENAME, componentName.getPackageName()); intent.putExtra(INTENT_EXTRA_BADGE_COUNT, badgeCount); intent.putExtra(INTENT_EXTRA_BADGE_UPGRADENUMBER, badgeCount); if (BroadcastHelper.canResolveBroadcast(context, intent)) { context.sendBroadcast(intent); } else { int version = getSupportVersion(); if (version == 6) { try { Bundle extras = new Bundle(); extras.putInt(INTENT_EXTRA_BADGEUPGRADE_COUNT, badgeCount); context.getContentResolver().call(Uri.parse(PROVIDER_CONTENT_URI), "setAppBadgeCount", null, extras); } catch (Throwable th) { throw new ShortcutBadgeException("unable to resolve intent: " + intent.toString()); } } } } @Override public List<String> getSupportLaunchers() { return Collections.singletonList("com.oppo.launcher"); } private int getSupportVersion() { int i = ROMVERSION; if (i >= 0) { return ROMVERSION; } try { i = ((Integer) executeClassLoad(getClass("com.color.os.ColorBuild"), "getColorOSVERSION", null, null)).intValue(); } catch (Exception e) { i = 0; } if (i == 0) { try { String str = getSystemProperty("ro.build.version.opporom"); if (str.startsWith("V1.4")) { return 3; } if (str.startsWith("V2.0")) { return 4; } if (str.startsWith("V2.1")) { return 5; } } catch (Exception ignored) { } } ROMVERSION = i; return ROMVERSION; } private Object executeClassLoad(Class cls, String str, Class[] clsArr, Object[] objArr) { Object obj = null; if (!(cls == null || checkObjExists(str))) { Method method = getMethod(cls, str, clsArr); if (method != null) { method.setAccessible(true); try { obj = method.invoke(null, objArr); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } } return obj; } private Method getMethod(Class cls, String str, Class[] clsArr) { Method method = null; if (cls == null || checkObjExists(str)) { return method; } try { cls.getMethods(); cls.getDeclaredMethods(); return cls.getDeclaredMethod(str, clsArr); } catch (Exception e) { try { return cls.getMethod(str, clsArr); } catch (Exception e2) { return cls.getSuperclass() != null ? getMethod(cls.getSuperclass(), str, clsArr) : method; } } } private Class getClass(String str) { Class cls = null; try { cls = Class.forName(str); } catch (ClassNotFoundException ignored) { } return cls; } private boolean checkObjExists(Object obj) { return obj == null || obj.toString().equals("") || obj.toString().trim().equals("null"); } private String getSystemProperty(String propName) { String line; BufferedReader input = null; try { Process p = Runtime.getRuntime().exec("getprop " + propName); input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024); line = input.readLine(); input.close(); } catch (IOException ex) { return null; } finally { CloseHelper.closeQuietly(input); } return line; } }