Skip to content

Commit 9617f42

Browse files
committed
Add cache for MessageHistory Database
Signed-off-by: Dev4Mod <[email protected]>
1 parent 72526aa commit 9617f42

File tree

1 file changed

+82
-5
lines changed

1 file changed

+82
-5
lines changed

app/src/main/java/com/wmods/wppenhacer/xposed/core/db/MessageHistory.java

Lines changed: 82 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import android.database.Cursor;
66
import android.database.sqlite.SQLiteDatabase;
77
import android.database.sqlite.SQLiteOpenHelper;
8+
import android.util.LruCache;
89

910
import androidx.annotation.Nullable;
1011

@@ -25,13 +26,23 @@ public class MessageHistory extends SQLiteOpenHelper {
2526
private static MessageHistory mInstance;
2627
private SQLiteDatabase dbWrite;
2728

29+
private static final int MESSAGE_CACHE_SIZE = 100;
30+
private static final int SEEN_MESSAGE_CACHE_SIZE = 200;
31+
private static final int SEEN_MESSAGES_LIST_CACHE_SIZE = 50;
32+
private final LruCache<Long, ArrayList<MessageItem>> messagesCache;
33+
private final LruCache<String, MessageSeenItem> seenMessageCache;
34+
private final LruCache<String, List<MessageSeenItem>> seenMessagesListCache;
35+
2836
public enum MessageType {
2937
MESSAGE_TYPE,
3038
VIEW_ONCE_TYPE
3139
}
3240

3341
public MessageHistory(Context context) {
3442
super(context, "MessageHistory.db", null, 2);
43+
messagesCache = new LruCache<>(MESSAGE_CACHE_SIZE);
44+
seenMessageCache = new LruCache<>(SEEN_MESSAGE_CACHE_SIZE);
45+
seenMessagesListCache = new LruCache<>(SEEN_MESSAGES_LIST_CACHE_SIZE);
3546
}
3647

3748
public static MessageHistory getInstance() {
@@ -51,10 +62,20 @@ public final void insertMessage(long id, String message, long timestamp) {
5162
contentValues0.put("text_data", message);
5263
contentValues0.put("editTimestamp", timestamp);
5364
dbWrite.insert("MessageHistory", null, contentValues0);
65+
66+
// Invalidate cache for this message ID
67+
messagesCache.remove(id);
5468
}
5569
}
5670

5771
public ArrayList<MessageItem> getMessages(long v) {
72+
// Check cache first
73+
ArrayList<MessageItem> cachedMessages = messagesCache.get(v);
74+
if (cachedMessages != null) {
75+
return cachedMessages;
76+
}
77+
78+
// If not in cache, query database
5879
Cursor history = dbWrite.query("MessageHistory", new String[]{"_id", "row_id", "text_data", "editTimestamp"}, "row_id=?", new String[]{String.valueOf(v)}, null, null, null);
5980
if (!history.moveToFirst()) {
6081
history.close();
@@ -69,6 +90,9 @@ public ArrayList<MessageItem> getMessages(long v) {
6990
}
7091
while (history.moveToNext());
7192
history.close();
93+
94+
// Store in cache
95+
messagesCache.put(v, messages);
7296
return messages;
7397
}
7498

@@ -82,6 +106,11 @@ public final void insertHideSeenMessage(String jid, String message_id, MessageTy
82106
content.put("message_id", message_id);
83107
content.put("type", type.ordinal());
84108
dbWrite.insert("hide_seen_messages", null, content);
109+
110+
// Invalidate caches
111+
String cacheKey = createSeenMessageCacheKey(jid, message_id, type);
112+
seenMessageCache.remove(cacheKey);
113+
invalidateSeenMessagesListCache(jid, type);
85114
}
86115
}
87116

@@ -95,12 +124,28 @@ public boolean updateViewedMessage(String jid, String message_id, MessageType ty
95124
ContentValues content = new ContentValues();
96125
content.put("viewed", viewed ? 1 : 0);
97126
dbWrite.update("hide_seen_messages", content, "_id=?", new String[]{cursor.getString(cursor.getColumnIndexOrThrow("_id"))});
127+
128+
// Update cache or invalidate
129+
String cacheKey = createSeenMessageCacheKey(jid, message_id, type);
130+
MessageSeenItem cachedItem = seenMessageCache.get(cacheKey);
131+
if (cachedItem != null && cachedItem.viewed != viewed) {
132+
seenMessageCache.remove(cacheKey);
133+
}
134+
invalidateSeenMessagesListCache(jid, type);
98135
}
99136
cursor.close();
100137
return true;
101138
}
102139

103140
public MessageSeenItem getHideSeenMessage(String jid, String message_id, MessageType type) {
141+
// Check cache first
142+
String cacheKey = createSeenMessageCacheKey(jid, message_id, type);
143+
MessageSeenItem cachedItem = seenMessageCache.get(cacheKey);
144+
if (cachedItem != null) {
145+
return cachedItem;
146+
}
147+
148+
// If not in cache, query database
104149
Cursor cursor = dbWrite.query("hide_seen_messages", new String[]{"viewed"}, "jid=? AND message_id=? AND type=?", new String[]{jid, message_id, String.valueOf(type.ordinal())}, null, null, null);
105150
if (!cursor.moveToFirst()) {
106151
cursor.close();
@@ -109,10 +154,21 @@ public MessageSeenItem getHideSeenMessage(String jid, String message_id, Message
109154
var viewed = cursor.getInt(cursor.getColumnIndexOrThrow("viewed")) == 1;
110155
var message = new MessageSeenItem(jid, message_id, viewed);
111156
cursor.close();
157+
158+
// Store in cache
159+
seenMessageCache.put(cacheKey, message);
112160
return message;
113161
}
114162

115163
public List<MessageSeenItem> getHideSeenMessages(String jid, MessageType type, boolean viewed) {
164+
// Check cache first
165+
String cacheKey = createSeenMessagesListCacheKey(jid, type, viewed);
166+
List<MessageSeenItem> cachedList = seenMessagesListCache.get(cacheKey);
167+
if (cachedList != null) {
168+
return cachedList;
169+
}
170+
171+
// If not in cache, query database
116172
Cursor cursor = dbWrite.query("hide_seen_messages", new String[]{"jid", "message_id", "viewed"}, "jid=? AND type=? AND viewed=?", new String[]{jid, String.valueOf(type.ordinal()), viewed ? "1" : "0"}, null, null, null);
117173
if (!cursor.moveToFirst()) {
118174
cursor.close();
@@ -123,12 +179,18 @@ public List<MessageSeenItem> getHideSeenMessages(String jid, MessageType type, b
123179
var message_id = cursor.getString(cursor.getColumnIndexOrThrow("message_id"));
124180
var message = new MessageSeenItem(jid, message_id, viewed);
125181
messages.add(message);
182+
183+
// Also cache individual messages
184+
String msgCacheKey = createSeenMessageCacheKey(jid, message_id, type);
185+
seenMessageCache.put(msgCacheKey, message);
126186
} while (cursor.moveToNext());
127187
cursor.close();
188+
189+
// Store in cache
190+
seenMessagesListCache.put(cacheKey, messages);
128191
return messages;
129192
}
130193

131-
132194
@Override
133195
public void onCreate(SQLiteDatabase sqLiteDatabase) {
134196
sqLiteDatabase.execSQL("create table MessageHistory(_id INTEGER PRIMARY KEY AUTOINCREMENT, row_id INTEGER NOT NULL, text_data TEXT NOT NULL, editTimestamp BIGINT DEFAULT 0 );");
@@ -142,6 +204,25 @@ public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVers
142204
}
143205
}
144206

207+
private String createSeenMessageCacheKey(String jid, String message_id, MessageType type) {
208+
return jid + "_" + message_id + "_" + type.ordinal();
209+
}
210+
211+
private String createSeenMessagesListCacheKey(String jid, MessageType type, boolean viewed) {
212+
return jid + "_" + type.ordinal() + "_" + (viewed ? "1" : "0");
213+
}
214+
215+
private void invalidateSeenMessagesListCache(String jid, MessageType type) {
216+
seenMessagesListCache.remove(createSeenMessagesListCacheKey(jid, type, true));
217+
seenMessagesListCache.remove(createSeenMessagesListCacheKey(jid, type, false));
218+
}
219+
220+
public void clearCaches() {
221+
messagesCache.evictAll();
222+
seenMessageCache.evictAll();
223+
seenMessagesListCache.evictAll();
224+
}
225+
145226
@AllArgsConstructor
146227
public static class MessageItem {
147228
public long id;
@@ -170,9 +251,5 @@ public FMessageWpp getFMessage() {
170251
}
171252
return fMessageWpp;
172253
}
173-
174-
175254
}
176-
177-
178255
}

0 commit comments

Comments
 (0)