@@ -1244,34 +1244,52 @@ public TLRPC.TL_messages_stickerSet getStickerSet(TLRPC.InputStickerSet inputSti
1244
1244
return null ;
1245
1245
}
1246
1246
1247
+ private boolean cleanedupStickerSetCache ;
1248
+ private void cleanupStickerSetCache () {
1249
+ if (cleanedupStickerSetCache ) {
1250
+ return ;
1251
+ }
1252
+ cleanedupStickerSetCache = true ;
1253
+ getMessagesStorage ().getStorageQueue ().postRunnable (() -> {
1254
+ try {
1255
+ final long minDate = (System .currentTimeMillis () - 1000 * 60 * 60 * 24 * 7 );
1256
+ getMessagesStorage ().getDatabase ().executeFast ("DELETE FROM stickersets2 WHERE date < " + minDate ).stepThis ().dispose ();
1257
+ } catch (Exception e ) {
1258
+ FileLog .e (e );
1259
+ }
1260
+ });
1261
+ }
1262
+
1247
1263
private void saveStickerSetIntoCache (TLRPC .TL_messages_stickerSet set ) {
1248
1264
if (set == null || set .set == null ) {
1249
1265
return ;
1250
1266
}
1251
1267
getMessagesStorage ().getStorageQueue ().postRunnable (() -> {
1252
1268
try {
1253
- SQLitePreparedStatement state = getMessagesStorage ().getDatabase ().executeFast ("REPLACE INTO stickersets VALUES(?, ?, ?)" );
1269
+ SQLitePreparedStatement state = getMessagesStorage ().getDatabase ().executeFast ("REPLACE INTO stickersets2 VALUES(?, ?, ?, ?)" );
1254
1270
state .requery ();
1255
1271
NativeByteBuffer data = new NativeByteBuffer (set .getObjectSize ());
1256
1272
set .serializeToStream (data );
1257
1273
state .bindLong (1 , set .set .id );
1258
1274
state .bindByteBuffer (2 , data );
1259
1275
state .bindInteger (3 , set .set .hash );
1276
+ state .bindLong (4 , System .currentTimeMillis ());
1260
1277
state .step ();
1261
1278
data .reuse ();
1262
1279
state .dispose ();
1263
1280
} catch (Exception e ) {
1264
1281
FileLog .e (e );
1265
1282
}
1266
1283
});
1284
+ cleanupStickerSetCache ();
1267
1285
}
1268
1286
1269
1287
private TLRPC .TL_messages_stickerSet getCachedStickerSetInternal (long id , Integer hash ) {
1270
1288
TLRPC .TL_messages_stickerSet set = null ;
1271
1289
SQLiteCursor cursor = null ;
1272
1290
NativeByteBuffer data = null ;
1273
1291
try {
1274
- cursor = getMessagesStorage ().getDatabase ().queryFinalized ("SELECT data, hash FROM stickersets WHERE id = " + id + " LIMIT 1" );
1292
+ cursor = getMessagesStorage ().getDatabase ().queryFinalized ("SELECT data, hash FROM stickersets2 WHERE id = " + id + " LIMIT 1" );
1275
1293
if (cursor .next () && !cursor .isNull (0 )) {
1276
1294
data = cursor .byteBufferValue (0 );
1277
1295
if (data != null ) {
@@ -6283,11 +6301,15 @@ public ArrayList<TLRPC.MessageEntity> getEntities(CharSequence[] message, boolea
6283
6301
content = substring (content , 0 , content .length () - 1 );
6284
6302
}
6285
6303
if (!TextUtils .isEmpty (content )) {
6304
+ if (content .length () > 1 && content .charAt (0 ) == '\n' ) {
6305
+ content = content .subSequence (1 , content .length ());
6306
+ index --;
6307
+ }
6286
6308
message [0 ] = AndroidUtilities .concat (startMessage , content , endMessage );
6287
6309
TLRPC .TL_messageEntityPre entity = new TLRPC .TL_messageEntityPre ();
6288
6310
entity .offset = start + (replacedFirst ? 0 : 1 );
6289
6311
entity .length = index - start - 3 - (language .length () + (!language .isEmpty () ? 1 : 0 )) + (replacedFirst ? 0 : 1 );
6290
- entity .language = language ;
6312
+ entity .language = TextUtils . isEmpty ( language ) || language . trim (). length () == 0 ? "" : language ;
6291
6313
entities .add (entity );
6292
6314
lastIndex -= 6 ;
6293
6315
}
@@ -6630,10 +6652,13 @@ public void saveDraft(long dialogId, int threadId, CharSequence message, ArrayLi
6630
6652
TLRPC .Peer peer2 = getMessagesController ().getPeer (dialogId );
6631
6653
TLRPC .Peer thisPeer = quote .message .messageOwner .peer_id ;
6632
6654
if (peer2 != null && !MessageObject .peersEqual (peer2 , thisPeer )) {
6633
- draftMessage .reply_to .flags |= 1 ;
6634
- draftMessage .reply_to .reply_to_peer_id = getMessagesController ().getInputPeer (peer2 );
6655
+ draftMessage .reply_to .flags |= 2 ;
6656
+ draftMessage .reply_to .reply_to_peer_id = getMessagesController ().getInputPeer (thisPeer );
6635
6657
}
6636
6658
}
6659
+ } else if (dialogId != MessageObject .getDialogId (replyToMessage )) {
6660
+ draftMessage .reply_to .flags |= 2 ;
6661
+ draftMessage .reply_to .reply_to_peer_id = getMessagesController ().getInputPeer (getMessagesController ().getPeer (MessageObject .getDialogId (replyToMessage )));
6637
6662
}
6638
6663
}
6639
6664
if (entities != null && !entities .isEmpty ()) {
@@ -6644,10 +6669,20 @@ public void saveDraft(long dialogId, int threadId, CharSequence message, ArrayLi
6644
6669
SparseArray <TLRPC .DraftMessage > threads = drafts .get (dialogId );
6645
6670
TLRPC .DraftMessage currentDraft = threads == null ? null : threads .get (threadId );
6646
6671
if (!clean ) {
6647
- if (
6648
- currentDraft != null && currentDraft .message .equals (draftMessage .message ) && replyToEquals (currentDraft .reply_to , draftMessage .reply_to ) && currentDraft .no_webpage == draftMessage .no_webpage ||
6649
- currentDraft == null && TextUtils .isEmpty (draftMessage .message ) && (draftMessage .reply_to == null || draftMessage .reply_to .reply_to_msg_id == 0 )
6650
- ) {
6672
+ boolean sameDraft ;
6673
+ if (currentDraft != null ) {
6674
+ sameDraft = (
6675
+ currentDraft .message .equals (draftMessage .message ) &&
6676
+ replyToEquals (currentDraft .reply_to , draftMessage .reply_to ) &&
6677
+ currentDraft .no_webpage == draftMessage .no_webpage
6678
+ );
6679
+ } else {
6680
+ sameDraft = (
6681
+ TextUtils .isEmpty (draftMessage .message ) &&
6682
+ (draftMessage .reply_to == null || draftMessage .reply_to .reply_to_msg_id == 0 )
6683
+ );
6684
+ }
6685
+ if (sameDraft ) {
6651
6686
return ;
6652
6687
}
6653
6688
}
@@ -6791,7 +6826,7 @@ public void saveDraft(long dialogId, int threadId, TLRPC.DraftMessage draft, TLR
6791
6826
if (threads != null ) {
6792
6827
replyToMessage = threads .get (threadId );
6793
6828
}
6794
- if (replyToMessage == null || replyToMessage .id != draft .reply_to .reply_to_msg_id || !MessageObject .peersEqual (replyToMessage . peer_id , getMessagesController (). getPeer ( draft .reply_to .reply_to_msg_id ) )) {
6829
+ if (replyToMessage == null || replyToMessage .id != draft .reply_to .reply_to_msg_id || !MessageObject .peersEqual (draft .reply_to .reply_to_peer_id , replyToMessage . peer_id )) {
6795
6830
replyToMessage = null ;
6796
6831
}
6797
6832
} else if (draft != null && draft .reply_to == null ) {
@@ -6823,13 +6858,14 @@ public void saveDraft(long dialogId, int threadId, TLRPC.DraftMessage draft, TLR
6823
6858
}
6824
6859
editor .commit ();
6825
6860
if (fromServer && (threadId == 0 || getMessagesController ().isForum (dialogId ))) {
6826
- if (draft != null && draft .reply_to != null && draft .reply_to .reply_to_msg_id != 0 && replyToMessage == null ) {
6861
+ if (draft != null && draft .reply_to != null && draft .reply_to .reply_to_msg_id != 0 && (replyToMessage == null || replyToMessage .reply_to instanceof TLRPC .TL_messageReplyHeader && replyToMessage .replyMessage == null )) {
6862
+ final long replyDialogId = (draft .reply_to .flags & 2 ) != 0 ? DialogObject .getPeerDialogId (draft .reply_to .reply_to_peer_id ) : dialogId ;
6827
6863
TLRPC .User user = null ;
6828
6864
TLRPC .Chat chat = null ;
6829
- if (DialogObject .isUserDialog (dialogId )) {
6830
- user = getMessagesController ().getUser (dialogId );
6865
+ if (DialogObject .isUserDialog (replyDialogId )) {
6866
+ user = getMessagesController ().getUser (replyDialogId );
6831
6867
} else {
6832
- chat = getMessagesController ().getChat (-dialogId );
6868
+ chat = getMessagesController ().getChat (-replyDialogId );
6833
6869
}
6834
6870
if (user != null || chat != null ) {
6835
6871
long channelId = ChatObject .isChannel (chat ) ? chat .id : 0 ;
@@ -6838,14 +6874,41 @@ public void saveDraft(long dialogId, int threadId, TLRPC.DraftMessage draft, TLR
6838
6874
getMessagesStorage ().getStorageQueue ().postRunnable (() -> {
6839
6875
try {
6840
6876
TLRPC .Message message = null ;
6841
- SQLiteCursor cursor = getMessagesStorage ().getDatabase ().queryFinalized (String .format (Locale .US , "SELECT data FROM messages_v2 WHERE mid = %d and uid = %d" , messageId , dialogId ));
6877
+ SQLiteCursor cursor = getMessagesStorage ().getDatabase ().queryFinalized (String .format (Locale .US , "SELECT data, replydata FROM messages_v2 WHERE mid = %d and uid = %d" , messageId , replyDialogId ));
6842
6878
if (cursor .next ()) {
6843
6879
NativeByteBuffer data = cursor .byteBufferValue (0 );
6844
6880
if (data != null ) {
6845
6881
message = TLRPC .Message .TLdeserialize (data , data .readInt32 (false ), false );
6846
6882
message .readAttachPath (data , getUserConfig ().clientUserId );
6847
6883
data .reuse ();
6848
6884
}
6885
+ if (message != null ) {
6886
+ ArrayList <Long > usersToLoad = new ArrayList <>();
6887
+ ArrayList <Long > chatsToLoad = new ArrayList <>();
6888
+ LongSparseArray <SparseArray <ArrayList <TLRPC .Message >>> replyMessageOwners = new LongSparseArray <>();
6889
+ LongSparseArray <ArrayList <Integer >> dialogReplyMessagesIds = new LongSparseArray <>();
6890
+ try {
6891
+ if (message .reply_to != null && message .reply_to .reply_to_msg_id != 0 ) {
6892
+ if (!cursor .isNull (1 )) {
6893
+ NativeByteBuffer data2 = cursor .byteBufferValue (1 );
6894
+ if (data2 != null ) {
6895
+ message .replyMessage = TLRPC .Message .TLdeserialize (data2 , data2 .readInt32 (false ), false );
6896
+ message .replyMessage .readAttachPath (data2 , getUserConfig ().clientUserId );
6897
+ data2 .reuse ();
6898
+ if (message .replyMessage != null ) {
6899
+ MessagesStorage .addUsersAndChatsFromMessage (message .replyMessage , usersToLoad , chatsToLoad , null );
6900
+ }
6901
+ }
6902
+ }
6903
+ if (message .replyMessage == null ) {
6904
+ MessagesStorage .addReplyMessages (message , replyMessageOwners , dialogReplyMessagesIds );
6905
+ }
6906
+ }
6907
+ } catch (Exception e ) {
6908
+ getMessagesStorage ().checkSQLException (e );
6909
+ }
6910
+ getMessagesStorage ().loadReplyMessages (replyMessageOwners , dialogReplyMessagesIds , usersToLoad , chatsToLoad , false );
6911
+ }
6849
6912
}
6850
6913
cursor .dispose ();
6851
6914
if (message == null ) {
0 commit comments