diff --git a/SampleApp/build.gradle b/SampleApp/build.gradle
index 7ac69fd..208fdd9 100644
--- a/SampleApp/build.gradle
+++ b/SampleApp/build.gradle
@@ -18,12 +18,7 @@ android {
versionCode 1
versionName "1.0"
}
- buildTypes {
- release {
- runProguard false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
+
}
diff --git a/ShortcutBadger/build.gradle b/ShortcutBadger/build.gradle
index d7e79db..e8ab75a 100644
--- a/ShortcutBadger/build.gradle
+++ b/ShortcutBadger/build.gradle
@@ -10,17 +10,12 @@ android {
buildToolsVersion "20.0.0"
defaultConfig {
- applicationId 'me.leolin.shortcutbadger'
minSdkVersion 8
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
- buildTypes {
- release {
- runProguard false
- }
- }
+
}
diff --git a/ShortcutBadger/src/main/AndroidManifest.xml b/ShortcutBadger/src/main/AndroidManifest.xml
index 83d723a..f1b48fd 100644
--- a/ShortcutBadger/src/main/AndroidManifest.xml
+++ b/ShortcutBadger/src/main/AndroidManifest.xml
@@ -6,6 +6,8 @@
+
+
diff --git a/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/ShortcutBadger.java b/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/ShortcutBadger.java
index 0aa5bf7..c51ad78 100644
--- a/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/ShortcutBadger.java
+++ b/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/ShortcutBadger.java
@@ -5,8 +5,10 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.os.Build;
import me.leolin.shortcutbadger.impl.*;
+
/**
* Created with IntelliJ IDEA.
* User: leolin
@@ -15,15 +17,21 @@ import me.leolin.shortcutbadger.impl.*;
* To change this template use File | Settings | File Templates.
*/
public abstract class ShortcutBadger {
- private static final String HOME_PACKAGE_SONY = "com.sonyericsson.home";
- private static final String HOME_PACKAGE_SAMSUNG = "com.sec.android.app.launcher";
- private static final String HOME_PACKAGE_LG = "com.lge.launcher2";
+ private static final String HOME_PACKAGE_SONY1 = "com.sonyericsson.home";
+ private static final String HOME_PACKAGE_SONY2 = "com.anddoes.launcher";
+ private static final String HOME_PACKAGE_SAMSUNG1 = "com.sec.android.app.launcher";
+ private static final String HOME_PACKAGE_SAMSUNG2 = "com.sec.android.app.twlauncher";
+ private static final String HOME_PACKAGE_LG1 = "com.lge.launcher";
+ private static final String HOME_PACKAGE_LG2 = "com.lge.launcher2";
private static final String HOME_PACKAGE_HTC = "com.htc.launcher";
- private static final String HOME_PACKAGE_ANDROID = "com.android.launcher";
private static final String HOME_PACKAGE_APEX = "com.anddoes.launcher";
private static final String HOME_PACKAGE_ADW = "org.adw.launcher";
private static final String HOME_PACKAGE_ADW_EX = "org.adwfreak.launcher";
private static final String HOME_PACKAGE_NOVA = "com.teslacoilsw.launcher";
+ private static final String HOME_PACKAGE_ANDROID1 = "com.android.launcher";
+ private static final String HOME_PACKAGE_ANDROID2 = "com.android.launcher2";
+ private static final String HOME_PACKAGE_ANDROID3 = "com.google.android.googlequicksearchbox";
+
private static final String MESSAGE_NOT_SUPPORT_BADGE_COUNT = "ShortBadger is currently not support the badgeCount \"%d\"";
private static final String MESSAGE_NOT_SUPPORT_THIS_HOME = "ShortcutBadger is currently not support the home launcher package \"%s\"";
@@ -31,6 +39,8 @@ public abstract class ShortcutBadger {
private static final int MIN_BADGE_COUNT = 0;
private static final int MAX_BADGE_COUNT = 99;
+ private static ShortcutBadger sShortcutBadger;
+
private ShortcutBadger() {
}
@@ -55,41 +65,64 @@ public abstract class ShortcutBadger {
ResolveInfo resolveInfo = context.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
String currentHomePackage = resolveInfo.activityInfo.packageName;
- //different home launcher packages use different way adding badges
- ShortcutBadger mShortcutBadger = null;
- if (HOME_PACKAGE_SONY.equals(currentHomePackage)) {
- mShortcutBadger = new SonyHomeBadger(context);
- } else if (HOME_PACKAGE_SAMSUNG.equals(currentHomePackage)) {
- mShortcutBadger = new SamsungHomeBadger(context);
- } else if (HOME_PACKAGE_LG.equals(currentHomePackage)) {
- mShortcutBadger = new LGHomeBadger(context);
- } else if (HOME_PACKAGE_HTC.equals(currentHomePackage)) {
-// mShortcutBadger = new hTCHomeBadger(context);
- mShortcutBadger = new NewHtcHomeBadger(context);
- } else if (HOME_PACKAGE_ANDROID.equals(currentHomePackage)) {
- mShortcutBadger = new AndroidHomeBadger(context);
- } else if (HOME_PACKAGE_APEX.equals(currentHomePackage)) {
- mShortcutBadger = new ApexHomeBadger(context);
- } else if (HOME_PACKAGE_ADW.equals(currentHomePackage)
- || HOME_PACKAGE_ADW_EX.equals(currentHomePackage)) {
- mShortcutBadger = new AdwHomeBadger(context);
- } else if (HOME_PACKAGE_NOVA.equals(currentHomePackage)) {
- mShortcutBadger = new NovaHomeBadger(context);
- }
+
+ ShortcutBadger shortcutBadger = getShortcutBadger(currentHomePackage, context);
//not support this home launcher package
- if (mShortcutBadger == null) {
+ if (shortcutBadger == null) {
String exceptionMessage = String.format(MESSAGE_NOT_SUPPORT_THIS_HOME, currentHomePackage);
throw new ShortcutBadgeException(exceptionMessage);
}
try {
- mShortcutBadger.executeBadge(badgeCount);
+ shortcutBadger.executeBadge(badgeCount);
} catch (Throwable e) {
throw new ShortcutBadgeException("Unable to execute badge:" + e.getMessage());
}
+ shortcutBadger.executeBadge(badgeCount);
}
+ private static ShortcutBadger getShortcutBadger(String currentHomePackage, Context context) {
+ if (sShortcutBadger != null) {
+ return sShortcutBadger;
+ }
+
+ // Workaround for Meizu:
+ // Meizu declare 'com.android.launcher', but hold something else
+ // Icons get duplicated on restart after badge change
+ if (Build.MANUFACTURER.toLowerCase().contains("meizu")) {
+ return null;
+ }
+
+
+ if (HOME_PACKAGE_SONY1.equals(currentHomePackage) ||
+ HOME_PACKAGE_SONY2.equals(currentHomePackage)) {
+ sShortcutBadger = new SonyHomeBadger(context);
+ } else if (HOME_PACKAGE_SAMSUNG1.equals(currentHomePackage) ||
+ HOME_PACKAGE_SAMSUNG2.equals(currentHomePackage)) {
+ sShortcutBadger = new SamsungHomeBadger(context);
+ } else if (HOME_PACKAGE_LG1.equals(currentHomePackage) ||
+ HOME_PACKAGE_LG2.equals(currentHomePackage)) {
+ sShortcutBadger = new LGHomeBadger(context);
+ } else if (HOME_PACKAGE_HTC.equals(currentHomePackage)) {
+ sShortcutBadger = new NewHtcHomeBadger(context);
+ } else if (HOME_PACKAGE_ANDROID1.equals(currentHomePackage) ||
+ HOME_PACKAGE_ANDROID2.equals(currentHomePackage) ||
+ HOME_PACKAGE_ANDROID3.equals(currentHomePackage)) {
+ sShortcutBadger = new AndroidHomeBadger(context);
+ } else if (HOME_PACKAGE_APEX.equals(currentHomePackage)) {
+ sShortcutBadger = new ApexHomeBadger(context);
+ } else if (HOME_PACKAGE_ADW.equals(currentHomePackage)
+ || HOME_PACKAGE_ADW_EX.equals(currentHomePackage)) {
+ sShortcutBadger = new AdwHomeBadger(context);
+ } else if (HOME_PACKAGE_NOVA.equals(currentHomePackage)) {
+ sShortcutBadger = new NovaHomeBadger(context);
+ }
+
+
+ return sShortcutBadger;
+ }
+
protected String getEntryActivityName() {
ComponentName componentName = mContext.getPackageManager().getLaunchIntentForPackage(mContext.getPackageName()).getComponent();
return componentName.getClassName();
diff --git a/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/AndroidHomeBadger.java b/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/AndroidHomeBadger.java
index 171d910..9d0b9e7 100644
--- a/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/AndroidHomeBadger.java
+++ b/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/AndroidHomeBadger.java
@@ -9,11 +9,7 @@ import me.leolin.shortcutbadger.ShortcutBadgeException;
import me.leolin.shortcutbadger.ShortcutBadger;
/**
- * Created with IntelliJ IDEA.
- * User: leolin
- * Date: 2013/11/14
- * Time: 下午7:15
- * To change this template use File | Settings | File Templates.
+ * @author Leo Lin
*/
public class AndroidHomeBadger extends ShortcutBadger {
private static final String CONTENT_URI = "content://com.android.launcher2.settings/favorites?notify=true";
diff --git a/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/LGHomeBadger.java b/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/LGHomeBadger.java
index 4876470..08d65a0 100644
--- a/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/LGHomeBadger.java
+++ b/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/LGHomeBadger.java
@@ -5,11 +5,7 @@ import android.content.Intent;
import me.leolin.shortcutbadger.ShortcutBadger;
/**
- * Created with IntelliJ IDEA.
- * User: leolin
- * Date: 2013/11/14
- * Time: 下午5:55
- * To change this template use File | Settings | File Templates.
+ * @author Leo Lin
*/
public class LGHomeBadger extends ShortcutBadger {
diff --git a/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/NewHtcHomeBadger.java b/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/NewHtcHomeBadger.java
index e031067..6201b2d 100644
--- a/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/NewHtcHomeBadger.java
+++ b/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/NewHtcHomeBadger.java
@@ -7,7 +7,7 @@ import me.leolin.shortcutbadger.ShortcutBadgeException;
import me.leolin.shortcutbadger.ShortcutBadger;
/**
- * @author Leolin
+ * @author Leo Lin
*/
public class NewHtcHomeBadger extends ShortcutBadger {
diff --git a/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/SamsungHomeBadger.java b/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/SamsungHomeBadger.java
index daa9f64..ea9f2c5 100644
--- a/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/SamsungHomeBadger.java
+++ b/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/SamsungHomeBadger.java
@@ -7,16 +7,14 @@ import android.database.Cursor;
import android.net.Uri;
import me.leolin.shortcutbadger.ShortcutBadgeException;
import me.leolin.shortcutbadger.ShortcutBadger;
+import me.leolin.shortcutbadger.util.CloseHelper;
/**
- * Created with IntelliJ IDEA.
- * User: leolin
- * Date: 2013/11/14
- * Time: 下午7:15
- * To change this template use File | Settings | File Templates.
+ * @author Leo Lin
*/
public class SamsungHomeBadger extends ShortcutBadger {
private static final String CONTENT_URI = "content://com.sec.badge/apps?notify=true";
+ private static final String[] CONTENT_PROJECTION = new String[]{"_id",};
public SamsungHomeBadger(Context context) {
super(context);
@@ -26,20 +24,29 @@ public class SamsungHomeBadger extends ShortcutBadger {
protected void executeBadge(int badgeCount) throws ShortcutBadgeException {
Uri mUri = Uri.parse(CONTENT_URI);
ContentResolver contentResolver = mContext.getContentResolver();
- Cursor cursor = contentResolver.query(mUri, new String[]{"_id",}, "package=?", new String[]{getContextPackageName()}, null);
- if (cursor.moveToNext()) {
- int id = cursor.getInt(0);
- ContentValues contentValues = new ContentValues();
- contentValues.put("badgecount", badgeCount);
- contentResolver.update(mUri, contentValues, "_id=?", new String[]{String.valueOf(id)});
- } else {
- ContentValues contentValues = new ContentValues();
- contentValues.put("package", getContextPackageName());
- contentValues.put("class", getEntryActivityName());
- contentValues.put("badgecount", badgeCount);
- contentResolver.insert(mUri, contentValues);
+ Cursor cursor = null;
+ try {
+ cursor = contentResolver.query(mUri, CONTENT_PROJECTION, "package=?", new String[]{getContextPackageName()}, null);
+ if (cursor != null) {
+ while (cursor.moveToNext()) {
+ int id = cursor.getInt(0);
+ ContentValues contentValues = getContentValues(badgeCount);
+ contentResolver.update(mUri, contentValues, "_id=?", new String[]{String.valueOf(id)});
+ }
+ } else {
+ ContentValues contentValues = getContentValues(badgeCount);
+ contentResolver.insert(mUri, contentValues);
+ }
+ } finally {
+ CloseHelper.close(cursor);
}
+ }
-
+ private ContentValues getContentValues(int badgeCount) {
+ ContentValues contentValues = new ContentValues();
+ contentValues.put("package", getContextPackageName());
+ contentValues.put("class", getEntryActivityName());
+ contentValues.put("badgecount", badgeCount);
+ return contentValues;
}
}
diff --git a/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/SonyHomeBadger.java b/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/SonyHomeBadger.java
index b273e7b..d4da54c 100644
--- a/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/SonyHomeBadger.java
+++ b/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/SonyHomeBadger.java
@@ -5,11 +5,7 @@ import android.content.Intent;
import me.leolin.shortcutbadger.ShortcutBadger;
/**
- * Created with IntelliJ IDEA.
- * User: leolin
- * Date: 2013/11/14
- * Time: 下午5:55
- * To change this template use File | Settings | File Templates.
+ * @author Leo Lin
*/
public class SonyHomeBadger extends ShortcutBadger {
diff --git a/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/hTCHomeBadger.java b/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/hTCHomeBadger.java
deleted file mode 100644
index bf22710..0000000
--- a/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/impl/hTCHomeBadger.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package me.leolin.shortcutbadger.impl;
-
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import me.leolin.shortcutbadger.ShortcutBadgeException;
-import me.leolin.shortcutbadger.ShortcutBadger;
-import me.leolin.shortcutbadger.util.ImageUtil;
-
-/**
- * Created with IntelliJ IDEA.
- * User: leolin
- * Date: 2013/11/14
- * Time: 下午7:15
- * To change this template use File | Settings | File Templates.
- */
-@Deprecated
-public class hTCHomeBadger extends ShortcutBadger {
- private static final String CONTENT_URI = "content://com.htc.launcher.settings/favorites?notify=true";
-
- public hTCHomeBadger(Context context) {
- super(context);
- }
-
- @Override
- protected void executeBadge(int badgeCount) throws ShortcutBadgeException {
- ContentResolver contentResolver = mContext.getContentResolver();
- Uri mUri = Uri.parse(CONTENT_URI);
- String appName = mContext.getResources().getText(mContext.getResources().getIdentifier("app_name",
- "string", getContextPackageName())).toString();
-
- boolean supportNotifyCount = true;
- try {
- Cursor cursor = contentResolver.query(mUri, new String[]{"notifyCount"}, "title=?", new String[]{appName}, null);
- } catch (Throwable e) {
- supportNotifyCount = false;
- }
-
- if (supportNotifyCount) {
- ContentValues contentValues = new ContentValues();
- contentValues.put("notifyCount", badgeCount);
- contentResolver.update(mUri, contentValues, "title=?", new String[]{appName});
- } else {
- byte[] bytes = ImageUtil.drawBadgeOnAppIcon(mContext, badgeCount);
-
-
- ContentValues contentValues = new ContentValues();
- contentValues.put("iconType", 1);
- contentValues.put("itemType", 1);
- contentValues.put("icon", bytes);
- contentResolver.update(mUri, contentValues, "title=?", new String[]{appName});
- }
-
-
- }
-}
diff --git a/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/util/CloseHelper.java b/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/util/CloseHelper.java
new file mode 100644
index 0000000..048eba1
--- /dev/null
+++ b/ShortcutBadger/src/main/java/me/leolin/shortcutbadger/util/CloseHelper.java
@@ -0,0 +1,14 @@
+package me.leolin.shortcutbadger.util;
+
+import android.database.Cursor;
+
+/**
+ * @author leolin
+ */
+public class CloseHelper {
+ public static void close(Cursor cursor) {
+ if (cursor != null && !cursor.isClosed()) {
+ cursor.close();
+ }
+ }
+}
diff --git a/build.gradle b/build.gradle
index 0a444ef..72ffcf7 100644
--- a/build.gradle
+++ b/build.gradle
@@ -4,7 +4,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:0.12.2'
+ classpath 'com.android.tools.build:gradle:1.0.+'
classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.+'
}
}
@@ -17,7 +17,7 @@ subprojects{
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:0.12.2'
+ classpath 'com.android.tools.build:gradle:1.0.+'
classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.+'
}
}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 0087cd3..2322723 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 7a73d23..65681fa 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,5 @@
-#Fri Oct 10 21:55:32 CST 2014
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-1.12-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.2-bin.zip
diff --git a/proguard-rules.pro b/proguard-rules.pro
new file mode 100644
index 0000000..9f2333c
--- /dev/null
+++ b/proguard-rules.pro
@@ -0,0 +1,19 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /home/mik/sdk/android-sdk-linux/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+-dontshrink
\ No newline at end of file
diff --git a/src/main/java/com/shortcutBadger/impl/CloseHelper.java b/src/main/java/com/shortcutBadger/impl/CloseHelper.java
new file mode 100644
index 0000000..ca30ab7
--- /dev/null
+++ b/src/main/java/com/shortcutBadger/impl/CloseHelper.java
@@ -0,0 +1,11 @@
+package com.shortcutBadger.impl;
+
+import android.database.Cursor;
+
+public class CloseHelper {
+ public static void close(Cursor cursor) {
+ if (cursor != null && !cursor.isClosed()) {
+ cursor.close();
+ }
+ }
+}