Skip to content

Commit 3a1d758

Browse files
committed
feat: implement pinned filter method and enhance PinnedKeySet functionality
1 parent 1b67df4 commit 3a1d758

File tree

3 files changed

+77
-25
lines changed

3 files changed

+77
-25
lines changed

app/src/main/java/com/wmods/wppenhacer/utils/FeatureCatalog.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,6 @@ private static List<SearchableFeature> buildFeatureCatalog(Context context) {
8282
"general_home",
8383
Arrays.asList("backup", "restore", "force")));
8484

85-
catalog.add(new SearchableFeature("disable_ads",
86-
context.getString(R.string.disable_ads),
87-
context.getString(R.string.disable_ads_sum),
88-
SearchableFeature.Category.GENERAL_HOME,
89-
SearchableFeature.FragmentType.GENERAL,
90-
"general_home",
91-
Arrays.asList("ads", "advertising", "block")));
92-
9385
catalog.add(new SearchableFeature("lite_mode",
9486
context.getString(R.string.lite_mode),
9587
context.getString(R.string.lite_mode_sum),

app/src/main/java/com/wmods/wppenhacer/xposed/core/devkit/Unobfuscator.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2665,4 +2665,21 @@ public static Class<?>[] loadSharedPreferencesClasses(ClassLoader classLoader) t
26652665
.toArray(Class[]::new);
26662666
});
26672667
}
2668+
2669+
public static Method loadPinnedFilterMethod(ClassLoader classLoader) throws Exception {
2670+
return UnobfuscatorCache.getInstance().getMethod(classLoader, () -> {
2671+
var method = findFirstMethodUsingStrings(classLoader, StringMatchType.Contains, "pinSelectedJids");
2672+
var methodData = dexkit.getMethodData(method);
2673+
var invokes = methodData.getInvokes();
2674+
for (var invoke : invokes) {
2675+
if (!invoke.isMethod()) continue;
2676+
var methodInstance = invoke.getMethodInstance(classLoader);
2677+
if (!Set.class.isAssignableFrom(methodInstance.getReturnType()))
2678+
continue;
2679+
if (methodInstance.getParameterCount() == 2 && methodInstance.getParameterTypes()[0] == Iterable.class && methodInstance.getParameterTypes()[1] == Set.class)
2680+
return methodInstance;
2681+
}
2682+
throw new NoSuchMethodException("PinnedLinkedHashMethod not found");
2683+
});
2684+
}
26682685
}

app/src/main/java/com/wmods/wppenhacer/xposed/features/general/PinnedLimit.java

Lines changed: 60 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import com.wmods.wppenhacer.xposed.core.Feature;
99
import com.wmods.wppenhacer.xposed.core.devkit.Unobfuscator;
10+
import com.wmods.wppenhacer.xposed.utils.DebugUtils;
1011

1112
import java.util.ArrayList;
1213
import java.util.Collection;
@@ -33,11 +34,9 @@ public PinnedLimit(@NonNull ClassLoader loader, @NonNull XSharedPreferences pref
3334
@Override
3435
@SuppressLint("DiscouragedApi")
3536
public void doHook() throws Throwable {
36-
37-
var pinnedSetMethod = Unobfuscator.loadPinnedHashSetMethod(classLoader);
37+
var pinnedHashSetMethod = Unobfuscator.loadPinnedHashSetMethod(classLoader);
3838
var pinnedInChatMethod = Unobfuscator.loadPinnedInChatMethod(classLoader);
3939

40-
4140
// increase pinned limit in chat to 60
4241
XposedBridge.hookMethod(pinnedInChatMethod, XC_MethodReplacement.returnConstant(60));
4342

@@ -63,7 +62,7 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
6362

6463

6564
// This creates a modified linkedhashMap to return 0 if the fixed list is less than 60.
66-
XposedBridge.hookMethod(pinnedSetMethod, new XC_MethodHook() {
65+
XposedBridge.hookMethod(pinnedHashSetMethod, new XC_MethodHook() {
6766

6867
@Override
6968
@SuppressWarnings("unchecked")
@@ -81,6 +80,26 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
8180
}
8281
});
8382

83+
var method = Unobfuscator.loadPinnedFilterMethod(classLoader);
84+
XposedBridge.hookMethod(method, new XC_MethodHook() {
85+
@Override
86+
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
87+
if (!(param.args[0] instanceof PinnedLinkedHashMap.PinnedKeySet<?>)) {
88+
return;
89+
}
90+
var set = (Set) param.getResult();
91+
PinnedLinkedHashMap<Object> pinnedMod;
92+
pinnedMod = new PinnedLinkedHashMap<>();
93+
pinnedMod.setLimit(prefs.getBoolean("pinnedlimit", false) ? 60 : 3);
94+
for (Object item : set) {
95+
pinnedMod.put(item, item);
96+
}
97+
PinnedLinkedHashMap.PinnedKeySet<Object> newKeySet = pinnedMod.keySet();
98+
newKeySet.setDisableInterator(false);
99+
param.setResult(pinnedMod.keySet());
100+
}
101+
});
102+
84103
}
85104

86105
@NonNull
@@ -105,19 +124,13 @@ public int size() {
105124

106125
@NonNull
107126
@Override
108-
public Set<T> keySet() {
127+
public PinnedKeySet<T> keySet() {
109128
return new PinnedKeySet<>(this, super.keySet());
110129
}
111130

112-
static class PinnedKeySet<T> implements Set<T> {
113-
114-
private final Set<T> set;
115-
private final PinnedLinkedHashMap<T> pinnedKeySet;
131+
record PinnedKeySet<T>(PinnedLinkedHashMap<T> pinnedKeySet, Set<T> set) implements Set<T> {
116132

117-
public PinnedKeySet(PinnedLinkedHashMap<T> pinnedKeySet, Set<T> set) {
118-
this.pinnedKeySet = pinnedKeySet;
119-
this.set = set;
120-
}
133+
private static boolean disableInterator = true;
121134

122135
@Override
123136
public int size() {
@@ -137,6 +150,21 @@ public boolean contains(@Nullable Object o) {
137150
@NonNull
138151
@Override
139152
public Iterator<T> iterator() {
153+
if (disableInterator) {
154+
if (pinnedKeySet.size() < pinnedKeySet.limit) {
155+
return new Iterator<T>() {
156+
@Override
157+
public boolean hasNext() {
158+
return false;
159+
}
160+
161+
@Override
162+
public T next() {
163+
return null;
164+
}
165+
};
166+
}
167+
}
140168
return set.iterator();
141169
}
142170

@@ -154,22 +182,33 @@ public <T1> T1[] toArray(@NonNull T1[] a) {
154182

155183
@Override
156184
public boolean add(@Nullable T t) {
157-
return set.add(t);
185+
var hadKey = pinnedKeySet.containsKey(t);
186+
pinnedKeySet.put(t, t);
187+
return !hadKey;
158188
}
159189

160190
@Override
161191
public boolean remove(@Nullable Object o) {
162-
return set.remove(o);
192+
var hadKey = pinnedKeySet.containsKey(o);
193+
if (hadKey) {
194+
pinnedKeySet.remove(o);
195+
}
196+
return hadKey;
163197
}
164198

199+
165200
@Override
166201
public boolean containsAll(@NonNull Collection<?> c) {
167202
return set.containsAll(c);
168203
}
169204

170205
@Override
171206
public boolean addAll(@NonNull Collection<? extends T> c) {
172-
return false;
207+
var changed = false;
208+
for (T item : c) {
209+
changed |= add(item);
210+
}
211+
return changed;
173212
}
174213

175214
@Override
@@ -193,7 +232,11 @@ public void clear() {
193232
public Spliterator<T> spliterator() {
194233
return set.spliterator();
195234
}
235+
236+
public void setDisableInterator(boolean b) {
237+
this.disableInterator = b;
238+
}
196239
}
197240
}
198241

199-
}
242+
}

0 commit comments

Comments
 (0)