1111import java .util .Collection ;
1212import java .util .Iterator ;
1313import java .util .LinkedHashMap ;
14+ import java .util .LinkedHashSet ;
1415import java .util .Map ;
1516import java .util .Set ;
1617import java .util .Spliterator ;
1920import de .robv .android .xposed .XC_MethodReplacement ;
2021import de .robv .android .xposed .XSharedPreferences ;
2122import de .robv .android .xposed .XposedBridge ;
23+ import de .robv .android .xposed .XposedHelpers ;
24+ import lombok .Setter ;
2225
2326public class PinnedLimit extends Feature {
2427
@@ -33,11 +36,23 @@ public void doHook() throws Throwable {
3336 var pinnedSetMethod = Unobfuscator .loadPinnedHashSetMethod (classLoader );
3437 var pinnedInChatMethod = Unobfuscator .loadPinnedInChatMethod (classLoader );
3538
39+
3640 // increase pinned limit in chat to 60
3741 XposedBridge .hookMethod (pinnedInChatMethod , XC_MethodReplacement .returnConstant (60 ));
3842
43+ // Fix bug in initialCapacity of LinkedHashSet
44+ XposedHelpers .findAndHookConstructor (LinkedHashSet .class , int .class , new XC_MethodHook () {
45+ @ Override
46+ protected void beforeHookedMethod (MethodHookParam param ) throws Throwable {
47+ if ((int ) param .args [0 ] < 0 ) {
48+ param .args [0 ] = Math .abs ((int ) param .args [0 ]);
49+ }
50+ }
51+ });
52+
3953 // This creates a modified linkedhashMap to return 0 if the fixed list is less than 60.
4054 XposedBridge .hookMethod (pinnedSetMethod , new XC_MethodHook () {
55+
4156 @ Override
4257 @ SuppressWarnings ("unchecked" )
4358 protected void afterHookedMethod (MethodHookParam param ) throws Throwable {
@@ -63,14 +78,15 @@ public String getPluginName() {
6378 }
6479
6580
81+ @ Setter
6682 private static class PinnedLinkedHashMap <T > extends LinkedHashMap <T , T > {
6783
6884 @ Override
6985 public int size () {
7086 if (super .size () >= limit ) {
71- return 3 ;
87+ return super . size () ;
7288 }
73- return -60 ;
89+ return -this . limit ;
7490 }
7591
7692 private int limit ;
@@ -81,16 +97,12 @@ public Set<T> keySet() {
8197 return new PinnedKeySet <>(this , super .keySet ());
8298 }
8399
84- public void setLimit (int i ) {
85- this .limit = i ;
86- }
87-
88100 static class PinnedKeySet <T > implements Set <T > {
89101
90- private final Set set ;
91- private final PinnedLinkedHashMap pinnedKeySet ;
102+ private final Set < T > set ;
103+ private final PinnedLinkedHashMap < T > pinnedKeySet ;
92104
93- public PinnedKeySet (PinnedLinkedHashMap <T > pinnedKeySet , Set set ) {
105+ public PinnedKeySet (PinnedLinkedHashMap <T > pinnedKeySet , Set < T > set ) {
94106 this .pinnedKeySet = pinnedKeySet ;
95107 this .set = set ;
96108 }
@@ -125,11 +137,11 @@ public Object[] toArray() {
125137 @ NonNull
126138 @ Override
127139 public <T1 > T1 [] toArray (@ NonNull T1 [] a ) {
128- return ( T1 []) set .toArray (a );
140+ return set .toArray (a );
129141 }
130142
131143 @ Override
132- public boolean add (Object t ) {
144+ public boolean add (@ Nullable T t ) {
133145 return set .add (t );
134146 }
135147
0 commit comments