phonebookui/pbkcommonui/src/cntimportsview.cpp
branchRCL_3
changeset 62 5b6f26637ad3
equal deleted inserted replaced
58:d4f567ce2e7c 62:5b6f26637ad3
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  
       
    15 *
       
    16 */
       
    17 
       
    18 #include "cntimportsview.h"
       
    19 #include "cntglobal.h"
       
    20 
       
    21 #include <hbpushbutton.h>
       
    22 #include <hbaction.h>
       
    23 #include <hbview.h>
       
    24 #include <hbmenu.h>
       
    25 #include <hbframebackground.h>
       
    26 #include <QStandardItemModel>
       
    27 #include <hbmainwindow.h>
       
    28 #include <hblabel.h>
       
    29 #include <hblistview.h>
       
    30 #include <QTimer>
       
    31 #include <hbnotificationdialog.h>
       
    32 #include <hbmessagebox.h>
       
    33 #include <hbprogressbar.h>
       
    34 #include <QGraphicsLinearLayout>
       
    35 #include <hbframebackground.h>
       
    36 #include <hbabstractviewitem.h>
       
    37 #include <hbextendedlocale.h>
       
    38 #include <hbparameterlengthlimiter.h>
       
    39 #include <hblistviewitem.h>
       
    40 #include <hbstringutil.h>
       
    41 #include <QCoreApplication>
       
    42 #include <hbdevicenotificationdialog.h>
       
    43 
       
    44 const char *CNT_IMPORT_UI_XML = ":/xml/contacts_sim.docml";
       
    45 const int KTimerValue = 1; // used as 1 msec timer for saving ADN contacts from SIM   
       
    46 
       
    47 CntImportsView::CntImportsView() : mContactSimManagerADN(0),
       
    48     mContactSimManagerSDN(0),    
       
    49     mFetchRequestADN(0),
       
    50     mFetchRequestSDN(0),
       
    51     mListView(0),
       
    52     mModel(0),
       
    53     mAdnSimUtility(0),
       
    54     mSdnSimUtility(0),
       
    55     mAdnEntriesPresent(0),
       
    56     mImportSimPopup(0),
       
    57     mSaveCount(0),
       
    58     mFetchIsDone(0),
       
    59     mTimerId(0),
       
    60     mAdnStorePresent(0),
       
    61     mSdnStorePresent(0),
       
    62     mSimPresent(0),
       
    63     mAdnStoreEntries(0),
       
    64     mSdnStoreEntries(0),
       
    65     mSimError(0),
       
    66     mWaitingForAdnCache(0),
       
    67     mImportInProgress(false)
       
    68 {
       
    69     bool ok = false;
       
    70     mDocumentLoader.load(CNT_IMPORT_UI_XML, &ok);
       
    71 
       
    72     if (ok)
       
    73     {
       
    74         mView = static_cast<HbView*>(mDocumentLoader.findWidget(QString("view")));
       
    75     }
       
    76     else
       
    77     {
       
    78         qFatal("Unable to read :/xml/contacts_sim.docml");
       
    79     }
       
    80 
       
    81     //back button
       
    82     mSoftkey = new HbAction(Hb::BackNaviAction, mView);
       
    83     connect(mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView()));
       
    84       
       
    85 }
       
    86 
       
    87 void CntImportsView::deactivate()
       
    88 {
       
    89 }
       
    90 
       
    91    
       
    92 CntImportsView::~CntImportsView()
       
    93 {
       
    94     mView->deleteLater();
       
    95     delete mFetchRequestADN;
       
    96     delete mFetchRequestSDN;
       
    97     delete mModel;
       
    98     delete mAdnSimUtility;
       
    99     delete mSdnSimUtility;
       
   100 }
       
   101 
       
   102 /*!
       
   103 Activates a previous view
       
   104 */
       
   105 void CntImportsView::showPreviousView()
       
   106 {
       
   107     CntViewParameters args;
       
   108     mViewManager->back(args);
       
   109 }
       
   110 
       
   111 /*
       
   112 Activates a default view
       
   113 */
       
   114 void CntImportsView::activate(const CntViewParameters aArgs)
       
   115 {
       
   116     Q_UNUSED(aArgs);
       
   117     //back button
       
   118           
       
   119     if (mView->navigationAction() != mSoftkey)
       
   120     {
       
   121         mView->setNavigationAction(mSoftkey);
       
   122     }
       
   123             
       
   124     mViewManager = &mEngine->viewManager();  
       
   125     mContactSymbianManager = &mEngine->contactManager(SYMBIAN_BACKEND);
       
   126    
       
   127     // Sim Utility info fetch
       
   128     int getSimInfoError(0);
       
   129     int storesError(0);
       
   130     int getSdnSimInfoError(0);
       
   131     
       
   132     
       
   133     //ADN store
       
   134     int error = -1;
       
   135     mAdnSimUtility = new CntSimUtility(CntSimUtility::AdnStore, error);
       
   136     
       
   137     if (error != 0) 
       
   138     {
       
   139         delete mAdnSimUtility; 
       
   140         mAdnSimUtility = 0;
       
   141         mSimError = true;
       
   142     }
       
   143     else
       
   144     {
       
   145         // check what stores are there
       
   146         CntSimUtility::AvailableStores stores = mAdnSimUtility->getAvailableStores(storesError);
       
   147         if(!storesError)
       
   148         {
       
   149             mSimPresent = stores.SimPresent;
       
   150             mAdnStorePresent = stores.AdnStorePresent; 
       
   151             mSdnStorePresent = stores.SdnStorePresent;
       
   152         }
       
   153         
       
   154         //check there are ADN contacts 
       
   155         if (mAdnStorePresent)
       
   156         {
       
   157             CntSimUtility::SimInfo simInfo = mAdnSimUtility->getSimInfo(getSimInfoError);
       
   158             if (!getSimInfoError)
       
   159             {
       
   160                 // sim entries are present
       
   161                 mAdnStoreEntries = simInfo.usedEntries;
       
   162                 if (mAdnStoreEntries > 0) 
       
   163                 { 
       
   164                     mAdnEntriesPresent = true;
       
   165                 }
       
   166             }
       
   167             else
       
   168             {
       
   169                 if (getSimInfoError == KErrNotReady)
       
   170                 {
       
   171                     //ADN store is not accessible, e.g. because of active FDN
       
   172                     //Or ADN cache is not ready yet, so wait for this  
       
   173                     mAdnStorePresent = true;
       
   174                     mAdnEntriesPresent = true;
       
   175                     mWaitingForAdnCache = true;
       
   176                     connect(mAdnSimUtility, SIGNAL(adnCacheStatusReady(CntSimUtility::CacheStatus&, int)), this, SLOT(adnCacheStatusReady(CntSimUtility::CacheStatus&, int)));
       
   177                     if (!mAdnSimUtility->notifyAdnCacheStatus()) {
       
   178                         mAdnStorePresent = false;
       
   179                         mAdnEntriesPresent = false;
       
   180                         mWaitingForAdnCache = false;
       
   181                     }
       
   182                 }
       
   183                 else
       
   184                 {
       
   185                     simInfoErrorMessage(getSimInfoError);
       
   186                 }
       
   187             }
       
   188         }
       
   189     }
       
   190     
       
   191     //SDN store
       
   192      if (mSdnStorePresent && !mWaitingForAdnCache)
       
   193      {
       
   194         int sdnError = -1;
       
   195         mSdnStorePresent = false;
       
   196         if (!mSdnSimUtility) 
       
   197         {
       
   198             mSdnSimUtility = new CntSimUtility(CntSimUtility::SdnStore, sdnError);
       
   199             if (sdnError != 0) 
       
   200             {
       
   201                 delete mSdnSimUtility; 
       
   202                 mSdnSimUtility = 0;
       
   203             }
       
   204         }
       
   205         if (mSdnSimUtility)
       
   206         {
       
   207             //get number of SDN contacts 
       
   208             CntSimUtility::SimInfo sdnSimInfo = mSdnSimUtility->getSimInfo(getSdnSimInfoError);
       
   209             if (!getSdnSimInfoError)
       
   210             {
       
   211                 // sim entries are present
       
   212                 mSdnStoreEntries = sdnSimInfo.usedEntries;
       
   213                 if (mSdnStoreEntries > 0) {
       
   214                     mSdnStorePresent = true;    
       
   215                 }
       
   216             }
       
   217         }
       
   218      }
       
   219     // end SDN store
       
   220     
       
   221     mListView = static_cast<HbListView*>(mDocumentLoader.findWidget(QString("listView")));
       
   222     
       
   223     HbFrameBackground frame;
       
   224     frame.setFrameGraphicsName("qtg_fr_list_normal");
       
   225     frame.setFrameType(HbFrameDrawer::NinePieces);
       
   226     mListView->itemPrototypes().first()->setDefaultFrame(frame);
       
   227     mListView->listItemPrototype()->setStretchingStyle(HbListViewItem::StretchLandscape);
       
   228     mListView->setUniformItemSizes(true);
       
   229     
       
   230     connect(mListView, SIGNAL(activated (const QModelIndex&)),
       
   231                                       this,  SLOT(onListViewActivated(const QModelIndex&)));
       
   232        
       
   233     mModel = new QStandardItemModel();
       
   234     
       
   235     QStandardItem *importSimItem = new QStandardItem();
       
   236     QStringList simList;
       
   237     
       
   238     QString simImport(hbTrId("txt_phob_dblist_import_from_sim"));
       
   239     QString simNoContacts(hbTrId("txt_phob_dblist_import_from_1_val_no_sim_contacts"));
       
   240     QString simNoCard(hbTrId("txt_phob_dblist_import_from_ovi_val_no_sim_card"));
       
   241     
       
   242     // check if SIM card is there 
       
   243     if (mSimError)
       
   244     {
       
   245         simList << simImport;
       
   246         importSimItem->setEnabled(false);
       
   247     }
       
   248     else if (!(mAdnStorePresent || mSdnStorePresent))
       
   249     {
       
   250         // Both stores are not present
       
   251         // disable the QStandardItem
       
   252         if (!mSimPresent) 
       
   253         {
       
   254             simList << simImport << simNoCard;
       
   255         }
       
   256         else
       
   257         {
       
   258             simList << simImport << simNoContacts;
       
   259         }
       
   260         importSimItem->setEnabled(false);
       
   261     }
       
   262     else if (!(mAdnEntriesPresent || mSdnStorePresent))
       
   263     {
       
   264         // Sim card is present
       
   265         // No ADN entries are there
       
   266         // no SDN entries are there
       
   267         simList << simImport << simNoContacts;
       
   268         importSimItem->setEnabled(false);
       
   269     }
       
   270     else
       
   271     {   
       
   272         // SIM card is present
       
   273         //ADN entries or SDN entries are there
       
   274         simList << simImport;
       
   275         int error = 0;
       
   276         QDateTime date = mAdnSimUtility->getLastImportTime(error);
       
   277         if (error == 0) {
       
   278             HbExtendedLocale locale = HbExtendedLocale::system();
       
   279             QString dateStr = locale.format(date.date(), r_qtn_date_usual);
       
   280             QString dateStrLocaleDigits = HbStringUtil::convertDigits(dateStr); 
       
   281             QString dateStrFull = 
       
   282                 HbParameterLengthLimiter(hbTrId("txt_phob_dblist_import_from_1_val_updated_1")).arg(dateStrLocaleDigits);
       
   283             simList << dateStrFull;
       
   284         }
       
   285     }
       
   286     importSimItem->setData(simList, Qt::DisplayRole);
       
   287     importSimItem->setData(HbIcon("qtg_large_sim"), Qt::DecorationRole);   
       
   288      
       
   289     mModel->insertRow(0,importSimItem);
       
   290     
       
   291     QStandardItem *importDeviceItem = new QStandardItem();
       
   292     QStringList deviceList;
       
   293     QString deviceImport(hbTrId("txt_phob_dblist_import_from_device"));
       
   294     deviceList << deviceImport;
       
   295     importDeviceItem->setData(deviceList, Qt::DisplayRole);
       
   296     importDeviceItem->setData(HbIcon("qtg_large_data_import"), Qt::DecorationRole);
       
   297     importDeviceItem->setEnabled(false);
       
   298        
       
   299     mModel->insertRow(1,importDeviceItem);
       
   300     
       
   301     mListView->setModel(mModel);
       
   302     mListView->setSelectionMode(HbAbstractItemView::NoSelection);
       
   303     connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(endKeyPressed()));
       
   304 }
       
   305 
       
   306 void CntImportsView::simInfoErrorMessage(int infoError)
       
   307 {
       
   308     Q_UNUSED(infoError);
       
   309     QString errorMessage;
       
   310     errorMessage.append(hbTrId("txt_phob_info_sim_card_error"));
       
   311     HbNotificationDialog::launchDialog(errorMessage);
       
   312     mSimError = true;
       
   313 }
       
   314 
       
   315 void CntImportsView::onListViewActivated(const QModelIndex &index)
       
   316 {
       
   317     int row = index.row();
       
   318     if ( row == 0 ) // row 0 has "Imports from SIM" 
       
   319     {
       
   320        if (!startSimImport())
       
   321        {
       
   322            //show error note
       
   323            simInfoErrorMessage(KErrAccessDenied);
       
   324        }
       
   325        else
       
   326        {
       
   327            //start popup and progress
       
   328            showWaitNote();
       
   329        }
       
   330     }        
       
   331 }
       
   332 
       
   333 
       
   334 bool CntImportsView::startSimImport()
       
   335 {
       
   336 
       
   337     bool started = false;
       
   338     mImportInProgress = true;
       
   339 
       
   340     delete mFetchRequestADN;
       
   341     mContactSimManagerADN = &mEngine->contactManager(SIM_BACKEND_ADN);
       
   342     mFetchRequestADN = new QContactFetchRequest;
       
   343     mFetchRequestADN->setManager(mContactSimManagerADN);   
       
   344     
       
   345     delete mFetchRequestSDN;
       
   346     mContactSimManagerSDN = &mEngine->contactManager(SIM_BACKEND_SDN);
       
   347     mFetchRequestSDN = new QContactFetchRequest;
       
   348     mFetchRequestSDN->setManager(mContactSimManagerSDN);        
       
   349         
       
   350     if (mWaitingForAdnCache)
       
   351     {
       
   352         //show progress dialog and wait when ADN cache is ready
       
   353         started = true;
       
   354     }
       
   355     else
       
   356     {
       
   357         if(mAdnStorePresent)
       
   358         {
       
   359             connect(mFetchRequestADN, SIGNAL(resultsAvailable()), this, SLOT(importFetchResultReceivedADN()));
       
   360         }
       
   361       
       
   362         if(mSdnStorePresent)
       
   363         {
       
   364             connect(mFetchRequestSDN, SIGNAL(resultsAvailable()), this, SLOT(importFetchResultReceivedSDN()));
       
   365         }
       
   366         
       
   367         if(mAdnEntriesPresent > 0 && mContactSimManagerADN->error() == QContactManager::NoError) 
       
   368         {
       
   369             // ADN contacts are there, start fetch
       
   370             mFetchRequestADN->start();
       
   371             started = true;
       
   372         }
       
   373         else if (mSdnStorePresent && mContactSimManagerSDN->error() == QContactManager::NoError)        
       
   374         {
       
   375             //start fetch of SDN contacts since ADN contacts are not there
       
   376             mFetchRequestSDN->start();
       
   377             started = true;
       
   378         }
       
   379     }
       
   380     return started;
       
   381 }  
       
   382 
       
   383 void CntImportsView::stopSimImport()
       
   384 {
       
   385     mImportSimPopup->close();
       
   386     mImportInProgress = false;
       
   387     if (mFetchIsDone)
       
   388     {
       
   389         // indicates that timer has been started
       
   390         killTimer(mTimerId);
       
   391     }
       
   392     mSaveSimContactsList.clear(); 
       
   393     mSaveSimContactsListSDN.clear(); 
       
   394     
       
   395     showSimImportResults();
       
   396     
       
   397     if (mFetchRequestADN != NULL)
       
   398     {
       
   399         mFetchRequestADN->cancel();
       
   400     }
       
   401     if (mFetchRequestSDN != NULL)
       
   402     {
       
   403         mFetchRequestSDN->cancel();
       
   404     }
       
   405     
       
   406     // save import time
       
   407     int error = 0;
       
   408     mAdnSimUtility->setLastImportTime(error);
       
   409     
       
   410     //update sim import row with last import time
       
   411     if (error == 0) {
       
   412         QList<QStandardItem*> importSimItems = mModel->takeRow(0);
       
   413         QStandardItem* importSimItem = 0;
       
   414         if (importSimItems.count() > 0) {
       
   415             importSimItem = importSimItems.at(0);
       
   416         }
       
   417         
       
   418         if (importSimItem != 0) {
       
   419             QDateTime date = mAdnSimUtility->getLastImportTime(error);
       
   420             if (error == 0) {
       
   421                 QStringList simList;
       
   422                 QString simImport(hbTrId("txt_phob_dblist_import_from_sim"));
       
   423                 simList << simImport;
       
   424                 
       
   425                 HbExtendedLocale locale = HbExtendedLocale::system();
       
   426                 QString dateStr = locale.format(date.date(), r_qtn_date_usual);
       
   427                 QString dateStrLocaleDigits = HbStringUtil::convertDigits(dateStr);
       
   428                 QString dateStrFull = 
       
   429                     HbParameterLengthLimiter(hbTrId("txt_phob_dblist_import_from_1_val_updated_1")).arg(dateStrLocaleDigits);
       
   430                 simList << dateStrFull;
       
   431                 
       
   432                 importSimItem->setData(simList, Qt::DisplayRole);
       
   433                 importSimItem->setData(HbIcon("qtg_large_sim"), Qt::DecorationRole);
       
   434             }
       
   435             mModel->insertRow(0, importSimItem);
       
   436             mListView->reset();
       
   437         }
       
   438     }
       
   439    
       
   440 }
       
   441 
       
   442 void CntImportsView::importFetchResultReceivedADN()
       
   443 {
       
   444     //save import time
       
   445     int error = 0;
       
   446     mAdnSimUtility->setLastImportTime(error);
       
   447 
       
   448     QList<QContact> simContactsList = mFetchRequestADN->contacts();
       
   449     if (simContactsList.isEmpty())
       
   450     {
       
   451         // No sim contacts, jump to fetching SDN contacts
       
   452         fetchSDNContacts();
       
   453     }
       
   454     else
       
   455     {
       
   456         // save ADN contacts
       
   457     
       
   458         int count = simContactsList.count();
       
   459         foreach(QContact contact, simContactsList) 
       
   460         {
       
   461             if (contact.localId() > 0) 
       
   462             {
       
   463             //delete local id before saving to different storage
       
   464                QScopedPointer<QContactId> contactId(new QContactId());
       
   465                contactId->setLocalId(0);
       
   466                contactId->setManagerUri(QString());
       
   467                contact.setId(*contactId);
       
   468     
       
   469                // custom label contains name information, save it to the first name 
       
   470                QList<QContactDetail> names = contact.details(QContactName::DefinitionName);
       
   471                if (names.count() > 0) 
       
   472                {
       
   473                    QContactName name = static_cast<QContactName>(names.at(0));
       
   474                    name.setFirstName(name.customLabel());
       
   475                    name.setCustomLabel(QString());
       
   476                    contact.saveDetail(&name);
       
   477                }
       
   478                  
       
   479                //update phone numbers to contain default subtype
       
   480                QList<QContactDetail> numbers = contact.details(QContactPhoneNumber::DefinitionName);
       
   481                for (int i = 0; i < numbers.count(); i++) 
       
   482                {
       
   483                    QContactPhoneNumber number = static_cast<QContactPhoneNumber>(numbers.at(i));
       
   484                    number.setSubTypes(QContactPhoneNumber::SubTypeMobile);
       
   485                    contact.saveDetail(&number);
       
   486                }
       
   487                
       
   488                //remove sync target details, it's read-only. 
       
   489                 QList<QContactDetail> syncTargets = contact.details(QContactSyncTarget::DefinitionName);
       
   490                 for (int j = 0; j < syncTargets.count(); j++) 
       
   491                 {
       
   492                     QContactSyncTarget syncTarget = static_cast<QContactSyncTarget>(syncTargets.at(j));
       
   493                     contact.removeDetail(&syncTarget);
       
   494                 }
       
   495                
       
   496                contact.setType(QContactType::TypeContact);
       
   497                setPreferredDetails(&contact);
       
   498                mSaveSimContactsList.append(contact);
       
   499                 
       
   500             }
       
   501         }
       
   502         // save the list synchronously because async cancelling of save request is  
       
   503         // not supported in symbian backend at the time of this implementation
       
   504         
       
   505         if (!(mSaveSimContactsList.isEmpty()))
       
   506         {
       
   507             // indicates that there is one or more sim contact that has been fetched
       
   508             // create a timer and start saving synchronously one by one
       
   509             // when cancel is pressed, kill the timer
       
   510             
       
   511             mTimerId = startTimer(KTimerValue); // starting a 1 msec timer
       
   512             mFetchIsDone = true;
       
   513             mSaveCount = 0;    
       
   514         }
       
   515     }
       
   516 }
       
   517 
       
   518 void CntImportsView::timerEvent(QTimerEvent *event)
       
   519 {
       
   520     Q_UNUSED(event);
       
   521     if (!(mSaveCount >= mSaveSimContactsList.count())) // while mSaveCount is less than or equal to mSaveSimContactsList.count()
       
   522     {
       
   523         QContact unSavedContact = mSaveSimContactsList.at(mSaveCount);
       
   524         mContactSymbianManager->saveContact(&unSavedContact);
       
   525         mSaveCount++;
       
   526         //use another counter to check number of actual saved if saveContact() fails
       
   527     }
       
   528     else
       
   529     {
       
   530         // saving complete
       
   531         killTimer(mTimerId);
       
   532         mSaveSimContactsList.clear();
       
   533         
       
   534         // ADN contacts fetching and saving is done
       
   535         // Now start SDN fetching and save
       
   536         fetchSDNContacts();
       
   537     }
       
   538 }
       
   539 
       
   540 void CntImportsView::showWaitNote()
       
   541 {
       
   542     mImportSimPopup = new HbDialog();    
       
   543     mImportSimPopup->setDismissPolicy(HbPopup::NoDismiss);
       
   544     mImportSimPopup->setTimeout(HbPopup::NoTimeout);
       
   545     mImportSimPopup->setBackgroundFaded(true);
       
   546     mImportSimPopup->setAttribute(Qt::WA_DeleteOnClose, true);
       
   547     
       
   548     HbLabel *headingLabel = new HbLabel(mImportSimPopup);
       
   549     headingLabel->setPlainText(hbTrId("txt_phob_title_import_contacts")); 
       
   550     mImportSimPopup->setHeadingWidget(headingLabel);
       
   551     
       
   552     QGraphicsLinearLayout *containerLayout = new QGraphicsLinearLayout(Qt::Vertical);
       
   553     containerLayout->setContentsMargins(0, 0, 0, 0);
       
   554     containerLayout->setSpacing(10);
       
   555     
       
   556     HbLabel *icon = new HbLabel(mImportSimPopup);
       
   557     icon->setIcon(HbIcon("qtg_large_sim"));  
       
   558     
       
   559     HbLabel *simText= new HbLabel(mImportSimPopup);
       
   560     simText->setPlainText(hbTrId("txt_phob_info_importing_contacts_from_sim")); 
       
   561     simText->setTextWrapping(Hb::TextWordWrap);
       
   562     simText->setElideMode(Qt::ElideNone);
       
   563     
       
   564     HbProgressBar *progressBar = new HbProgressBar(mImportSimPopup);
       
   565     progressBar->setRange(0,0); 
       
   566     
       
   567     HbPushButton *stopButton = new HbPushButton(mImportSimPopup);
       
   568     stopButton->setText(hbTrId("txt_phob_button_cancel"));
       
   569     connect(stopButton, SIGNAL(clicked()), this, SLOT(stopSimImport()));
       
   570     
       
   571     QGraphicsLinearLayout *containerLayout1 = new QGraphicsLinearLayout(Qt::Horizontal);
       
   572     containerLayout1->addItem(icon);
       
   573     containerLayout1->addItem(simText);
       
   574     
       
   575     QGraphicsWidget *containerWidget = new QGraphicsWidget;    
       
   576     containerLayout->addItem(containerLayout1);
       
   577     containerLayout->addItem(progressBar);
       
   578     containerLayout->addItem(stopButton);  
       
   579     containerWidget->setLayout(containerLayout);
       
   580     mImportSimPopup->setContentWidget(containerWidget);
       
   581     mSaveCount = 0;
       
   582     mImportSimPopup->open();
       
   583 }
       
   584 
       
   585 void CntImportsView::showSimImportResults() const
       
   586 {   
       
   587     QString results = hbTrId("txt_phob_dpophead_ln_contacts_imported").arg(mSaveCount).arg(mAdnStoreEntries + mSdnStoreEntries);
       
   588     HbNotificationDialog::launchDialog(results);
       
   589 }
       
   590 
       
   591 void CntImportsView::fetchSDNContacts()
       
   592 {
       
   593    if (mSdnStorePresent && mContactSimManagerSDN->error() == QContactManager::NoError)
       
   594     {
       
   595         mFetchRequestSDN->start();
       
   596     }
       
   597     else
       
   598     {
       
   599         // no SDN contacts to fetch
       
   600         showSimImportResults();
       
   601         mImportSimPopup->close();
       
   602         mImportInProgress = false;
       
   603         // Importing finished, go back to NamesView
       
   604         showPreviousView();
       
   605     }
       
   606 }
       
   607 
       
   608 void CntImportsView::importFetchResultReceivedSDN()
       
   609 {
       
   610     //save import time
       
   611     int error = 0;
       
   612     mAdnSimUtility->setLastImportTime(error);
       
   613 
       
   614     QList<QContact> simContactsListSDN = mFetchRequestSDN->contacts();
       
   615     if (simContactsListSDN.isEmpty())
       
   616     {
       
   617         //No sdn contacts present
       
   618         showSimImportResults();
       
   619         mSaveSimContactsListSDN.clear(); 
       
   620         mImportSimPopup->close();
       
   621         mImportInProgress = false;
       
   622         // Importing finished, go back to NamesView
       
   623         showPreviousView();
       
   624     }
       
   625     else
       
   626     {
       
   627     // SAVE SDN CONTACTS
       
   628         int count = simContactsListSDN.count();
       
   629         foreach(QContact contact, simContactsListSDN) 
       
   630         {
       
   631             if (contact.localId() > 0) 
       
   632             {
       
   633             //delete local id before saving to different storage
       
   634                QScopedPointer<QContactId> contactId(new QContactId());
       
   635                contactId->setLocalId(0);
       
   636                contactId->setManagerUri(QString());
       
   637                contact.setId(*contactId);
       
   638     
       
   639                //custom label contains name information, save it to the first name 
       
   640               QList<QContactDetail> names = contact.details(QContactName::DefinitionName);
       
   641               if (names.count() > 0) 
       
   642               {
       
   643                   QContactName name = static_cast<QContactName>(names.at(0));
       
   644                   name.setFirstName(name.customLabel());
       
   645                   name.setCustomLabel(QString());
       
   646                   contact.saveDetail(&name);
       
   647               }
       
   648                 
       
   649               //update phone numbers to contain default subtype
       
   650               QList<QContactDetail> numbers = contact.details(QContactPhoneNumber::DefinitionName);
       
   651               for (int i = 0; i < numbers.count(); i++) 
       
   652               {
       
   653                   QContactPhoneNumber number = static_cast<QContactPhoneNumber>(numbers.at(i));
       
   654                   number.setSubTypes(QContactPhoneNumber::SubTypeMobile);
       
   655                   contact.saveDetail(&number);
       
   656               }
       
   657               
       
   658               //remove sync target details, it's read-only. 
       
   659               QList<QContactDetail> syncTargets = contact.details(QContactSyncTarget::DefinitionName);
       
   660               for (int j = 0; j < syncTargets.count(); j++) 
       
   661               {
       
   662                   QContactSyncTarget syncTarget = static_cast<QContactSyncTarget>(syncTargets.at(j));
       
   663                   contact.removeDetail(&syncTarget);
       
   664               }
       
   665               
       
   666                contact.setType(QContactType::TypeContact);
       
   667                setPreferredDetails(&contact);
       
   668                mSaveSimContactsListSDN.append(contact);
       
   669                 
       
   670             }
       
   671         }
       
   672         // save the list synchronously because async cancelling of save request is  
       
   673         // not supported in symbian backend at the time of this implementation
       
   674         
       
   675         if (!(mSaveSimContactsListSDN.isEmpty()))
       
   676         {
       
   677             // indicates that there is one or more SDN sim contact that has been fetched
       
   678             QMap<int, QContactManager::Error> errorMap;
       
   679             mContactSymbianManager->saveContacts(&mSaveSimContactsListSDN,&errorMap);
       
   680             // check number of contacts really saved
       
   681             mSaveCount = mSaveCount + mSaveSimContactsListSDN.count();
       
   682         }
       
   683         
       
   684         // no more SDN contacts to fetch
       
   685         showSimImportResults();
       
   686         mSaveSimContactsListSDN.clear(); 
       
   687         mImportSimPopup->close();
       
   688         mImportInProgress = false;
       
   689         // Importing finished, go back to NamesView
       
   690         showPreviousView();
       
   691     }   
       
   692 }
       
   693 
       
   694 void CntImportsView::adnCacheStatusReady(CntSimUtility::CacheStatus& cacheStatus, int error)
       
   695 {
       
   696     mWaitingForAdnCache = false;
       
   697     //update ADN store info...
       
   698     if (error != 0 || cacheStatus == CntSimUtility::ECacheFailed)
       
   699     {
       
   700         mAdnStorePresent = false;
       
   701         mAdnEntriesPresent = false;
       
   702         mSdnStorePresent = false;
       
   703     }
       
   704     else
       
   705     {
       
   706         //check if there are ADN contacts
       
   707         mAdnStorePresent = true;
       
   708         mAdnEntriesPresent = false;
       
   709         int getSimInfoError = -1;
       
   710         CntSimUtility::SimInfo simInfo = mAdnSimUtility->getSimInfo(getSimInfoError);
       
   711         if (!getSimInfoError)
       
   712         {
       
   713             // sim entries are present
       
   714             mAdnStoreEntries = simInfo.usedEntries;
       
   715             if (mAdnStoreEntries > 0) 
       
   716             { 
       
   717                 mAdnEntriesPresent = true;
       
   718             }
       
   719         }
       
   720         
       
   721         //get number of SDN contacts
       
   722         int sdnError = -1;
       
   723         mSdnStorePresent = false;
       
   724         if (!mSdnSimUtility)
       
   725         {
       
   726             mSdnSimUtility = new CntSimUtility(CntSimUtility::SdnStore, sdnError);
       
   727             if (sdnError != 0) 
       
   728             {
       
   729                 delete mSdnSimUtility; 
       
   730                 mSdnSimUtility = 0;
       
   731             }
       
   732         }
       
   733         if (mSdnSimUtility)
       
   734         {
       
   735             int getSdnSimInfoError = 0;
       
   736             CntSimUtility::SimInfo sdnSimInfo = mSdnSimUtility->getSimInfo(getSdnSimInfoError);
       
   737             if (!getSdnSimInfoError)
       
   738             {
       
   739                 mSdnStoreEntries = sdnSimInfo.usedEntries;
       
   740                 if (mSdnStoreEntries > 0)
       
   741                 {
       
   742                     mSdnStorePresent = true;    
       
   743                 }
       
   744             }
       
   745         }
       
   746     }
       
   747     
       
   748     //dismiss progress dialog, if there are no SIM contacts 
       
   749     if(mImportSimPopup != NULL && mImportSimPopup->isActive() &&
       
   750        !mAdnEntriesPresent && !mSdnStorePresent)
       
   751     {
       
   752         mImportSimPopup->close();
       
   753         showSimImportResults();
       
   754     }
       
   755     
       
   756     //disable sim import item, if there are no SIM contacts 
       
   757     if(!mAdnEntriesPresent && !mSdnStorePresent && mModel)
       
   758     {
       
   759         QList<QStandardItem*> importSimItems = mModel->takeRow(0);
       
   760         QStandardItem* importSimItem = 0;
       
   761         if (importSimItems.count() > 0)
       
   762         {
       
   763             importSimItem = importSimItems.at(0);
       
   764         }
       
   765          
       
   766         if (importSimItem != 0)
       
   767         {
       
   768             QStringList simList;
       
   769             QString simImport(hbTrId("txt_phob_dblist_import_from_sim"));
       
   770             simList << simImport;
       
   771             QString simNoContacts(hbTrId("txt_phob_dblist_import_from_1_val_no_sim_contacts"));
       
   772             simList << simNoContacts;
       
   773                  
       
   774             importSimItem->setData(simList, Qt::DisplayRole);
       
   775             importSimItem->setData(HbIcon("qtg_large_sim"), Qt::DecorationRole);
       
   776             importSimItem->setEnabled(false);
       
   777             mModel->insertRow(0, importSimItem);
       
   778             mListView->reset();
       
   779         }
       
   780     }
       
   781     
       
   782     //start SIM contacts import, if user tapped "SIM import"
       
   783     if(mImportSimPopup != NULL && mImportSimPopup->isActive())
       
   784     {
       
   785         if (!startSimImport())
       
   786         {
       
   787             //dismiss wait note
       
   788             mImportSimPopup->close();
       
   789             mImportInProgress = false;
       
   790             //and show error note
       
   791             simInfoErrorMessage(KErrAccessDenied);
       
   792         }
       
   793     }
       
   794 }
       
   795 
       
   796 void CntImportsView::setPreferredDetails( QContact *aContact )
       
   797 {
       
   798     QList<QContactPhoneNumber> numberList( aContact->details<QContactPhoneNumber>() );
       
   799     //set preferred number for call if there is only one phone number
       
   800     if ( aContact->preferredDetail("call").isEmpty() && numberList.count() == 1 )
       
   801     {
       
   802         aContact->setPreferredDetail( "call", numberList.first() );
       
   803     }
       
   804     //set preferred number for message if there is only one mobile phone number
       
   805     if ( aContact->preferredDetail("message").isEmpty() && numberList.count() == 1 )
       
   806     {      
       
   807         aContact->setPreferredDetail( "message", numberList.first() );
       
   808     }
       
   809     //set preferred number for message if there is only one email address
       
   810     QList<QContactEmailAddress> emailList( aContact->details<QContactEmailAddress>() );
       
   811     if ( aContact->preferredDetail("email").isEmpty() && emailList.count() == 1 )
       
   812     {      
       
   813         aContact->setPreferredDetail( "email", emailList.first() );
       
   814     }
       
   815 }
       
   816 
       
   817 void CntImportsView::endKeyPressed()
       
   818 {   
       
   819     if(mImportInProgress && !mSimError)
       
   820     {
       
   821         QString results = hbTrId("txt_phob_dpophead_ln_contacts_imported").arg(mSaveCount).arg(mAdnStoreEntries + mSdnStoreEntries);
       
   822         HbDeviceNotificationDialog::notification(QString(),results);
       
   823     }    
       
   824 }
       
   825 
       
   826 
       
   827 // EOF