Search in sources :

Example 91 with SQLiteCursor

use of org.telegram.SQLite.SQLiteCursor in project Telegram-FOSS by Telegram-FOSS-Team.

the class MessagesStorage method resetMentionsCount.

public void resetMentionsCount(long did, int count) {
    storageQueue.postRunnable(() -> {
        try {
            int prevUnreadCount = 0;
            SQLiteCursor cursor = database.queryFinalized("SELECT unread_count_i FROM dialogs WHERE did = " + did);
            if (cursor.next()) {
                prevUnreadCount = cursor.intValue(0);
            }
            cursor.dispose();
            if (prevUnreadCount != 0 || count != 0) {
                if (count == 0) {
                    database.executeFast(String.format(Locale.US, "UPDATE messages_v2 SET read_state = read_state | 2 WHERE uid = %d AND mention = 1 AND read_state IN(0, 1)", did)).stepThis().dispose();
                }
                database.executeFast(String.format(Locale.US, "UPDATE dialogs SET unread_count_i = %d WHERE did = %d", count, did)).stepThis().dispose();
                LongSparseIntArray sparseArray = new LongSparseIntArray(1);
                sparseArray.put(did, count);
                getMessagesController().processDialogsUpdateRead(null, sparseArray);
                if (count == 0) {
                    updateFiltersReadCounter(null, sparseArray, true);
                }
            }
        } catch (Exception e) {
            FileLog.e(e);
        }
    });
}
Also used : LongSparseIntArray(org.telegram.messenger.support.LongSparseIntArray) SQLiteCursor(org.telegram.SQLite.SQLiteCursor) SQLiteException(org.telegram.SQLite.SQLiteException)

Example 92 with SQLiteCursor

use of org.telegram.SQLite.SQLiteCursor in project Telegram-FOSS by Telegram-FOSS-Team.

the class MessagesStorage method localSearch.

public void localSearch(int dialogsType, String query, ArrayList<Object> resultArray, ArrayList<CharSequence> resultArrayNames, ArrayList<TLRPC.User> encUsers, int folderId) {
    long selfUserId = UserConfig.getInstance(currentAccount).getClientUserId();
    try {
        String search1 = query.trim().toLowerCase();
        if (TextUtils.isEmpty(search1)) {
            return;
        }
        String savedMessages = LocaleController.getString("SavedMessages", R.string.SavedMessages).toLowerCase();
        String savedMessages2 = "saved messages";
        String search2 = LocaleController.getInstance().getTranslitString(search1);
        if (search1.equals(search2) || search2.length() == 0) {
            search2 = null;
        }
        String[] search = new String[1 + (search2 != null ? 1 : 0)];
        search[0] = search1;
        if (search2 != null) {
            search[1] = search2;
        }
        ArrayList<Long> usersToLoad = new ArrayList<>();
        ArrayList<Long> chatsToLoad = new ArrayList<>();
        ArrayList<Integer> encryptedToLoad = new ArrayList<>();
        int resultCount = 0;
        LongSparseArray<DialogsSearchAdapter.DialogSearchResult> dialogsResult = new LongSparseArray<>();
        SQLiteCursor cursor;
        if (folderId >= 0) {
            cursor = getDatabase().queryFinalized("SELECT did, date FROM dialogs WHERE folder_id = ? ORDER BY date DESC LIMIT 600", folderId);
        } else {
            cursor = getDatabase().queryFinalized("SELECT did, date FROM dialogs ORDER BY date DESC LIMIT 600");
        }
        while (cursor.next()) {
            long id = cursor.longValue(0);
            DialogsSearchAdapter.DialogSearchResult dialogSearchResult = new DialogsSearchAdapter.DialogSearchResult();
            dialogSearchResult.date = cursor.intValue(1);
            dialogsResult.put(id, dialogSearchResult);
            if (!DialogObject.isEncryptedDialog(id)) {
                if (DialogObject.isUserDialog(id)) {
                    if (dialogsType == 4 && id == selfUserId) {
                        continue;
                    }
                    if (dialogsType != 2 && !usersToLoad.contains(id)) {
                        usersToLoad.add(id);
                    }
                } else {
                    if (dialogsType == 4) {
                        continue;
                    }
                    if (!chatsToLoad.contains(-id)) {
                        chatsToLoad.add(-id);
                    }
                }
            } else if (dialogsType == 0 || dialogsType == 3) {
                int encryptedChatId = DialogObject.getEncryptedChatId(id);
                if (!encryptedToLoad.contains(encryptedChatId)) {
                    encryptedToLoad.add(encryptedChatId);
                }
            }
        }
        cursor.dispose();
        if (dialogsType != 4 && (savedMessages).startsWith(search1) || savedMessages2.startsWith(search1)) {
            TLRPC.User user = UserConfig.getInstance(currentAccount).getCurrentUser();
            DialogsSearchAdapter.DialogSearchResult dialogSearchResult = new DialogsSearchAdapter.DialogSearchResult();
            dialogSearchResult.date = Integer.MAX_VALUE;
            dialogSearchResult.name = savedMessages;
            dialogSearchResult.object = user;
            dialogsResult.put(user.id, dialogSearchResult);
            resultCount++;
        }
        if (!usersToLoad.isEmpty()) {
            cursor = getDatabase().queryFinalized(String.format(Locale.US, "SELECT data, status, name FROM users WHERE uid IN(%s)", TextUtils.join(",", usersToLoad)));
            while (cursor.next()) {
                String name = cursor.stringValue(2);
                String tName = LocaleController.getInstance().getTranslitString(name);
                if (name.equals(tName)) {
                    tName = null;
                }
                String username = null;
                int usernamePos = name.lastIndexOf(";;;");
                if (usernamePos != -1) {
                    username = name.substring(usernamePos + 3);
                }
                int found = 0;
                for (String q : search) {
                    if (name.startsWith(q) || name.contains(" " + q) || tName != null && (tName.startsWith(q) || tName.contains(" " + q))) {
                        found = 1;
                    } else if (username != null && username.startsWith(q)) {
                        found = 2;
                    }
                    if (found != 0) {
                        NativeByteBuffer data = cursor.byteBufferValue(0);
                        if (data != null) {
                            TLRPC.User user = TLRPC.User.TLdeserialize(data, data.readInt32(false), false);
                            data.reuse();
                            DialogsSearchAdapter.DialogSearchResult dialogSearchResult = dialogsResult.get(user.id);
                            if (user.status != null) {
                                user.status.expires = cursor.intValue(1);
                            }
                            if (found == 1) {
                                dialogSearchResult.name = AndroidUtilities.generateSearchName(user.first_name, user.last_name, q);
                            } else {
                                dialogSearchResult.name = AndroidUtilities.generateSearchName("@" + user.username, null, "@" + q);
                            }
                            dialogSearchResult.object = user;
                            resultCount++;
                        }
                        break;
                    }
                }
            }
            cursor.dispose();
        }
        if (!chatsToLoad.isEmpty()) {
            cursor = getDatabase().queryFinalized(String.format(Locale.US, "SELECT data, name FROM chats WHERE uid IN(%s)", TextUtils.join(",", chatsToLoad)));
            while (cursor.next()) {
                String name = cursor.stringValue(1);
                String tName = LocaleController.getInstance().getTranslitString(name);
                if (name.equals(tName)) {
                    tName = null;
                }
                for (String q : search) {
                    if (name.startsWith(q) || name.contains(" " + q) || tName != null && (tName.startsWith(q) || tName.contains(" " + q))) {
                        NativeByteBuffer data = cursor.byteBufferValue(0);
                        if (data != null) {
                            TLRPC.Chat chat = TLRPC.Chat.TLdeserialize(data, data.readInt32(false), false);
                            data.reuse();
                            if (!(chat == null || chat.deactivated || ChatObject.isChannel(chat) && ChatObject.isNotInChat(chat))) {
                                long dialog_id = -chat.id;
                                DialogsSearchAdapter.DialogSearchResult dialogSearchResult = dialogsResult.get(dialog_id);
                                dialogSearchResult.name = AndroidUtilities.generateSearchName(chat.title, null, q);
                                dialogSearchResult.object = chat;
                                resultCount++;
                            }
                        }
                        break;
                    }
                }
            }
            cursor.dispose();
        }
        if (!encryptedToLoad.isEmpty()) {
            cursor = getDatabase().queryFinalized(String.format(Locale.US, "SELECT q.data, u.name, q.user, q.g, q.authkey, q.ttl, u.data, u.status, q.layer, q.seq_in, q.seq_out, q.use_count, q.exchange_id, q.key_date, q.fprint, q.fauthkey, q.khash, q.in_seq_no, q.admin_id, q.mtproto_seq FROM enc_chats as q INNER JOIN users as u ON q.user = u.uid WHERE q.uid IN(%s)", TextUtils.join(",", encryptedToLoad)));
            while (cursor.next()) {
                String name = cursor.stringValue(1);
                String tName = LocaleController.getInstance().getTranslitString(name);
                if (name.equals(tName)) {
                    tName = null;
                }
                String username = null;
                int usernamePos = name.lastIndexOf(";;;");
                if (usernamePos != -1) {
                    username = name.substring(usernamePos + 2);
                }
                int found = 0;
                for (int a = 0; a < search.length; a++) {
                    String q = search[a];
                    if (name.startsWith(q) || name.contains(" " + q) || tName != null && (tName.startsWith(q) || tName.contains(" " + q))) {
                        found = 1;
                    } else if (username != null && username.startsWith(q)) {
                        found = 2;
                    }
                    if (found != 0) {
                        TLRPC.EncryptedChat chat = null;
                        TLRPC.User user = null;
                        NativeByteBuffer data = cursor.byteBufferValue(0);
                        if (data != null) {
                            chat = TLRPC.EncryptedChat.TLdeserialize(data, data.readInt32(false), false);
                            data.reuse();
                        }
                        data = cursor.byteBufferValue(6);
                        if (data != null) {
                            user = TLRPC.User.TLdeserialize(data, data.readInt32(false), false);
                            data.reuse();
                        }
                        if (chat != null && user != null) {
                            DialogsSearchAdapter.DialogSearchResult dialogSearchResult = dialogsResult.get(DialogObject.makeEncryptedDialogId(chat.id));
                            chat.user_id = cursor.longValue(2);
                            chat.a_or_b = cursor.byteArrayValue(3);
                            chat.auth_key = cursor.byteArrayValue(4);
                            chat.ttl = cursor.intValue(5);
                            chat.layer = cursor.intValue(8);
                            chat.seq_in = cursor.intValue(9);
                            chat.seq_out = cursor.intValue(10);
                            int use_count = cursor.intValue(11);
                            chat.key_use_count_in = (short) (use_count >> 16);
                            chat.key_use_count_out = (short) (use_count);
                            chat.exchange_id = cursor.longValue(12);
                            chat.key_create_date = cursor.intValue(13);
                            chat.future_key_fingerprint = cursor.longValue(14);
                            chat.future_auth_key = cursor.byteArrayValue(15);
                            chat.key_hash = cursor.byteArrayValue(16);
                            chat.in_seq_no = cursor.intValue(17);
                            long admin_id = cursor.longValue(18);
                            if (admin_id != 0) {
                                chat.admin_id = admin_id;
                            }
                            chat.mtproto_seq = cursor.intValue(19);
                            if (user.status != null) {
                                user.status.expires = cursor.intValue(7);
                            }
                            if (found == 1) {
                                dialogSearchResult.name = new SpannableStringBuilder(ContactsController.formatName(user.first_name, user.last_name));
                                ((SpannableStringBuilder) dialogSearchResult.name).setSpan(new ForegroundColorSpan(Theme.getColor(Theme.key_chats_secretName)), 0, dialogSearchResult.name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                            } else {
                                dialogSearchResult.name = AndroidUtilities.generateSearchName("@" + user.username, null, "@" + q);
                            }
                            dialogSearchResult.object = chat;
                            encUsers.add(user);
                            resultCount++;
                        }
                        break;
                    }
                }
            }
            cursor.dispose();
        }
        ArrayList<DialogsSearchAdapter.DialogSearchResult> searchResults = new ArrayList<>(resultCount);
        for (int a = 0; a < dialogsResult.size(); a++) {
            DialogsSearchAdapter.DialogSearchResult dialogSearchResult = dialogsResult.valueAt(a);
            if (dialogSearchResult.object != null && dialogSearchResult.name != null) {
                searchResults.add(dialogSearchResult);
            }
        }
        Collections.sort(searchResults, (lhs, rhs) -> {
            if (lhs.date < rhs.date) {
                return 1;
            } else if (lhs.date > rhs.date) {
                return -1;
            }
            return 0;
        });
        for (int a = 0; a < searchResults.size(); a++) {
            DialogsSearchAdapter.DialogSearchResult dialogSearchResult = searchResults.get(a);
            resultArray.add(dialogSearchResult.object);
            resultArrayNames.add(dialogSearchResult.name);
        }
        if (dialogsType != 2) {
            cursor = getDatabase().queryFinalized("SELECT u.data, u.status, u.name, u.uid FROM users as u INNER JOIN contacts as c ON u.uid = c.uid");
            while (cursor.next()) {
                long uid = cursor.longValue(3);
                if (dialogsResult.indexOfKey(uid) >= 0) {
                    continue;
                }
                String name = cursor.stringValue(2);
                String tName = LocaleController.getInstance().getTranslitString(name);
                if (name.equals(tName)) {
                    tName = null;
                }
                String username = null;
                int usernamePos = name.lastIndexOf(";;;");
                if (usernamePos != -1) {
                    username = name.substring(usernamePos + 3);
                }
                int found = 0;
                for (String q : search) {
                    if (name.startsWith(q) || name.contains(" " + q) || tName != null && (tName.startsWith(q) || tName.contains(" " + q))) {
                        found = 1;
                    } else if (username != null && username.startsWith(q)) {
                        found = 2;
                    }
                    if (found != 0) {
                        NativeByteBuffer data = cursor.byteBufferValue(0);
                        if (data != null) {
                            TLRPC.User user = TLRPC.User.TLdeserialize(data, data.readInt32(false), false);
                            data.reuse();
                            if (user.status != null) {
                                user.status.expires = cursor.intValue(1);
                            }
                            if (found == 1) {
                                resultArrayNames.add(AndroidUtilities.generateSearchName(user.first_name, user.last_name, q));
                            } else {
                                resultArrayNames.add(AndroidUtilities.generateSearchName("@" + user.username, null, "@" + q));
                            }
                            resultArray.add(user);
                        }
                        break;
                    }
                }
            }
            cursor.dispose();
        }
    } catch (Exception e) {
        FileLog.e(e);
    }
}
Also used : LongSparseArray(androidx.collection.LongSparseArray) ForegroundColorSpan(android.text.style.ForegroundColorSpan) DialogsSearchAdapter(org.telegram.ui.Adapters.DialogsSearchAdapter) ArrayList(java.util.ArrayList) NativeByteBuffer(org.telegram.tgnet.NativeByteBuffer) SQLiteCursor(org.telegram.SQLite.SQLiteCursor) TLRPC(org.telegram.tgnet.TLRPC) SQLiteException(org.telegram.SQLite.SQLiteException) AtomicLong(java.util.concurrent.atomic.AtomicLong) SpannableStringBuilder(android.text.SpannableStringBuilder)

Example 93 with SQLiteCursor

use of org.telegram.SQLite.SQLiteCursor in project Telegram-FOSS by Telegram-FOSS-Team.

the class MessagesStorage method createTaskForSecretChat.

public void createTaskForSecretChat(int chatId, int time, int readTime, int isOut, ArrayList<Long> random_ids) {
    storageQueue.postRunnable(() -> {
        try {
            long dialogId = DialogObject.makeEncryptedDialogId(chatId);
            int minDate = Integer.MAX_VALUE;
            SparseArray<ArrayList<Integer>> messages = new SparseArray<>();
            ArrayList<Integer> midsArray = new ArrayList<>();
            StringBuilder mids = new StringBuilder();
            SQLiteCursor cursor;
            if (random_ids == null) {
                cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid, ttl FROM messages_v2 WHERE uid = %d AND out = %d AND read_state > 0 AND ttl > 0 AND date <= %d AND send_state = 0 AND media != 1", dialogId, isOut, time));
            } else {
                String ids = TextUtils.join(",", random_ids);
                cursor = database.queryFinalized(String.format(Locale.US, "SELECT m.mid, m.ttl FROM messages_v2 as m INNER JOIN randoms_v2 as r ON m.mid = r.mid AND m.uid = r.uid WHERE r.random_id IN (%s)", ids));
            }
            while (cursor.next()) {
                int ttl = cursor.intValue(1);
                int mid = cursor.intValue(0);
                if (random_ids != null) {
                    midsArray.add(mid);
                }
                if (ttl <= 0) {
                    continue;
                }
                int date = Math.max(time, readTime) + ttl;
                minDate = Math.min(minDate, date);
                ArrayList<Integer> arr = messages.get(date);
                if (arr == null) {
                    arr = new ArrayList<>();
                    messages.put(date, arr);
                }
                if (mids.length() != 0) {
                    mids.append(",");
                }
                mids.append(mid);
                arr.add(mid);
            }
            cursor.dispose();
            if (random_ids != null) {
                AndroidUtilities.runOnUIThread(() -> {
                    markMessagesContentAsRead(dialogId, midsArray, 0);
                    getNotificationCenter().postNotificationName(NotificationCenter.messagesReadContent, dialogId, midsArray);
                });
            }
            if (messages.size() != 0) {
                database.beginTransaction();
                SQLitePreparedStatement state = database.executeFast("REPLACE INTO enc_tasks_v4 VALUES(?, ?, ?, ?)");
                for (int a = 0; a < messages.size(); a++) {
                    int key = messages.keyAt(a);
                    ArrayList<Integer> arr = messages.get(key);
                    for (int b = 0; b < arr.size(); b++) {
                        state.requery();
                        state.bindInteger(1, arr.get(b));
                        state.bindLong(2, dialogId);
                        state.bindInteger(3, key);
                        state.bindInteger(4, 0);
                        state.step();
                    }
                }
                state.dispose();
                database.commitTransaction();
                database.executeFast(String.format(Locale.US, "UPDATE messages_v2 SET ttl = 0 WHERE mid IN(%s) AND uid = %d", mids.toString(), dialogId)).stepThis().dispose();
                getMessagesController().didAddedNewTask(minDate, dialogId, messages);
            }
        } catch (Exception e) {
            FileLog.e(e);
        }
    });
}
Also used : SpannableStringBuilder(android.text.SpannableStringBuilder) ArrayList(java.util.ArrayList) SQLiteCursor(org.telegram.SQLite.SQLiteCursor) SQLiteException(org.telegram.SQLite.SQLiteException) SQLitePreparedStatement(org.telegram.SQLite.SQLitePreparedStatement) LongSparseArray(androidx.collection.LongSparseArray) SparseArray(android.util.SparseArray)

Example 94 with SQLiteCursor

use of org.telegram.SQLite.SQLiteCursor in project Telegram-FOSS by Telegram-FOSS-Team.

the class MessagesStorage method markMessagesContentAsReadInternal.

private void markMessagesContentAsReadInternal(long dialogId, ArrayList<Integer> mids, int date) {
    try {
        String midsStr = TextUtils.join(",", mids);
        database.executeFast(String.format(Locale.US, "UPDATE messages_v2 SET read_state = read_state | 2 WHERE mid IN (%s) AND uid = %d", midsStr, dialogId)).stepThis().dispose();
        if (date != 0) {
            SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT mid, ttl FROM messages_v2 WHERE mid IN (%s) AND uid = %d AND ttl > 0", midsStr, dialogId));
            ArrayList<Integer> arrayList = null;
            while (cursor.next()) {
                if (arrayList == null) {
                    arrayList = new ArrayList<>();
                }
                arrayList.add(cursor.intValue(0));
            }
            if (arrayList != null) {
                emptyMessagesMedia(dialogId, arrayList);
            }
            cursor.dispose();
        }
    } catch (Exception e) {
        FileLog.e(e);
    }
}
Also used : SQLiteCursor(org.telegram.SQLite.SQLiteCursor) SQLiteException(org.telegram.SQLite.SQLiteException)

Example 95 with SQLiteCursor

use of org.telegram.SQLite.SQLiteCursor in project Telegram-FOSS by Telegram-FOSS-Team.

the class MessagesStorage method getMessagesCount.

public void getMessagesCount(long dialog_id, IntCallback callback) {
    storageQueue.postRunnable(() -> {
        try {
            int result;
            SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT COUNT(mid) FROM messages_v2 WHERE uid = %d", dialog_id));
            if (cursor.next()) {
                result = cursor.intValue(0);
            } else {
                result = 0;
            }
            cursor.dispose();
            AndroidUtilities.runOnUIThread(() -> callback.run(result));
        } catch (Exception e) {
            FileLog.e(e);
        }
    });
}
Also used : SQLiteCursor(org.telegram.SQLite.SQLiteCursor) SQLiteException(org.telegram.SQLite.SQLiteException)

Aggregations

SQLiteCursor (org.telegram.SQLite.SQLiteCursor)118 SQLiteException (org.telegram.SQLite.SQLiteException)105 TLRPC (org.telegram.tgnet.TLRPC)77 NativeByteBuffer (org.telegram.tgnet.NativeByteBuffer)66 ArrayList (java.util.ArrayList)58 SQLitePreparedStatement (org.telegram.SQLite.SQLitePreparedStatement)42 LongSparseArray (androidx.collection.LongSparseArray)25 AtomicLong (java.util.concurrent.atomic.AtomicLong)19 Paint (android.graphics.Paint)18 SparseArray (android.util.SparseArray)11 CountDownLatch (java.util.concurrent.CountDownLatch)11 SpannableStringBuilder (android.text.SpannableStringBuilder)10 LongSparseIntArray (org.telegram.messenger.support.LongSparseIntArray)10 File (java.io.File)8 HashMap (java.util.HashMap)7 Pair (android.util.Pair)6 TLObject (org.telegram.tgnet.TLObject)6 LinkedHashMap (java.util.LinkedHashMap)4 SharedPreferences (android.content.SharedPreferences)3 SpannedString (android.text.SpannedString)3