diff --git a/src/cacheconfiguration.cpp b/src/cacheconfiguration.cpp new file mode 100644 index 0000000..35f3d3b --- /dev/null +++ b/src/cacheconfiguration.cpp @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2014 Jolla Ltd. + * Contact: Matt Vogt + * + * 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 + +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.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.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 + diff --git a/src/cacheconfiguration.h b/src/cacheconfiguration.h new file mode 100644 index 0000000..2777471 --- /dev/null +++ b/src/cacheconfiguration.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2014 Jolla Ltd. + * Contact: Matt Vogt + * + * 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 +#include + +#ifdef HAS_MLITE +#include +#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 +}; + diff --git a/src/seasidecache.cpp b/src/seasidecache.cpp index 7d2cddb..b63c129 100644 --- a/src/seasidecache.cpp +++ b/src/seasidecache.cpp @@ -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.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()); - 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 > SeasideCache::nameGroupMembers() SeasideCache::DisplayLabelOrder SeasideCache::displayLabelOrder() { - return instancePtr->m_displayLabelOrder; + return static_cast(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,130 +2735,96 @@ 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.toInt()); - - QSet modifiedGroups; + QSet modifiedGroups; - // Update the display labels - typedef QHash::iterator iterator; - for (iterator it = m_people.begin(); it != m_people.end(); ++it) { - // Regenerate the display label - QString newLabel = generateDisplayLabel(it->contact, m_displayLabelOrder); - if (newLabel != it->displayLabel) { - it->displayLabel = newLabel; + // Update the display labels + typedef QHash::iterator iterator; + for (iterator it = m_people.begin(); it != m_people.end(); ++it) { + // Regenerate the display label + QString newLabel = generateDisplayLabel(it->contact, static_cast(order)); + if (newLabel != it->displayLabel) { + it->displayLabel = newLabel; - contactDataChanged(it->iid); - reportItemUpdated(&*it); - } + contactDataChanged(it->iid); + reportItemUpdated(&*it); + } - if (it->itemData) { - it->itemData->displayLabelOrderChanged(m_displayLabelOrder); - } + if (it->itemData) { + it->itemData->displayLabelOrderChanged(static_cast(order)); + } - // If the contact's name group is derived from display label, it may have changed - const QString group(determineNameGroup(&*it)); - if (group != it->nameGroup) { - if (!ignoreContactForNameGroups(it->contact)) { - removeFromContactNameGroup(it->iid, it->nameGroup, &modifiedGroups); + // If the contact's name group is derived from display label, it may have changed + const QString group(determineNameGroup(&*it)); + if (group != it->nameGroup) { + if (!ignoreContactForNameGroups(it->contact)) { + removeFromContactNameGroup(it->iid, it->nameGroup, &modifiedGroups); - it->nameGroup = group; - addToContactNameGroup(it->iid, it->nameGroup, &modifiedGroups); - } + it->nameGroup = group; + addToContactNameGroup(it->iid, it->nameGroup, &modifiedGroups); } } + } - notifyNameGroupsChanged(modifiedGroups); + notifyNameGroupsChanged(modifiedGroups); - for (int i = 0; i < FilterTypesCount; ++i) { - const QList &models = m_models[i]; - for (int j = 0; j < models.count(); ++j) { - ListModel *model = models.at(j); - model->updateDisplayLabelOrder(); - model->sourceItemsChanged(); - } + for (int i = 0; i < FilterTypesCount; ++i) { + const QList &models = m_models[i]; + for (int j = 0; j < models.count(); ++j) { + ListModel *model = models.at(j); + model->updateDisplayLabelOrder(); + 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 &models = m_models[i]; - for (int j = 0; j < models.count(); ++j) { - models.at(j)->updateSortProperty(); - // No need for sourceItemsChanged, as the sorted list update will cause that - } + for (int i = 0; i < FilterTypesCount; ++i) { + const QList &models = m_models[i]; + for (int j = 0; j < models.count(); ++j) { + models.at(j)->updateSortProperty(); + // No need for sourceItemsChanged, as the sorted list update will cause that } - - // Update the sorted list order - m_refreshRequired = true; - requestUpdate(); } -#endif + + // Update the sorted list order + m_refreshRequired = true; + requestUpdate(); } -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 modifiedGroups; + // Update the name groups + QSet modifiedGroups; - typedef QHash::iterator iterator; - for (iterator it = m_people.begin(); it != m_people.end(); ++it) { - // Update the nameGroup for this contact - const QString group(determineNameGroup(&*it)); - if (group != it->nameGroup) { - if (!ignoreContactForNameGroups(it->contact)) { - removeFromContactNameGroup(it->iid, it->nameGroup, &modifiedGroups); + typedef QHash::iterator iterator; + for (iterator it = m_people.begin(); it != m_people.end(); ++it) { + // Update the nameGroup for this contact + const QString group(determineNameGroup(&*it)); + if (group != it->nameGroup) { + if (!ignoreContactForNameGroups(it->contact)) { + removeFromContactNameGroup(it->iid, it->nameGroup, &modifiedGroups); - it->nameGroup = group; - addToContactNameGroup(it->iid, it->nameGroup, &modifiedGroups); - } + it->nameGroup = group; + addToContactNameGroup(it->iid, it->nameGroup, &modifiedGroups); } } + } - notifyNameGroupsChanged(modifiedGroups); + notifyNameGroupsChanged(modifiedGroups); - for (int i = 0; i < FilterTypesCount; ++i) { - const QList &models = m_models[i]; - for (int j = 0; j < models.count(); ++j) { - ListModel *model = models.at(j); - model->updateGroupProperty(); - model->sourceItemsChanged(); - } + for (int i = 0; i < FilterTypesCount; ++i) { + const QList &models = m_models[i]; + for (int j = 0; j < models.count(); ++j) { + ListModel *model = models.at(j); + model->updateGroupProperty(); + model->sourceItemsChanged(); } } -#endif } void SeasideCache::displayStatusChanged(const QString &status) diff --git a/src/seasidecache.h b/src/seasidecache.h index 246ec54..314902e 100644 --- a/src/seasidecache.h +++ b/src/seasidecache.h @@ -33,6 +33,7 @@ #define SEASIDECACHE_H #include "contactcacheexport.h" +#include "cacheconfiguration.h" #include "seasidenamegrouper.h" #include @@ -56,10 +57,6 @@ #include #include -#ifdef HAS_MLITE -#include -#endif - QTCONTACTS_USE_NAMESPACE class CONTACTCACHE_EXPORT SeasideNameGroupChangeListener @@ -96,8 +93,8 @@ class CONTACTCACHE_EXPORT SeasideCache : public QObject }; enum DisplayLabelOrder { - FirstNameFirst = 0, - LastNameFirst + FirstNameFirst = CacheConfiguration::FirstNameFirst, + LastNameFirst = CacheConfiguration::LastNameFirst }; enum ContactState { @@ -350,9 +347,9 @@ private slots: void contactsChanged(const QList &contactIds); void contactsPresenceChanged(const QList &contactIds); void contactsRemoved(const QList &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 slots: QList m_sortOrder; QList 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; diff --git a/src/src.pro b/src/src.pro index 12d9965..7a2f4ed 100644 --- a/src/src.pro +++ b/src/src.pro @@ -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 \