diff -r bab96b7ed1a4 -r f39ed5e045e0 phonesettings/cpphonesettingsplugins/divertplugin/src/cpdivertplugingroup.cpp --- a/phonesettings/cpphonesettingsplugins/divertplugin/src/cpdivertplugingroup.cpp Tue Jun 15 14:14:38 2010 +0100 +++ b/phonesettings/cpphonesettingsplugins/divertplugin/src/cpdivertplugingroup.cpp Thu Jul 22 16:33:21 2010 +0100 @@ -15,7 +15,6 @@ * */ -#include #include #include #include @@ -28,21 +27,18 @@ #include #include #include +#include #include -#include "cpdivertselectionitem.h" #include "cpdivertplugingroup.h" #include "cpplugincommon.h" #include "cpphonenotes.h" #include "cppluginlogging.h" #include "cpdivertitemdata.h" -#include "cpdivertselectioncustomitem.h" Q_DECLARE_METATYPE(PsCallDivertingCondition) Q_DECLARE_METATYPE(PsServiceGroup) // CONSTANTS -const QString KVoiceMail("voiceMail"); -const QString KVideoMail("voiceMail"); const QString KOtherNumber("otherNumber"); /*! @@ -63,9 +59,9 @@ m_DataItemVideoIfNotAvailable(NULL), m_activeNoteId(0), m_activeProgressNoteId(0), - m_divertToVoiceMailBox(false), m_helper(helper), - m_divertTimeout(0) + m_activateDivertPhase(NonePhase), + m_dialog(NULL) { DPRINT << ": IN"; @@ -105,9 +101,6 @@ SIGNAL(requestDone()), this, SLOT(divertRequestProcessed())); - - // Create custom item prototype - m_helper.addItemPrototype(new CpDivertSelectionItem()); // Listen form item visibility change m_helper.connectToForm( @@ -116,9 +109,7 @@ // Create grouped setting items createVoiceCallItems(this); createVideoCallItems(this); - - m_eventLoop = new QEventLoop(this); - + DPRINT << ": OUT"; } @@ -144,6 +135,7 @@ CpSettingFormItemData *page = new CpSettingFormItemData( HbDataFormModelItem::GroupPageItem, hbTrId("txt_phone_setlabel_service_val_voice_divert")); + page->setObjectName("voiceCallSettingsGroupItem"); parent->appendChild(page); m_DataItemVoiceAllCalls = createDivertItem( @@ -152,6 +144,7 @@ hbTrId("txt_phone_setlabel_all_calls"), hbTrId("txt_phone_setlabel_all_calls"), false, page); + m_DataItemVoiceAllCalls->setObjectName("voiceAllCallsDataItem"); m_DataItemVoiceIfBusy = createDivertItem( DivertConditionBusy, @@ -159,6 +152,7 @@ hbTrId("txt_phone_setlabel_if_busy"), hbTrId("txt_phone_setlabel_if_busy"), false, page); + m_DataItemVoiceIfBusy->setObjectName("voiceIfBusyDataItem"); m_DataItemVoiceIfNotAnswered = createDivertItem( DivertConditionNoReply, @@ -166,22 +160,23 @@ hbTrId("txt_phone_setlabel_if_not_answered"), hbTrId("txt_phone_setlabel_if_not_answered"), true, page); - m_DataItemVoiceIfNotAnswered->setContentWidgetData( - "timeoutText", hbTrId("txt_phone_setlabel_delay")); - + m_DataItemVoiceIfNotAnswered->setObjectName("voiceIfNotAnsweredDataItem"); + m_DataItemVoiceIfOutOfReach = createDivertItem( DivertConditionNotReachable, ServiceGroupVoice, hbTrId("txt_phone_setlabel_if_out_of_reach"), hbTrId("txt_phone_setlabel_if_out_of_reach"), false, page); - + m_DataItemVoiceIfOutOfReach->setObjectName("voiceIfOutOfReachDataItem"); + m_DataItemVoiceIfNotAvailable = createDivertItem( DivertConditionAllConditionalCases, ServiceGroupVoice, hbTrId("txt_phone_setlabel_if_not_available"), hbTrId("txt_phone_setlabel_if_not_available"), true, page); + m_DataItemVoiceIfNotAvailable->setObjectName("voiceIfNotAvailableDataItem"); DPRINT << ": OUT"; } @@ -192,9 +187,11 @@ void CpDivertPluginGroup::createVideoCallItems(CpSettingFormItemData *parent) { DPRINT << ": IN"; + CpSettingFormItemData *page = new CpSettingFormItemData( HbDataFormModelItem::GroupPageItem, hbTrId("txt_phone_setlabel_service_val_video_divert")); + page->setObjectName("videoCallSettingsGroupItem"); parent->appendChild(page); @@ -204,6 +201,7 @@ hbTrId("txt_phone_setlabel_all_calls"), hbTrId("txt_phone_setlabel_all_calls"), false, page); + m_DataItemVideoAllCalls->setObjectName("videoAllCallsDataItem"); m_DataItemVideoIfBusy = createDivertItem( DivertConditionBusy, @@ -211,29 +209,31 @@ hbTrId("txt_phone_setlabel_if_busy"), hbTrId("txt_phone_setlabel_if_busy"), false, page); - + m_DataItemVideoIfBusy->setObjectName("videoIfBusyDataItem"); + 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_DataItemVideoIfNotAnswered->setObjectName("videoIfNotAnsweredDataItem"); + m_DataItemVideoIfOutOfReach = createDivertItem( DivertConditionNotReachable, ServiceGroupData, hbTrId("txt_phone_setlabel_if_out_of_reach"), hbTrId("txt_phone_setlabel_if_out_of_reach"), false, page); - + m_DataItemVideoIfOutOfReach->setObjectName("videoIfOutOfReachDataItem"); + m_DataItemVideoIfNotAvailable = createDivertItem( DivertConditionAllConditionalCases, ServiceGroupData, hbTrId("txt_phone_setlabel_if_not_available"), hbTrId("txt_phone_setlabel_if_not_available"), true, page); + m_DataItemVideoIfNotAvailable->setObjectName("videoIfNotAvailableDataItem"); DPRINT << ": OUT"; } @@ -250,13 +250,13 @@ CpSettingFormItemData *parent) { DPRINT << ": IN"; - + CpDivertItemData *item = new CpDivertItemData( - static_cast - (CpDivertSelectionItem::CpDivertSelectionItemId), + HbDataFormModelItem::CheckBoxItem, label, m_helper, parent); + QVariant conditionVar; conditionVar.setValue(condition); item->setProperty("condition", conditionVar); @@ -265,6 +265,7 @@ item->setProperty("serviceGroup", serviceGroupVar); item->setProperty("queryLabel", queryLabel); item->setProperty("needTimeoutInfo", needTimeoutInfo); + item->setProperty("divertItem", true); item->setEnabled(false); // Connect signals @@ -273,6 +274,7 @@ this, SLOT(changeDivertingStateRequested(CpDivertItemData&))); parent->appendChild(item); + DPRINT << ": OUT"; return item; } @@ -286,18 +288,21 @@ DPRINT << "item:" << item; HbDataFormModelItem* modelItem = - qobject_cast(item.model())->itemFromIndex(item); + qobject_cast(item.model())->itemFromIndex(item); + if (!isDivertSettingsItem(modelItem)) { + return; + } - if (!modelItem->contentWidgetData("number").isValid() && - (static_cast - (CpDivertSelectionItem::CpDivertSelectionItemId == modelItem->type()))){ + bool isInitialStatusQueryDoneForItem = + modelItem->contentWidgetData("text").isValid(); + if (!isInitialStatusQueryDoneForItem) { CpDivertItemData *item = static_cast(modelItem); - if(qvariant_cast(item->property("condition")) != + if (qvariant_cast(item->property("condition")) != DivertConditionAllConditionalCases) { addToDivertingRequestQueue(CheckDivertStatus, *item); } } - + DPRINT << ": OUT"; } @@ -308,21 +313,17 @@ DivertRequest request, CpDivertItemData &item) { DPRINT << ": IN"; + CpDivertRequestQueueItem i; i.request = request; i.item = &item; m_divertRequestQueue.enqueue(i); - if (m_divertRequestQueue.count()==1) { - // Process if first item was added, process other later - try { - processDivertingRequestQueue(); - } catch(...) { - DPRINT << "error!!"; - } + if (m_divertRequestQueue.count() == 1) { + // Process if first item was added, process other later + processDivertingRequestQueue(); } - DPRINT << ": OUT"; } @@ -332,6 +333,7 @@ void CpDivertPluginGroup::divertRequestProcessed() { DPRINT << ": IN"; + // Remove previous request and process next one if (!m_divertRequestQueue.isEmpty()) { m_divertRequestQueue.dequeue(); @@ -353,19 +355,28 @@ PsServiceGroup serviceGroup, PsCallDivertingCondition condition, PsCallDivertingStatus status, - const QString& number, int timeout) + const QString& aNumber, int aTimeout) { DPRINT << ": IN"; - CpDivertSelectionCustomitem::State itemState = - CpDivertSelectionCustomitem::Disabled; + Qt::CheckState itemState = Qt::Unchecked; if (status == DivertingStatusActive) { - itemState = CpDivertSelectionCustomitem::Enabled; + itemState = Qt::Checked; } else if (status == DivertingStatusInactive) { - itemState = CpDivertSelectionCustomitem::Deactivated; + itemState = Qt::PartiallyChecked; } else { - itemState = CpDivertSelectionCustomitem::Disabled; + itemState = Qt::Unchecked; } + + QString number = aNumber; + int timeout = aTimeout; + if (Qt::PartiallyChecked == itemState) { + number = QString(""); + timeout = 0; + } + + QVariant numberValue; + numberValue.setValue(number); switch (condition) { case DivertConditionAllConditionalCases: @@ -381,24 +392,43 @@ 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); + CpSettingFormItemData* itemData = item(ServiceGroupVoice, condition); + itemData->setContentWidgetData("text", numberValue); + if (DivertConditionNoReply == condition) { + if (timeout > 0) { + itemData->setDescription( + hbTrId("txt_phone_setlabel_divert_delay_ln_seconds", timeout)); + } else { + itemData->setDescription(""); + } + } + itemData->setContentWidgetData("checkState", itemState); + itemData->setEnabled(true); } 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); + CpSettingFormItemData* itemData = item(ServiceGroupData, condition); + itemData->setContentWidgetData("text", numberValue); + if (DivertConditionNoReply == condition) { + if (timeout > 0) { + itemData->setDescription( + hbTrId("txt_phone_setlabel_divert_delay_ln_seconds", timeout)); + } else { + itemData->setDescription(""); + } + } + itemData->setContentWidgetData("checkState", itemState); + itemData->setEnabled(true); } + break; case DivertConditionAllCalls: case DivertConditionUnknown: default: break; } + + DPRINT << ": OUT"; } /*! @@ -408,16 +438,23 @@ PsServiceGroup serviceGroup, PsCallDivertingCondition condition) { DPRINT << ": IN"; + if (serviceGroup & ServiceGroupVoice) { - item(ServiceGroupVoice, condition)->setContentWidgetData("state", - item(ServiceGroupVoice, condition)->contentWidgetData("state")); + CpSettingFormItemData* itemData = item(ServiceGroupVoice, condition); + int checkState = itemData->contentWidgetData("checkState").toInt(); + int revertedCheckState = + Qt::Checked == checkState ? Qt::Unchecked : Qt::Checked; + itemData->setContentWidgetData("checkState", revertedCheckState); } if (serviceGroup & ServiceGroupData) { - item(ServiceGroupData, condition)->setContentWidgetData("state", - item(ServiceGroupData, condition)->contentWidgetData("state")); + CpSettingFormItemData* itemData = item(ServiceGroupData, condition); + int checkState = itemData->contentWidgetData("checkState").toInt(); + int revertedCheckState = + Qt::Checked == checkState ? Qt::Unchecked : Qt::Checked; + itemData->setContentWidgetData("checkState", revertedCheckState); } - + DPRINT << ": OUT"; } @@ -427,6 +464,8 @@ CpSettingFormItemData* CpDivertPluginGroup::item( PsService service, PsCallDivertingCondition condition) { + DPRINT << ": IN"; + CpSettingFormItemData *ret = 0; switch (condition) { case DivertConditionUnconditional: @@ -470,6 +509,8 @@ break; } Q_CHECK_PTR(ret); + + DPRINT << ": OUT"; return ret; } @@ -485,61 +526,41 @@ } CpDivertRequestQueueItem request = m_divertRequestQueue.head(); // Command param - PSCallDivertingCommand divertCommand; - divertCommand.iServiceGroup = qvariant_cast( + m_divertCommand.iServiceGroup = qvariant_cast( request.item->property("serviceGroup")); - divertCommand.iCondition = qvariant_cast( + m_divertCommand.iCondition = qvariant_cast( request.item->property("condition")); - divertCommand.iStatus = DivertingStatusUnknown; - divertCommand.iNumber = ""; - divertCommand.iNoReplyTimer = 0; + m_divertCommand.iStatus = DivertingStatusUnknown; + m_divertCommand.iNumber = ""; + m_divertCommand.iNoReplyTimer = 0; switch (request.request) { case ActivateDivert: { DPRINT << "activate"; - divertCommand.iSetting = RegisterDiverting; - if (popUpVoiceNumberListQuery( - 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 - revertItemData( - divertCommand.iServiceGroup, - divertCommand.iCondition); - m_divertRequestQueue.clear(); - } - } else { - setCallDiverting(divertCommand); - } - } else { - // Query was cancelled - revertItemData( - divertCommand.iServiceGroup, - divertCommand.iCondition); - m_divertRequestQueue.clear(); - } + m_divertCommand.iSetting = RegisterDiverting; + m_activateDivertPhase = PopUpVoiceNumberListQueryPhase; + popUpVoiceNumberListQuery( + request.item->property("queryLabel").toString(), + m_divertCommand.iServiceGroup); } break; case DeactivateDivert: { DPRINT << "deactivate"; - divertCommand.iSetting = EraseDiverting; - setCallDiverting(divertCommand); + m_divertCommand.iSetting = EraseDiverting; + setCallDiverting(m_divertCommand); } break; case CheckDivertStatus: { DPRINT << "check status"; m_callDivertingWrapper->getCallDivertingStatus( - divertCommand.iServiceGroup, - divertCommand.iCondition, - bscParam(divertCommand.iServiceGroup) ); + m_divertCommand.iServiceGroup, + m_divertCommand.iCondition, + bscParam(m_divertCommand.iServiceGroup) ); if (!CpPhoneNotes::instance()->noteShowing()) { CpPhoneNotes::instance()->showGlobalProgressNote( - m_activeProgressNoteId, hbTrId("txt_phone_info_requesting")); + m_activeProgressNoteId, + hbTrId("txt_common_info_requesting")); } } break; @@ -559,12 +580,11 @@ { DPRINT << ": IN"; - DivertRequest event=ActivateDivert; - if (CpDivertSelectionCustomitem::Enabled == - item.contentWidgetData("state").toInt()) { + DivertRequest event = ActivateDivert; + if (Qt::Checked == item.contentWidgetData("checkState").toInt()) { + event = ActivateDivert; + } else { event = DeactivateDivert; - } else { - event = ActivateDivert; } addToDivertingRequestQueue(event, item); @@ -598,47 +618,41 @@ (DivertConditionUnconditional == aSetting.iCondition) && (DivertingStatusActive != aSetting.iStatus) ); - switch(aSetting.iStatus) { - case DivertingStatusActive: + switch (aSetting.iStatus) { + case DivertingStatusActive: { if (aPlural) { - CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId, - hbTrId("txt_phone_info_diverts_activated"), - HbMessageBox::MessageTypeInformation); + CpPhoneNotes::instance()->showNotificationDialog( + hbTrId("txt_phone_info_diverts_activated")); } else { - CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId, - hbTrId("txt_phone_info_divert_activated"), - HbMessageBox::MessageTypeInformation); + CpPhoneNotes::instance()->showNotificationDialog( + hbTrId("txt_phone_info_divert_activated")); } - if (!m_divertToVoiceMailBox) { + QString voiceMailBoxNumber; + QString videoMailBoxNumber; + m_callDivertingWrapper->getVoiceMailBoxNumber(voiceMailBoxNumber, ServiceGroupVoice); + m_callDivertingWrapper->getVoiceMailBoxNumber(videoMailBoxNumber, ServiceGroupData); + if ((aSetting.iNumber != voiceMailBoxNumber) && (aSetting.iNumber != videoMailBoxNumber)) { // Number, except vmbx number, will be added to defaultnumber list m_callDivertingWrapper->setNewDefaultNumber(aSetting.iNumber); } - // Diverting calls does not affect Internet calls - if (Tools::voipSupported() && - (aSetting.iServiceGroup & ServiceGroupVoice)) { - CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId, - hbTrId("Diverting calls does not affect Internet calls"), - HbMessageBox::MessageTypeInformation); - } + } break; case DivertingStatusNotRegistered: case DivertingStatusInactive: if (aPlural) { - CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId, - hbTrId("txt_phone_info_diverts_deactivated"), - HbMessageBox::MessageTypeInformation); + CpPhoneNotes::instance()->showNotificationDialog( + hbTrId("txt_phone_info_diverts_deactivated")); } else { - CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId, - hbTrId("txt_phone_info_divert_deactivated"), - HbMessageBox::MessageTypeInformation); + CpPhoneNotes::instance()->showNotificationDialog( + hbTrId("txt_phone_info_divert_deactivated")); } break; case DivertingStatusNotProvisioned: case DivertingStatusUnknown: default: - CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId, - hbTrId("txt_phone_info_request_not_completed"), - HbMessageBox::MessageTypeInformation); + CpPhoneNotes::instance()->showNotificationDialog( + hbTrId("txt_phone_info_request_not_completed")); + break; } DPRINT << ": OUT"; @@ -655,7 +669,7 @@ DPRINT << "divertList.Size():" << divertList.size(); DPRINT << "plural:" << plural; - foreach(PSCallDivertingStatus* status, divertList) { + foreach (PSCallDivertingStatus* status, divertList) { DPRINT << status->iCondition; DPRINT << status->iNumber; DPRINT << status->iServiceGroup; @@ -688,13 +702,13 @@ qvariant_cast( m_divertRequestQueue.head().item->property("condition"))); } - + // Clear queue m_divertRequestQueue.clear(); - + // Cancel previous note CpPhoneNotes::instance()->cancelNote(m_activeNoteId); - + // Show error note CpPhoneNotes::instance()->showGlobalErrorNote(m_activeNoteId, aReason); @@ -704,65 +718,82 @@ /*! CpDivertPluginGroup::popUpVoiceNumberListQuery. */ -bool CpDivertPluginGroup::popUpVoiceNumberListQuery( - const QString& heading, QString& result, PsServiceGroup serviceGroup) +void CpDivertPluginGroup::popUpVoiceNumberListQuery( + const QString& heading, PsServiceGroup serviceGroup) { DPRINT << ": IN"; - - bool requestOK(false); + if (m_dialog) { + m_dialog->deleteLater(); + m_dialog = NULL; + } - if (!m_eventLoop->isRunning()){ - m_divertNumber = ""; - m_divertToVoiceMailBox = false; - QStringList defNumbers; - HbDialog *dialog = createDialog(heading); - m_voiceNumberList = new HbListWidget(dialog); + m_divertCommand.iNumber.clear(); + QStringList defNumbers; + QScopedPointer dialog(createDialog(heading)); + HbListWidget *list = new HbListWidget(dialog.data()); + + QString vmbxNumber; + int vmbxErr = 0; + if (serviceGroup == ServiceGroupVoice) { + vmbxErr = m_callDivertingWrapper->getVoiceMailBoxNumber( + vmbxNumber, ServiceGroupVoice); + + } else if(serviceGroup == ServiceGroupData) { + vmbxErr = m_callDivertingWrapper->getVoiceMailBoxNumber( + vmbxNumber, ServiceGroupData); + + } else { + vmbxErr = -1; + // Skip + } + + if (!vmbxErr) { if (serviceGroup == ServiceGroupVoice) { addItemToListWidget( - m_voiceNumberList, 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(m_voiceNumberList, defNumbers[i], defNumbers[i]); + list, + hbTrId("txt_phone_setlabel_voice_mbx"), + vmbxNumber ); + + } else { + addItemToListWidget( + list, + hbTrId("txt_phone_setlabel_video_mbx"), + vmbxNumber ); } - addItemToListWidget(m_voiceNumberList, hbTrId("txt_phone_list_enter_number_manually"), KOtherNumber ); - dialog->setContentWidget(m_voiceNumberList); - - // Connect list item activation signal to close the popup - QObject::connect(m_voiceNumberList, - SIGNAL(activated(HbListWidgetItem*)), - dialog, - SLOT(close()), - Qt::UniqueConnection); - - // Sets the "Cancel"-action/button - HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_cancel")); - dialog->addAction(cancelAction); - QObject::connect(cancelAction, - SIGNAL(triggered(bool)), - dialog, - SLOT(close())); - - dialog->open(this, SLOT(voiceNumberListQueryClosed(HbAction *))); - - QPointer guard = this; - m_eventLoop->exec(); - if (guard.isNull()) { - requestOK = false; - } else if (!m_divertNumber.isEmpty()) { - result = m_divertNumber; - requestOK = true; - } + } + + // 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("txt_phone_list_enter_number_manually"), + KOtherNumber ); + dialog->setContentWidget(list); - DPRINT << ": OUT : result:" << result; - DPRINT << ": OUT : requestOK :" << requestOK; - return requestOK; + // Connect list item activation signal to close the popup + QObject::connect(list, + SIGNAL(activated(HbListWidgetItem*)), + dialog.data(), + SLOT(close()), + Qt::UniqueConnection); + + // Sets the "Cancel"-action/button + HbAction *cancelAction = new HbAction(hbTrId( + "txt_common_button_cancel"), + dialog.data()); + dialog->addAction(cancelAction); + QObject::connect(cancelAction, + SIGNAL(triggered(bool)), + dialog.data(), + SLOT(close())); + + dialog->open(this, SLOT(voiceNumberListQueryClosed(HbAction *))); + m_dialog = dialog.take(); + DPRINT << ": OUT"; } /*! @@ -771,40 +802,65 @@ void CpDivertPluginGroup::voiceNumberListQueryClosed(HbAction* action) { DPRINT << ": IN"; + HbListWidget *list(NULL); + m_divertCommand.iNumber.clear(); + bool processNextPhase(true); - bool exitLoop(true); + if (m_dialog) { + bool err = QObject::disconnect(m_dialog->contentWidget(), + SIGNAL(activated(HbListWidgetItem*)), + m_dialog, + SLOT(close())); + list = qobject_cast(m_dialog->contentWidget()); + m_dialog->deleteLater(); + m_dialog = NULL; + } // Enter if cancel wasn't selected - if (!action) { + if (!action && list) { // Update the view with selected text - QString data = m_voiceNumberList->currentItem()->data().toString(); + QString data = list->currentItem()->data().toString(); + QString text = list->currentItem()->text(); + DPRINT << ": data: " << data; - - if (data == KVoiceMail) { - m_callDivertingWrapper->getVoiceMailBoxNumber(m_divertNumber); - if (!m_divertNumber.isEmpty()) { - DPRINT << ": voicemailboxnumber found"; + DPRINT << ": text: " << text; + + if (data == KOtherNumber) { + DPRINT << ": open popUpNumberEditor"; + processNextPhase = false; + popUpNumberEditor(hbTrId("txt_phone_info_number")); + } else if (text == hbTrId("txt_phone_setlabel_voice_mbx")) { + DPRINT << ": get voicemailboxnumber"; + m_callDivertingWrapper->getVoiceMailBoxNumber( + m_divertCommand.iNumber, ServiceGroupVoice); + if (m_divertCommand.iNumber.isEmpty()) { + DPRINT << ": voicemailboxnumber query"; + m_callDivertingWrapper->queryVoiceMailBoxNumber( + m_divertCommand.iNumber, ServiceGroupVoice); } - - m_eventLoop->quit(); - - } else if (data == KOtherNumber) { - // Event loop is terminated by popUpNumberEditorClosed - exitLoop = false; - - DPRINT << ": open popUpNumberEditor"; - popUpNumberEditor(hbTrId("txt_phone_info_number"), m_divertNumber); - } else { + } else if (text == hbTrId("txt_phone_setlabel_video_mbx")) { + DPRINT << ": get videomailboxnumber"; + m_callDivertingWrapper->getVoiceMailBoxNumber( + m_divertCommand.iNumber, ServiceGroupData); + if (m_divertCommand.iNumber.isEmpty()) { + DPRINT << ": videomailboxnumber query"; + m_callDivertingWrapper->queryVoiceMailBoxNumber( + m_divertCommand.iNumber, ServiceGroupData); + } + } else { //TODO if matched contact name not work DPRINT << ": else"; - m_divertNumber = data; + m_divertCommand.iNumber = data; } - } - - if (exitLoop) { - DPRINT << ": quit eventloop"; - m_eventLoop->quit(); + DPRINT << ": processNextPhase: " << processNextPhase; + DPRINT << ": m_divertCommand.iNumber: " << m_divertCommand.iNumber; + if (processNextPhase) { + if (m_divertCommand.iNumber.isEmpty()) { + nextPhaseForActivateDivert(false); + } else { + nextPhaseForActivateDivert(true); + } } DPRINT << ": OUT"; @@ -814,26 +870,32 @@ CpDivertPluginGroup::popUpNumberEditor. */ void CpDivertPluginGroup::popUpNumberEditor( - const QString& heading, QString& result) + const QString& heading) { DPRINT << ": IN"; - Q_UNUSED(result); - - HbDialog *dialog = createDialog(heading); + if (m_dialog) { + m_dialog->deleteLater(); + m_dialog = NULL; + } + QScopedPointer dialog(createDialog(heading)); - m_voiceNumberEditor = new HbLineEdit(dialog); - m_voiceNumberEditor->setInputMethodHints(Qt::ImhDialableCharactersOnly); - dialog->setContentWidget(m_voiceNumberEditor); + HbLineEdit *editor = new HbLineEdit(dialog.data()); + editor->setInputMethodHints(Qt::ImhDialableCharactersOnly); + //Ownership is transferred + dialog->setContentWidget(editor); - HbAction *okAction = new HbAction(hbTrId("txt_common_button_ok")); + HbAction *okAction = new HbAction( + hbTrId("txt_common_button_ok"), + dialog.data()); dialog->addAction(okAction); - HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_cancel")); + HbAction *cancelAction = new HbAction( + hbTrId("txt_common_button_cancel"), + dialog.data()); dialog->addAction(cancelAction); - dialog->open(this, SLOT(popUpNumberEditorClosed(HbAction*))); - + m_dialog = dialog.take(); DPRINT << ": OUT"; } @@ -843,32 +905,33 @@ void CpDivertPluginGroup::popUpNumberEditorClosed(HbAction* action) { DPRINT << ": IN"; - bool cancelled(true); if (action) { - if (action->text() == hbTrId("txt_common_button_ok")) - { + if (action->text() == hbTrId("txt_common_button_ok")) { cancelled = false; DPRINT << ": ok selected"; - } + } } if (!cancelled) { - m_divertNumber = m_voiceNumberEditor->text(); - DPRINT << ": m_divertNumber " - << m_divertNumber; - if (m_divertNumber.isEmpty()) { - CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId, - hbTrId("txt_phone_info_invalid_phone_number"), HbMessageBox::MessageTypeWarning); - } + HbLineEdit *editor = qobject_cast(m_dialog->contentWidget()); + if (editor) { + m_divertCommand.iNumber = editor->text(); + } + + DPRINT << ": m_divertCommand.iNumber " + << m_divertCommand.iNumber; + if (m_divertCommand.iNumber.isEmpty()) { + CpPhoneNotes::instance()->showNotificationDialog(hbTrId("txt_phone_info_invalid_phone_number")); + } + } + if (m_dialog) { + m_dialog->deleteLater(); + m_dialog = NULL; } - if (m_voiceNumberEditor) { - delete m_voiceNumberEditor; - m_voiceNumberEditor = NULL; - } + nextPhaseForActivateDivert(!cancelled); - m_eventLoop->quit(); DPRINT << ": OUT"; } @@ -890,7 +953,7 @@ if (0 == result) { if (!CpPhoneNotes::instance()->noteShowing()) { CpPhoneNotes::instance()->showGlobalProgressNote( - m_activeProgressNoteId, hbTrId("txt_phone_info_requesting")); + m_activeProgressNoteId, hbTrId("txt_common_info_requesting")); } } else { handleDivertingError(result); @@ -902,52 +965,48 @@ /*! CpDivertPluginGroup::popUpTimerQuery. */ -bool CpDivertPluginGroup::popUpTimerQuery(int &timeout) +void CpDivertPluginGroup::popUpTimerQuery() { DPRINT << ": IN"; - Q_UNUSED(timeout); + + m_divertCommand.iNoReplyTimer = 0; + + QScopedPointer dialog(createDialog(hbTrId("txt_phone_title_delay"))); + HbListWidget *list = new HbListWidget(dialog.data()); - bool requestOK(false); - m_divertTimeout = 0; + HbParameterLengthLimiter pluralLimiter; + pluralLimiter = HbParameterLengthLimiter("txt_phone_list_ln_seconds", 5); + addItemToListWidget(list, pluralLimiter, 5 ); + pluralLimiter = HbParameterLengthLimiter("txt_phone_list_ln_seconds", 10); + addItemToListWidget(list, pluralLimiter, 10); + pluralLimiter = HbParameterLengthLimiter("txt_phone_list_ln_seconds", 15); + addItemToListWidget(list, pluralLimiter, 15); + pluralLimiter = HbParameterLengthLimiter("txt_phone_list_ln_seconds", 20); + addItemToListWidget(list, pluralLimiter, 20); + pluralLimiter = HbParameterLengthLimiter("txt_phone_list_ln_seconds", 25); + addItemToListWidget(list, pluralLimiter, 25); + pluralLimiter = HbParameterLengthLimiter("txt_phone_list_ln_seconds", 30); + addItemToListWidget(list, pluralLimiter, 30); - if (!m_eventLoop->isRunning()) { - HbDialog *dialog = createDialog(hbTrId("txt_phone_title_delay")); - - if (m_popupTimerList) { - m_popupTimerList = new HbListWidget(dialog); - - addItemToListWidget(m_popupTimerList, hbTrId("txt_phone_list_5_seconds"), 5 ); - addItemToListWidget(m_popupTimerList, hbTrId("txt_phone_list_10_seconds"), 10); - addItemToListWidget(m_popupTimerList, hbTrId("txt_phone_list_15_seconds"), 15); - addItemToListWidget(m_popupTimerList, hbTrId("txt_phone_list_20_seconds"), 20); - addItemToListWidget(m_popupTimerList, hbTrId("txt_phone_list_25_seconds"), 25); - addItemToListWidget(m_popupTimerList, hbTrId("txt_phone_list_30_seconds"), 30); - - // Connect list item activation signal to close the popup - QObject::connect( - m_popupTimerList, SIGNAL(activated(HbListWidgetItem*)), - dialog, SLOT(close()), - Qt::UniqueConnection); - } - - // Sets the "Cancel"-action/button - HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_cancel")); - dialog->addAction(cancelAction); - dialog->setContentWidget(m_popupTimerList); + // Connect list item activation signal to close the popup + QObject::connect( + list, SIGNAL(activated(HbListWidgetItem*)), + dialog.data(), SLOT(close()), + Qt::UniqueConnection); - dialog->open(this, SLOT(popUpTimerQueryClosed(HbAction *))); - - QPointer guard = this; - m_eventLoop->exec(); - if (guard.isNull()) { - requestOK = false; - } else if (m_divertTimeout > 0) { - requestOK = true; - } + // Sets the "Cancel"-action/button + HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_cancel")); + dialog->addAction(cancelAction); + dialog->setContentWidget(list); + + dialog->open(this, SLOT(popUpTimerQueryClosed(HbAction *))); + if (m_dialog) { + m_dialog->deleteLater(); + m_dialog = NULL; } + m_dialog = dialog.take(); - DPRINT << ": OUT : requestOK :" << requestOK; - return requestOK; + DPRINT << ": OUT"; } /*! @@ -955,22 +1014,28 @@ */ void CpDivertPluginGroup::popUpTimerQueryClosed(HbAction* action) { + DPRINT << ": IN"; + // If not cancel action selected + bool cancelled(true); if (!action) { + cancelled = false; // Update the view with selected text - if (m_popupTimerList->currentItem()) { - m_divertTimeout = - m_popupTimerList->currentItem()->data().toInt(); + HbListWidget *list = qobject_cast(m_dialog->contentWidget()); + if (list && list->currentItem()) { + m_divertCommand.iNoReplyTimer = + list->currentItem()->data().toInt(); } } - else { - DPRINT << ": Cancel"; + + if (m_dialog) { + m_dialog->deleteLater(); + m_dialog = NULL; } + + nextPhaseForActivateDivert(!cancelled); - DPRINT << ": quit eventloop"; - m_eventLoop->quit(); - - DPRINT << ": OUT: timeout: " << m_divertTimeout; + DPRINT << ": OUT: timeout: " << m_divertCommand.iNoReplyTimer; } @@ -1004,8 +1069,6 @@ bsc = AllBearer; } - - DPRINT << ": OUT : bsc :" << bsc; return bsc; } @@ -1074,12 +1137,12 @@ DPRINT << ": IN"; // all calls divert activation deactivates automatically other diverts - QVariant itemState = m_DataItemVoiceAllCalls->contentWidgetData("state"); + QVariant itemState = m_DataItemVoiceAllCalls->contentWidgetData("checkState"); if ((itemState.isValid()) && - (itemState.toInt() == CpDivertSelectionCustomitem::Enabled)) { - deActivateDependentDivertOption(m_DataItemVoiceIfBusy); - deActivateDependentDivertOption(m_DataItemVoiceIfNotAnswered); - deActivateDependentDivertOption(m_DataItemVoiceIfOutOfReach); + (itemState.toInt() == Qt::Checked)) { + 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 @@ -1090,12 +1153,12 @@ } // all calls divert activation deactivates automatically other diverts - itemState = m_DataItemVideoAllCalls->contentWidgetData("state"); + itemState = m_DataItemVideoAllCalls->contentWidgetData("checkState"); if ((itemState.isValid()) && - (itemState.toInt() == CpDivertSelectionCustomitem::Enabled)) { - deActivateDependentDivertOption(m_DataItemVideoIfBusy); - deActivateDependentDivertOption(m_DataItemVideoIfNotAnswered); - deActivateDependentDivertOption(m_DataItemVideoIfOutOfReach); + (itemState.toInt() == Qt::Checked)) { + 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 @@ -1112,18 +1175,25 @@ } /*! - CpDivertPluginGroup::deActivateDependentDivertOption. + CpDivertPluginGroup::deactivateDependentDivertOption. */ -void CpDivertPluginGroup::deActivateDependentDivertOption( +void CpDivertPluginGroup::deactivateDependentDivertOption( CpDivertItemData* item) const { - QVariant itemState = item->contentWidgetData("state"); - if ((itemState.isValid()) && - (itemState == CpDivertSelectionCustomitem::Enabled)) { - item->setContentWidgetData( - "state", CpDivertSelectionCustomitem::Deactivated); + DPRINT << ": IN"; + + QVariant itemState = item->contentWidgetData("checkState"); + if ((itemState.isValid()) && (itemState == Qt::Checked)) { + item->setContentWidgetData("checkState", Qt::Unchecked); + item->setContentWidgetData("text", QString("")); + + if (!item->description().isEmpty()) { + item->setDescription(""); + } } item->setEnabled(false); + + DPRINT << ": OUT"; } /*! @@ -1132,13 +1202,15 @@ void CpDivertPluginGroup::activateDependentDivertOption( CpDivertItemData* item, bool fetchFromNetwork) { - if ((CpDivertSelectionCustomitem::Deactivated == - item->contentWidgetData("state").toInt()) && + DPRINT << ": IN"; + + if ((Qt::Unchecked == item->contentWidgetData("checkState").toInt()) && fetchFromNetwork) { - addToDivertingRequestQueue( - CheckDivertStatus, *item); + addToDivertingRequestQueue(CheckDivertStatus, *item); } item->setEnabled(true); + + DPRINT << ": OUT"; } /*! @@ -1152,31 +1224,28 @@ // CFNrc before concluding that not available divert is enabled, because // some networks may not return divert number for inactive diverts. int cfbState = - m_DataItemVoiceIfBusy->contentWidgetData("state").toInt(); + m_DataItemVoiceIfBusy->contentWidgetData("checkState").toInt(); int cfnryState = - m_DataItemVoiceIfNotAnswered->contentWidgetData("state").toInt(); + m_DataItemVoiceIfNotAnswered->contentWidgetData("checkState").toInt(); int cfnrcState = - m_DataItemVoiceIfOutOfReach->contentWidgetData("state").toInt(); + m_DataItemVoiceIfOutOfReach->contentWidgetData("checkState").toInt(); QVariant cfbNumber = - m_DataItemVoiceIfBusy->contentWidgetData("number"); + m_DataItemVoiceIfBusy->contentWidgetData("text"); QVariant cfnryNumber = - m_DataItemVoiceIfNotAnswered->contentWidgetData("number"); + m_DataItemVoiceIfNotAnswered->contentWidgetData("text"); QVariant cfnrcNumber = - m_DataItemVoiceIfOutOfReach->contentWidgetData("number"); + m_DataItemVoiceIfOutOfReach->contentWidgetData("text"); if ((cfbNumber == cfnryNumber) && (cfbNumber == cfnrcNumber) && (cfbState == cfnryState) && (cfbState == cfnrcState)) { m_DataItemVoiceIfNotAvailable->setContentWidgetData( - "number", m_DataItemVoiceIfBusy->contentWidgetData("number")); - m_DataItemVoiceIfNotAvailable->setContentWidgetData( - "timeout", m_DataItemVoiceIfNotAnswered->contentWidgetData("timeout")); + "text", m_DataItemVoiceIfBusy->contentWidgetData("text")); m_DataItemVoiceIfNotAvailable->setContentWidgetData( - "state", m_DataItemVoiceIfBusy->contentWidgetData("state")); + "checkState", m_DataItemVoiceIfBusy->contentWidgetData("checkState")); } else { - m_DataItemVoiceIfNotAvailable->setContentWidgetData("number", ""); - m_DataItemVoiceIfNotAvailable->setContentWidgetData("timeout", 0); + m_DataItemVoiceIfNotAvailable->setContentWidgetData("text", ""); m_DataItemVoiceIfNotAvailable->setContentWidgetData( - "state", CpDivertSelectionCustomitem::Disabled); + "checkState", Qt::Unchecked); } // Item dimming @@ -1190,32 +1259,28 @@ // 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(); + m_DataItemVideoIfBusy->contentWidgetData("checkState").toInt(); cfnryState = - m_DataItemVideoIfNotAnswered->contentWidgetData("state").toInt(); + m_DataItemVideoIfNotAnswered->contentWidgetData("checkState").toInt(); cfnrcState = - m_DataItemVideoIfOutOfReach->contentWidgetData("state").toInt(); + m_DataItemVideoIfOutOfReach->contentWidgetData("checkState").toInt(); cfbNumber = - m_DataItemVideoIfBusy->contentWidgetData("number"); + m_DataItemVideoIfBusy->contentWidgetData("text"); cfnryNumber = - m_DataItemVideoIfNotAnswered->contentWidgetData("number"); + m_DataItemVideoIfNotAnswered->contentWidgetData("text"); cfnrcNumber = - m_DataItemVideoIfOutOfReach->contentWidgetData("number"); + m_DataItemVideoIfOutOfReach->contentWidgetData("text"); if ((cfbNumber == cfnryNumber) && (cfbNumber == cfnrcNumber) && (cfbState == cfnryState) && (cfbState == cfnrcState)) { m_DataItemVideoIfNotAvailable->setContentWidgetData( - "number", m_DataItemVideoIfBusy->contentWidgetData("number")); + "text", m_DataItemVideoIfBusy->contentWidgetData("text")); m_DataItemVideoIfNotAvailable->setContentWidgetData( - "timeout", m_DataItemVideoIfNotAnswered->contentWidgetData("timeout")); - m_DataItemVideoIfNotAvailable->setContentWidgetData( - "state", m_DataItemVideoIfBusy->contentWidgetData("state")); + "checkState", m_DataItemVideoIfBusy->contentWidgetData("checkState")); } else { - m_DataItemVideoIfNotAvailable->setContentWidgetData("number", ""); - m_DataItemVideoIfNotAvailable->setContentWidgetData("timeout", 0); + m_DataItemVideoIfNotAvailable->setContentWidgetData("text", ""); m_DataItemVideoIfNotAvailable->setContentWidgetData( - "state", CpDivertSelectionCustomitem::Disabled); - + "checkState", Qt::Unchecked); } // Item dimming @@ -1227,4 +1292,60 @@ DPRINT << ": OUT"; } +void CpDivertPluginGroup::nextPhaseForActivateDivert(bool ok) +{ + DPRINT << ": IN"; + + if (ok) { + switch (m_activateDivertPhase) { + case PopUpVoiceNumberListQueryPhase: { + CpDivertRequestQueueItem request = m_divertRequestQueue.head(); + if (request.item->property("needTimeoutInfo").toBool()) { + m_activateDivertPhase = PopUpTimerQueryPhase; + popUpTimerQuery(); + } else { + m_activateDivertPhase = NonePhase; + setCallDiverting(m_divertCommand); + } + } + break; + case PopUpTimerQueryPhase: { + m_activateDivertPhase = NonePhase; + setCallDiverting(m_divertCommand); + } + default: + DPRINT << "Error: unknown enum value"; + break; + } + } else { + // Query was cancelled + revertItemData( + m_divertCommand.iServiceGroup, + m_divertCommand.iCondition); + m_divertRequestQueue.clear(); + m_activateDivertPhase = NonePhase; + } + + DPRINT << ": OUT"; +} + +/*! + CpDivertPluginGroup::itemShown. + */ +bool CpDivertPluginGroup::isDivertSettingsItem(HbDataFormModelItem* modelItem) { + return ( + modelItem == m_DataItemVoiceAllCalls || + modelItem == m_DataItemVoiceIfBusy || + modelItem == m_DataItemVoiceIfNotAnswered || + modelItem == m_DataItemVoiceIfOutOfReach || + modelItem == m_DataItemVoiceIfNotAvailable || + + modelItem == m_DataItemVideoAllCalls || + modelItem == m_DataItemVideoIfBusy || + modelItem == m_DataItemVideoIfNotAnswered || + modelItem == m_DataItemVideoIfOutOfReach || + modelItem == m_DataItemVideoIfNotAvailable + ); +} + // End of File.