/* Synthesise the display label of a contact */ QString QContactWinCEEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error* error) const { Q_UNUSED(error) // The POOM API (well, lack thereof) makes this a bit strange. // It's basically just "Last, First" or "Company", if "FileAs" is not set. QContactName name = contact.detail<QContactName>(); QContactOrganization org = contact.detail<QContactOrganization>(); // Basically we ignore any existing labels for this contact, since we're being // asked what the synthesized label would be // XXX For greatest accuracy we might be better off converting this contact to // a real item (but don't save it), and then retrieve it... if (!name.customLabel().isEmpty()) { return name.customLabel(); } else if (!name.lastName().isEmpty()) { if (!name.firstName().isEmpty()) { return QString(QLatin1String("%1, %2")).arg(name.lastName()).arg(name.firstName()); } else { // Just last return name.lastName(); } } else if (!name.firstName().isEmpty()) { return name.firstName(); } else if (!org.name().isEmpty()) { return org.name(); } else { // XXX grargh. return QLatin1String("Unnamed"); } }
// small helper to avoid inconvenience QString SeasidePerson::generateDisplayLabel(const QContact &mContact, SeasideProxyModel::DisplayLabelOrder order) { //REVISIT: Move this or parts of this to localeutils.cpp QString displayLabel; QContactName name = mContact.detail<QContactName>(); QString nameStr1; QString nameStr2; if (order == SeasideProxyModel::LastNameFirst) { nameStr1 = name.lastName(); nameStr2 = name.firstName(); } else { nameStr1 = name.firstName(); nameStr2 = name.lastName(); } if (!nameStr1.isNull()) displayLabel.append(nameStr1); if (!nameStr2.isNull()) { if (!displayLabel.isEmpty()) displayLabel.append(" "); displayLabel.append(nameStr2); } if (!displayLabel.isEmpty()) return displayLabel; foreach (const QContactOnlineAccount& account, mContact.details<QContactOnlineAccount>()) { if (!account.accountUri().isNull()) return account.accountUri(); } foreach (const QContactEmailAddress& email, mContact.details<QContactEmailAddress>()) { if (!email.emailAddress().isNull()) return email.emailAddress(); } QContactOrganization company = mContact.detail<QContactOrganization>(); if (!company.name().isNull()) return company.name(); foreach (const QContactPhoneNumber& phone, mContact.details<QContactPhoneNumber>()) { if (!phone.number().isNull()) return phone.number(); } // This is last because the custom label is often source from this function, so we want to // overwrite that value in many cases. if (!name.customLabel().isNull()) return name.customLabel(); return "(Unnamed)"; // TODO: localisation }
void SeasideCache::setFirstName(FilterType filterType, int index, const QString &firstName) { #ifdef USING_QTPIM CacheItem &cacheItem = m_cache[m_cacheIndices[m_contacts[filterType].at(index)]]; #else CacheItem &cacheItem = m_cache[m_contacts[filterType].at(index) - 1]; #endif QContactName name = cacheItem.contact.detail<QContactName>(); name.setFirstName(firstName); cacheItem.contact.saveDetail(&name); QString fullName = name.firstName() + QChar::fromLatin1(' ') + name.lastName(); cacheItem.nameGroup = determineNameGroup(&cacheItem); cacheItem.displayLabel = fullName; ItemListener *listener(cacheItem.listeners); while (listener) { listener->itemUpdated(&cacheItem); listener = listener->next; } if (m_models[filterType]) m_models[filterType]->sourceDataChanged(index, index); }
/* Synthesise the display label of a contact */ QString QContactMaemo5Engine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error* error) const { QString label; // Try to get the display name from the OSSO-ABook Contact label = d->m_abook->getDisplayName(contact); // Synthesise the display label for not saved contacts // A. FirstName + LastName if (label.isEmpty()){ QContactName name = contact.detail(QContactName::DefinitionName); QStringList nameList; nameList << name.firstName(); if (name.lastName().count()){ nameList << name.lastName(); } label = nameList.join(QString(' ')); } // B. Email if (label.isEmpty()){ QContactEmailAddress email = contact.detail(QContactEmailAddress::DefinitionName); label = email.emailAddress(); } // if (label.isEmpty()){ *error = QContactManager::UnspecifiedError; return QString("No name"); } *error = QContactManager::NoError; return label; }
QList<Contact> Contacts::getContactsFromPhone(){ QPointer<QContactManager> contactManager = new QContactManager(); // QStringList QContactManager::supportedContactTypes () QList<QContact> contactsPhone = contactManager->contacts(); QList<Contact> contacts; foreach (const QContact& contact, contactsPhone) { QContactPhoneNumber phoneNumber = contact.detail<QContactPhoneNumber>(); // QList<QContactPhoneNumber> phoneNumbers = contact.details<QContactPhoneNumber>(); if(!phoneNumber.isEmpty()){ QContactName name = contact.detail<QContactName>(); QString number = phoneNumber.number(); number = number.replace("+",""); QString nameFinal = name.firstName()+" "+name.lastName(); contacts.append(Contact(nameFinal.trimmed(),number)); } }
// small helper to avoid inconvenience static QString generateDisplayLabel(QContact mContact) { //REVISIT: Move this or parts of this to localeutils.cpp QString displayLabel; QContactName name = mContact.detail<QContactName>(); QString nameStr1 = name.firstName(); QString nameStr2 = name.lastName(); if (!nameStr1.isNull()) displayLabel.append(nameStr1); if (!nameStr2.isNull()) { if (!displayLabel.isEmpty()) displayLabel.append(" "); displayLabel.append(nameStr2); } if (!displayLabel.isEmpty()) return displayLabel; foreach (const QContactOnlineAccount& account, mContact.details<QContactOnlineAccount>()) { if (!account.accountUri().isNull()) return account.accountUri(); } foreach (const QContactEmailAddress& email, mContact.details<QContactEmailAddress>()) { if (!email.emailAddress().isNull()) return email.emailAddress(); } QContactOrganization company = mContact.detail<QContactOrganization>(); if (!company.name().isNull()) return company.name(); foreach (const QContactPhoneNumber& phone, mContact.details<QContactPhoneNumber>()) { if (!phone.number().isNull()) return phone.number(); } return "(unnamed)"; // TODO: localisation }
QString SeasidePerson::lastName() const { QContactName nameDetail = mContact.detail<QContactName>(); return nameDetail.lastName(); }
QContact generateContact(const QString &syncTarget = QString(QLatin1String("local")), bool possiblyAggregate = false) { static const QStringList firstNames(generateFirstNamesList()); static const QStringList middleNames(generateMiddleNamesList()); static const QStringList lastNames(generateLastNamesList()); static const QStringList nonOverlappingFirstNames(generateNonOverlappingFirstNamesList()); static const QStringList nonOverlappingLastNames(generateNonOverlappingLastNamesList()); static const QStringList phoneNumbers(generatePhoneNumbersList()); static const QStringList emailProviders(generateEmailProvidersList()); static const QStringList avatars(generateAvatarsList()); static const QStringList hobbies(generateHobbiesList()); // we randomly determine whether to generate various details // to ensure that we have heterogeneous contacts in the db. QContact retn; int random = qrand(); bool preventAggregate = (syncTarget != QLatin1String("local") && !possiblyAggregate); // We always have a sync target. QContactSyncTarget synctarget; synctarget.setSyncTarget(syncTarget); retn.saveDetail(&synctarget); // We always have a name. Select an overlapping name if the sync target // is something other than "local" and possiblyAggregate is true. QContactName name; name.setFirstName(preventAggregate ? nonOverlappingFirstNames.at(random % nonOverlappingFirstNames.size()) : firstNames.at(random % firstNames.size())); name.setLastName(preventAggregate ? nonOverlappingLastNames.at(random % nonOverlappingLastNames.size()) : lastNames.at(random % lastNames.size())); if ((random % 6) == 0) name.setMiddleName(middleNames.at(random % middleNames.size())); if ((random % 17) == 0) name.setPrefix(QLatin1String("Dr.")); retn.saveDetail(&name); // Favorite if ((random % 31) == 0) { QContactFavorite fav; fav.setFavorite(true); retn.saveDetail(&fav); } // Phone number if ((random % 3) == 0) { QContactPhoneNumber phn; QString randomPhn = phoneNumbers.at(random % phoneNumbers.size()); phn.setNumber(preventAggregate ? QString(QString::number(random % 500000) + randomPhn) : randomPhn); if ((random % 9) == 0) phn.setContexts(QContactDetail::ContextWork); retn.saveDetail(&phn); } // Email if ((random % 2) == 0) { QContactEmailAddress em; em.setEmailAddress(QString(QLatin1String("%1%2%3%4")) .arg(preventAggregate ? QString(QString::number(random % 500000) + syncTarget) : QString()) .arg(name.firstName()).arg(name.lastName()) .arg(emailProviders.at(random % emailProviders.size()))); if (random % 9) em.setContexts(QContactDetail::ContextWork); retn.saveDetail(&em); } // Avatar if ((random % 5) == 0) { QContactAvatar av; av.setImageUrl(name.firstName() + avatars.at(random % avatars.size())); retn.saveDetail(&av); } // Hobby if ((random % 21) == 0) { QContactHobby h1; h1.setHobby(hobbies.at(random % hobbies.size())); retn.saveDetail(&h1); int newRandom = qrand(); if ((newRandom % 2) == 0) { QContactHobby h2; h2.setHobby(hobbies.at(newRandom % hobbies.size())); retn.saveDetail(&h2); } } return retn; }
QString SeasideCache::determineNameGroup(const CacheItem *cacheItem) { if (!cacheItem) return QString(); const QContactName nameDetail = cacheItem->contact.detail<QContactName>(); const QString sort(sortProperty() == QString::fromLatin1("firstName") ? nameDetail.firstName() : nameDetail.lastName()); QString group; if (!sort.isEmpty()) { group = QString(sort[0].toUpper()); } else if (!cacheItem->displayLabel.isEmpty()) { group = QString(cacheItem->displayLabel[0].toUpper()); } if (group.isNull() || !allContactNameGroups.contains(group)) { group = QString::fromLatin1("#"); // 'other' group } return group; }
void SeasideCache::reset() { for (int i = 0; i < FilterTypesCount; ++i) { m_contacts[i].clear(); m_populated[i] = false; m_models[i] = 0; } m_cache.clear(); m_cacheIndices.clear(); for (uint i = 0; i < sizeof(contactsData) / sizeof(Contact); ++i) { QContact contact; // This is specific to the qtcontacts-sqlite backend: const QString idStr(QString::fromLatin1("qtcontacts:org.nemomobile.contacts.sqlite::sql-%1")); contact.setId(QContactId::fromString(idStr.arg(i + 1))); QContactName name; name.setFirstName(QString::fromLatin1(contactsData[i].firstName)); name.setMiddleName(QString::fromUtf8(contactsData[i].middleName)); name.setLastName(QString::fromLatin1(contactsData[i].lastName)); contact.saveDetail(&name); if (contactsData[i].avatar) { QContactAvatar avatar; avatar.setImageUrl(QUrl(QLatin1String(contactsData[i].avatar))); contact.saveDetail(&avatar); } QContactStatusFlags statusFlags; if (contactsData[i].email) { QContactEmailAddress email; email.setEmailAddress(QLatin1String(contactsData[i].email)); contact.saveDetail(&email); statusFlags.setFlag(QContactStatusFlags::HasEmailAddress, true); } if (contactsData[i].phoneNumber) { QContactPhoneNumber phoneNumber; phoneNumber.setNumber(QLatin1String(contactsData[i].phoneNumber)); contact.saveDetail(&phoneNumber); statusFlags.setFlag(QContactStatusFlags::HasPhoneNumber, true); } contact.saveDetail(&statusFlags); m_cacheIndices.insert(internalId(contact), m_cache.count()); m_cache.append(CacheItem(contact)); QString fullName = name.firstName() + QChar::fromLatin1(' ') + name.lastName(); CacheItem &cacheItem = m_cache.last(); cacheItem.nameGroup = determineNameGroup(&cacheItem); cacheItem.displayLabel = fullName; } insert(FilterAll, 0, getContactsForFilterType(FilterAll)); insert(FilterFavorites, 0, getContactsForFilterType(FilterFavorites)); insert(FilterOnline, 0, getContactsForFilterType(FilterOnline)); }