Use reflection to get support launchers for badger.

This commit is contained in:
Leo Lin 2015-03-30 11:49:58 +08:00
parent 61c039ee5b
commit b16754efa7
14 changed files with 158 additions and 64 deletions

View File

@ -53,6 +53,8 @@ HOW TO USE
<br/>
<br/>
<br/>
LICENSE
===================================
<br/>

View File

@ -17,5 +17,6 @@ android {
dependencies {
compile 'me.leolin:ShortcutBadger:1.0.+@aar'
// compile 'me.leolin:ShortcutBadger:1.0.+@aar'
compile project(':ShortcutBadger')
}

View File

@ -1,10 +1,14 @@
package me.leolin.shortcutbadger.example;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import me.leolin.shortcutbadger.ShortcutBadgeException;
import me.leolin.shortcutbadger.ShortcutBadger;
@ -41,6 +45,16 @@ public class MainActivity extends Activity {
}
}
});
//find the home launcher Package
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
ResolveInfo resolveInfo = getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
String currentHomePackage = resolveInfo.activityInfo.packageName;
TextView textViewHomePackage = (TextView) findViewById(R.id.textViewHomePackage);
textViewHomePackage.setText("launcher:" + currentHomePackage);
}

View File

@ -8,13 +8,21 @@
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:id="@+id/textViewHomePackage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"/>
<EditText
android:id="@+id/numInput"
android:layout_below="@id/textViewHomePackage"
android:inputType="numberDecimal"
android:layout_width="match_parent" android:layout_height="wrap_content"
/>
<Button android:id="@+id/btnSetBadge"
android:layout_below="@id/numInput"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="Set badge"
android:layout_centerVertical="true" android:layout_centerHorizontal="true"/>

View File

@ -8,31 +8,30 @@ import android.content.pm.ResolveInfo;
import android.os.Build;
import me.leolin.shortcutbadger.impl.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.LinkedList;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* User: leolin
* Date: 2013/11/14
* Time: 下午5:51
* To change this template use File | Settings | File Templates.
* @author Leo Lin
*/
public abstract class ShortcutBadger {
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_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 HOME_PACKAGE_SOLID = "com.majeur.launcher";
private static final List<Class<? extends ShortcutBadger>> BADGERS = new LinkedList<Class<? extends ShortcutBadger>>();
static {
BADGERS.add(AdwHomeBadger.class);
BADGERS.add(AndroidHomeBadger.class);
BADGERS.add(ApexHomeBadger.class);
BADGERS.add(LGHomeBadger.class);
BADGERS.add(NewHtcHomeBadger.class);
BADGERS.add(NovaHomeBadger.class);
BADGERS.add(SamsungHomeBadger.class);
BADGERS.add(SolidHomeBadger.class);
BADGERS.add(SonyHomeBadger.class);
}
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\"";
@ -40,7 +39,7 @@ 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 static ShortcutBadger mShortcutBadger;
private ShortcutBadger() {
}
@ -67,14 +66,15 @@ public abstract class ShortcutBadger {
String currentHomePackage = resolveInfo.activityInfo.packageName;
ShortcutBadger shortcutBadger = getShortcutBadger(currentHomePackage, context);
//not support this home launcher package
if (shortcutBadger == null) {
String exceptionMessage = String.format(MESSAGE_NOT_SUPPORT_THIS_HOME, currentHomePackage);
throw new ShortcutBadgeException(exceptionMessage);
}
try {
ShortcutBadger shortcutBadger = getShortcutBadger(currentHomePackage, context);
//not support this home launcher package
if (shortcutBadger == null) {
String exceptionMessage = String.format(MESSAGE_NOT_SUPPORT_THIS_HOME, currentHomePackage);
throw new ShortcutBadgeException(exceptionMessage);
}
shortcutBadger.executeBadge(badgeCount);
} catch (Throwable e) {
throw new ShortcutBadgeException("Unable to execute badge:" + e.getMessage());
@ -82,9 +82,9 @@ public abstract class ShortcutBadger {
}
private static ShortcutBadger getShortcutBadger(String currentHomePackage, Context context) {
if (sShortcutBadger != null) {
return sShortcutBadger;
private static ShortcutBadger getShortcutBadger(String currentHomePackage, Context context) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
if (mShortcutBadger != null) {
return mShortcutBadger;
}
// Workaround for Meizu:
@ -95,36 +95,21 @@ public abstract class ShortcutBadger {
}
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);
} else if (HOME_PACKAGE_SOLID.equals(currentHomePackage)) {
sShortcutBadger = new SolidHomeBadger(context);
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;
}
}
return sShortcutBadger;
return mShortcutBadger;
}
public abstract List<String> getSupportLaunchers();
protected String getEntryActivityName() {
ComponentName componentName = mContext.getPackageManager().getLaunchIntentForPackage(mContext.getPackageName()).getComponent();
return componentName.getClassName();

View File

@ -2,10 +2,12 @@ package me.leolin.shortcutbadger.impl;
import android.content.Context;
import android.content.Intent;
import me.leolin.shortcutbadger.ShortcutBadgeException;
import me.leolin.shortcutbadger.ShortcutBadger;
import java.util.Arrays;
import java.util.List;
/**
* @author Gernot Pansy
*/
@ -27,4 +29,12 @@ public class AdwHomeBadger extends ShortcutBadger {
intent.putExtra(COUNT, badgeCount);
mContext.sendBroadcast(intent);
}
@Override
public List<String> getSupportLaunchers() {
return Arrays.asList(
"org.adw.launcher",
"org.adwfreak.launcher"
);
}
}

View File

@ -4,9 +4,12 @@ import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.net.Uri;
import me.leolin.shortcutbadger.util.ImageUtil;
import me.leolin.shortcutbadger.ShortcutBadgeException;
import me.leolin.shortcutbadger.ShortcutBadger;
import me.leolin.shortcutbadger.util.ImageUtil;
import java.util.Arrays;
import java.util.List;
/**
* @author Leo Lin
@ -32,4 +35,13 @@ public class AndroidHomeBadger extends ShortcutBadger {
contentValues.put("icon", bytes);
contentResolver.update(mUri, contentValues, "title=?", new String[]{appName});
}
@Override
public List<String> getSupportLaunchers() {
return Arrays.asList(
"com.android.launcher",
"com.android.launcher2",
"com.google.android.googlequicksearchbox"
);
}
}

View File

@ -6,6 +6,9 @@ import android.content.Intent;
import me.leolin.shortcutbadger.ShortcutBadgeException;
import me.leolin.shortcutbadger.ShortcutBadger;
import java.util.Arrays;
import java.util.List;
/**
* @author Gernot Pansy
*/
@ -29,4 +32,9 @@ public class ApexHomeBadger extends ShortcutBadger {
intent.putExtra(CLASS, getEntryActivityName());
mContext.sendBroadcast(intent);
}
@Override
public List<String> getSupportLaunchers() {
return Arrays.asList("com.anddoes.launcher");
}
}

View File

@ -4,6 +4,9 @@ import android.content.Context;
import android.content.Intent;
import me.leolin.shortcutbadger.ShortcutBadger;
import java.util.Arrays;
import java.util.List;
/**
* @author Leo Lin
*/
@ -26,4 +29,12 @@ public class LGHomeBadger extends ShortcutBadger {
intent.putExtra(INTENT_EXTRA_ACTIVITY_NAME, getEntryActivityName());
mContext.sendBroadcast(intent);
}
@Override
public List<String> getSupportLaunchers() {
return Arrays.asList(
"com.lge.launcher",
"com.lge.launcher2"
);
}
}

View File

@ -6,6 +6,9 @@ import android.content.Intent;
import me.leolin.shortcutbadger.ShortcutBadgeException;
import me.leolin.shortcutbadger.ShortcutBadger;
import java.util.Arrays;
import java.util.List;
/**
* @author Leo Lin
*/
@ -36,4 +39,9 @@ public class NewHtcHomeBadger extends ShortcutBadger {
intent.putExtra(COUNT, badgeCount);
mContext.sendBroadcast(intent);
}
@Override
public List<String> getSupportLaunchers() {
return Arrays.asList("com.htc.launcher");
}
}

View File

@ -1,19 +1,19 @@
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 java.util.Arrays;
import java.util.List;
/**
* Shortcut Badger support for Nova Launcher.
*
* <p/>
* TeslaUnread must be installed.
*
* <p/>
* User: Gernot Pansy
* Date: 2014/11/03
* Time: 7:15
@ -45,4 +45,9 @@ public class NovaHomeBadger extends ShortcutBadger {
throw new ShortcutBadgeException(ex.getMessage());
}
}
@Override
public List<String> getSupportLaunchers() {
return Arrays.asList("com.teslacoilsw.launcher");
}
}

View File

@ -9,6 +9,9 @@ import me.leolin.shortcutbadger.ShortcutBadgeException;
import me.leolin.shortcutbadger.ShortcutBadger;
import me.leolin.shortcutbadger.util.CloseHelper;
import java.util.Arrays;
import java.util.List;
/**
* @author Leo Lin
*/
@ -60,4 +63,12 @@ public class SamsungHomeBadger extends ShortcutBadger {
return contentValues;
}
@Override
public List<String> getSupportLaunchers() {
return Arrays.asList(
"com.sec.android.app.launcher",
"com.sec.android.app.twlauncher"
);
}
}

View File

@ -6,6 +6,9 @@ import android.content.Intent;
import me.leolin.shortcutbadger.ShortcutBadgeException;
import me.leolin.shortcutbadger.ShortcutBadger;
import java.util.Arrays;
import java.util.List;
/**
* @author MajeurAndroid
*/
@ -28,4 +31,9 @@ public class SolidHomeBadger extends ShortcutBadger {
intent.putExtra(CLASS, getEntryActivityName());
mContext.sendBroadcast(intent);
}
@Override
public List<String> getSupportLaunchers() {
return Arrays.asList("com.majeur.launcher");
}
}

View File

@ -4,6 +4,9 @@ import android.content.Context;
import android.content.Intent;
import me.leolin.shortcutbadger.ShortcutBadger;
import java.util.Arrays;
import java.util.List;
/**
* @author Leo Lin
*/
@ -29,4 +32,12 @@ public class SonyHomeBadger extends ShortcutBadger {
intent.putExtra(INTENT_EXTRA_SHOW_MESSAGE, badgeCount > 0);
mContext.sendBroadcast(intent);
}
@Override
public List<String> getSupportLaunchers() {
return Arrays.asList(
"com.sonyericsson.home",
"com.anddoes.launcher"
);
}
}