Skip to content

Commit da9623f

Browse files
committed
对小米推送的小图标(smallIcon)染色,修正底层实现错误引起的内嵌小米推送图标(mipush_small_notification)不生效的问题
1 parent 4e81319 commit da9623f

File tree

6 files changed

+164
-32
lines changed

6 files changed

+164
-32
lines changed

src/main/java/com/oasisfeng/nevo/decorators/MIUIDecorator.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@
1515
import de.robv.android.xposed.XposedHelpers;
1616

1717
import com.oasisfeng.nevo.xposed.R;
18+
import com.oasisfeng.nevo.decorators.media.ColorUtil;
1819

1920
import top.trumeet.common.cache.IconCache;
2021

2122
public class MIUIDecorator extends BigTextDecorator {
2223

24+
private static final String NOTIFICATION_ICON = "mipush_notification";
2325
private static final String NOTIFICATION_SMALL_ICON = "mipush_small_notification";
2426
private static final String TAG = "MIUIDecorator";
2527

@@ -31,9 +33,12 @@ private static void setSmallIcon(Notification n, Icon icon) {
3133
public void apply(StatusBarNotification evolving) {
3234
super.apply(evolving);
3335
final Notification n = evolving.getNotification();
34-
final Context context = getPackageContext();
36+
Icon defIcon;
37+
{
38+
final Context context = getPackageContext();
39+
defIcon = Icon.createWithResource(context, R.drawable.mipush_small_notification);
40+
}
3541
Log.d(TAG, "begin modifying ");
36-
Icon defIcon = Icon.createWithResource(context, R.drawable.mipush_small_notification);
3742
String packageName = null;
3843
try {
3944
packageName = evolving.getPackageName();
@@ -48,19 +53,25 @@ public void apply(StatusBarNotification evolving) {
4853
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
4954
// do nothing
5055
} else {
56+
final IconCache cache = IconCache.getInstance();
57+
final Context context = getPackageContext(packageName);
5158
int iconId;
52-
// Log.d(TAG, "packageName: " + packageName);
53-
iconId = context.getResources().getIdentifier(NOTIFICATION_SMALL_ICON, "drawable", packageName);
54-
if (iconId > 0) // has icon
59+
if ((iconId = context.getResources().getIdentifier(NOTIFICATION_SMALL_ICON, "drawable", packageName)) != 0) { // has small icon
60+
Log.d("inspect", "iconId0 " + iconId);
61+
setSmallIcon(n, Icon.createWithResource(packageName, iconId));
62+
} else if ((iconId = context.getResources().getIdentifier(NOTIFICATION_ICON, "drawable", packageName)) != 0) { // has icon
63+
Log.d("inspect", "iconId1 " + iconId);
5564
setSmallIcon(n, Icon.createWithResource(packageName, iconId));
56-
if (iconId <= 0) { // does not have icon
57-
Icon iconCache = IconCache.getInstance().getIconCache(context, packageName, (ctx, b) -> Icon.createWithBitmap(b));
65+
} else { // does not have icon
66+
Log.d("inspect", "iconId2 " + iconId);
67+
Icon iconCache = cache.getIconCache(context, packageName, (ctx, b) -> Icon.createWithBitmap(b));
5868
if (iconCache != null) {
5969
setSmallIcon(n, iconCache);
6070
} else {
6171
setSmallIcon(n, defIcon);
6272
}
6373
}
74+
n.color = cache.getAppColor(context, packageName, (ctx, b) -> ColorUtil.getColor(b)[0]);
6475
}
6576
Log.d(TAG, "end modifying");
6677
}

src/main/java/com/oasisfeng/nevo/decorators/media/ColorUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public static int[] getColor(Bitmap bitmap){
1717
if (bitmap != null){
1818
Palette palette = Palette.from(bitmap).generate();
1919
Palette.Swatch swatch = palette.getDominantSwatch();
20-
if (swatch!=null){
20+
if (swatch != null){
2121
backgroundColor = swatch.getRgb();
2222
textColor = getTextColor(palette,backgroundColor);
2323
}

src/main/java/com/oasisfeng/nevo/sdk/NevoDecoratorService.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,14 @@ public static void setNLS(NotificationListenerService nls) {
5757
}
5858

5959
protected static Context getPackageContext() {
60-
return getPackageContext(BuildConfig.APPLICATION_ID);
60+
if (packageContext == null)
61+
packageContext = getPackageContext(BuildConfig.APPLICATION_ID);
62+
return packageContext;
6163
}
6264

6365
protected static Context getPackageContext(String packageName) {
6466
try {
65-
if (packageContext == null)
66-
packageContext = getAppContext().createPackageContext(packageName, Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
67-
return packageContext;
67+
return getAppContext().createPackageContext(packageName, Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
6868
} catch (PackageManager.NameNotFoundException ig) { return null; }
6969
}
7070

Lines changed: 89 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,100 @@
11
package com.oasisfeng.nevo.xposed;
22

33
import android.app.Activity;
4+
import android.content.Context;
45
import android.content.Intent;
6+
import android.content.pm.PackageInfo;
7+
import android.content.pm.PackageManager;
8+
import android.graphics.drawable.Icon;
59
import android.net.Uri;
610
import android.os.Bundle;
11+
import android.util.Log;
712
import android.view.View;
13+
import android.view.ViewGroup;
14+
import android.widget.BaseAdapter;
15+
import android.widget.ImageView;
16+
import android.widget.ListView;
17+
import android.widget.TextView;
18+
19+
import java.util.List;
20+
21+
import top.trumeet.common.cache.IconCache;
22+
23+
import com.oasisfeng.nevo.decorators.media.ColorUtil;
824

925
public class MainActivity extends Activity {
26+
private static final String NOTIFICATION_ICON = "mipush_notification";
27+
private static final String NOTIFICATION_SMALL_ICON = "mipush_small_notification";
28+
29+
private ListView listView;
30+
private IconCache cache;
31+
32+
@Override
33+
protected void onCreate(Bundle savedInstanceState) {
34+
super.onCreate(savedInstanceState);
35+
listView = new ListView(this);
36+
cache = IconCache.getInstance();
37+
final PackageManager manager = getPackageManager();
38+
final List<PackageInfo> packages = manager.getInstalledPackages(0);
39+
listView.setAdapter(new BaseAdapter() {
40+
@Override
41+
public int getCount() {
42+
return packages.size();
43+
}
44+
45+
@Override
46+
public PackageInfo getItem(int position) {
47+
return packages.get(position);
48+
}
49+
50+
@Override
51+
public long getItemId(int position) {
52+
return packages.get(position).hashCode();
53+
}
54+
55+
@Override
56+
public View getView(int position, View convertView, ViewGroup parent) {
57+
View view = null;
58+
59+
// 如果convertView不为空则复用
60+
if (convertView == null) {
61+
view = View.inflate(MainActivity.this, R.layout.app_info, null);
62+
}else {
63+
view = convertView;
64+
}
65+
66+
PackageInfo info = getItem(position);
67+
// applicationLabel
68+
TextView appName = (TextView) view.findViewById(R.id.appName);
69+
appName.setText(manager.getApplicationLabel(info.applicationInfo));
70+
// applicationIcon
71+
ImageView appIcon = (ImageView) view.findViewById(R.id.appIcon);
72+
appIcon.setImageDrawable(manager.getApplicationIcon(info.applicationInfo));
73+
// applicationLogo
74+
ImageView appLogo = (ImageView) view.findViewById(R.id.appLogo);
75+
appLogo.setImageDrawable(manager.getApplicationLogo(info.applicationInfo));
76+
// smallIcon
77+
ImageView smallIcon = (ImageView) view.findViewById(R.id.smallIcon);
78+
ImageView gen = (ImageView) view.findViewById(R.id.gen);
79+
try {
80+
final Context context = createPackageContext(info.packageName, 0);
81+
int iconId;
82+
if ((iconId = context.getResources().getIdentifier(NOTIFICATION_SMALL_ICON, "drawable", info.packageName)) != 0) // has icon
83+
smallIcon.setImageIcon(Icon.createWithResource(info.packageName, iconId));
84+
else if ((iconId = context.getResources().getIdentifier(NOTIFICATION_ICON, "drawable", info.packageName)) != 0)
85+
smallIcon.setImageIcon(Icon.createWithResource(info.packageName, iconId));
86+
else
87+
smallIcon.setImageIcon(null);
88+
Icon iconCache = cache.getIconCache(context, info.packageName, (ctx, b) -> Icon.createWithBitmap(b));
89+
if (iconCache != null) {
90+
gen.setImageIcon(iconCache);
91+
gen.setColorFilter(cache.getAppColor(context, info.packageName, (ctx, b) -> ColorUtil.getColor(b)[0]));
92+
}
93+
} catch (IllegalArgumentException | PackageManager.NameNotFoundException ign) { Log.d("inspect", "ex " + info.packageName);}
94+
return view;
95+
}
96+
});
97+
setContentView(listView);
98+
}
1099

11-
@Override
12-
protected void onCreate(Bundle savedInstanceState) {
13-
super.onCreate(savedInstanceState);
14-
setContentView(R.layout.activity_main);
15-
}
16-
17-
public void github(View v){
18-
Intent intent = new Intent(Intent.ACTION_VIEW);
19-
intent.setData(Uri.parse("https://github.com/Qiwu2542284182/MusicNotification"));
20-
startActivity(intent);
21-
}
22-
23-
public void magisk(View v){
24-
Intent intent = new Intent(Intent.ACTION_VIEW);
25-
intent.setData(Uri.parse("https://pan.baidu.com/s/1-w5vB4Lz5NiZJFoO07dgjA"));
26-
startActivity(intent);
27-
}
28100
}

src/main/java/top/trumeet/common/cache/IconCache.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import android.graphics.Bitmap;
55
import android.graphics.drawable.Drawable;
66
import android.graphics.drawable.Icon;
7+
import android.util.Log;
78
import android.util.LruCache;
89

910
import top.trumeet.common.utils.ImgUtils;
@@ -53,8 +54,15 @@ public Bitmap getRawIconBitmap(final Context ctx, final String pkg) {
5354
@Override
5455
Bitmap gen() {
5556
try {
56-
Drawable icon = ctx.getPackageManager().getApplicationIcon(pkg);
57-
return drawableToBitmap(icon);
57+
Log.d("inspect", "context " + ctx);
58+
Drawable icon = ctx.getPackageManager().getApplicationIcon(pkg);
59+
Log.d("inspect", "icon " + icon);
60+
Bitmap r = drawableToBitmap(icon);
61+
Log.d("inspect", "bitmap " + r);
62+
return r;
63+
} catch (IllegalArgumentException ignored) {
64+
Log.d("inspect", "ooo " + pkg);
65+
return null;
5866
} catch (Exception ignored) {
5967
return null;
6068
}
@@ -73,7 +81,6 @@ Icon gen() {
7381
}.get("white_" + pkg);
7482
}
7583

76-
7784
public int getAppColor(final Context ctx, final String pkg, Converter<Bitmap, Integer> callback) {
7885
return new AbstractCacheAspect<Integer>(appColorCache) {
7986
@Override

src/main/res/layout/app_info.xml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools"
5+
android:layout_width="match_parent"
6+
android:layout_height="match_parent"
7+
android:background="#999"
8+
android:orientation="horizontal">
9+
10+
<TextView
11+
android:id="@+id/appName"
12+
android:layout_width="200px"
13+
android:layout_height="64px"
14+
android:layout_weight="1"
15+
android:gravity="center_vertical"
16+
tools:text="YouTube" />
17+
18+
<ImageView
19+
android:id="@+id/appIcon"
20+
android:layout_width="64px"
21+
android:layout_height="64px"
22+
android:layout_weight="1" />
23+
24+
<ImageView
25+
android:id="@+id/appLogo"
26+
android:layout_width="64px"
27+
android:layout_height="64px"
28+
android:layout_weight="1" />
29+
30+
<ImageView
31+
android:id="@+id/smallIcon"
32+
android:layout_width="64px"
33+
android:layout_height="64px"
34+
android:layout_weight="1" />
35+
36+
<ImageView
37+
android:id="@+id/gen"
38+
android:layout_width="64px"
39+
android:layout_height="64px"
40+
android:layout_weight="1" />
41+
42+
</LinearLayout>

0 commit comments

Comments
 (0)