leolin310148 / ShortcutBadger

An Android library supports badge notification like iOS in Samsung, LG, Sony and HTC launchers.
Other
7.35k stars 1.34k forks source link

反编译手机QQ,发现了BadgeUtils、BadgeUtilImpl类及com.tencent.commonsdk.badge包 #298

Open liyujiang-gzu opened 6 years ago

liyujiang-gzu commented 6 years ago

com.tencent.mobileqq.msf.core.push.BadgeUtilImpl反编译代码如下:

package com.tencent.mobileqq.msf.core.push;

import android.app.Notification;
import android.content.Context;
import com.tencent.commonsdk.badge.BadgeController;
import com.tencent.commonsdk.badge.CommonBadgeUtilImpl;
import com.tencent.mobileqq.msf.sdk.SettingCloneUtil;
import com.tencent.qphone.base.util.QLog;

public class BadgeUtilImpl
{
  public static final String QQSETTING_SHOW_BADGEUNREAD_KEY = "qqsetting_show_badgeunread_key";
  public static final String TAG = "BadgeUtilImpl";

  public static void changeMI6Badge(Context paramContext, int paramInt, Notification paramNotification)
  {
    if (!isEnabled(paramContext))
    {
      if (QLog.isColorLevel())
        QLog.d("BadgeUtilImpl", 2, "setBadge isdisableabled count=0");
      paramInt = 0;
    }
    CommonBadgeUtilImpl.changeMI6Badge(paramContext, paramInt, paramNotification);
  }

  public static void disableBadge(Context paramContext)
  {
    if (isSupportBadge(paramContext))
    {
      setBadge(paramContext, 0, true);
      SettingCloneUtil.writeValue(paramContext, null, null, "qqsetting_show_badgeunread_key", false);
    }
  }

  public static void enableBadge(Context paramContext)
  {
    if (isSupportBadge(paramContext))
      SettingCloneUtil.writeValue(paramContext, null, null, "qqsetting_show_badgeunread_key", true);
  }

  public static boolean isEnabled(Context paramContext)
  {
    boolean bool1 = isSupportBadge(paramContext);
    boolean bool2 = false;
    if (bool1)
      bool2 = SettingCloneUtil.readValue(paramContext, null, null, "qqsetting_show_badgeunread_key", true);
    return bool2;
  }

  public static boolean isSupportBadge(Context paramContext)
  {
    return CommonBadgeUtilImpl.isSupportBadge(paramContext);
  }

  public static void setBadge(Context paramContext, int paramInt)
  {
    setBadge(paramContext, paramInt, false);
  }

  public static void setBadge(Context paramContext, int paramInt, boolean paramBoolean)
  {
    if (QLog.isColorLevel())
      QLog.d("BadgeUtilImpl", 2, "setBadge count=" + paramInt + "|forceSet=" + paramBoolean);
    if ((!isEnabled(paramContext)) && (!paramBoolean))
      return;
    if (!isEnabled(paramContext))
    {
      if (QLog.isColorLevel())
        QLog.d("BadgeUtilImpl", 2, "setBadge isdisableabled count=0");
      paramInt = 0;
    }
    BadgeController.setBadge(paramInt);
    CommonBadgeUtilImpl.setBadge(paramContext, paramInt, paramBoolean);
  }

  public static void setLimitCount(int paramInt)
  {
    CommonBadgeUtilImpl.setLimitCount(paramInt);
  }

  public static void setMIUI6Badge(Context paramContext, int paramInt, Notification paramNotification)
  {
    CommonBadgeUtilImpl.setMIUI6Badge(paramContext, paramInt, paramNotification);
  }
}

BadgeController类:

package com.tencent.commonsdk.badge;

import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Bundle;

public final class BadgeController
{
  private static final String[] LAUNCHER_WHITE_LIST;
  private static final String TAG = "BadgeUtils";
  private static Context sApplication;
  private static String sCurBadgeProviderAuthorities;
  private static String sCurLauncherPackageName;
  private static boolean sDebug = false;
  private static volatile Integer sNextCount;
  private static volatile boolean sResumed = true;

  static
  {
    LAUNCHER_WHITE_LIST = new String[] { "com.tct.launcher", "com.bbk.studyos.launcher", "com.android.launcher3", "com.gionee.amisystem" };
  }

  private static String getCurLauncherPackageName()
  {
    try
    {
      Intent localIntent = new Intent("android.intent.action.MAIN");
      localIntent.addCategory("android.intent.category.HOME");
      ResolveInfo localResolveInfo = sApplication.getPackageManager().resolveActivity(localIntent, 0);
      if (localResolveInfo != null)
      {
        if (localResolveInfo.activityInfo == null)
          return null;
        if (!localResolveInfo.activityInfo.packageName.equals("android"))
        {
          String str = localResolveInfo.activityInfo.packageName;
          return str;
        }
      }
    }
    catch (Exception localException)
    {
    }
    return null;
  }

  public static void init(Context paramContext)
  {
    sApplication = paramContext.getApplicationContext();
    String str = getCurLauncherPackageName();
    String[] arrayOfString = LAUNCHER_WHITE_LIST;
    int i = arrayOfString.length;
    int j = 0;
    while (true)
    {
      int k = 0;
      if (j < i)
      {
        if (arrayOfString[j].equalsIgnoreCase(str))
          k = 1;
      }
      else
      {
        if (sDebug)
          break label107;
        if (k != 0)
          sCurLauncherPackageName = str;
        if (sCurLauncherPackageName == null);
      }
      try
      {
        ApplicationInfo localApplicationInfo = sApplication.getPackageManager().getApplicationInfo(sCurLauncherPackageName, 128);
        if (localApplicationInfo != null)
          sCurBadgeProviderAuthorities = localApplicationInfo.metaData.getString("badge_provider");
        return;
        j++;
        continue;
        label107: sCurLauncherPackageName = str;
      }
      catch (Exception localException)
      {
      }
    }
  }

  public static boolean isSupport(Context paramContext)
  {
    if (sCurLauncherPackageName == null)
      init(paramContext);
    return sCurBadgeProviderAuthorities != null;
  }

  public static void resumeOrPause(boolean paramBoolean)
  {
    sResumed = paramBoolean;
    Integer localInteger = sNextCount;
    if ((sResumed) && (localInteger != null))
      setBadge(localInteger.intValue());
  }

  public static boolean setBadge(int paramInt)
  {
    if (!sResumed)
      sNextCount = Integer.valueOf(paramInt);
    while (sCurBadgeProviderAuthorities == null)
    {
      return false;
      sNextCount = null;
    }
    Uri localUri = Uri.parse("content://" + sCurBadgeProviderAuthorities + "/badge");
    Bundle localBundle1 = new Bundle();
    localBundle1.putInt("count", paramInt);
    Bundle localBundle2 = sApplication.getContentResolver().call(localUri, "setBadge", "", localBundle1);
    boolean bool = false;
    if (localBundle2 != null)
      bool = localBundle2.getBoolean("result");
    return bool;
  }
}

CommonBadgeUtilImpl类:

package com.tencent.commonsdk.badge;

import android.app.Notification;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Build.VERSION;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.List;

public class CommonBadgeUtilImpl
{
  public static final String ACTION_APPLICATION_MESSAGE_QUERY = "android.intent.action.APPLICATION_MESSAGE_QUERY";
  public static final String ACTION_APPLICATION_MESSAGE_UPDATE = "android.intent.action.APPLICATION_MESSAGE_UPDATE";
  public static final String ACTION_QQLAUNCHER_BADGE_UPDATE = "com.tencent.qlauncher.action.ACTION_UPDATE_SHORTCUT";
  public static final String EXTRA_UPDATE_APPLICATION_COMPONENT_NAME = "android.intent.extra.update_application_component_name";
  public static final String EXTRA_UPDATE_APPLICATION_MESSAGE_TEXT = "android.intent.extra.update_application_message_text";
  public static final String LENOVO_PACKAGE_NAME = "com.lenovo.launcher";
  public static final String MANUFACTURER_OF_HARDWARE_HUAWEI = "huawei";
  public static final String MANUFACTURER_OF_HARDWARE_LENOVO = "lenovo";
  public static final String MANUFACTURER_OF_HARDWARE_OPPO = "OPPO";
  public static final String MANUFACTURER_OF_HARDWARE_SANXING = "samsung";
  public static final String MANUFACTURER_OF_HARDWARE_SONY = "Sony Ericsson";
  public static final String MANUFACTURER_OF_HARDWARE_VIVO = "vivo";
  public static final String MANUFACTURER_OF_HARDWARE_XIAOMI = "Xiaomi";
  public static final String MANUFACTURER_OF_HARDWARE_ZUK = "ZUK";
  public static final String MANUFACTURER_OF_LENOVO_LAUNCHER_BADGE = "content://com.lenovo.launcher.badge/lenovo_badges";
  public static int NOTIFICATION_ID_NOTIFYID = 0;
  private static final String OPPO_QQ_BADGE_NUMBER = "com.tencent.mobileqq.badge";
  public static final String TAG = "CommonBadgeUtilImpl";
  public static int haslenovoLanucher;
  private static Boolean haveprovider = null;
  public static String mLauncherClassName;
  public static int mLimitCount;
  private static int miui6Flag;
  public static PackageManager packmag;
  private static int sBadgeAbility;
  private static Context sContext;
  public static String[] sQQLuancherPackageNames;

  static
  {
    NOTIFICATION_ID_NOTIFYID = 110234;
    sQQLuancherPackageNames = new String[] { "com.tencent.qlauncher.lite", "com.tencent.qlauncher", "com.tencent.qqlauncher", "com.tencent.launcher" };
    mLauncherClassName = "";
    haslenovoLanucher = -1;
    mLimitCount = -1;
    sBadgeAbility = 0;
    miui6Flag = 0;
  }

  public static void changeMI6Badge(Context paramContext, int paramInt, Notification paramNotification)
  {
    if (paramInt > mLimitCount)
      paramInt = mLimitCount;
    try
    {
      Object localObject = Class.forName("android.app.MiuiNotification").newInstance();
      Field localField = localObject.getClass().getDeclaredField("messageCount");
      localField.setAccessible(true);
      localField.set(localObject, Integer.valueOf(paramInt));
      paramNotification.getClass().getField("extraNotification").set(paramNotification, localObject);
      return;
    }
    catch (NoSuchFieldException localNoSuchFieldException)
    {
      localNoSuchFieldException.printStackTrace();
      return;
    }
    catch (IllegalArgumentException localIllegalArgumentException)
    {
      localIllegalArgumentException.printStackTrace();
      return;
    }
    catch (IllegalAccessException localIllegalAccessException)
    {
      localIllegalAccessException.printStackTrace();
      return;
    }
    catch (ClassNotFoundException localClassNotFoundException)
    {
      localClassNotFoundException.printStackTrace();
      return;
    }
    catch (InstantiationException localInstantiationException)
    {
      localInstantiationException.printStackTrace();
    }
  }

  public static void changeMIBadge(Context paramContext, int paramInt)
  {
    if (isMIUI6())
      return;
    Intent localIntent = new Intent("android.intent.action.APPLICATION_MESSAGE_UPDATE");
    localIntent.putExtra("android.intent.extra.update_application_component_name", "com.tencent.mobileqq/.activity.SplashActivity");
    String str;
    if (paramInt > 0)
      if (paramInt > mLimitCount)
        str = "" + mLimitCount;
    while (true)
    {
      localIntent.putExtra("android.intent.extra.update_application_message_text", str);
      paramContext.sendBroadcast(localIntent);
      return;
      str = paramInt + "";
      continue;
      str = "";
    }
  }

  public static void changeOPPOBadge(Context paramContext, int paramInt)
  {
    if (paramInt > mLimitCount)
      paramInt = mLimitCount;
    try
    {
      Bundle localBundle = new Bundle();
      localBundle.putInt("app_badge_count", paramInt);
      paramContext.getContentResolver().call(Uri.parse("content://com.android.badge/badge"), "setAppBadgeCount", null, localBundle);
      return;
    }
    catch (Throwable localThrowable)
    {
    }
  }

  public static void changeVivoBadge(Context paramContext, int paramInt)
  {
    if (paramInt > mLimitCount)
      paramInt = mLimitCount;
    String str = getLauncherClassName(paramContext);
    if (str == null)
      return;
    Intent localIntent = new Intent("launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM");
    localIntent.putExtra("packageName", paramContext.getPackageName());
    localIntent.putExtra("className", str);
    localIntent.putExtra("notificationNum", paramInt);
    paramContext.sendBroadcast(localIntent);
  }

  public static void changeZUKBadge(Context paramContext, int paramInt)
  {
    if (paramInt > mLimitCount)
      paramInt = mLimitCount;
    try
    {
      Bundle localBundle = new Bundle();
      localBundle.putStringArrayList("app_shortcut_custom_id", null);
      localBundle.putInt("app_badge_count", paramInt);
      if (paramContext.getContentResolver().call(Uri.parse("content://com.android.badge/badge"), "setAppBadgeCount", null, localBundle) != null);
      for (boolean bool = true; ; bool = false)
      {
        Log.d("CommonBadgeUtilImpl", "changeZUKBadge mcount=" + paramInt + "result=" + bool);
        return;
      }
    }
    catch (Throwable localThrowable)
    {
      localThrowable.printStackTrace();
    }
  }

  public static String getLauncherClassName(Context paramContext)
  {
    if (!TextUtils.isEmpty(mLauncherClassName))
      return mLauncherClassName;
    PackageManager localPackageManager = paramContext.getPackageManager();
    Intent localIntent = new Intent("android.intent.action.MAIN");
    localIntent.addCategory("android.intent.category.LAUNCHER");
    try
    {
      Iterator localIterator = localPackageManager.queryIntentActivities(localIntent, 0).iterator();
      while (localIterator.hasNext())
      {
        ResolveInfo localResolveInfo = (ResolveInfo)localIterator.next();
        if (!localResolveInfo.activityInfo.applicationInfo.packageName.equalsIgnoreCase(paramContext.getPackageName()))
          continue;
        String str = localResolveInfo.activityInfo.name;
        mLauncherClassName = str;
        return str;
      }
    }
    catch (Exception localException)
    {
      return null;
    }
    return null;
  }

  // ERROR //
  public static boolean isMIUI6()
  {
    // Byte code:
    //   0: getstatic 103   com/tencent/commonsdk/badge/CommonBadgeUtilImpl:miui6Flag   I
    //   3: ifne +131 -> 134
    //   6: iconst_m1
    //   7: putstatic 103   com/tencent/commonsdk/badge/CommonBadgeUtilImpl:miui6Flag   I
    //   10: ldc 93
    //   12: astore_0
    //   13: aconst_null
    //   14: astore_1
    //   15: new 346    java/io/BufferedReader
    //   18: dup
    //   19: new 348    java/io/InputStreamReader
    //   22: dup
    //   23: new 350    java/lang/ProcessBuilder
    //   26: dup
    //   27: iconst_2
    //   28: anewarray 81   java/lang/String
    //   31: dup
    //   32: iconst_0
    //   33: ldc_w 352
    //   36: aastore
    //   37: dup
    //   38: iconst_1
    //   39: ldc_w 354
    //   42: aastore
    //   43: invokespecial 357  java/lang/ProcessBuilder:<init> ([Ljava/lang/String;)V
    //   46: invokevirtual 361  java/lang/ProcessBuilder:start  ()Ljava/lang/Process;
    //   49: invokevirtual 367  java/lang/Process:getInputStream    ()Ljava/io/InputStream;
    //   52: invokespecial 370  java/io/InputStreamReader:<init>    (Ljava/io/InputStream;)V
    //   55: sipush 1024
    //   58: invokespecial 373  java/io/BufferedReader:<init>   (Ljava/io/Reader;I)V
    //   61: astore_2
    //   62: aload_2
    //   63: invokevirtual 376  java/io/BufferedReader:readLine ()Ljava/lang/String;
    //   66: astore_0
    //   67: aload_2
    //   68: invokevirtual 379  java/io/BufferedReader:close    ()V
    //   71: aload_2
    //   72: ifnull +7 -> 79
    //   75: aload_2
    //   76: invokevirtual 379  java/io/BufferedReader:close    ()V
    //   79: aload_0
    //   80: invokestatic 285   android/text/TextUtils:isEmpty  (Ljava/lang/CharSequence;)Z
    //   83: ifne +51 -> 134
    //   86: aload_0
    //   87: invokestatic 383   java/lang/Integer:parseInt  (Ljava/lang/String;)I
    //   90: istore 24
    //   92: iload 24
    //   94: istore 22
    //   96: iload 22
    //   98: iconst_3
    //   99: if_icmple +35 -> 134
    //   102: ldc_w 385
    //   105: new 187   java/lang/StringBuilder
    //   108: dup
    //   109: invokespecial 188 java/lang/StringBuilder:<init>  ()V
    //   112: ldc_w 387
    //   115: invokevirtual 192 java/lang/StringBuilder:append  (Ljava/lang/String;)Ljava/lang/StringBuilder;
    //   118: iload 22
    //   120: invokevirtual 195 java/lang/StringBuilder:append  (I)Ljava/lang/StringBuilder;
    //   123: invokevirtual 199 java/lang/StringBuilder:toString    ()Ljava/lang/String;
    //   126: invokestatic 276  android/util/Log:d  (Ljava/lang/String;Ljava/lang/String;)I
    //   129: pop
    //   130: iconst_1
    //   131: putstatic 103 com/tencent/commonsdk/badge/CommonBadgeUtilImpl:miui6Flag   I
    //   134: getstatic 103 com/tencent/commonsdk/badge/CommonBadgeUtilImpl:miui6Flag   I
    //   137: iconst_1
    //   138: if_icmpne +261 -> 399
    //   141: iconst_1
    //   142: ireturn
    //   143: astore 21
    //   145: aload 21
    //   147: invokevirtual 388 java/lang/NumberFormatException:printStackTrace ()V
    //   150: iconst_0
    //   151: istore 22
    //   153: goto -57 -> 96
    //   156: astore 27
    //   158: aload_1
    //   159: ifnull +7 -> 166
    //   162: aload_1
    //   163: invokevirtual 379 java/io/BufferedReader:close    ()V
    //   166: aload_0
    //   167: invokestatic 285  android/text/TextUtils:isEmpty  (Ljava/lang/CharSequence;)Z
    //   170: ifne -36 -> 134
    //   173: aload_0
    //   174: invokestatic 383  java/lang/Integer:parseInt  (Ljava/lang/String;)I
    //   177: istore 7
    //   179: iload 7
    //   181: istore 5
    //   183: iload 5
    //   185: iconst_3
    //   186: if_icmple -52 -> 134
    //   189: ldc_w 385
    //   192: new 187   java/lang/StringBuilder
    //   195: dup
    //   196: invokespecial 188 java/lang/StringBuilder:<init>  ()V
    //   199: ldc_w 387
    //   202: invokevirtual 192 java/lang/StringBuilder:append  (Ljava/lang/String;)Ljava/lang/StringBuilder;
    //   205: iload 5
    //   207: invokevirtual 195 java/lang/StringBuilder:append  (I)Ljava/lang/StringBuilder;
    //   210: invokevirtual 199 java/lang/StringBuilder:toString    ()Ljava/lang/String;
    //   213: invokestatic 276  android/util/Log:d  (Ljava/lang/String;Ljava/lang/String;)I
    //   216: pop
    //   217: iconst_1
    //   218: putstatic 103 com/tencent/commonsdk/badge/CommonBadgeUtilImpl:miui6Flag   I
    //   221: goto -87 -> 134
    //   224: astore 4
    //   226: aload 4
    //   228: invokevirtual 388 java/lang/NumberFormatException:printStackTrace ()V
    //   231: iconst_0
    //   232: istore 5
    //   234: goto -51 -> 183
    //   237: astore 26
    //   239: aload_1
    //   240: ifnull +7 -> 247
    //   243: aload_1
    //   244: invokevirtual 379 java/io/BufferedReader:close    ()V
    //   247: aload_0
    //   248: invokestatic 285  android/text/TextUtils:isEmpty  (Ljava/lang/CharSequence;)Z
    //   251: ifne -117 -> 134
    //   254: aload_0
    //   255: invokestatic 383  java/lang/Integer:parseInt  (Ljava/lang/String;)I
    //   258: istore 13
    //   260: iload 13
    //   262: istore 11
    //   264: iload 11
    //   266: iconst_3
    //   267: if_icmple -133 -> 134
    //   270: ldc_w 385
    //   273: new 187   java/lang/StringBuilder
    //   276: dup
    //   277: invokespecial 188 java/lang/StringBuilder:<init>  ()V
    //   280: ldc_w 387
    //   283: invokevirtual 192 java/lang/StringBuilder:append  (Ljava/lang/String;)Ljava/lang/StringBuilder;
    //   286: iload 11
    //   288: invokevirtual 195 java/lang/StringBuilder:append  (I)Ljava/lang/StringBuilder;
    //   291: invokevirtual 199 java/lang/StringBuilder:toString    ()Ljava/lang/String;
    //   294: invokestatic 276  android/util/Log:d  (Ljava/lang/String;Ljava/lang/String;)I
    //   297: pop
    //   298: iconst_1
    //   299: putstatic 103 com/tencent/commonsdk/badge/CommonBadgeUtilImpl:miui6Flag   I
    //   302: goto -168 -> 134
    //   305: astore 10
    //   307: aload 10
    //   309: invokevirtual 388 java/lang/NumberFormatException:printStackTrace ()V
    //   312: iconst_0
    //   313: istore 11
    //   315: goto -51 -> 264
    //   318: astore 15
    //   320: aload_1
    //   321: ifnull +7 -> 328
    //   324: aload_1
    //   325: invokevirtual 379 java/io/BufferedReader:close    ()V
    //   328: aload_0
    //   329: invokestatic 285  android/text/TextUtils:isEmpty  (Ljava/lang/CharSequence;)Z
    //   332: ifne +51 -> 383
    //   335: aload_0
    //   336: invokestatic 383  java/lang/Integer:parseInt  (Ljava/lang/String;)I
    //   339: istore 19
    //   341: iload 19
    //   343: istore 17
    //   345: iload 17
    //   347: iconst_3
    //   348: if_icmple +35 -> 383
    //   351: ldc_w 385
    //   354: new 187   java/lang/StringBuilder
    //   357: dup
    //   358: invokespecial 188 java/lang/StringBuilder:<init>  ()V
    //   361: ldc_w 387
    //   364: invokevirtual 192 java/lang/StringBuilder:append  (Ljava/lang/String;)Ljava/lang/StringBuilder;
    //   367: iload 17
    //   369: invokevirtual 195 java/lang/StringBuilder:append  (I)Ljava/lang/StringBuilder;
    //   372: invokevirtual 199 java/lang/StringBuilder:toString    ()Ljava/lang/String;
    //   375: invokestatic 276  android/util/Log:d  (Ljava/lang/String;Ljava/lang/String;)I
    //   378: pop
    //   379: iconst_1
    //   380: putstatic 103 com/tencent/commonsdk/badge/CommonBadgeUtilImpl:miui6Flag   I
    //   383: aload 15
    //   385: athrow
    //   386: astore 16
    //   388: aload 16
    //   390: invokevirtual 388 java/lang/NumberFormatException:printStackTrace ()V
    //   393: iconst_0
    //   394: istore 17
    //   396: goto -51 -> 345
    //   399: iconst_0
    //   400: ireturn
    //   401: astore 25
    //   403: goto -324 -> 79
    //   406: astore 8
    //   408: goto -242 -> 166
    //   411: astore 14
    //   413: goto -166 -> 247
    //   416: astore 20
    //   418: goto -90 -> 328
    //   421: astore 15
    //   423: aload_2
    //   424: astore_1
    //   425: goto -105 -> 320
    //   428: astore 9
    //   430: aload_2
    //   431: astore_1
    //   432: goto -193 -> 239
    //   435: astore_3
    //   436: aload_2
    //   437: astore_1
    //   438: goto -280 -> 158
    //
    // Exception table:
    //   from   to  target  type
    //   86 92  143 java/lang/NumberFormatException
    //   15 62  156 java/io/IOException
    //   173    179 224 java/lang/NumberFormatException
    //   15 62  237 java/lang/Exception
    //   254    260 305 java/lang/NumberFormatException
    //   15 62  318 finally
    //   335    341 386 java/lang/NumberFormatException
    //   75 79  401 java/io/IOException
    //   162    166 406 java/io/IOException
    //   243    247 411 java/io/IOException
    //   324    328 416 java/io/IOException
    //   62 71  421 finally
    //   62 71  428 java/lang/Exception
    //   62 71  435 java/io/IOException
  }

  public static boolean isQQLanucher()
  {
    if (packmag == null)
      packmag = sContext.getPackageManager();
    int i = 0;
    while (true)
    {
      int j = sQQLuancherPackageNames.length;
      int k = 0;
      if (i < j);
      try
      {
        PackageInfo localPackageInfo = packmag.getPackageInfo(sQQLuancherPackageNames[i], 0);
        if (localPackageInfo != null)
        {
          k = 1;
          return k;
        }
      }
      catch (Exception localException)
      {
        i++;
      }
    }
  }

  public static boolean isSupportBadge(Context paramContext)
  {
    int i = 1;
    if (sContext == null)
      sContext = paramContext;
    if (sBadgeAbility != 0)
    {
      if (sBadgeAbility == i)
        return i;
      return false;
    }
    int j;
    if (Build.MANUFACTURER.equalsIgnoreCase("ZUK"))
    {
      j = 1;
      BadgeController.init(sContext);
      if (BadgeController.isSupport(sContext))
        j = 1;
      if (j == 0)
        break label173;
    }
    while (true)
    {
      sBadgeAbility = i;
      return j;
      if ((islenovoLanucher("com.lenovo.launcher")) || (isQQLanucher()))
      {
        j = 1;
        break;
      }
      if (Build.MANUFACTURER.equalsIgnoreCase("Xiaomi"))
      {
        j = 1;
        break;
      }
      if (Build.MANUFACTURER.equalsIgnoreCase("samsung"))
      {
        j = 1;
        break;
      }
      if (Build.MANUFACTURER.equalsIgnoreCase("huawei"))
      {
        j = 1;
        break;
      }
      if (Build.MANUFACTURER.equalsIgnoreCase("OPPO"))
      {
        j = 1;
        break;
      }
      if (Build.MANUFACTURER.equalsIgnoreCase("vivo"))
      {
        j = 1;
        break;
      }
      j = 0;
      break;
      label173: i = 2;
    }
  }

  public static boolean islenovoLanucher(String paramString)
  {
    if (Build.VERSION.SDK_INT < 15);
    while (true)
    {
      return false;
      if (haslenovoLanucher == -1)
        break;
      if (haslenovoLanucher == 1)
        return true;
    }
    try
    {
      if ((packmag == null) && (sContext != null))
        packmag = sContext.getPackageManager();
      if (Float.valueOf(Float.parseFloat(packmag.getPackageInfo(paramString, 0).versionName.substring(0, 3))).floatValue() >= 6.7F)
      {
        haslenovoLanucher = 1;
        return true;
      }
      haslenovoLanucher = 0;
      return false;
    }
    catch (PackageManager.NameNotFoundException localNameNotFoundException)
    {
      haslenovoLanucher = 0;
      return false;
    }
    catch (Exception localException)
    {
      haslenovoLanucher = 0;
    }
    return false;
  }

  public static void setBadge(Context paramContext, int paramInt)
  {
    setBadge(paramContext, paramInt, false);
  }

  public static void setBadge(Context paramContext, int paramInt, boolean paramBoolean)
  {
    Log.d("CommonBadgeUtilImpl", "setBadge count=" + paramInt + "|forceSet=" + paramBoolean);
    if (isQQLanucher())
      setQQLauncherBadges(paramContext, paramInt);
    if (Build.MANUFACTURER.equalsIgnoreCase("ZUK"))
      changeZUKBadge(paramContext, paramInt);
    if (islenovoLanucher("com.lenovo.launcher"))
      setLenovoBadge(paramContext, paramInt);
    if (Build.MANUFACTURER.equalsIgnoreCase("Xiaomi"))
      changeMIBadge(paramContext, paramInt);
    do
    {
      return;
      if (Build.MANUFACTURER.equalsIgnoreCase("samsung"))
      {
        setSamsungBadge(paramContext, paramInt);
        return;
      }
      if (Build.MANUFACTURER.equalsIgnoreCase("huawei"))
      {
        setHuaweiBadge(paramContext, paramInt);
        return;
      }
      if (!Build.MANUFACTURER.equalsIgnoreCase("OPPO"))
        continue;
      changeOPPOBadge(paramContext, paramInt);
      return;
    }
    while (!Build.MANUFACTURER.equalsIgnoreCase("vivo"));
    changeVivoBadge(paramContext, paramInt);
  }

  public static void setHuaweiBadge(Context paramContext, int paramInt)
  {
    int i = paramInt;
    try
    {
      String str = getLauncherClassName(paramContext);
      if (str == null)
        return;
      if (i > mLimitCount)
        i = mLimitCount;
      Bundle localBundle = new Bundle();
      localBundle.putString("package", paramContext.getPackageName());
      localBundle.putString("class", str);
      localBundle.putInt("badgenumber", i);
      paramContext.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, localBundle);
      return;
    }
    catch (Throwable localThrowable)
    {
    }
  }

  public static void setLenovoBadge(Context paramContext, int paramInt)
  {
    ContentValues localContentValues = new ContentValues();
    String str = getLauncherClassName(paramContext);
    if (str == null);
    while (true)
    {
      return;
      Cursor localCursor = null;
      try
      {
        localContentValues.put("package", paramContext.getPackageName());
        localContentValues.put("class", str);
        localContentValues.put("badgecount", Integer.valueOf(paramInt));
        localContentValues.put("extraData", "");
        ContentResolver localContentResolver1 = paramContext.getContentResolver();
        Uri localUri1 = Uri.parse("content://com.lenovo.launcher.badge/lenovo_badges");
        String[] arrayOfString1 = { "package", "class", "badgecount", "extraData" };
        String[] arrayOfString2 = new String[1];
        arrayOfString2[0] = paramContext.getPackageName();
        localCursor = localContentResolver1.query(localUri1, arrayOfString1, "package=?", arrayOfString2, null);
        if ((localCursor != null) && (localCursor.getCount() > 0))
        {
          if (localCursor.moveToFirst())
          {
            ContentResolver localContentResolver2 = paramContext.getContentResolver();
            Uri localUri2 = Uri.parse("content://com.lenovo.launcher.badge/lenovo_badges");
            String[] arrayOfString3 = new String[1];
            arrayOfString3[0] = paramContext.getPackageName();
            localContentResolver2.update(localUri2, localContentValues, "package=?", arrayOfString3);
          }
          return;
        }
        Log.d("lenovo", "setLenovoBadge cur=null");
        paramContext.getContentResolver().insert(Uri.parse("content://com.lenovo.launcher.badge/lenovo_badges"), localContentValues);
        return;
      }
      catch (Throwable localThrowable)
      {
        return;
      }
      finally
      {
        if (localCursor != null)
          localCursor.close();
      }
    }
    throw localObject;
  }

  public static void setLimitCount(int paramInt)
  {
    mLimitCount = paramInt;
  }

  public static void setMIUI6Badge(Context paramContext, int paramInt, Notification paramNotification)
  {
    if ((Build.MANUFACTURER.equalsIgnoreCase("Xiaomi")) && (isMIUI6()))
      changeMI6Badge(paramContext, paramInt, paramNotification);
  }

  public static void setQQLauncherBadges(Context paramContext, int paramInt)
  {
    if (paramInt > mLimitCount)
      paramInt = mLimitCount;
    while (true)
    {
      Intent localIntent = new Intent("com.tencent.qlauncher.action.ACTION_UPDATE_SHORTCUT");
      localIntent.putExtra("webappId", "20634");
      localIntent.putExtra("info_tips", String.valueOf(paramInt));
      paramContext.sendBroadcast(localIntent);
      return;
      if (paramInt >= 1)
        continue;
      paramInt = 0;
    }
  }

  public static void setSamsungBadge(Context paramContext, int paramInt)
  {
    int i = paramInt;
    Cursor localCursor = null;
    try
    {
      Boolean localBoolean = haveprovider;
      localCursor = null;
      if (localBoolean == null)
      {
        Uri localUri = Uri.parse("content://com.sec.badge/apps");
        localCursor = paramContext.getContentResolver().query(localUri, null, null, null, null);
        if (localCursor == null)
        {
          haveprovider = Boolean.valueOf(false);
          return;
        }
        haveprovider = Boolean.valueOf(true);
      }
      if (haveprovider.booleanValue())
      {
        String str = getLauncherClassName(paramContext);
        if (str == null)
          return;
        if (i > mLimitCount)
          i = mLimitCount;
        Intent localIntent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
        localIntent.putExtra("badge_count", i);
        localIntent.putExtra("badge_count_package_name", paramContext.getPackageName());
        localIntent.putExtra("badge_count_class_name", str);
        paramContext.sendBroadcast(localIntent);
      }
      return;
    }
    catch (Throwable localThrowable)
    {
      return;
    }
    finally
    {
      if (localCursor != null)
        localCursor.close();
    }
    throw localObject;
  }

  public static void setSonyBadge(Context paramContext, int paramInt)
  {
    Intent localIntent = new Intent();
    String str1 = getLauncherClassName(paramContext);
    if (str1 == null)
      return;
    if (paramInt < 1)
    {
      str2 = "";
      localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", false);
      localIntent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
      localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", str1);
      localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", str2);
      localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", paramContext.getPackageName());
      paramContext.sendBroadcast(localIntent);
      return;
    }
    if (paramInt > mLimitCount);
    for (String str2 = "" + mLimitCount; ; str2 = paramInt + "")
    {
      localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", true);
      break;
    }
  }
}
LeonXtp commented 6 years ago

厉害了,手q是咋反编译的?

liyujiang-gzu commented 6 years ago

没有Lenovo手机验证,不知是否有效:

    //Lenovo Launcher
    public static void setBadgeOfLenovo(Context context, int count) {
        try {
            ContentValues cv = new ContentValues();
            String str = getLauncherClassName(context);
            cv.put("package", context.getPackageName());
            cv.put("class", str);
            cv.put("badgecount", count);
            cv.put("extraData", "");
            ContentResolver resolver = context.getContentResolver();
            Uri uri = Uri.parse("content://com.lenovo.launcher.badge/lenovo_badges");
            String[] pkgs = {context.getPackageName()};
            Cursor cursor = resolver.query(uri, new String[]{"package", "class", "badgecount", "extraData"}, "package=?", pkgs, null);
            if (cursor != null && cursor.getCount() > 0) {
                if (cursor.moveToFirst()) {
                    resolver.update(uri, cv, "package=?", pkgs);
                }
                cursor.close();
            } else {
                resolver.insert(uri, cv);
            }
            //LogUtils.d("Lenovo set badge success");
        } catch (Exception e) {
            //LogUtils.w("Lenovo set badge failed: " + e.getMessage());
        }
    }
    //Badge Provider
    private static void setBadgeOfProvider(Context context, int count) {
        try {
            String pkg = getLauncherPackageName(context);
            ApplicationInfo info = context.getApplicationContext().getPackageManager().getApplicationInfo(pkg, PackageManager.GET_META_DATA);
            String provider = info.metaData.getString("badge_provider");
            Uri uri = Uri.parse("content://" + provider + "/badge");
            Bundle extra = new Bundle();
            extra.putInt("count", count);
            context.getContentResolver().call(uri, "setBadge", "", extra);
            //LogUtils.d("Provider set badge success by ContentResolver");
        } catch (Exception e2) {
            //LogUtils.w("Provider set badge failed by ContentResolver: " + e2.getMessage());
        }
    }
liuhuan8986 commented 5 years ago

反编译出来的类,效果如何?

liyujiang-gzu commented 5 years ago

反编译用处不大,oppo、vivo、360目测是单独给QQ和微信开了小灶

QiLiKing commented 5 years ago

是啊,包括后台,也是开小灶了,可恶的手机厂商!

xgAnd commented 5 years ago

针对于小米的这种需要Notification才能设置角标的,那我后台推送的就是消息的推送,已经显示出了Notification可咋搞。