Добавлен экран Calls в сайдбар и улучшено управление историей звонков
This commit is contained in:
@@ -174,6 +174,16 @@ interface GroupDao {
|
||||
suspend fun deleteAllByAccount(account: String): Int
|
||||
}
|
||||
|
||||
/** Строка истории звонков (messages + данные собеседника из dialogs) */
|
||||
data class CallHistoryRow(
|
||||
@Embedded val message: MessageEntity,
|
||||
@ColumnInfo(name = "peer_key") val peerKey: String,
|
||||
@ColumnInfo(name = "peer_title") val peerTitle: String?,
|
||||
@ColumnInfo(name = "peer_username") val peerUsername: String?,
|
||||
@ColumnInfo(name = "peer_verified") val peerVerified: Int?,
|
||||
@ColumnInfo(name = "peer_online") val peerOnline: Int?
|
||||
)
|
||||
|
||||
/** DAO для работы с сообщениями */
|
||||
@Dao
|
||||
interface MessageDao {
|
||||
@@ -559,6 +569,65 @@ interface MessageDao {
|
||||
)
|
||||
suspend fun getMessagesWithFiles(account: String, limit: Int, offset: Int): List<MessageEntity>
|
||||
|
||||
/**
|
||||
* 📞 История звонков на основе CALL attachments (type: 4)
|
||||
* LEFT JOIN на dialogs нужен для имени/username/verified без дополнительных запросов.
|
||||
*/
|
||||
@Query(
|
||||
"""
|
||||
SELECT
|
||||
m.*,
|
||||
CASE
|
||||
WHEN m.from_me = 1 THEN m.to_public_key
|
||||
ELSE m.from_public_key
|
||||
END AS peer_key,
|
||||
d.opponent_title AS peer_title,
|
||||
d.opponent_username AS peer_username,
|
||||
d.verified AS peer_verified,
|
||||
d.is_online AS peer_online
|
||||
FROM messages m
|
||||
LEFT JOIN dialogs d
|
||||
ON d.account = m.account
|
||||
AND d.opponent_key = CASE
|
||||
WHEN m.from_me = 1 THEN m.to_public_key
|
||||
ELSE m.from_public_key
|
||||
END
|
||||
WHERE m.account = :account
|
||||
AND m.attachments != '[]'
|
||||
AND (m.attachments LIKE '%"type":4%' OR m.attachments LIKE '%"type": 4%')
|
||||
ORDER BY m.timestamp DESC, m.message_id DESC
|
||||
LIMIT :limit
|
||||
"""
|
||||
)
|
||||
fun getCallHistoryFlow(account: String, limit: Int = 300): Flow<List<CallHistoryRow>>
|
||||
|
||||
/** Пиры, у которых есть call attachments (нужно для пересчета dialogs после удаления). */
|
||||
@Query(
|
||||
"""
|
||||
SELECT DISTINCT
|
||||
CASE
|
||||
WHEN from_me = 1 THEN to_public_key
|
||||
ELSE from_public_key
|
||||
END AS peer_key
|
||||
FROM messages
|
||||
WHERE account = :account
|
||||
AND attachments != '[]'
|
||||
AND (attachments LIKE '%"type":4%' OR attachments LIKE '%"type": 4%')
|
||||
"""
|
||||
)
|
||||
suspend fun getCallHistoryPeers(account: String): List<String>
|
||||
|
||||
/** Удалить все call events из messages для аккаунта. */
|
||||
@Query(
|
||||
"""
|
||||
DELETE FROM messages
|
||||
WHERE account = :account
|
||||
AND attachments != '[]'
|
||||
AND (attachments LIKE '%"type":4%' OR attachments LIKE '%"type": 4%')
|
||||
"""
|
||||
)
|
||||
suspend fun deleteAllCallMessages(account: String): Int
|
||||
|
||||
/** Все сообщения аккаунта (для поиска по тексту), отсортированные по дате */
|
||||
@Query(
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user