messagingapp/msgui/unifiededitor/src/msgunieditoraddress.cpp
changeset 34 84197e66a4bd
parent 31 ebfee66fde93
child 44 36f374c67aa8
equal deleted inserted replaced
31:ebfee66fde93 34:84197e66a4bd
    32 #include <xqconversions.h>
    32 #include <xqconversions.h>
    33 
    33 
    34 // USER INCLUDES
    34 // USER INCLUDES
    35 #include "debugtraces.h"
    35 #include "debugtraces.h"
    36 #include "msgunieditoraddress.h"
    36 #include "msgunieditoraddress.h"
    37 #include "msgunifiededitorlineedit.h"
    37 #include "msgunieditorlineedit.h"
    38 #include "msgmonitor.h"
    38 #include "msgunieditormonitor.h"
    39 #include "unieditorgenutils.h"
    39 #include "UniEditorGenUtils.h"
    40 
    40 
    41 const QString PBK_ICON("qtg_mono_contacts");
    41 const QString PBK_ICON("qtg_mono_contacts");
    42 const QString SEND_ICON("qtg_mono_send");
    42 const QString SEND_ICON("qtg_mono_send");
    43 const QString replacementStr("; ");
    43 const QString REPLACEMENT_STR("; ");
       
    44 const QString COMMA_SEPERATOR(",");
    44 
    45 
    45 // Constants
    46 // Constants
    46 const int KDefaultGsmNumberMatchLength = 7;  //matching unique ph numbers
    47 const int KDefaultGsmNumberMatchLength = 7;  //matching unique ph numbers
    47 #define LOC_SMS_RECIPIENT_LIMIT_REACHED hbTrId("txt_messaging_dialog_number_of_recipients_exceeded")
    48 #define LOC_SMS_RECIPIENT_LIMIT_REACHED hbTrId("txt_messaging_dialog_number_of_recipients_exceeded")
    48 #define LOC_MMS_RECIPIENT_LIMIT_REACHED hbTrId("txt_messaging_dpopinfo_unable_to_add_more_recipien")
    49 #define LOC_MMS_RECIPIENT_LIMIT_REACHED hbTrId("txt_messaging_dpopinfo_unable_to_add_more_recipien")
    49 #define LOC_DIALOG_OK hbTrId("txt_common_button_ok")
    50 #define LOC_DIALOG_OK hbTrId("txt_common_button_ok")
    50 #define LOC_BUTTON_CANCEL hbTrId("txt_common_button_cancel")
    51 #define LOC_BUTTON_CANCEL hbTrId("txt_common_button_cancel")
    51 #define LOC_INVALID_RECIPIENT hbTrId("txt_messaging_dialog_invalid_recipient_found")
    52 #define LOC_INVALID_RECIPIENT hbTrId("txt_messaging_dialog_invalid_recipient_found")
       
    53 #define LOC_INVALID_RECIPIENT_NOT_ADDED hbTrId("txt_messaging_dialog_invalid_recipient_not_added")
       
    54 #define LOC_INVALID_RECIPIENTS_NOT_ADDED hbTrId("txt_messaging_dialog_invalid_recipients_not_added")
       
    55 
       
    56 
       
    57 
       
    58 
    52 
    59 
    53 MsgUnifiedEditorAddress::MsgUnifiedEditorAddress( const QString& label,
    60 MsgUnifiedEditorAddress::MsgUnifiedEditorAddress( const QString& label,
    54                                                   QGraphicsItem *parent ) :
    61                                                   QGraphicsItem *parent ) :
    55 MsgUnifiedEditorBaseWidget(parent),
    62 MsgUnifiedEditorBaseWidget(parent),
    56 mSkipMaxRecipientQuery(false),
    63 mSkipMaxRecipientQuery(false),
    88     //style()->unregisterPlugin(mPluginPath);
    95     //style()->unregisterPlugin(mPluginPath);
    89 }
    96 }
    90 
    97 
    91 void MsgUnifiedEditorAddress::fetchContacts()
    98 void MsgUnifiedEditorAddress::fetchContacts()
    92 {
    99 {
       
   100     mLaunchBtn->blockSignals(true);
       
   101     
    93     QList<QVariant> args;
   102     QList<QVariant> args;
    94     QString serviceName("com.nokia.services.phonebookservices");
   103     QString serviceName("com.nokia.services.phonebookservices");
    95     QString operation("fetch(QString,QString,QString)");
   104     QString operation("fetch(QString,QString,QString)");
    96     XQAiwRequest* request;
   105     XQAiwRequest* request;
    97     XQApplicationManager appManager;
   106     XQApplicationManager appManager;
   110     args << KCntFilterDisplayAll;
   119     args << KCntFilterDisplayAll;
   111 
   120 
   112     request->setArguments(args);
   121     request->setArguments(args);
   113     request->send();
   122     request->send();
   114     delete request;
   123     delete request;
       
   124     
       
   125     //unblock click signal after some delay.
       
   126     QTimer::singleShot(250,this,SLOT(unblockSignals()));
   115 }
   127 }
   116 
   128 
   117 void MsgUnifiedEditorAddress::handleOk(const QVariant& value)
   129 void MsgUnifiedEditorAddress::handleOk(const QVariant& value)
   118 {
   130 {
   119    CntServicesContactList contactList =
   131    CntServicesContactList contactList =
   195     mAboutToExceedMaxMmsRecipients = false;
   207     mAboutToExceedMaxMmsRecipients = false;
   196     mExceedsMaxMmsRecipientsBy = 0;
   208     mExceedsMaxMmsRecipientsBy = 0;
   197 
   209 
   198     // first, we check if MMS max-recipient count will exceed
   210     // first, we check if MMS max-recipient count will exceed
   199     int count = addrlist.count();
   211     int count = addrlist.count();
   200 	int futureCount = count + MsgMonitor::msgAddressCount();
   212 	int futureCount = count + MsgUnifiedEditorMonitor::msgAddressCount();
   201 	if(futureCount > MsgMonitor::maxMmsRecipients())
   213 	if(futureCount > MsgUnifiedEditorMonitor::maxMmsRecipients())
   202 	{
   214 	{
   203 	    mAboutToExceedMaxMmsRecipients = true;
   215 	    mAboutToExceedMaxMmsRecipients = true;
   204 	    mExceedsMaxMmsRecipientsBy =
   216 	    mExceedsMaxMmsRecipientsBy =
   205 	            futureCount - MsgMonitor::maxMmsRecipients();
   217 	            futureCount - MsgUnifiedEditorMonitor::maxMmsRecipients();
   206 	}
   218 	}
   207 	// else, check if SMS max-recipient count will exceed
   219 	// else, check if SMS max-recipient count will exceed
   208 	else if(!mSkipMaxRecipientQuery)
   220 	else if(!mSkipMaxRecipientQuery)
   209 	{
   221 	{
   210 	    futureCount = count + addressCount();
   222 	    futureCount = count + addressCount();
   211 	    if( (addressCount() <= MsgMonitor::maxSmsRecipients()) &&
   223 	    if( (addressCount() <= MsgUnifiedEditorMonitor::maxSmsRecipients()) &&
   212 	        (futureCount > MsgMonitor::maxSmsRecipients()) )
   224 	        (futureCount > MsgUnifiedEditorMonitor::maxSmsRecipients()) )
   213 	    {
   225 	    {
   214 	        mAboutToExceedMaxSmsRecipients = true;
   226 	        mAboutToExceedMaxSmsRecipients = true;
   215 	    }
   227 	    }
   216 	}
   228 	}
   217 
   229 
   218 
   230 	int  invalidCount= 0;
       
   231     QString invalidContacts;
   219     for(int i = 0; i < count; i++ )
   232     for(int i = 0; i < count; i++ )
   220     {
   233         {
   221         mAddressMap.insertMulti(addrlist[i]->address(), addrlist[i]->alias());
   234         bool isValid = false;
   222         if(!addrlist[i]->alias().isEmpty())
   235         isValid = checkValidAddress(addrlist.at(i)->address());
   223         {
   236         if(!isValid) 
   224             mAddressEdit->setText(addrlist[i]->alias());
   237            {
   225         }
   238             invalidCount ++;
   226         else
   239             // append the comma till last but one contact.
   227         {
   240             // add the invalid ocntacts to the " , " seperated string.
   228             mAddressEdit->setText(addrlist[i]->address(), false);
   241             if(invalidCount > 1)
   229         }
   242                 {
   230     }
   243                 invalidContacts.append(COMMA_SEPERATOR);
       
   244                 }
       
   245             invalidContacts.append(addrlist.at(i)->alias());
       
   246            }  
       
   247        else
       
   248            {
       
   249            mAddressMap.insertMulti(addrlist[i]->address(), addrlist[i]->alias());
       
   250            if(!addrlist[i]->alias().isEmpty())
       
   251               {
       
   252               mAddressEdit->setText(addrlist[i]->alias());
       
   253               }
       
   254            else
       
   255               {
       
   256               mAddressEdit->setText(addrlist[i]->address(), false);
       
   257               }
       
   258            }
       
   259      
       
   260        }
       
   261     if(invalidCount)
       
   262         {
       
   263         QString invalidStr;
       
   264         (invalidCount == 1)?(invalidStr = QString(LOC_INVALID_RECIPIENT_NOT_ADDED)) :(invalidStr = QString(LOC_INVALID_RECIPIENTS_NOT_ADDED));
       
   265         // append line seperator
       
   266          invalidStr.append("<br>"); 
       
   267          invalidStr.append(invalidContacts);
       
   268          HbMessageBox::information(invalidStr);
       
   269         }
   231 
   270 
   232     // addition operation complete, reset flags
   271     // addition operation complete, reset flags
   233     mAboutToExceedMaxSmsRecipients = false;
   272     mAboutToExceedMaxSmsRecipients = false;
   234     mAboutToExceedMaxMmsRecipients = false;
   273     mAboutToExceedMaxMmsRecipients = false;
   235     mExceedsMaxMmsRecipientsBy = 0;
   274     mExceedsMaxMmsRecipientsBy = 0;
   254 
   293 
   255 void MsgUnifiedEditorAddress::onContentsChanged(const QString& text)
   294 void MsgUnifiedEditorAddress::onContentsChanged(const QString& text)
   256 {
   295 {
   257     // Max MMS recipient count check
   296     // Max MMS recipient count check
   258     if( mAboutToExceedMaxMmsRecipients ||
   297     if( mAboutToExceedMaxMmsRecipients ||
   259         (MsgMonitor::msgAddressCount() >= MsgMonitor::maxMmsRecipients()) )
   298         (MsgUnifiedEditorMonitor::msgAddressCount() >= MsgUnifiedEditorMonitor::maxMmsRecipients()) )
   260     {
   299     {
   261         if(mAboutToExceedMaxMmsRecipients)
   300         if(mAboutToExceedMaxMmsRecipients)
   262         {// show discreet note only once
   301         {// show discreet note only once
   263             --mExceedsMaxMmsRecipientsBy;
   302             --mExceedsMaxMmsRecipientsBy;
   264             if(!mExceedsMaxMmsRecipientsBy)
   303             if(!mExceedsMaxMmsRecipientsBy)
   270         }
   309         }
   271         else
   310         else
   272         {
   311         {
   273             // update monitor data
   312             // update monitor data
   274             emit contentChanged();
   313             emit contentChanged();
   275             if(MsgMonitor::msgAddressCount() > MsgMonitor::maxMmsRecipients())
   314             if(MsgUnifiedEditorMonitor::msgAddressCount() > MsgUnifiedEditorMonitor::maxMmsRecipients())
   276             {
   315             {
   277                 HbNotificationDialog::launchDialog(
   316                 HbNotificationDialog::launchDialog(
   278                         LOC_MMS_RECIPIENT_LIMIT_REACHED);
   317                         LOC_MMS_RECIPIENT_LIMIT_REACHED);
   279                 resetToPrevious();
   318                 resetToPrevious();
   280                 // reset monitor data
   319                 // reset monitor data
   288         return;
   327         return;
   289     }
   328     }
   290 
   329 
   291     // Max SMS recipient count check
   330     // Max SMS recipient count check
   292     if( !mSkipMaxRecipientQuery &&
   331     if( !mSkipMaxRecipientQuery &&
   293         (MsgMonitor::messageType() == ConvergedMessage::Sms) &&
   332         (MsgUnifiedEditorMonitor::messageType() == ConvergedMessage::Sms) &&
   294         (mAddressEdit->addresses().count() > MsgMonitor::maxSmsRecipients()) )
   333         (mAddressEdit->addresses().count() > MsgUnifiedEditorMonitor::maxSmsRecipients()) )
   295     {
   334     {
   296         // when we show this dialog, we don't want the intermediate states
   335         // when we show this dialog, we don't want the intermediate states
   297         // to be signalled to us
   336         // to be signalled to us
   298         disconnect(mAddressEdit, SIGNAL(contentsChanged(const QString&)),
   337         disconnect(mAddressEdit, SIGNAL(contentsChanged(const QString&)),
   299                 this, SLOT(onContentsChanged(const QString&)));
   338                 this, SLOT(onContentsChanged(const QString&)));
   412     // to be signalled to us
   451     // to be signalled to us
   413     disconnect(mAddressEdit, SIGNAL(contentsChanged(const QString&)),
   452     disconnect(mAddressEdit, SIGNAL(contentsChanged(const QString&)),
   414             this, SLOT(onContentsChanged(const QString&)));
   453             this, SLOT(onContentsChanged(const QString&)));
   415 
   454 
   416     mAddressEdit->clearContent();
   455     mAddressEdit->clearContent();
   417     QStringList list = mPrevBuffer.split(replacementStr,
   456     QStringList list = mPrevBuffer.split(REPLACEMENT_STR,
   418             QString::SkipEmptyParts);
   457             QString::SkipEmptyParts);
   419     int count = list.count();
   458     int count = list.count();
   420     QStringList valList = mAddressMap.values();
   459     QStringList valList = mAddressMap.values();
   421     for(int i=0; i<count; i++)
   460     for(int i=0; i<count; i++)
   422     {
   461     {
   465     syncAdditionsToMap();
   504     syncAdditionsToMap();
   466 
   505 
   467     // get the list of contacts in address-field
   506     // get the list of contacts in address-field
   468     QStringList fieldAddresses(mAddressEdit->addresses());
   507     QStringList fieldAddresses(mAddressEdit->addresses());
   469 
   508 
   470     bool allValid = true;
   509     bool isValid = true;
   471     foreach(QString addr, fieldAddresses)
   510     foreach(QString addr, fieldAddresses)
   472     {
   511     {
   473         // run address validation only if address is unmapped
   512         // run address validation only if address is unmapped
   474         // (i.e. user-inserted)
   513         // (i.e. user-inserted)
   475         if(mAddressMap.contains(addr))
   514         if(mAddressMap.contains(addr))
   476         {
   515         {
   477             // 1. perform number validation
   516         isValid = checkValidAddress(addr);
   478             allValid = CommonPhoneParser::IsValidPhoneNumber(
   517             if(!isValid)
   479                     *XQConversions::qStringToS60Desc(addr),
       
   480                     CommonPhoneParser::ESMSNumber );
       
   481 
       
   482             // 2. if number validity fails, then perform email addr validation
       
   483             if( !allValid &&
       
   484                 (MsgMonitor::messageType() == ConvergedMessage::Mms) )
       
   485             { // additional check for MMS only
       
   486                 allValid = genUtils->IsValidEmailAddress(
       
   487                         *XQConversions::qStringToS60Desc(addr) );
       
   488             }
       
   489 
       
   490             if(!allValid)
       
   491             {
   518             {
   492                 mAddressEdit->highlightInvalidString(addr);
   519                 mAddressEdit->highlightInvalidString(addr);
   493                 QString invalidAddrStr =
   520                 QString invalidAddrStr =
   494                         QString(LOC_INVALID_RECIPIENT).arg(addr);
   521                         QString(LOC_INVALID_RECIPIENT).arg(addr);
   495                 HbMessageBox* dlg = new HbMessageBox(invalidAddrStr,
   522                 HbMessageBox* dlg = new HbMessageBox(invalidAddrStr,
   500                 dlg->open(this, SLOT(handleInvalidContactDialog(HbAction*)));
   527                 dlg->open(this, SLOT(handleInvalidContactDialog(HbAction*)));
   501                 break;
   528                 break;
   502             }
   529             }
   503         }
   530         }
   504     }
   531     }
       
   532    
       
   533     return isValid;
       
   534 }
       
   535 // ----------------------------------------------------------------------------
       
   536 // MsgUnifiedEditorAddress::checkValidAddress
       
   537 // @see header
       
   538 // ----------------------------------------------------------------------------
       
   539 bool MsgUnifiedEditorAddress::checkValidAddress(const QString& addr)
       
   540     {
       
   541     bool isValid = false;
       
   542     // 1. perform number validation
       
   543     isValid = CommonPhoneParser::IsValidPhoneNumber(
       
   544             *XQConversions::qStringToS60Desc(addr),
       
   545             CommonPhoneParser::ESMSNumber );
       
   546 
       
   547     // 2. if number validity fails, then perform email addr validation
       
   548     UniEditorGenUtils* genUtils = new UniEditorGenUtils;
       
   549     if( !isValid &&
       
   550         ( MsgUnifiedEditorMonitor::messageType() == ConvergedMessage::Mms) )
       
   551         { // additional check for MMS only
       
   552         isValid = genUtils->IsValidEmailAddress(
       
   553                     *XQConversions::qStringToS60Desc(addr) );
       
   554         } 
   505     delete genUtils;
   555     delete genUtils;
   506     return allValid;
   556     return isValid;
   507 }
   557     }
   508 
   558 
   509 void MsgUnifiedEditorAddress::handleInvalidContactDialog(
   559 void MsgUnifiedEditorAddress::handleInvalidContactDialog(
   510         HbAction* act)
   560         HbAction* act)
   511 {
   561 {
   512     Q_UNUSED(act);
   562     Q_UNUSED(act);
   513     QTimer::singleShot(250, this, SLOT(setFocus()));
   563     QTimer::singleShot(250, this, SLOT(setFocus()));
   514 }
   564 }
   515 
   565 
       
   566 void MsgUnifiedEditorAddress::unblockSignals()
       
   567 {
       
   568     mLaunchBtn->blockSignals(false);
       
   569 }
       
   570 
   516 Q_IMPLEMENT_USER_METATYPE(CntServicesContact)
   571 Q_IMPLEMENT_USER_METATYPE(CntServicesContact)
   517 Q_IMPLEMENT_USER_METATYPE_NO_OPERATORS(CntServicesContactList)
   572 Q_IMPLEMENT_USER_METATYPE_NO_OPERATORS(CntServicesContactList)
   518 
   573 
   519 //EOF
   574 //EOF