Browse Source

Persist avatar removal intent and prioritize profile changes

master
evgeny 6 days ago
parent
commit
3e1641aaf0
  1. 18
      tools/chatgui/src/avatars/avatarmanager.cpp
  2. 2
      tools/chatgui/src/avatars/avatarmanager.h
  3. 1
      tools/chatgui/tests/test_avatars.cpp

18
tools/chatgui/src/avatars/avatarmanager.cpp

@ -49,6 +49,7 @@ void AvatarManager::initialize() {
const QString base = m_db->dbPath().isEmpty() ? QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) : m_db->dbPath(); const QString base = m_db->dbPath().isEmpty() ? QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) : m_db->dbPath();
m_directory = base + QStringLiteral("/avatar_cache/") + QString::number(m_db->myNodeId(), 16); m_directory = base + QStringLiteral("/avatar_cache/") + QString::number(m_db->myNodeId(), 16);
m_defaultServer = m_db->getUiState("avatar_default_server").toULongLong(nullptr, 16); m_defaultServer = m_db->getUiState("avatar_default_server").toULongLong(nullptr, 16);
m_defaultConfigured = m_db->getUiStateInt("avatar_default_configured", 0) != 0;
const QString file = m_db->getUiState("avatar_default_file"); const QString file = m_db->getUiState("avatar_default_file");
if (mf_avatar_file_valid(file.toLatin1().constData())) m_defaultHash = file.left(64); if (mf_avatar_file_valid(file.toLatin1().constData())) m_defaultHash = file.left(64);
const QString directory = m_directory; const QString directory = m_directory;
@ -164,9 +165,10 @@ void AvatarManager::loadCache(const QString& hash) {
} }
void AvatarManager::saveDefault() { void AvatarManager::saveDefault() {
const char* keys[] = {"avatar_default_server", "avatar_default_file"}; m_defaultConfigured = true;
const QString values[] = {QString::number(m_defaultServer, 16), m_defaultHash.isEmpty() ? QString() : m_defaultHash + ".png"}; const char* keys[] = {"avatar_default_server", "avatar_default_file", "avatar_default_configured"};
for (int i = 0; i < 2; i++) { const QString values[] = {QString::number(m_defaultServer, 16), m_defaultHash.isEmpty() ? QString() : m_defaultHash + ".png", "1"};
for (int i = 0; i < 3; i++) {
auto* q = (save_ui_state_arg*)u_calloc(1, sizeof(save_ui_state_arg)); auto* q = (save_ui_state_arg*)u_calloc(1, sizeof(save_ui_state_arg));
if (!q) { DEBUG_ERROR(DEBUG_CATEGORY_MEDIA, "avatar: preference allocation failed"); return; } if (!q) { DEBUG_ERROR(DEBUG_CATEGORY_MEDIA, "avatar: preference allocation failed"); return; }
q->inst = gui_bridge_get_inst(); const QByteArray value = values[i].toLatin1(); q->inst = gui_bridge_get_inst(); const QByteArray value = values[i].toLatin1();
@ -208,7 +210,7 @@ void AvatarManager::cancelUploads() {
void AvatarManager::clearDefault() { void AvatarManager::clearDefault() {
if (!m_ready || !gui_bridge_is_uasync_ready()) return; if (!m_ready || !gui_bridge_is_uasync_ready()) return;
++m_generation; cancelUploads(); m_defaultHash.clear(); m_defaultServer = 0; saveDefault(); ++m_generation; cancelUploads(); m_defaultHash.clear(); m_defaultServer = 0; saveDefault();
for (const auto& ref : m_refs) if (ref.owner == m_db->myNodeId() && ref.server) { for (const auto& ref : m_refs) if (ref.owner == m_db->myNodeId()) {
Job job; job.ref = ref; job.ref.server = 0; job.ref.hash.clear(); job.upload = true; job.generation = m_generation; Job job; job.ref = ref; job.ref.server = 0; job.ref.hash.clear(); job.upload = true; job.generation = m_generation;
enqueue(job); enqueue(job);
} }
@ -216,10 +218,14 @@ void AvatarManager::clearDefault() {
} }
void AvatarManager::scheduleOwn(quint64 group) { void AvatarManager::scheduleOwn(quint64 group) {
const QString context = key(group, m_db->myNodeId());
if (m_ready && m_defaultConfigured && !m_defaultServer && m_refs.value(context).server &&
m_retry.value(context) <= QDateTime::currentMSecsSinceEpoch()) {
Job job; job.ref = {group, m_db->myNodeId(), 0, {}}; job.upload = true; job.generation = m_generation; enqueue(job); return;
}
if (!m_ready || m_preparing || !m_defaultServer || m_defaultHash.isEmpty() || !m_servers.value(group).contains(m_defaultServer) || if (!m_ready || m_preparing || !m_defaultServer || m_defaultHash.isEmpty() || !m_servers.value(group).contains(m_defaultServer) ||
m_missing.contains(m_defaultHash)) return; m_missing.contains(m_defaultHash)) return;
if (!m_images.contains(m_defaultHash)) { loadCache(m_defaultHash); return; } if (!m_images.contains(m_defaultHash)) { loadCache(m_defaultHash); return; }
const QString context = key(group, m_db->myNodeId());
if (!m_refs.contains(context) || m_retry.value(context) > QDateTime::currentMSecsSinceEpoch()) return; if (!m_refs.contains(context) || m_retry.value(context) > QDateTime::currentMSecsSinceEpoch()) return;
const Ref old = m_refs.value(context); const Ref old = m_refs.value(context);
if (old.server == m_defaultServer && old.hash == m_defaultHash) return; if (old.server == m_defaultServer && old.hash == m_defaultHash) return;
@ -232,7 +238,7 @@ void AvatarManager::enqueue(const Job& job) {
(!job.upload && !old.upload && old.ref.hash == job.ref.hash)) return; (!job.upload && !old.upload && old.ref.hash == job.ref.hash)) return;
for (const auto& old : m_queue) if ((old.ref.group == job.ref.group && old.ref.owner == job.ref.owner) || for (const auto& old : m_queue) if ((old.ref.group == job.ref.group && old.ref.owner == job.ref.owner) ||
(!job.upload && !old.upload && old.ref.hash == job.ref.hash)) return; (!job.upload && !old.upload && old.ref.hash == job.ref.hash)) return;
m_queue.enqueue(job); if (job.upload) m_queue.prepend(job); else m_queue.enqueue(job);
} }
void AvatarManager::pump() { void AvatarManager::pump() {

2
tools/chatgui/src/avatars/avatarmanager.h

@ -51,7 +51,7 @@ private:
DbManager* m_db; DbManager* m_db;
QString m_directory, m_defaultHash; QString m_directory, m_defaultHash;
quint64 m_defaultServer = 0, m_generation = 1; quint64 m_defaultServer = 0, m_generation = 1;
bool m_ready = false, m_preparing = false; bool m_ready = false, m_preparing = false, m_defaultConfigured = false;
QHash<QString, Ref> m_refs; QHash<QString, Ref> m_refs;
QHash<quint64, QMap<quint64, QString>> m_servers; QHash<quint64, QMap<quint64, QString>> m_servers;
QCache<QString, QImage> m_images{32 * 1024}; QCache<QString, QImage> m_images{32 * 1024};

1
tools/chatgui/tests/test_avatars.cpp

@ -104,6 +104,7 @@ private slots:
QVERIFY(QFile::exists(directory.path() + "/storage/" + channel.channelId + '/' + QString::number(testInstance->node_id) + QVERIFY(QFile::exists(directory.path() + "/storage/" + channel.channelId + '/' + QString::number(testInstance->node_id) +
"/avatars/" + member.avatar_file)); "/avatars/" + member.avatar_file));
QVERIFY(!manager.image(channel.channelId, testInstance->node_id).isNull()); QVERIFY(!manager.image(channel.channelId, testInstance->node_id).isNull());
QVERIFY(!manager.image("pm:test", testInstance->node_id).isNull());
cached = directory.path() + "/avatar_cache/" + QString::number(testInstance->node_id, 16) + '/' + member.avatar_file; cached = directory.path() + "/avatar_cache/" + QString::number(testInstance->node_id, 16) + '/' + member.avatar_file;
} }
chat_core_update_my_name(testInstance, "quote\"\\name"); chat_core_sync_my_addresses(testInstance); chat_core_update_my_name(testInstance, "quote\"\\name"); chat_core_sync_my_addresses(testInstance);

Loading…
Cancel
Save