Commit e442c84d authored by mvogt's avatar mvogt

[libcontacts] Extract configuration object from cache

Allow the configuration data to be read and updated even if the cache
has not been instantiated.
parent af9a67cf
/*
* Copyright (C) 2014 Jolla Ltd.
* Contact: Matt Vogt <matthew.vogt@jollamobile.com>
*
* You may use this file under the terms of the BSD license as follows:
*
* "Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Nemo Mobile nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
*/
#include "cacheconfiguration.h"
#include <QtDebug>
CacheConfiguration::CacheConfiguration()
: m_displayLabelOrder(FirstNameFirst)
, m_sortProperty(QString::fromLatin1("firstName"))
, m_groupProperty(QString::fromLatin1("firstName"))
#ifdef HAS_MLITE
, m_displayLabelOrderConf(QLatin1String("/org/nemomobile/contacts/display_label_order"))
, m_sortPropertyConf(QLatin1String("/org/nemomobile/contacts/sort_property"))
, m_groupPropertyConf(QLatin1String("/org/nemomobile/contacts/group_property"))
#endif
{
#ifdef HAS_MLITE
connect(&m_displayLabelOrderConf, SIGNAL(valueChanged()), this, SLOT(onDisplayLabelOrderChanged()));
QVariant displayLabelOrder = m_displayLabelOrderConf.value();
if (displayLabelOrder.isValid())
m_displayLabelOrder = static_cast<DisplayLabelOrder>(displayLabelOrder.toInt());
connect(&m_sortPropertyConf, SIGNAL(valueChanged()), this, SLOT(onSortPropertyChanged()));
QVariant sortPropertyConf = m_sortPropertyConf.value();
if (sortPropertyConf.isValid())
m_sortProperty = sortPropertyConf.toString();
connect(&m_groupPropertyConf, SIGNAL(valueChanged()), this, SLOT(onGroupPropertyChanged()));
QVariant groupPropertyConf = m_groupPropertyConf.value();
if (groupPropertyConf.isValid())
m_groupProperty = groupPropertyConf.toString();
#endif
}
#ifdef HAS_MLITE
void CacheConfiguration::onDisplayLabelOrderChanged()
{
QVariant displayLabelOrder = m_displayLabelOrderConf.value();
if (displayLabelOrder.isValid() && displayLabelOrder.toInt() != m_displayLabelOrder) {
m_displayLabelOrder = static_cast<DisplayLabelOrder>(displayLabelOrder.toInt());
emit displayLabelOrderChanged(m_displayLabelOrder);
}
}
void CacheConfiguration::onSortPropertyChanged()
{
QVariant sortProperty = m_sortPropertyConf.value();
if (sortProperty.isValid() && sortProperty.toString() != m_sortProperty) {
const QString newProperty(sortProperty.toString());
if ((newProperty != QString::fromLatin1("firstName")) &&
(newProperty != QString::fromLatin1("lastName"))) {
qWarning() << "Invalid sort property configuration:" << newProperty;
return;
}
m_sortProperty = newProperty;
emit sortPropertyChanged(m_sortProperty);
}
}
void CacheConfiguration::onGroupPropertyChanged()
{
QVariant groupProperty = m_groupPropertyConf.value();
if (groupProperty.isValid() && groupProperty.toString() != m_groupProperty) {
const QString newProperty(groupProperty.toString());
if ((newProperty != QString::fromLatin1("firstName")) &&
(newProperty != QString::fromLatin1("lastName"))) {
qWarning() << "Invalid group property configuration:" << newProperty;
return;
}
m_groupProperty = newProperty;
emit groupPropertyChanged(m_groupProperty);
}
}
#endif
/*
* Copyright (C) 2014 Jolla Ltd.
* Contact: Matt Vogt <matthew.vogt@jollamobile.com>
*
* You may use this file under the terms of the BSD license as follows:
*
* "Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Nemo Mobile nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
*/
#include "contactcacheexport.h"
#include <QObject>
#include <QString>
#ifdef HAS_MLITE
#include <mgconfitem.h>
#endif
class CONTACTCACHE_EXPORT CacheConfiguration : public QObject
{
Q_OBJECT
public:
enum DisplayLabelOrder {
FirstNameFirst = 0,
LastNameFirst
};
CacheConfiguration();
DisplayLabelOrder displayLabelOrder() const { return m_displayLabelOrder; }
QString sortProperty() const { return m_sortProperty; }
QString groupProperty() const { return m_groupProperty; }
signals:
void displayLabelOrderChanged(CacheConfiguration::DisplayLabelOrder order);
void sortPropertyChanged(const QString &sortProperty);
void groupPropertyChanged(const QString &groupProperty);
private:
DisplayLabelOrder m_displayLabelOrder;
QString m_sortProperty;
QString m_groupProperty;
#ifdef HAS_MLITE
MGConfItem m_displayLabelOrderConf;
MGConfItem m_sortPropertyConf;
MGConfItem m_groupPropertyConf;
private slots:
void onDisplayLabelOrderChanged();
void onSortPropertyChanged();
void onGroupPropertyChanged();
#endif
};
......@@ -77,6 +77,8 @@ QTVERSIT_USE_NAMESPACE
namespace {
Q_GLOBAL_STATIC(CacheConfiguration, cacheConfig)
ML10N::MLocale mLocale;
const QString aggregateRelationshipType = QContactRelationship::Aggregates();
......@@ -479,19 +481,11 @@ quint32 SeasideCache::internalId(const QContactId &id)
SeasideCache::SeasideCache()
: m_syncFilter(FilterNone)
#ifdef HAS_MLITE
, m_displayLabelOrderConf(QLatin1String("/org/nemomobile/contacts/display_label_order"))
, m_sortPropertyConf(QLatin1String("/org/nemomobile/contacts/sort_property"))
, m_groupPropertyConf(QLatin1String("/org/nemomobile/contacts/group_property"))
#endif
, m_populated(0)
, m_cacheIndex(0)
, m_queryIndex(0)
, m_fetchProcessedCount(0)
, m_fetchByIdProcessedCount(0)
, m_displayLabelOrder(FirstNameFirst)
, m_sortProperty(QString::fromLatin1("firstName"))
, m_groupProperty(QString::fromLatin1("firstName"))
, m_keepPopulated(false)
, m_populateProgress(Unpopulated)
, m_fetchTypes(0)
......@@ -509,22 +503,11 @@ SeasideCache::SeasideCache()
m_timer.start();
m_fetchPostponed.invalidate();
#ifdef HAS_MLITE
connect(&m_displayLabelOrderConf, SIGNAL(valueChanged()), this, SLOT(displayLabelOrderChanged()));
QVariant displayLabelOrder = m_displayLabelOrderConf.value();
if (displayLabelOrder.isValid())
m_displayLabelOrder = static_cast<DisplayLabelOrder>(displayLabelOrder.toInt());
connect(&m_sortPropertyConf, SIGNAL(valueChanged()), this, SLOT(sortPropertyChanged()));
QVariant sortPropertyConf = m_sortPropertyConf.value();
if (sortPropertyConf.isValid())
m_sortProperty = sortPropertyConf.toString();
connect(&m_groupPropertyConf, SIGNAL(valueChanged()), this, SLOT(groupPropertyChanged()));
QVariant groupPropertyConf = m_groupPropertyConf.value();
if (groupPropertyConf.isValid())
m_groupProperty = groupPropertyConf.toString();
#endif
CacheConfiguration *config(cacheConfig());
connect(config, SIGNAL(displayLabelOrderChanged(CacheConfiguration::DisplayLabelOrder)),
this, SLOT(displayLabelOrderChanged(CacheConfiguration::DisplayLabelOrder)));
connect(config, SIGNAL(sortPropertyChanged(QString)), this, SLOT(sortPropertyChanged(QString)));
connect(config, SIGNAL(groupPropertyChanged(QString)), this, SLOT(groupPropertyChanged(QString)));
if (!QDBusConnection::systemBus().connect(MCE_SERVICE, MCE_SIGNAL_PATH, MCE_SIGNAL_IF,
MCE_DISPLAY_SIG, this, SLOT(displayStatusChanged(QString)))) {
......@@ -579,7 +562,7 @@ SeasideCache::SeasideCache()
m_relationshipSaveRequest.setManager(mgr);
m_relationshipRemoveRequest.setManager(mgr);
setSortOrder(m_sortProperty);
setSortOrder(sortProperty());
}
SeasideCache::~SeasideCache()
......@@ -728,14 +711,14 @@ QString SeasideCache::determineNameGroup(const CacheItem *cacheItem)
return QString();
if (!instancePtr->m_nameGrouper.isNull()) {
QString group = instancePtr->m_nameGrouper->nameGroupForContact(cacheItem->contact, instancePtr->m_groupProperty);
QString group = instancePtr->m_nameGrouper->nameGroupForContact(cacheItem->contact, groupProperty());
if (!group.isNull() && allContactNameGroups.contains(group)) {
return group;
}
}
const QContactName name(cacheItem->contact.detail<QContactName>());
const QString nameProperty(instancePtr->m_groupProperty == QString::fromLatin1("firstName") ? name.firstName() : name.lastName());
const QString nameProperty(groupProperty() == QString::fromLatin1("firstName") ? name.firstName() : name.lastName());
QString group;
if (!nameProperty.isEmpty()) {
......@@ -787,17 +770,17 @@ QHash<QString, QSet<quint32> > SeasideCache::nameGroupMembers()
SeasideCache::DisplayLabelOrder SeasideCache::displayLabelOrder()
{
return instancePtr->m_displayLabelOrder;
return static_cast<DisplayLabelOrder>(cacheConfig()->displayLabelOrder());
}
QString SeasideCache::sortProperty()
{
return instancePtr->m_sortProperty;
return cacheConfig()->sortProperty();
}
QString SeasideCache::groupProperty()
{
return instancePtr->m_groupProperty;
return cacheConfig()->groupProperty();
}
int SeasideCache::contactId(const QContact &contact)
......@@ -1998,7 +1981,7 @@ void SeasideCache::updateCache(CacheItem *item, const QContact &contact, bool pa
item->contact = contact;
}
item->displayLabel = generateDisplayLabel(item->contact, m_displayLabelOrder);
item->displayLabel = generateDisplayLabel(item->contact, displayLabelOrder());
item->nameGroup = determineNameGroup(item);
if (!initialInsert) {
......@@ -2752,20 +2735,15 @@ void SeasideCache::setSortOrder(const QString &property)
m_onlineSortOrder.prepend(onlineOrder);
}
void SeasideCache::displayLabelOrderChanged()
void SeasideCache::displayLabelOrderChanged(CacheConfiguration::DisplayLabelOrder order)
{
#ifdef HAS_MLITE
QVariant displayLabelOrder = m_displayLabelOrderConf.value();
if (displayLabelOrder.isValid() && displayLabelOrder.toInt() != m_displayLabelOrder) {
m_displayLabelOrder = static_cast<DisplayLabelOrder>(displayLabelOrder.toInt());
QSet<QString> modifiedGroups;
// Update the display labels
typedef QHash<quint32, CacheItem>::iterator iterator;
for (iterator it = m_people.begin(); it != m_people.end(); ++it) {
// Regenerate the display label
QString newLabel = generateDisplayLabel(it->contact, m_displayLabelOrder);
QString newLabel = generateDisplayLabel(it->contact, static_cast<DisplayLabelOrder>(order));
if (newLabel != it->displayLabel) {
it->displayLabel = newLabel;
......@@ -2774,7 +2752,7 @@ void SeasideCache::displayLabelOrderChanged()
}
if (it->itemData) {
it->itemData->displayLabelOrderChanged(m_displayLabelOrder);
it->itemData->displayLabelOrderChanged(static_cast<DisplayLabelOrder>(order));
}
// If the contact's name group is derived from display label, it may have changed
......@@ -2799,24 +2777,11 @@ void SeasideCache::displayLabelOrderChanged()
model->sourceItemsChanged();
}
}
}
#endif
}
void SeasideCache::sortPropertyChanged()
void SeasideCache::sortPropertyChanged(const QString &sortProperty)
{
#ifdef HAS_MLITE
QVariant sortProperty = m_sortPropertyConf.value();
if (sortProperty.isValid() && sortProperty.toString() != m_sortProperty) {
const QString newProperty(sortProperty.toString());
if ((newProperty != QString::fromLatin1("firstName")) &&
(newProperty != QString::fromLatin1("lastName"))) {
qWarning() << "Invalid sort property configuration:" << newProperty;
return;
}
m_sortProperty = newProperty;
setSortOrder(m_sortProperty);
setSortOrder(sortProperty);
for (int i = 0; i < FilterTypesCount; ++i) {
const QList<ListModel *> &models = m_models[i];
......@@ -2829,24 +2794,10 @@ void SeasideCache::sortPropertyChanged()
// Update the sorted list order
m_refreshRequired = true;
requestUpdate();
}
#endif
}
void SeasideCache::groupPropertyChanged()
void SeasideCache::groupPropertyChanged(const QString &)
{
#ifdef HAS_MLITE
QVariant groupProperty = m_groupPropertyConf.value();
if (groupProperty.isValid() && groupProperty.toString() != m_groupProperty) {
const QString newProperty(groupProperty.toString());
if ((newProperty != QString::fromLatin1("firstName")) &&
(newProperty != QString::fromLatin1("lastName"))) {
qWarning() << "Invalid group property configuration:" << newProperty;
return;
}
m_groupProperty = newProperty;
// Update the name groups
QSet<QString> modifiedGroups;
......@@ -2874,8 +2825,6 @@ void SeasideCache::groupPropertyChanged()
model->sourceItemsChanged();
}
}
}
#endif
}
void SeasideCache::displayStatusChanged(const QString &status)
......
......@@ -33,6 +33,7 @@
#define SEASIDECACHE_H
#include "contactcacheexport.h"
#include "cacheconfiguration.h"
#include "seasidenamegrouper.h"
#include <qtcontacts-extensions.h>
......@@ -56,10 +57,6 @@
#include <QElapsedTimer>
#include <QAbstractListModel>
#ifdef HAS_MLITE
#include <mgconfitem.h>
#endif
QTCONTACTS_USE_NAMESPACE
class CONTACTCACHE_EXPORT SeasideNameGroupChangeListener
......@@ -96,8 +93,8 @@ public:
};
enum DisplayLabelOrder {
FirstNameFirst = 0,
LastNameFirst
FirstNameFirst = CacheConfiguration::FirstNameFirst,
LastNameFirst = CacheConfiguration::LastNameFirst
};
enum ContactState {
......@@ -350,9 +347,9 @@ private slots:
void contactsChanged(const QList<QContactId> &contactIds);
void contactsPresenceChanged(const QList<QContactId> &contactIds);
void contactsRemoved(const QList<QContactId> &contactIds);
void displayLabelOrderChanged();
void sortPropertyChanged();
void groupPropertyChanged();
void displayLabelOrderChanged(CacheConfiguration::DisplayLabelOrder order);
void sortPropertyChanged(const QString &sortProperty);
void groupPropertyChanged(const QString &groupProperty);
void displayStatusChanged(const QString &);
private:
......@@ -446,11 +443,6 @@ private:
QList<QContactSortOrder> m_sortOrder;
QList<QContactSortOrder> m_onlineSortOrder;
FilterType m_syncFilter;
#ifdef HAS_MLITE
MGConfItem m_displayLabelOrderConf;
MGConfItem m_sortPropertyConf;
MGConfItem m_groupPropertyConf;
#endif
int m_populated;
int m_cacheIndex;
int m_queryIndex;
......
......@@ -35,11 +35,13 @@ VPATH += $$replace(extensionsIncludePath, -I, )
HEADERS += contactmanagerengine.h
SOURCES += \
$$PWD/cacheconfiguration.cpp \
$$PWD/seasidecache.cpp \
$$PWD/seasideimport.cpp \
$$PWD/seasidepropertyhandler.cpp
HEADERS += \
$$PWD/cacheconfiguration.h \
$$PWD/contactcacheexport.h \
$$PWD/seasidecache.h \
$$PWD/seasideimport.h \
......@@ -48,6 +50,7 @@ HEADERS += \
$$PWD/seasidepropertyhandler.h
headers.files = \
$$PWD/cacheconfiguration.h \
$$PWD/contactcacheexport.h \
$$PWD/seasidecache.h \
$$PWD/seasideimport.h \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment