77
88import com .wmods .wppenhacer .xposed .core .Feature ;
99import com .wmods .wppenhacer .xposed .core .devkit .Unobfuscator ;
10+ import com .wmods .wppenhacer .xposed .utils .DebugUtils ;
1011
1112import java .util .ArrayList ;
1213import 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