Navigation Menu

Skip to content

Commit

Permalink
[nemo-qml-plugin-contacts] Delete unused avatar file when avatar path…
Browse files Browse the repository at this point in the history
… is changed or contact is removed. JB#46560
  • Loading branch information
blammit committed Feb 22, 2021
1 parent 6042fa9 commit 07cc9ca
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 0 deletions.
28 changes: 28 additions & 0 deletions lib/seasidecache.cpp
Expand Up @@ -1475,6 +1475,29 @@ QUrl SeasideCache::filteredAvatarUrl(const QContact &contact, const QStringList
return QUrl();
}

bool SeasideCache::removeLocalAvatarFile(const QContact &contact, const QContactAvatar &avatar)
{
if (avatar.isEmpty() || contact.collectionId() != localCollectionId()) {
return false;
}

const QString avatarPath = avatar.imageUrl().isLocalFile()
? avatar.imageUrl().toLocalFile()
: avatar.imageUrl().toString();

// Check that the avatar is a system-generated file before deleting it, to avoid deleting
// user-created files.
static const QString dataPath = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation).value(0);
static const QString avatarCachePath = QString("%1/data/avatars").arg(dataPath);
static const QString avatarSystemPath = QString("%1/system").arg(dataPath);

if (avatarPath.startsWith(avatarCachePath) || avatarPath.startsWith(avatarSystemPath)) {
return QFile::remove(avatarPath);
}

return false;
}

QString SeasideCache::normalizePhoneNumber(const QString &input, bool validate)
{
QtContactsSqliteExtensions::NormalizePhoneNumberFlags normalizeFlags(QtContactsSqliteExtensions::KeepPhoneNumberDialString);
Expand Down Expand Up @@ -2144,6 +2167,11 @@ void SeasideCache::contactsRemoved(const QList<QContactId> &ids)
// Remove the links to addressible details
updateContactIndexing(item->contact, QContact(), item->iid, QSet<QContactDetail::DetailType>(), item);

// Delete the avatar file assets of removed local contacts.
foreach (const QContactAvatar &avatar, item->contact.details<QContactAvatar>()) {
removeLocalAvatarFile(item->contact, avatar);
}

if (!m_keepPopulated) {
presentIds.append(id);
}
Expand Down
2 changes: 2 additions & 0 deletions lib/seasidecache.h
Expand Up @@ -53,6 +53,7 @@
#include <QContactIdFetchRequest>
#include <QContactName>
#include <QContactCollectionId>
#include <QContactAvatar>

#include <QTranslator>
#include <QBasicTimer>
Expand Down Expand Up @@ -363,6 +364,7 @@ class CONTACTCACHE_EXPORT SeasideCache : public QObject
static QString generateDisplayLabel(const QContact &contact, DisplayLabelOrder order = FirstNameFirst, bool fallbackToNonNameDetails = true);
static QString generateDisplayLabelFromNonNameDetails(const QContact &contact);
static QUrl filteredAvatarUrl(const QContact &contact, const QStringList &metadataFragments = QStringList());
static bool removeLocalAvatarFile(const QContact &contact, const QContactAvatar &avatar);

static QString normalizePhoneNumber(const QString &input, bool validate = false);
static QString minimizePhoneNumber(const QString &input, bool validate = false);
Expand Down
4 changes: 4 additions & 0 deletions src/seasideperson.cpp
Expand Up @@ -55,6 +55,7 @@
#include <QVersitWriter>
#include <QVersitContactExporter>

#include <QFile>
#include <QDebug>

QTVERSIT_USE_NAMESPACE
Expand Down Expand Up @@ -464,11 +465,14 @@ void SeasidePerson::setAvatarUrl(QUrl avatarUrl)
} else {
// We can only have one local avatar
QContactAvatar obsoleteAvatar(avatar);
SeasideCache::removeLocalAvatarFile(*mContact, obsoleteAvatar);
mContact->removeDetail(&obsoleteAvatar);
}
}
}

SeasideCache::removeLocalAvatarFile(*mContact, localAvatar);

localAvatar.setImageUrl(avatarUrl);
localAvatar.setValue(QContactAvatar::FieldMetaData, localMetadata);
mContact->saveDetail(&localAvatar);
Expand Down
5 changes: 5 additions & 0 deletions tests/tst_seasidefilteredmodel/seasidecache.cpp
Expand Up @@ -460,6 +460,11 @@ QUrl SeasideCache::filteredAvatarUrl(const QContact &contact, const QStringList
return QUrl();
}

bool SeasideCache::removeLocalAvatarFile(const QContact &, const QContactAvatar &)
{
return false;
}

QString SeasideCache::normalizePhoneNumber(const QString &input, bool)
{
return input;
Expand Down
2 changes: 2 additions & 0 deletions tests/tst_seasidefilteredmodel/seasidecache.h
Expand Up @@ -8,6 +8,7 @@
#include <QContactId>
#include <QContactManager>
#include <QContactCollection>
#include <QContactAvatar>

#include <QAbstractListModel>

Expand Down Expand Up @@ -218,6 +219,7 @@ class SeasideCache : public QObject
static QString generateDisplayLabel(const QContact &contact, DisplayLabelOrder order = FirstNameFirst);
static QString generateDisplayLabelFromNonNameDetails(const QContact &contact);
static QUrl filteredAvatarUrl(const QContact &contact, const QStringList &metadataFragments = QStringList());
static bool removeLocalAvatarFile(const QContact &, const QContactAvatar &);

static QString normalizePhoneNumber(const QString &input, bool validate = false);
static QString minimizePhoneNumber(const QString &input, bool validate = false);
Expand Down

0 comments on commit 07cc9ca

Please sign in to comment.