55import android .database .Cursor ;
66import android .database .sqlite .SQLiteDatabase ;
77import android .database .sqlite .SQLiteOpenHelper ;
8+ import android .util .LruCache ;
89
910import 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