Skip to content

Commit 9c894fe

Browse files
committed
Fix duplicated notifications, refactor some code
1 parent 62871a8 commit 9c894fe

File tree

3 files changed

+39
-33
lines changed

3 files changed

+39
-33
lines changed

app/src/main/java/de/Maxr1998/xposed/maxlock/hooks/Apps.java

+33-28
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
import de.Maxr1998.xposed.maxlock.Common;
3131
import de.Maxr1998.xposed.maxlock.util.AppLockHelpers;
3232
import de.robv.android.xposed.XC_MethodHook;
33-
import de.robv.android.xposed.callbacks.XC_LoadPackage;
3433

34+
import static android.os.Build.VERSION.SDK_INT;
3535
import static de.Maxr1998.xposed.maxlock.Common.MAXLOCK_PACKAGE_NAME;
3636
import static de.Maxr1998.xposed.maxlock.hooks.Main.logD;
3737
import static de.Maxr1998.xposed.maxlock.util.AppLockHelpers.IMOD_RESET_ON_HOMESCREEN;
@@ -40,16 +40,15 @@
4040
import static de.Maxr1998.xposed.maxlock.util.AppLockHelpers.wasAppClosed;
4141
import static de.robv.android.xposed.XposedBridge.log;
4242
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
43-
import static de.robv.android.xposed.XposedHelpers.getObjectField;
4443

4544
@SuppressWarnings("RedundantThrows")
4645
class Apps {
4746

4847
private static String launcherPackage;
4948

50-
static void init(final XC_LoadPackage.LoadPackageParam lPParam, final SharedPreferences prefsApps, final SharedPreferences prefsHistory) {
51-
if (!prefsApps.getBoolean(lPParam.packageName, false)) {
52-
initLogging(lPParam, prefsApps, prefsHistory);
49+
static void init(final String packageName, final Context appContext, final SharedPreferences prefsApps, final SharedPreferences prefsHistory) {
50+
if (!prefsApps.getBoolean(packageName, false)) {
51+
initLogging(packageName, prefsApps, prefsHistory);
5352
return;
5453
}
5554
try {
@@ -59,21 +58,21 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
5958
final Activity activity = (Activity) param.thisObject;
6059
String activityName = activity.getClass().getName();
6160
logD("Started " + activityName + " at " + System.currentTimeMillis());
62-
if (wasAppClosed(lPParam.packageName, prefsHistory)) {
61+
if (wasAppClosed(packageName, prefsHistory)) {
6362
activity.finish();
6463
logD("Finished " + activityName);
6564
return;
6665
}
6766
if (activityName.equals("android.app.Activity") ||
68-
pass(activity.getTaskId(), lPParam.packageName, activityName, prefsApps, prefsHistory)) {
67+
pass(activity.getTaskId(), packageName, activityName, prefsApps, prefsHistory)) {
6968
return;
7069
}
7170
logD("Show lockscreen for " + activityName);
7271
Intent i = new Intent()
7372
.setComponent(new ComponentName(MAXLOCK_PACKAGE_NAME, MAXLOCK_PACKAGE_NAME + ".ui.LockActivity"))
7473
.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
75-
.putExtra(Common.INTENT_EXTRAS_NAMES, new String[]{lPParam.packageName, activityName});
76-
if (prefsApps.getBoolean(lPParam.packageName + Common.APP_FAKE_CRASH_PREFERENCE, false)) {
74+
.putExtra(Common.INTENT_EXTRAS_NAMES, new String[]{packageName, activityName});
75+
if (prefsApps.getBoolean(packageName + Common.APP_FAKE_CRASH_PREFERENCE, false)) {
7776
i.putExtra(Common.LOCK_ACTIVITY_MODE, Common.MODE_FAKE_CRASH);
7877
}
7978
activity.startActivity(i);
@@ -83,7 +82,7 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
8382
@Override
8483
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
8584
if ((boolean) param.args[0]) {
86-
if (wasAppClosed(lPParam.packageName, prefsHistory)) {
85+
if (wasAppClosed(packageName, prefsHistory)) {
8786
final Activity activity = (Activity) param.thisObject;
8887
activity.finish();
8988
logD("Closed " + activity.getClass().getName());
@@ -92,36 +91,42 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
9291
}
9392
});
9493

95-
// Notification content hiding
94+
final Resources modRes = appContext.getPackageManager().getResourcesForApplication(MAXLOCK_PACKAGE_NAME);
95+
final String replacementText = modRes.getString(modRes.getIdentifier("notification_hidden_by_maxlock", "string", MAXLOCK_PACKAGE_NAME));
96+
final int mlColor = modRes.getColor(modRes.getIdentifier("primary_red", "color", MAXLOCK_PACKAGE_NAME));
97+
98+
// Notification (content) hiding
9699
findAndHookMethod(NotificationManager.class, "notify", String.class, int.class, Notification.class, new XC_MethodHook() {
97100
@Override
98101
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
99-
Notification notification = (Notification) param.args[2];
100102
if (prefsApps.getBoolean(Common.MASTER_SWITCH_ON, true)) {
101-
if (prefsApps.getBoolean(lPParam.packageName + Common.APP_HIDE_NOTIFICATIONS_PREFERENCE, false)) {
102-
logD("Blocked notification " + param.args[1] + " from " + lPParam.packageName);
103+
if (prefsApps.getBoolean(packageName + Common.APP_HIDE_NOTIFICATIONS_PREFERENCE, false)) {
104+
logD("Blocked notification from " + packageName);
103105
param.setResult(null);
104-
} else if (prefsApps.getBoolean(lPParam.packageName + Common.APP_HIDE_NOTIFICATION_CONTENT_PREFERENCE, false)) {
105-
logD("Hiding content for notification " + param.args[1] + " from " + lPParam.packageName);
106-
Context context = (Context) getObjectField(param.thisObject, "mContext");
107-
String appName = context.getPackageManager().getApplicationInfo(lPParam.packageName, 0).loadLabel(context.getPackageManager()).toString();
108-
Resources modRes = context.getPackageManager().getResourcesForApplication(MAXLOCK_PACKAGE_NAME);
109-
String replacementText = modRes.getString(modRes.getIdentifier("notification_hidden_by_maxlock", "string", MAXLOCK_PACKAGE_NAME));
110-
Notification.Builder replacementBuilder = new Notification.Builder(context)
106+
} else if (prefsApps.getBoolean(packageName + Common.APP_HIDE_NOTIFICATION_CONTENT_PREFERENCE, false)) {
107+
logD("Hiding notification content for " + packageName);
108+
Notification notification = (Notification) param.args[2];
109+
String appName = appContext.getPackageManager().getApplicationInfo(packageName, 0).loadLabel(appContext.getPackageManager()).toString();
110+
Notification.Builder replacementBuilder = (SDK_INT > Build.VERSION_CODES.O ?
111+
new Notification.Builder(appContext, notification.getChannelId()) : new Notification.Builder(appContext))
111112
.setContentTitle(appName)
112113
.setContentText(replacementText)
113114
.setLights(notification.ledARGB, notification.ledOnMS, notification.ledOffMS)
114115
.setSound(notification.sound)
115116
.setContentIntent(notification.contentIntent)
116117
.setDeleteIntent(notification.deleteIntent)
117118
.setWhen(notification.when);
118-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
119-
replacementBuilder.setColor(modRes.getColor(modRes.getIdentifier("primary_red", "color", MAXLOCK_PACKAGE_NAME)))
119+
if (SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
120+
replacementBuilder.setColor(mlColor)
121+
.setGroup(notification.getGroup())
122+
.setSortKey(notification.getSortKey())
120123
.setSound(notification.sound, notification.audioAttributes)
121124
.setVisibility(Notification.VISIBILITY_SECRET);
122125
}
123-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
126+
if (SDK_INT >= Build.VERSION_CODES.M)
124127
replacementBuilder.setSmallIcon(notification.getSmallIcon());
128+
if (SDK_INT >= Build.VERSION_CODES.O)
129+
replacementBuilder.setGroupAlertBehavior(notification.getGroupAlertBehavior());
125130
Notification replacement = replacementBuilder.build();
126131
replacement.flags = notification.flags;
127132
// Replace notification
@@ -135,16 +140,16 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
135140
}
136141
}
137142

138-
private static void initLogging(final XC_LoadPackage.LoadPackageParam lPParam, final SharedPreferences prefsApps, final SharedPreferences prefsHistory) {
143+
private static void initLogging(final String packageName, final SharedPreferences prefsApps, final SharedPreferences prefsHistory) {
139144
try {
140-
findAndHookMethod("android.app.Activity", lPParam.classLoader, "onStart", new XC_MethodHook() {
145+
findAndHookMethod(Activity.class, "onStart", new XC_MethodHook() {
141146
@Override
142147
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
143-
addToHistory(((Activity) param.thisObject).getTaskId(), lPParam.packageName, prefsHistory);
148+
addToHistory(((Activity) param.thisObject).getTaskId(), packageName, prefsHistory);
144149
if (launcherPackage == null) {
145150
launcherPackage = AppLockHelpers.getLauncherPackage(((Activity) param.thisObject).getPackageManager());
146151
}
147-
if (lPParam.packageName.equals(launcherPackage) && prefsApps.getBoolean(IMOD_RESET_ON_HOMESCREEN, false)) {
152+
if (packageName.equals(launcherPackage) && prefsApps.getBoolean(IMOD_RESET_ON_HOMESCREEN, false)) {
148153
prefsHistory.edit().clear().apply();
149154
logD("Returned to homescreen, locked apps");
150155
}

app/src/main/java/de/Maxr1998/xposed/maxlock/hooks/Main.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class Main : IXposedHookZygoteInit, IXposedHookLoadPackage {
6767
MaxLock.PACKAGE_NAME -> MaxLock.init(lPParam, prefsHistory)
6868
DeviceAdminProtection.PACKAGE_NAME -> DeviceAdminProtection.init(lPParam)
6969
}
70-
Apps.init(lPParam, prefsApps, prefsHistory)
70+
Apps.init(lPParam.packageName, ctx, prefsApps, prefsHistory)
7171
}
7272
})
7373
}
@@ -79,7 +79,7 @@ class Main : IXposedHookZygoteInit, IXposedHookLoadPackage {
7979
@JvmStatic
8080
fun logD(message: String) {
8181
if (BuildConfig.DEBUG)
82-
log("ML: " + message)
82+
log("ML: $message")
8383
}
8484
}
8585
}

app/src/main/java/de/Maxr1998/xposed/maxlock/hooks/SystemUI.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import de.robv.android.xposed.XC_MethodHook;
3333
import de.robv.android.xposed.callbacks.XC_LoadPackage;
3434

35+
import static android.os.Build.VERSION.SDK_INT;
3536
import static de.Maxr1998.xposed.maxlock.util.AppLockHelpers.IMOD_RESET_ON_SCREEN_OFF;
3637
import static de.Maxr1998.xposed.maxlock.util.AppLockHelpers.iModActive;
3738
import static de.Maxr1998.xposed.maxlock.util.AppLockHelpers.trim;
@@ -47,8 +48,8 @@ class SystemUI {
4748

4849
static final String PACKAGE_NAME = "com.android.systemui";
4950
static final String PACKAGE_NAME_KEYGUARD = "com.android.keyguard";
50-
private static final boolean LOLLIPOP = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
51-
private static final boolean NOUGAT = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N;
51+
private static final boolean LOLLIPOP = SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
52+
private static final boolean NOUGAT = SDK_INT >= Build.VERSION_CODES.N;
5253

5354
static void init(XC_LoadPackage.LoadPackageParam lPParam, final SharedPreferences prefs, final SharedPreferences prefsApps, final SharedPreferences prefsHistory) {
5455
try {
@@ -124,7 +125,7 @@ protected void beforeHookedMethod(MethodHookParam param) {
124125
};
125126
// Hook
126127
try {
127-
findAndHookMethod(hookedClass, lPParam.classLoader, "onScreenTurnedOff", Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? new Object[]{hook} : new Object[]{int.class, hook});
128+
findAndHookMethod(hookedClass, lPParam.classLoader, "onScreenTurnedOff", SDK_INT >= Build.VERSION_CODES.M ? new Object[]{hook} : new Object[]{int.class, hook});
128129
} catch (Throwable t) {
129130
log(t);
130131
}

0 commit comments

Comments
 (0)