mirror of
https://github.com/chatmail/core.git
synced 2026-05-05 14:26:30 +03:00
Merge pull request #1367 from deltachat/no-forward-to-device-chat
hide the device-chat from default forward-to-lists
This commit is contained in:
@@ -74,7 +74,8 @@ impl Chatlist {
|
|||||||
/// if DC_GCL_ARCHIVED_ONLY is not set, only unarchived chats are returned and
|
/// if DC_GCL_ARCHIVED_ONLY is not set, only unarchived chats are returned and
|
||||||
/// the pseudo-chat DC_CHAT_ID_ARCHIVED_LINK is added if there are *any* archived
|
/// the pseudo-chat DC_CHAT_ID_ARCHIVED_LINK is added if there are *any* archived
|
||||||
/// chats
|
/// chats
|
||||||
/// - the flag DC_GCL_FOR_FORWARDING sorts "Saved messages" to the top of the chatlist,
|
/// - the flag DC_GCL_FOR_FORWARDING sorts "Saved messages" to the top of the chatlist
|
||||||
|
/// and hides the device-chat,
|
||||||
// typically used on forwarding, may be combined with DC_GCL_NO_SPECIALS
|
// typically used on forwarding, may be combined with DC_GCL_NO_SPECIALS
|
||||||
/// - if the flag DC_GCL_NO_SPECIALS is set, deaddrop and archive link are not added
|
/// - if the flag DC_GCL_NO_SPECIALS is set, deaddrop and archive link are not added
|
||||||
/// to the list (may be used eg. for selecting chats on forwarding, the flag is
|
/// to the list (may be used eg. for selecting chats on forwarding, the flag is
|
||||||
@@ -104,6 +105,14 @@ impl Chatlist {
|
|||||||
.map_err(Into::into)
|
.map_err(Into::into)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let skip_id = if 0 != listflags & DC_GCL_FOR_FORWARDING {
|
||||||
|
chat::lookup_by_contact_id(context, DC_CONTACT_ID_DEVICE)
|
||||||
|
.unwrap_or_default()
|
||||||
|
.0
|
||||||
|
} else {
|
||||||
|
ChatId::new(0)
|
||||||
|
};
|
||||||
|
|
||||||
// select with left join and minimum:
|
// select with left join and minimum:
|
||||||
//
|
//
|
||||||
// - the inner select must use `hidden` and _not_ `m.hidden`
|
// - the inner select must use `hidden` and _not_ `m.hidden`
|
||||||
@@ -142,6 +151,9 @@ impl Chatlist {
|
|||||||
)?
|
)?
|
||||||
} else if 0 != listflags & DC_GCL_ARCHIVED_ONLY {
|
} else if 0 != listflags & DC_GCL_ARCHIVED_ONLY {
|
||||||
// show archived chats
|
// show archived chats
|
||||||
|
// (this includes the archived device-chat; we could skip it,
|
||||||
|
// however, then the number of archived chats do not match, which might be even more irritating.
|
||||||
|
// and adapting the number requires larger refactorings and seems not to be worth the effort)
|
||||||
context.sql.query_map(
|
context.sql.query_map(
|
||||||
"SELECT c.id, m.id
|
"SELECT c.id, m.id
|
||||||
FROM chats c
|
FROM chats c
|
||||||
@@ -181,13 +193,13 @@ impl Chatlist {
|
|||||||
SELECT MAX(timestamp)
|
SELECT MAX(timestamp)
|
||||||
FROM msgs
|
FROM msgs
|
||||||
WHERE chat_id=c.id
|
WHERE chat_id=c.id
|
||||||
AND (hidden=0 OR state=?))
|
AND (hidden=0 OR state=?1))
|
||||||
WHERE c.id>9
|
WHERE c.id>9 AND c.id!=?2
|
||||||
AND c.blocked=0
|
AND c.blocked=0
|
||||||
AND c.name LIKE ?
|
AND c.name LIKE ?3
|
||||||
GROUP BY c.id
|
GROUP BY c.id
|
||||||
ORDER BY IFNULL(m.timestamp,c.created_timestamp) DESC, m.id DESC;",
|
ORDER BY IFNULL(m.timestamp,c.created_timestamp) DESC, m.id DESC;",
|
||||||
params![MessageState::OutDraft, str_like_cmd],
|
params![MessageState::OutDraft, skip_id, str_like_cmd],
|
||||||
process_row,
|
process_row,
|
||||||
process_rows,
|
process_rows,
|
||||||
)?
|
)?
|
||||||
@@ -210,12 +222,12 @@ impl Chatlist {
|
|||||||
FROM msgs
|
FROM msgs
|
||||||
WHERE chat_id=c.id
|
WHERE chat_id=c.id
|
||||||
AND (hidden=0 OR state=?1))
|
AND (hidden=0 OR state=?1))
|
||||||
WHERE c.id>9
|
WHERE c.id>9 AND c.id!=?2
|
||||||
AND c.blocked=0
|
AND c.blocked=0
|
||||||
AND NOT c.archived=?2
|
AND NOT c.archived=?3
|
||||||
GROUP BY c.id
|
GROUP BY c.id
|
||||||
ORDER BY c.id=?3 DESC, c.archived=?4 DESC, IFNULL(m.timestamp,c.created_timestamp) DESC, m.id DESC;",
|
ORDER BY c.id=?4 DESC, c.archived=?5 DESC, IFNULL(m.timestamp,c.created_timestamp) DESC, m.id DESC;",
|
||||||
params![MessageState::OutDraft, ChatVisibility::Archived, sort_id_up, ChatVisibility::Pinned],
|
params![MessageState::OutDraft, skip_id, ChatVisibility::Archived, sort_id_up, ChatVisibility::Pinned],
|
||||||
process_row,
|
process_row,
|
||||||
process_rows,
|
process_rows,
|
||||||
)?;
|
)?;
|
||||||
@@ -415,13 +427,16 @@ mod tests {
|
|||||||
fn test_sort_self_talk_up_on_forward() {
|
fn test_sort_self_talk_up_on_forward() {
|
||||||
let t = dummy_context();
|
let t = dummy_context();
|
||||||
t.ctx.update_device_chats().unwrap();
|
t.ctx.update_device_chats().unwrap();
|
||||||
|
create_group_chat(&t.ctx, VerifiedStatus::Unverified, "a chat").unwrap();
|
||||||
|
|
||||||
let chats = Chatlist::try_load(&t.ctx, 0, None, None).unwrap();
|
let chats = Chatlist::try_load(&t.ctx, 0, None, None).unwrap();
|
||||||
assert!(Chat::load_from_db(&t.ctx, chats.get_chat_id(0))
|
assert!(chats.len() == 3);
|
||||||
|
assert!(!Chat::load_from_db(&t.ctx, chats.get_chat_id(0))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.is_device_talk());
|
.is_self_talk());
|
||||||
|
|
||||||
let chats = Chatlist::try_load(&t.ctx, DC_GCL_FOR_FORWARDING, None, None).unwrap();
|
let chats = Chatlist::try_load(&t.ctx, DC_GCL_FOR_FORWARDING, None, None).unwrap();
|
||||||
|
assert!(chats.len() == 2); // device chat cannot be written and is skipped on forwarding
|
||||||
assert!(Chat::load_from_db(&t.ctx, chats.get_chat_id(0))
|
assert!(Chat::load_from_db(&t.ctx, chats.get_chat_id(0))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.is_self_talk());
|
.is_self_talk());
|
||||||
|
|||||||
Reference in New Issue
Block a user