phonesettings/cpphonesettingsplugins/divertplugin/src/cpdivertplugingroup.cpp
changeset 27 2f8f8080a020
parent 22 6bb1b21d2484
child 30 ebdbd102c78a
--- a/phonesettings/cpphonesettingsplugins/divertplugin/src/cpdivertplugingroup.cpp	Fri Apr 16 14:58:25 2010 +0300
+++ b/phonesettings/cpphonesettingsplugins/divertplugin/src/cpdivertplugingroup.cpp	Mon May 03 12:31:11 2010 +0300
@@ -39,23 +39,40 @@
 #include "cpdivertitemdata.h"
 #include "cpdivertselectioncustomitem.h"
 
+Q_DECLARE_METATYPE(PsCallDivertingCondition)
+Q_DECLARE_METATYPE(PsServiceGroup)
+
 /*!
   CpDivertPluginGroup::CpDivertPluginGroup.
  */
 CpDivertPluginGroup::CpDivertPluginGroup(CpItemDataHelper &helper)
      : CpSettingFormItemData(HbDataFormModelItem::GroupItem, 
                              hbTrId("txt_phone_subhead_call_divert"),0),
-       m_csVoiceCallPage(NULL),
-       m_DataItemAllVoiceCalls(NULL),
-       m_DataItemIfBusy(NULL),
-       m_DataItemIfNotAnswered(NULL),
-       m_DataItemIfOutOfReach(NULL),
-       m_DataItemIfNotAvailable(NULL),
+       m_DataItemVoiceAllCalls(NULL),
+       m_DataItemVoiceIfBusy(NULL),
+       m_DataItemVoiceIfNotAnswered(NULL),
+       m_DataItemVoiceIfOutOfReach(NULL),
+       m_DataItemVoiceIfNotAvailable(NULL),
+       m_DataItemVideoAllCalls(NULL),
+       m_DataItemVideoIfBusy(NULL),
+       m_DataItemVideoIfNotAnswered(NULL),
+       m_DataItemVideoIfOutOfReach(NULL),
+       m_DataItemVideoIfNotAvailable(NULL),
        m_activeNoteId(0),
+       m_activeProgressNoteId(0),
+       m_divertToVoiceMailBox(false),
        m_helper(helper)
 {
     DPRINT << ": IN";
     
+    // Registration needed, because PsCallDivertingCondition and PsServiceGroup
+    // is used as a custom meta information for barring items.
+    qRegisterMetaType<PsCallDivertingCondition>(
+        "PsCallDivertingCondition");
+    
+    qRegisterMetaType<PsServiceGroup>(
+        "PsServiceGroup");
+    
     // Localization file loading
     QTranslator translator; 
     QString lang = QLocale::system().name();
@@ -105,9 +122,8 @@
             SIGNAL(itemShown(QModelIndex)), this, SLOT(itemShown(QModelIndex)));
     
     // Create grouped setting items
-    createVoiceCallItems();
-    createVideoCallItems();
-    createVoIPCallItems();
+    createVoiceCallItems(this);
+    createVideoCallItems(this);
     DPRINT << ": OUT";
 }
 
@@ -127,89 +143,143 @@
 /*!
  CpDivertPluginGroup::createVoiceCallItems.
  */
-void CpDivertPluginGroup::createVoiceCallItems()
+void CpDivertPluginGroup::createVoiceCallItems(CpSettingFormItemData *parent)
 {
     DPRINT << ": IN";
-    m_csVoiceCallPage = new CpSettingFormItemData(
+    CpSettingFormItemData *page = new CpSettingFormItemData(
                 HbDataFormModelItem::GroupPageItem,
                 hbTrId("txt_phone_setlabel_service_val_voice_divert"));
-    appendChild(m_csVoiceCallPage);
+    parent->appendChild(page);
 
-    m_DataItemAllVoiceCalls = new CpDivertItemData(
+    m_DataItemVoiceAllCalls = createDivertItem(
             DivertConditionUnconditional,
             ServiceGroupVoice,
             hbTrId("txt_phone_setlabel_all_calls"),
-            hbTrId("All voice calls:"), false,
-            m_helper,
-            m_csVoiceCallPage);
-    
-    addDivertDataItem(m_DataItemAllVoiceCalls, m_csVoiceCallPage);
+            hbTrId("txt_phone_setlabel_all_calls"), false,
+            page);
 
-    m_DataItemIfBusy = new CpDivertItemData(
+    m_DataItemVoiceIfBusy = createDivertItem(
             DivertConditionBusy,
             ServiceGroupVoice,
             hbTrId("txt_phone_setlabel_if_busy"),
-            hbTrId("If busy:"), false,
-            m_helper,
-            m_csVoiceCallPage);
-    
-    addDivertDataItem(m_DataItemIfBusy, m_csVoiceCallPage);
+            hbTrId("txt_phone_setlabel_if_busy"), false,
+            page);
 
-    m_DataItemIfNotAnswered = new CpDivertItemData(
+    m_DataItemVoiceIfNotAnswered = createDivertItem(
             DivertConditionNoReply,
             ServiceGroupVoice,
             hbTrId("txt_phone_setlabel_if_not_answered"),
-            hbTrId("If not answered:"), true,
-            m_helper,
-            m_csVoiceCallPage);
-    
-    addDivertDataItem(m_DataItemIfNotAnswered, m_csVoiceCallPage);
-    m_DataItemIfNotAnswered->setContentWidgetData("timeoutText", hbTrId("txt_phone_setlabel_delay"));
+            hbTrId("txt_phone_setlabel_if_not_answered"), true,
+            page);
+    m_DataItemVoiceIfNotAnswered->setContentWidgetData(
+            "timeoutText", hbTrId("txt_phone_setlabel_delay"));
 
-    m_DataItemIfOutOfReach = new CpDivertItemData(
+    m_DataItemVoiceIfOutOfReach = createDivertItem(
             DivertConditionNotReachable,
             ServiceGroupVoice,
             hbTrId("txt_phone_setlabel_if_out_of_reach"),
-            hbTrId("If out of reach:"), false,
-            m_helper,
-            m_csVoiceCallPage);
-    
-    addDivertDataItem(m_DataItemIfOutOfReach, m_csVoiceCallPage);
+            hbTrId("txt_phone_setlabel_if_out_of_reach"), false,
+            page);
 
-    m_DataItemIfNotAvailable = new CpDivertItemData(
+    m_DataItemVoiceIfNotAvailable = createDivertItem(
             DivertConditionAllConditionalCases,
             ServiceGroupVoice,
             hbTrId("txt_phone_setlabel_if_not_available"),
-            hbTrId("If not available:"), true,
-            m_helper,
-            m_csVoiceCallPage);
-    
-    addDivertDataItem(m_DataItemIfNotAvailable, m_csVoiceCallPage);
+            hbTrId("txt_phone_setlabel_if_not_available"), true,
+            page);
+
     DPRINT << ": OUT";
 }
 
 /*!
  CpDivertPluginGroup::createVideoCallItems
  */
-void CpDivertPluginGroup::createVideoCallItems()
+void CpDivertPluginGroup::createVideoCallItems(CpSettingFormItemData *parent)
 {
     DPRINT << ": IN";
-    appendChild( new CpSettingFormItemData(
-        HbDataFormModelItem::GroupPageItem,
-        hbTrId("txt_phone_setlabel_service_val_video_divert")) );
+    CpSettingFormItemData *page = new CpSettingFormItemData(
+            HbDataFormModelItem::GroupPageItem,
+            hbTrId("txt_phone_setlabel_service_val_video_divert"));
+    
+    parent->appendChild(page);
+    
+    m_DataItemVideoAllCalls = createDivertItem(
+            DivertConditionUnconditional,
+            ServiceGroupData,
+            hbTrId("txt_phone_setlabel_all_calls"),
+            hbTrId("txt_phone_setlabel_all_calls"), false,
+            page);
+
+    m_DataItemVideoIfBusy = createDivertItem(
+            DivertConditionBusy,
+            ServiceGroupData,
+            hbTrId("txt_phone_setlabel_if_busy"),
+            hbTrId("txt_phone_setlabel_if_busy"), false,
+            page);
+
+    m_DataItemVideoIfNotAnswered = createDivertItem(
+            DivertConditionNoReply,
+            ServiceGroupData,
+            hbTrId("txt_phone_setlabel_if_not_answered"),
+            hbTrId("txt_phone_setlabel_if_not_answered"), true,
+            page);
+    m_DataItemVideoIfNotAnswered->setContentWidgetData(
+            "timeoutText", hbTrId("txt_phone_setlabel_delay"));
+
+    m_DataItemVideoIfOutOfReach = createDivertItem(
+            DivertConditionNotReachable,
+            ServiceGroupData,
+            hbTrId("txt_phone_setlabel_if_out_of_reach"),
+            hbTrId("txt_phone_setlabel_if_out_of_reach"), false,
+            page);
+
+    m_DataItemVideoIfNotAvailable = createDivertItem(
+            DivertConditionAllConditionalCases,
+            ServiceGroupData,
+            hbTrId("txt_phone_setlabel_if_not_available"),
+            hbTrId("txt_phone_setlabel_if_not_available"), true,
+            page);
+    
     DPRINT << ": OUT";
 }
 
 /*!
- CpDivertPluginGroup::createVoIPCallItems
+ CpDivertPluginGroup::createDivertItem
  */
-void CpDivertPluginGroup::createVoIPCallItems()
+CpDivertItemData *CpDivertPluginGroup::createDivertItem(
+        PsCallDivertingCondition condition,
+        PsServiceGroup serviceGroup,
+        const QString &label,
+        const QString &queryLabel,
+        bool needTimeoutInfo,
+        CpSettingFormItemData *parent)
 {
     DPRINT << ": IN";
-    appendChild( new CpSettingFormItemData(
-        HbDataFormModelItem::GroupPageItem,
-        hbTrId("VoIP")) );
+
+    CpDivertItemData *item = new CpDivertItemData(
+        static_cast<HbDataFormModelItem::DataItemType>
+            (CpDivertSelectionItem::CpDivertSelectionItemId), 
+            label,
+            m_helper,
+            parent);
+    QVariant conditionVar;
+    conditionVar.setValue(condition);
+    item->setProperty("condition", conditionVar);
+    QVariant serviceGroupVar;
+    serviceGroupVar.setValue(serviceGroup);
+    item->setProperty("serviceGroup", serviceGroupVar);
+    item->setProperty("queryLabel", queryLabel);
+    item->setProperty("needTimeoutInfo", needTimeoutInfo);
+    item->setEnabled(false);
+    
+    // Connect signals
+    QObject::connect(
+        item, SIGNAL(itemClicked(CpDivertItemData&)),
+        this, SLOT(changeDivertingStateRequested(CpDivertItemData&)));
+    
+    parent->appendChild(item);
     DPRINT << ": OUT";
+    return item;
 }
 
 /*!
@@ -222,35 +292,20 @@
     HbDataFormModelItem* modelItem = 
             qobject_cast<HbDataFormModel*>(model())->itemFromIndex(item);
     
-    if (!modelItem->contentWidgetData("number").isValid()) {
-        if (modelItem==m_DataItemAllVoiceCalls) {
-            addToDivertingRequestQueue(CheckDivertStatus, *m_DataItemAllVoiceCalls);
-        } else if (modelItem==m_DataItemIfBusy) {
-            addToDivertingRequestQueue(CheckDivertStatus, *m_DataItemIfBusy);
-        } else if (modelItem==m_DataItemIfNotAnswered) {
-            addToDivertingRequestQueue(CheckDivertStatus, *m_DataItemIfNotAnswered);
-        } else if (modelItem==m_DataItemIfOutOfReach) {
-            addToDivertingRequestQueue(CheckDivertStatus, *m_DataItemIfOutOfReach);
-        } // do not update m_DataItemIfNotAvailable
+    if (!modelItem->contentWidgetData("number").isValid() &&
+        (static_cast<HbDataFormModelItem::DataItemType>
+            (CpDivertSelectionItem::CpDivertSelectionItemId == modelItem->type()))){
+        CpDivertItemData *item = static_cast<CpDivertItemData*>(modelItem); 
+        if(qvariant_cast<PsCallDivertingCondition>(item->property("condition")) !=
+                DivertConditionAllConditionalCases) {
+            addToDivertingRequestQueue(CheckDivertStatus, *item);
+        }
     }
 
-
     DPRINT << ": OUT";
 }
 
 /*!
-  CpDivertPluginGroup::addDivertDataItem.
- */
-void CpDivertPluginGroup::addDivertDataItem(
-        CpDivertItemData *item, CpSettingFormItemData *parent)
-{
-    parent->appendChild(item);
-    QObject::connect(
-        item, SIGNAL(itemClicked(CpDivertItemData&)),
-        this, SLOT(changeDivertingStateRequested(CpDivertItemData&)));
-}
-
-/*!
   CpDivertPluginGroup::addToDivertingRequestQueue.
  */
 void CpDivertPluginGroup::addToDivertingRequestQueue(
@@ -299,7 +354,9 @@
   CpDivertPluginGroup::changeItemData.
  */
 void CpDivertPluginGroup::changeItemData(
-        PsCallDivertingCondition condition, PsCallDivertingStatus status,
+        PsServiceGroup serviceGroup,
+        PsCallDivertingCondition condition,
+        PsCallDivertingStatus status,
         const QString& number, int timeout)
 {
     DPRINT << ": IN";
@@ -315,43 +372,31 @@
     }
     
     switch (condition) {
-    case DivertConditionUnconditional:
-        m_DataItemAllVoiceCalls->setContentWidgetData("number", number);
-        m_DataItemAllVoiceCalls->setContentWidgetData("timeout", timeout);
-        m_DataItemAllVoiceCalls->setContentWidgetData("state", itemState);
-        break;
-    case DivertConditionBusy:
-        m_DataItemIfBusy->setContentWidgetData("number", number);
-        m_DataItemIfBusy->setContentWidgetData("timeout", timeout);
-        m_DataItemIfBusy->setContentWidgetData("state", itemState);
-        break;
-    case DivertConditionNoReply:
-        m_DataItemIfNotAnswered->setContentWidgetData("number", number);
-        m_DataItemIfNotAnswered->setContentWidgetData("timeout", timeout);
-        m_DataItemIfNotAnswered->setContentWidgetData("state", itemState);
-        break;
-    case DivertConditionNotReachable:
-        m_DataItemIfOutOfReach->setContentWidgetData("number", number);
-        m_DataItemIfOutOfReach->setContentWidgetData("timeout", timeout);
-        m_DataItemIfOutOfReach->setContentWidgetData("state", itemState);
-        break;
     case DivertConditionAllConditionalCases:
         DPRINT << ": DivertConditionAllConditionalCases";
         
-        m_DataItemIfNotAvailable->setContentWidgetData("number", number);
-        m_DataItemIfNotAvailable->setContentWidgetData("timeout", timeout);
-        m_DataItemIfNotAvailable->setContentWidgetData("state", itemState);
+        // If not available effects also conditions below
+        changeItemData(serviceGroup, DivertConditionBusy, status, number, timeout);
+        changeItemData(serviceGroup, DivertConditionNoReply, status, number, timeout);
+        changeItemData(serviceGroup, DivertConditionNotReachable, status, number, timeout);
+        // Fall trough
+    case DivertConditionUnconditional:
+    case DivertConditionBusy:
+    case DivertConditionNoReply:
+    case DivertConditionNotReachable:
+        if (serviceGroup & ServiceGroupVoice) {
+            item(ServiceGroupVoice, condition)->setContentWidgetData("number", number);
+            item(ServiceGroupVoice, condition)->setContentWidgetData("timeout", timeout);
+            item(ServiceGroupVoice, condition)->setContentWidgetData("state", itemState);
+            item(ServiceGroupVoice, condition)->setEnabled(true);
+        }
         
-        // If not available effects also conditions below
-        m_DataItemIfBusy->setContentWidgetData("number", number);
-        m_DataItemIfBusy->setContentWidgetData("timeout", timeout);
-        m_DataItemIfBusy->setContentWidgetData("state", itemState);
-        m_DataItemIfNotAnswered->setContentWidgetData("number", number);
-        m_DataItemIfNotAnswered->setContentWidgetData("timeout", timeout);
-        m_DataItemIfNotAnswered->setContentWidgetData("state", itemState);
-        m_DataItemIfOutOfReach->setContentWidgetData("number", number);
-        m_DataItemIfOutOfReach->setContentWidgetData("timeout", timeout);
-        m_DataItemIfOutOfReach->setContentWidgetData("state", itemState);
+        if (serviceGroup & ServiceGroupData) {
+            item(ServiceGroupData, condition)->setContentWidgetData("number", number);
+            item(ServiceGroupData, condition)->setContentWidgetData("timeout", timeout);
+            item(ServiceGroupData, condition)->setContentWidgetData("state", itemState);
+            item(ServiceGroupData, condition)->setEnabled(true);
+        }
         break;
     case DivertConditionAllCalls:
     case DivertConditionUnknown:
@@ -363,37 +408,73 @@
 /*!
   CpDivertPluginGroup::revertItemData.
  */
-void CpDivertPluginGroup::revertItemData(PsCallDivertingCondition condition)
+void CpDivertPluginGroup::revertItemData(
+        PsServiceGroup serviceGroup, PsCallDivertingCondition condition)
 {
     DPRINT << ": IN";
+    if (serviceGroup & ServiceGroupVoice) {
+        item(ServiceGroupVoice, condition)->setContentWidgetData("state",
+            item(ServiceGroupVoice, condition)->contentWidgetData("state"));
+    }
     
+    if (serviceGroup & ServiceGroupData) {
+        item(ServiceGroupData, condition)->setContentWidgetData("state",
+            item(ServiceGroupData, condition)->contentWidgetData("state"));
+    }
+
+    DPRINT << ": OUT";
+}
+
+/*!
+  CpDivertPluginGroup::item.
+ */
+CpSettingFormItemData* CpDivertPluginGroup::item(
+        PsService service, PsCallDivertingCondition condition)
+{
+    CpSettingFormItemData *ret = 0;
     switch (condition) {
         case DivertConditionUnconditional:
-            m_DataItemAllVoiceCalls->setContentWidgetData("state", 
-                m_DataItemAllVoiceCalls->contentWidgetData("state"));
+            if (service == ServiceGroupVoice) {
+                ret = m_DataItemVoiceAllCalls;
+            } else {
+                ret = m_DataItemVideoAllCalls;
+            }
             break;
         case DivertConditionBusy:
-            m_DataItemIfBusy->setContentWidgetData("state", 
-                m_DataItemIfBusy->contentWidgetData("state"));
+            if (service == ServiceGroupVoice) {
+                ret = m_DataItemVoiceIfBusy;
+            } else {
+                ret = m_DataItemVideoIfBusy;
+            }
             break;
         case DivertConditionNoReply:
-            m_DataItemIfNotAnswered->setContentWidgetData("state", 
-                m_DataItemIfNotAnswered->contentWidgetData("state"));
+            if (service == ServiceGroupVoice) {
+                ret = m_DataItemVoiceIfNotAnswered;
+            } else {
+                ret = m_DataItemVideoIfNotAnswered;
+            }
             break;
         case DivertConditionNotReachable:
-            m_DataItemIfOutOfReach->setContentWidgetData("state", 
-                m_DataItemIfOutOfReach->contentWidgetData("state"));
+            if (service == ServiceGroupVoice) {
+                ret = m_DataItemVoiceIfOutOfReach;
+            } else {
+                ret = m_DataItemVideoIfOutOfReach;
+            }
             break;
         case DivertConditionAllConditionalCases:
-            DPRINT << ": DivertConditionAllConditionalCases";
-            m_DataItemIfNotAvailable->setContentWidgetData("state", 
-                m_DataItemIfNotAvailable->contentWidgetData("state"));
+            if (service == ServiceGroupVoice) {
+                ret = m_DataItemVoiceIfNotAvailable;
+            } else {
+                ret = m_DataItemVideoIfNotAvailable;
+            }
             break;
         case DivertConditionAllCalls:
         case DivertConditionUnknown:
         default:
             break;
     }
+    Q_CHECK_PTR(ret);
+    return ret;
 }
 
 /*!
@@ -409,10 +490,12 @@
     CpDivertRequestQueueItem request = m_divertRequestQueue.head();
     // Command param
     PSCallDivertingCommand divertCommand;
-    divertCommand.iServiceGroup = request.item->service();
-    divertCommand.iCondition = request.item->condition();
+    divertCommand.iServiceGroup = qvariant_cast<PsServiceGroup>(
+            request.item->property("serviceGroup"));
+    divertCommand.iCondition = qvariant_cast<PsCallDivertingCondition>(
+            request.item->property("condition"));
     divertCommand.iStatus = DivertingStatusUnknown;
-    divertCommand.iNumber = hbTrId("");
+    divertCommand.iNumber = "";
     divertCommand.iNoReplyTimer = 0;
 
     switch (request.request) {
@@ -420,16 +503,17 @@
             DPRINT << "activate";
             divertCommand.iSetting = RegisterDiverting;
             if (popUpVoiceNumberListQuery(
-                    request.item->queryLabel(), divertCommand.iNumber)) {
-                if (request.item->needTimeoutInfo()) {
+                    request.item->property("queryLabel").toString(),
+                    divertCommand.iNumber,
+                    divertCommand.iServiceGroup)) {
+                if (request.item->property("needTimeoutInfo").toBool()) {
                     if (popUpTimerQuery(divertCommand.iNoReplyTimer)) {
                         setCallDiverting(divertCommand);
                     } else {
                         // Query was cancelled
-                        request.item->setContentWidgetData("number", 
-                                request.item->contentWidgetData("number").toString());
-                        request.item->setContentWidgetData("timeout", 
-                                request.item->contentWidgetData("timeout").toInt());
+                        revertItemData(
+                                divertCommand.iServiceGroup, 
+                                divertCommand.iCondition);
                         m_divertRequestQueue.clear();
                     }
                 } else {
@@ -437,10 +521,9 @@
                 }
             } else {
                 // Query was cancelled
-                request.item->setContentWidgetData("number", 
-                        request.item->contentWidgetData("number").toString());
-                request.item->setContentWidgetData("timeout", 
-                        request.item->contentWidgetData("timeout").toInt());
+                revertItemData(
+                        divertCommand.iServiceGroup, 
+                        divertCommand.iCondition);
                 m_divertRequestQueue.clear();
             }
         }
@@ -456,11 +539,11 @@
             m_callDivertingWrapper->getCallDivertingStatus(
                 divertCommand.iServiceGroup,
                 divertCommand.iCondition,
-                bscParam() );
+                bscParam(divertCommand.iServiceGroup) );
             
             if (!CpPhoneNotes::instance()->noteShowing()) {
                 CpPhoneNotes::instance()->showGlobalProgressNote(
-                        m_activeProgressNoteId, hbTrId("Requesting"));
+                        m_activeProgressNoteId, hbTrId("txt_phone_info_requesting"));
             }
         }
             break;
@@ -511,20 +594,23 @@
     DPRINT << "iStatus:" << aSetting.iStatus;
 
     changeItemData(
+        aSetting.iServiceGroup,
         aSetting.iCondition, aSetting.iStatus,
         aSetting.iNumber, aSetting.iNoReplyTimer);
     
-    updateDependentDivertOptions();
+    updateDependentDivertOptions(
+            (DivertConditionUnconditional == aSetting.iCondition) &&
+            (DivertingStatusActive != aSetting.iStatus) );
     
     switch(aSetting.iStatus) {
         case DivertingStatusActive:
             if (aPlural) {
                 CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId,
-                    hbTrId("Diverts activated"), 
+                    hbTrId("txt_phone_info_diverts_activated"), 
                     HbMessageBox::MessageTypeInformation);
             } else {
                 CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId,
-                    hbTrId("Divert activated"), 
+                    hbTrId("txt_phone_info_divert_activated"), 
                     HbMessageBox::MessageTypeInformation);
             }
             if (!m_divertToVoiceMailBox) {
@@ -533,21 +619,21 @@
             }
             // Diverting calls does not affect Internet calls
             if (Tools::voipSupported() &&
-                    aSetting.iServiceGroup == ServiceGroupVoice) {
+                    (aSetting.iServiceGroup & ServiceGroupVoice)) {
                 CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId,
                     hbTrId("Diverting calls does not affect Internet calls"), 
                     HbMessageBox::MessageTypeInformation);
             }
             break;
-        case DivertingStatusNotRegistered:
+        case DivertingStatusNotRegistered:  
         case DivertingStatusInactive:
             if (aPlural) {
                 CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId,
-                    hbTrId("Diverts cancelled"), 
+                    hbTrId("txt_phone_info_diverts_deactivated"), 
                     HbMessageBox::MessageTypeInformation);
             } else {
                 CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId,
-                    hbTrId("Divert cancelled"), 
+                    hbTrId("txt_phone_info_divert_deactivated"), 
                     HbMessageBox::MessageTypeInformation);
             }
             break;
@@ -555,34 +641,10 @@
         case DivertingStatusUnknown:
         default:
             CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId,
-                hbTrId("Not done"), 
+                hbTrId("txt_phone_info_request_not_completed"), 
                 HbMessageBox::MessageTypeInformation);
     }
     
-    if ((DivertConditionUnconditional == aSetting.iCondition) &&
-            (DivertingStatusActive != aSetting.iStatus)) {
-        // Must query data for diverts depending on all calls divert, because 
-        // data may have been lost for registered diverts, which were 
-        // automatically deactivated due to the activation of all calls divert.
-        if (CpDivertSelectionCustomitem::Deactivated == 
-                m_DataItemIfBusy->contentWidgetData("state").toInt()) {
-            addToDivertingRequestQueue(
-                CheckDivertStatus, *m_DataItemIfBusy);
-        }
-        
-        if (CpDivertSelectionCustomitem::Deactivated == 
-                m_DataItemIfNotAnswered->contentWidgetData("state").toInt()) {
-            addToDivertingRequestQueue(
-                CheckDivertStatus, *m_DataItemIfNotAnswered);
-        }
-        
-        if (CpDivertSelectionCustomitem::Deactivated == 
-                m_DataItemIfOutOfReach->contentWidgetData("state").toInt()) {
-            addToDivertingRequestQueue(
-                CheckDivertStatus, *m_DataItemIfOutOfReach);
-        }
-    }
-    
     DPRINT << ": OUT";
 }
    
@@ -604,8 +666,10 @@
         DPRINT << status->iStatus;
         DPRINT << status->iTimeout;
         changeItemData(
+            status->iServiceGroup,
             status->iCondition, status->iStatus, 
             status->iNumber, status->iTimeout);
+    
     }
     
     updateDependentDivertOptions();
@@ -622,7 +686,11 @@
     
     // Update view item for failed request
     if (m_divertRequestQueue.count()) {
-        revertItemData(m_divertRequestQueue.head().item->condition());
+        revertItemData(
+            qvariant_cast<PsServiceGroup>(
+                    m_divertRequestQueue.head().item->property("serviceGroup")),
+            qvariant_cast<PsCallDivertingCondition>(
+                    m_divertRequestQueue.head().item->property("condition")));
     }
     
     // Clear queue
@@ -641,45 +709,53 @@
   CpDivertPluginGroup::popUpVoiceNumberListQuery.
  */
 bool CpDivertPluginGroup::popUpVoiceNumberListQuery(
-        const QString& heading, QString& result)
+        const QString& heading, QString& result, PsServiceGroup serviceGroup)
 {
     DPRINT << ": IN";
+    const QString KVoiceMail("voiceMail");
+    const QString KVideoMail("voiceMail");
+    const QString KOtherNumber("otherNumber");
     
     bool requestOK(false);
     m_divertToVoiceMailBox = false;
     QStringList defNumbers;
     HbDialog *dialog = createDialog(heading);
     HbListWidget *list = new HbListWidget(dialog);
-    addItemToListWidget(
-        list, hbTrId("txt_phone_setlabel_voice_mbx"), hbTrId("txt_phone_setlabel_voice_mbx") );
+    if (serviceGroup == ServiceGroupVoice) {
+        addItemToListWidget(
+            list, hbTrId("txt_phone_setlabel_voice_mbx"), KVoiceMail );
+    } else if(serviceGroup == ServiceGroupData) {
+        // TODO: Implement video voicemail
+    }
+
     // Add "old" divert number to list
     m_callDivertingWrapper->getDefaultNumbers(defNumbers);
     int count(defNumbers.count());
     for (int i = 0; i < count; i++) {
         addItemToListWidget(list, defNumbers[i], defNumbers[i]);
     }
-    addItemToListWidget(list, hbTrId("Other number"), hbTrId("Other number") );
+    addItemToListWidget(list, hbTrId("txt_phone_list_enter_number_manually"), KOtherNumber );
     // Connect list item activation signal to close the popup
     connect(
         list, SIGNAL(activated(HbListWidgetItem*)), 
         dialog, SLOT(close()));
     // Sets the "Cancel"-action/button
-    HbAction *cancelAction = new HbAction("Cancel");
+    HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_cancel"));
     dialog->setPrimaryAction(cancelAction);
     dialog->setContentWidget(list);
     // Launch popup and handle the response
     if (dialog->exec() != cancelAction) {
         // Update the view with selected text
         QString data = list->currentItem()->data().toString();
-        if (data == hbTrId("txt_phone_setlabel_voice_mbx")) {
+        if (data == KVoiceMail) {
             m_callDivertingWrapper->getVoiceMailBoxNumber(result);
             if (result.size()) {
                 // voicemailboxnumber found
                 m_divertToVoiceMailBox = true;
                 requestOK = true;
             }
-        } else if (data == hbTrId("Other number")) {
-            requestOK = popUpNumberEditor(hbTrId("Number:"), result);
+        } else if (data == KOtherNumber) {
+            requestOK = popUpNumberEditor(hbTrId("txt_phone_info_number"), result);
         } else {
             //TODO if matched contact name not work
             result = data;
@@ -712,9 +788,9 @@
     HbEditorInterface editorInterface(editor);
     editorInterface.setUpAsPhoneNumberEditor();
     dialog->setContentWidget(editor);
-    HbAction *okAction = new HbAction(hbTrId("OK"));
+    HbAction *okAction = new HbAction(hbTrId("txt_common_button_ok"));
     dialog->addAction(okAction);
-    HbAction *cancelAction = new HbAction(hbTrId("Cancel"));
+    HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_cancel"));
     dialog->setSecondaryAction(cancelAction);
     
     HbAction *resultAction = dialog->exec();
@@ -730,7 +806,7 @@
         }
         else {
             CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId, 
-                hbTrId("Enter number"), HbMessageBox::MessageTypeWarning);
+                hbTrId("txt_phone_info_invalid_phone_number"), HbMessageBox::MessageTypeWarning);
         }
     }
     delete dialog;
@@ -752,11 +828,12 @@
     DPRINT << "iSetting:" << command.iSetting;
     DPRINT << "iStatus:" << command.iStatus;
     
-    int result = m_callDivertingWrapper->setCallDiverting(command, bscParam());
+    int result = m_callDivertingWrapper->setCallDiverting(
+            command, bscParam(command.iServiceGroup));
     if (0 == result) {
         if (!CpPhoneNotes::instance()->noteShowing()) {
             CpPhoneNotes::instance()->showGlobalProgressNote(
-                    m_activeProgressNoteId, hbTrId("Requesting"));
+                    m_activeProgressNoteId, hbTrId("txt_phone_info_requesting"));
         }
     } else {
         handleDivertingError(result);
@@ -786,7 +863,7 @@
         list, SIGNAL(activated(HbListWidgetItem*)), 
         dialog, SLOT(close()));
     // Sets the "Cancel"-action/button
-    HbAction *cancelAction = new HbAction(hbTrId("Cancel"));
+    HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_cancel"));
     dialog->setPrimaryAction(cancelAction);
     dialog->setContentWidget(list);
     // Launch popup and handle the response
@@ -813,24 +890,34 @@
 /*!
   CpDivertPluginGroup::setbscParam.
  */
-int CpDivertPluginGroup::bscParam()
+int CpDivertPluginGroup::bscParam(PsServiceGroup serviceGroup)
 {
     DPRINT << ": IN";
 
     int bsc = AllTeleAndBearer;
-    int alsLine(AlsNotSupported);
-    m_ssSettingsWrapper->get(Als,alsLine);
-    DPRINT << ": alsLine " << alsLine;
-    if ((alsLine == AlsNotSupported) || (alsLine == AlsPrimary)) {
-        // Etelephony only activates voice service nothing else or causes
-        // voice service status request.
-        bsc = Telephony;
+
+    if (serviceGroup & ServiceGroupVoice) {
+        int alsLine(AlsNotSupported);
+        m_ssSettingsWrapper->get(Als,alsLine);
+        DPRINT << ": alsLine " << alsLine;
+        
+        if ((alsLine == AlsNotSupported) || (alsLine == AlsPrimary)) {
+            // Etelephony only activates voice service nothing else or causes
+            // voice service status request.
+            bsc = Telephony;
+        }
+        else { // ESSSettingsAlsAlternate
+            // EAltTele only activates alternate service nothing else or causes
+            // alternate service status request.
+            bsc = AltTele;
+        }
     }
-    else { // ESSSettingsAlsAlternate
-        // EAltTele only activates alternate service nothing else or causes
-        // alternate service status request.
-        bsc = AltTele;
+    
+    if (serviceGroup & ServiceGroupData) {
+        bsc = AllBearer;
     }
+
+
     
     DPRINT << ": OUT : bsc :" << bsc;
     return bsc;
@@ -895,34 +982,40 @@
      Enabling/disabling that options changes all the aforementioned diverts 
      at once.
 */
-void CpDivertPluginGroup::updateDependentDivertOptions()
+void CpDivertPluginGroup::updateDependentDivertOptions(bool fetchFromNetwork)
 {
     DPRINT << ": IN";
     
     // all calls divert activation deactivates automatically other diverts
-    QVariant itemState = m_DataItemAllVoiceCalls->contentWidgetData("state");
+    QVariant itemState = m_DataItemVoiceAllCalls->contentWidgetData("state");
     if ((itemState.isValid()) && 
         (itemState.toInt() == CpDivertSelectionCustomitem::Enabled)) {
-        itemState = m_DataItemIfBusy->contentWidgetData("state");
-        if ((itemState.isValid()) && 
-            (itemState == CpDivertSelectionCustomitem::Enabled)) {
-            m_DataItemIfBusy->setContentWidgetData(
-                "state", CpDivertSelectionCustomitem::Deactivated);
-        }
-        
-        itemState = m_DataItemIfNotAnswered->contentWidgetData("state");
-        if ((itemState.isValid()) &&
-            (itemState == CpDivertSelectionCustomitem::Enabled)) {
-            m_DataItemIfNotAnswered->setContentWidgetData(
-                "state", CpDivertSelectionCustomitem::Deactivated);
-        }
-        
-        itemState = m_DataItemIfOutOfReach->contentWidgetData("state");
-        if ((itemState.isValid()) &&
-            (itemState == CpDivertSelectionCustomitem::Enabled)) {
-            m_DataItemIfOutOfReach->setContentWidgetData(
-                "state", CpDivertSelectionCustomitem::Deactivated);
-        }
+        deActivateDependentDivertOption(m_DataItemVoiceIfBusy);
+        deActivateDependentDivertOption(m_DataItemVoiceIfNotAnswered);
+        deActivateDependentDivertOption(m_DataItemVoiceIfOutOfReach);
+    } else {
+        // Must query data for diverts depending on all calls divert, because 
+        // data may have been lost for registered diverts, which were 
+        // automatically deactivated due to the activation of all calls divert.
+        activateDependentDivertOption(m_DataItemVoiceIfBusy, fetchFromNetwork);
+        activateDependentDivertOption(m_DataItemVoiceIfNotAnswered, fetchFromNetwork);
+        activateDependentDivertOption(m_DataItemVoiceIfOutOfReach, fetchFromNetwork);
+    }
+    
+    // all calls divert activation deactivates automatically other diverts
+    itemState = m_DataItemVideoAllCalls->contentWidgetData("state");
+    if ((itemState.isValid()) && 
+        (itemState.toInt() == CpDivertSelectionCustomitem::Enabled)) {
+        deActivateDependentDivertOption(m_DataItemVideoIfBusy);
+        deActivateDependentDivertOption(m_DataItemVideoIfNotAnswered);
+        deActivateDependentDivertOption(m_DataItemVideoIfOutOfReach);
+    } else {
+        // Must query data for diverts depending on all calls divert, because 
+        // data may have been lost for registered diverts, which were 
+        // automatically deactivated due to the activation of all calls divert.
+        activateDependentDivertOption(m_DataItemVideoIfBusy, fetchFromNetwork);
+        activateDependentDivertOption(m_DataItemVideoIfNotAnswered, fetchFromNetwork);
+        activateDependentDivertOption(m_DataItemVideoIfOutOfReach, fetchFromNetwork);
     }
     
     // update not available divert option
@@ -932,6 +1025,36 @@
 }
 
 /*!
+  CpDivertPluginGroup::deActivateDependentDivertOption.
+*/
+void CpDivertPluginGroup::deActivateDependentDivertOption(
+        CpDivertItemData* item) const
+{
+    QVariant itemState = item->contentWidgetData("state");
+    if ((itemState.isValid()) && 
+        (itemState == CpDivertSelectionCustomitem::Enabled)) {
+        item->setContentWidgetData(
+            "state", CpDivertSelectionCustomitem::Deactivated);
+    }
+    item->setEnabled(false);
+}
+
+/*!
+  CpDivertPluginGroup::activateDependentDivertOption.
+*/
+void CpDivertPluginGroup::activateDependentDivertOption(
+        CpDivertItemData* item, bool fetchFromNetwork)
+{
+    if ((CpDivertSelectionCustomitem::Deactivated == 
+            item->contentWidgetData("state").toInt()) &&
+            fetchFromNetwork) {
+        addToDivertingRequestQueue(
+            CheckDivertStatus, *item);
+    }
+    item->setEnabled(true);
+}
+
+/*!
   CpDivertPluginGroup::updateNotAvailableDivertOption.
  */
 void CpDivertPluginGroup::updateNotAvailableDivertOption()
@@ -942,32 +1065,77 @@
     // CFNrc before concluding that not available divert is enabled, because
     // some networks may not return divert number for inactive diverts.
     int cfbState = 
-        m_DataItemIfBusy->contentWidgetData("state").toInt();
+        m_DataItemVoiceIfBusy->contentWidgetData("state").toInt();
     int cfnryState = 
-        m_DataItemIfNotAnswered->contentWidgetData("state").toInt();
+        m_DataItemVoiceIfNotAnswered->contentWidgetData("state").toInt();
     int cfnrcState = 
-        m_DataItemIfOutOfReach->contentWidgetData("state").toInt();
+        m_DataItemVoiceIfOutOfReach->contentWidgetData("state").toInt();
     QVariant cfbNumber = 
-        m_DataItemIfBusy->contentWidgetData("number");
+        m_DataItemVoiceIfBusy->contentWidgetData("number");
     QVariant cfnryNumber = 
-        m_DataItemIfNotAnswered->contentWidgetData("number");
+        m_DataItemVoiceIfNotAnswered->contentWidgetData("number");
     QVariant cfnrcNumber = 
-        m_DataItemIfOutOfReach->contentWidgetData("number");
+        m_DataItemVoiceIfOutOfReach->contentWidgetData("number");
     
     if ((cfbNumber == cfnryNumber) && (cfbNumber == cfnrcNumber) &&
         (cfbState == cfnryState) && (cfbState == cfnrcState)) {
-        m_DataItemIfNotAvailable->setContentWidgetData(
-            "number", m_DataItemIfBusy->contentWidgetData("number"));
-        m_DataItemIfNotAvailable->setContentWidgetData(
-            "timeout", m_DataItemIfNotAnswered->contentWidgetData("timeout"));
-        m_DataItemIfNotAvailable->setContentWidgetData(
-            "state", m_DataItemIfBusy->contentWidgetData("state"));
+        m_DataItemVoiceIfNotAvailable->setContentWidgetData(
+            "number", m_DataItemVoiceIfBusy->contentWidgetData("number"));
+        m_DataItemVoiceIfNotAvailable->setContentWidgetData(
+            "timeout", m_DataItemVoiceIfNotAnswered->contentWidgetData("timeout"));
+        m_DataItemVoiceIfNotAvailable->setContentWidgetData(
+            "state", m_DataItemVoiceIfBusy->contentWidgetData("state"));
     } else {
-        m_DataItemIfNotAvailable->setContentWidgetData("number", "");
-        m_DataItemIfNotAvailable->setContentWidgetData("timeout", 0);
-        m_DataItemIfNotAvailable->setContentWidgetData(
+        m_DataItemVoiceIfNotAvailable->setContentWidgetData("number", "");
+        m_DataItemVoiceIfNotAvailable->setContentWidgetData("timeout", 0);
+        m_DataItemVoiceIfNotAvailable->setContentWidgetData(
             "state", CpDivertSelectionCustomitem::Disabled);
+
     }
+    // Item dimming
+    m_DataItemVoiceIfNotAvailable->setEnabled(
+            m_DataItemVoiceIfBusy->isEnabled() &&
+            m_DataItemVoiceIfNotAnswered->isEnabled() &&
+            m_DataItemVoiceIfOutOfReach->isEnabled()); 
+    
+    
+    // We must check that both states & numbers match amongst CFB, CRNry and 
+    // CFNrc before concluding that not available divert is enabled, because
+    // some networks may not return divert number for inactive diverts.
+    cfbState = 
+        m_DataItemVideoIfBusy->contentWidgetData("state").toInt();
+    cfnryState = 
+        m_DataItemVideoIfNotAnswered->contentWidgetData("state").toInt();
+    cfnrcState = 
+        m_DataItemVideoIfOutOfReach->contentWidgetData("state").toInt();
+    cfbNumber = 
+        m_DataItemVideoIfBusy->contentWidgetData("number");
+    cfnryNumber = 
+        m_DataItemVideoIfNotAnswered->contentWidgetData("number");
+    cfnrcNumber = 
+        m_DataItemVideoIfOutOfReach->contentWidgetData("number");
+    
+    if ((cfbNumber == cfnryNumber) && (cfbNumber == cfnrcNumber) &&
+        (cfbState == cfnryState) && (cfbState == cfnrcState)) {
+        m_DataItemVideoIfNotAvailable->setContentWidgetData(
+            "number", m_DataItemVideoIfBusy->contentWidgetData("number"));
+        m_DataItemVideoIfNotAvailable->setContentWidgetData(
+            "timeout", m_DataItemVideoIfNotAnswered->contentWidgetData("timeout"));
+        m_DataItemVideoIfNotAvailable->setContentWidgetData(
+            "state", m_DataItemVideoIfBusy->contentWidgetData("state"));
+    } else {
+        m_DataItemVideoIfNotAvailable->setContentWidgetData("number", "");
+        m_DataItemVideoIfNotAvailable->setContentWidgetData("timeout", 0);
+        m_DataItemVideoIfNotAvailable->setContentWidgetData(
+            "state", CpDivertSelectionCustomitem::Disabled);
+
+    }
+    
+    // Item dimming
+    m_DataItemVideoIfNotAvailable->setEnabled(
+            m_DataItemVideoIfBusy->isEnabled() &&
+            m_DataItemVideoIfNotAnswered->isEnabled() &&
+            m_DataItemVideoIfOutOfReach->isEnabled()); 
     
     DPRINT << ": OUT";
 }