diff -r c84cf270c54f -r 92ab7f8d0eab phonesettings/cpphonesettingsplugins/divertplugin/src/cpdivertplugingroup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonesettings/cpphonesettingsplugins/divertplugin/src/cpdivertplugingroup.cpp Fri Mar 19 09:28:42 2010 +0200 @@ -0,0 +1,969 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#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" + +/*! + 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_activeNoteId(0), + m_helper(helper) +{ + DPRINT << ": IN"; + + // Localization file loading + QTranslator translator; + QString lang = QLocale::system().name(); + QString path = "z:/resource/qt/translations/"; + DPRINT << ": loading translation: " << QString(path + "telephone_cp_" + lang); + bool translatorLoaded = translator.load(path + "telephone_cp_" + lang); + DPRINT << ": translator loaded: " << translatorLoaded; + if (translatorLoaded) { + qApp->installTranslator(&translator); + DPRINT << ": translator installed"; + } + + m_pSetWrapper = new PSetWrapper; + DPRINT << ": PSetWrapper created"; + + m_ssSettingsWrapper = new SsSettingsWrapper; + DPRINT << ": SsSettingsWrapper created"; + + m_callDivertingWrapper = &m_pSetWrapper->callDivertingWrapper(); + QObject::connect( + m_callDivertingWrapper, + SIGNAL(handleDivertingChanged(const PSCallDivertingCommand&,bool)), + this, + SLOT(handleDivertingChanged(const PSCallDivertingCommand&,bool))); + QObject::connect( + m_callDivertingWrapper, + SIGNAL(handleDivertingStatus(QList&, bool)), + this, + SLOT(handleDivertingStatus(QList&, bool))); + QObject::connect( + m_callDivertingWrapper, + SIGNAL(handleDivertingError(int)), + this, + SLOT(handleDivertingError(int))); + + QObject::connect( + m_callDivertingWrapper, + SIGNAL(requestDone()), + this, + SLOT(divertRequestProcessed())); + + // Create custom item prototype + m_helper.addItemPrototype(new CpDivertSelectionItem()); + + // Create grouped setting items + createVoiceCallItems(); + createVideoCallItems(); + createVoIPCallItems(); + DPRINT << ": OUT"; +} + +/*! + CpDivertPluginGroup::~CpDivertPluginGroup. + */ +CpDivertPluginGroup::~CpDivertPluginGroup() +{ + DPRINT << ": IN"; + + delete m_pSetWrapper; + delete m_ssSettingsWrapper; + + DPRINT << ": OUT"; +} + +/*! + CpDivertPluginGroup::createVoiceCallItems. + */ +void CpDivertPluginGroup::createVoiceCallItems() +{ + DPRINT << ": IN"; + m_csVoiceCallPage = new CpSettingFormItemData( + HbDataFormModelItem::GroupPageItem, + hbTrId("txt_phone_setlabel_service_val_voice_divert")); + appendChild(m_csVoiceCallPage); + + m_DataItemAllVoiceCalls = new CpDivertItemData( + DivertConditionUnconditional, + ServiceGroupVoice, + hbTrId("txt_phone_setlabel_all_calls"), + hbTrId("All voice calls:"), false, + m_helper, + m_csVoiceCallPage); + + addDivertDataItem(m_DataItemAllVoiceCalls, m_csVoiceCallPage); + + m_DataItemIfBusy = new CpDivertItemData( + DivertConditionBusy, + ServiceGroupVoice, + hbTrId("txt_phone_setlabel_if_busy"), + hbTrId("If busy:"), false, + m_helper, + m_csVoiceCallPage); + + addDivertDataItem(m_DataItemIfBusy, m_csVoiceCallPage); + + m_DataItemIfNotAnswered = new CpDivertItemData( + 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")); + + m_DataItemIfOutOfReach = new CpDivertItemData( + 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); + + m_DataItemIfNotAvailable = new CpDivertItemData( + DivertConditionAllConditionalCases, + ServiceGroupVoice, + hbTrId("txt_phone_setlabel_if_not_available"), + hbTrId("If not available:"), true, + m_helper, + m_csVoiceCallPage); + + addDivertDataItem(m_DataItemIfNotAvailable, m_csVoiceCallPage); + DPRINT << ": OUT"; +} + +/*! + CpDivertPluginGroup::createVideoCallItems + */ +void CpDivertPluginGroup::createVideoCallItems() +{ + DPRINT << ": IN"; + appendChild( new CpSettingFormItemData( + HbDataFormModelItem::GroupPageItem, + hbTrId("txt_phone_setlabel_service_val_video_divert")) ); + DPRINT << ": OUT"; +} + +/*! + CpDivertPluginGroup::createVoIPCallItems + */ +void CpDivertPluginGroup::createVoIPCallItems() +{ + DPRINT << ": IN"; + appendChild( new CpSettingFormItemData( + HbDataFormModelItem::GroupPageItem, + hbTrId("VoIP")) ); + DPRINT << ": OUT"; +} + +/*! + CpDivertPluginGroup::itemShown. + */ +void CpDivertPluginGroup::itemShown(const QModelIndex& item) +{ + DPRINT << ": IN"; + DPRINT << "item:" << item; + HbDataFormModelItem* modelItem = + qobject_cast(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 + } + + + 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( + 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!!"; + } + } + + + DPRINT << ": OUT"; +} + +/*! + CpDivertPluginGroup::divertRequestProcessed. + */ +void CpDivertPluginGroup::divertRequestProcessed() +{ + DPRINT << ": IN"; + // Remove previous request and process next one + if (!m_divertRequestQueue.isEmpty()) { + m_divertRequestQueue.dequeue(); + processDivertingRequestQueue(); + } + + if (m_divertRequestQueue.isEmpty()) { + // Queue empty so cancel process note + CpPhoneNotes::instance()->cancelNote(m_activeProgressNoteId); + } + + DPRINT << ": OUT"; +} + +/*! + CpDivertPluginGroup::changeItemData. + */ +void CpDivertPluginGroup::changeItemData( + PsCallDivertingCondition condition, PsCallDivertingStatus status, + const QString& number, int timeout) +{ + DPRINT << ": IN"; + + CpDivertSelectionCustomitem::State itemState = + CpDivertSelectionCustomitem::Disabled; + if (status == DivertingStatusActive) { + itemState = CpDivertSelectionCustomitem::Enabled; + } else if (status == DivertingStatusInactive) { + itemState = CpDivertSelectionCustomitem::Deactivated; + } else { + itemState = CpDivertSelectionCustomitem::Disabled; + } + + 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 + 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); + break; + case DivertConditionAllCalls: + case DivertConditionUnknown: + default: + break; + } +} + +/*! + CpDivertPluginGroup::revertItemData. + */ +void CpDivertPluginGroup::revertItemData(PsCallDivertingCondition condition) +{ + DPRINT << ": IN"; + + switch (condition) { + case DivertConditionUnconditional: + m_DataItemAllVoiceCalls->setContentWidgetData("state", + m_DataItemAllVoiceCalls->contentWidgetData("state")); + break; + case DivertConditionBusy: + m_DataItemIfBusy->setContentWidgetData("state", + m_DataItemIfBusy->contentWidgetData("state")); + break; + case DivertConditionNoReply: + m_DataItemIfNotAnswered->setContentWidgetData("state", + m_DataItemIfNotAnswered->contentWidgetData("state")); + break; + case DivertConditionNotReachable: + m_DataItemIfOutOfReach->setContentWidgetData("state", + m_DataItemIfOutOfReach->contentWidgetData("state")); + break; + case DivertConditionAllConditionalCases: + DPRINT << ": DivertConditionAllConditionalCases"; + m_DataItemIfNotAvailable->setContentWidgetData("state", + m_DataItemIfNotAvailable->contentWidgetData("state")); + break; + case DivertConditionAllCalls: + case DivertConditionUnknown: + default: + break; + } +} + +/*! + CpDivertPluginGroup::processDivertingRequestQueue. + */ +void CpDivertPluginGroup::processDivertingRequestQueue() +{ + DPRINT << ": IN"; + if (m_divertRequestQueue.isEmpty()) { + DPRINT << "queue empty : OUT"; + return; + } + CpDivertRequestQueueItem request = m_divertRequestQueue.head(); + // Command param + PSCallDivertingCommand divertCommand; + divertCommand.iServiceGroup = request.item->service(); + divertCommand.iCondition = request.item->condition(); + divertCommand.iStatus = DivertingStatusUnknown; + divertCommand.iNumber = hbTrId(""); + divertCommand.iNoReplyTimer = 0; + + switch (request.request) { + case ActivateDivert: { + DPRINT << "activate"; + divertCommand.iSetting = RegisterDiverting; + if (popUpVoiceNumberListQuery( + request.item->queryLabel(), divertCommand.iNumber)) { + if (request.item->needTimeoutInfo()) { + 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()); + m_divertRequestQueue.clear(); + } + } else { + setCallDiverting(divertCommand); + } + } else { + // Query was cancelled + request.item->setContentWidgetData("number", + request.item->contentWidgetData("number").toString()); + request.item->setContentWidgetData("timeout", + request.item->contentWidgetData("timeout").toInt()); + m_divertRequestQueue.clear(); + } + } + break; + case DeactivateDivert: { + DPRINT << "deactivate"; + divertCommand.iSetting = EraseDiverting; + setCallDiverting(divertCommand); + } + break; + case CheckDivertStatus: { + DPRINT << "check status"; + m_callDivertingWrapper->getCallDivertingStatus( + divertCommand.iServiceGroup, + divertCommand.iCondition, + bscParam() ); + + if (!CpPhoneNotes::instance()->noteShowing()) { + CpPhoneNotes::instance()->showGlobalProgressNote( + m_activeProgressNoteId, hbTrId("Requesting")); + } + } + break; + default: + DPRINT << "Error: unknown enum value"; + break; + } + + DPRINT << ": OUT"; +} + +/*! + CpDivertPluginGroup::changeDivertingStateRequested. + */ +void CpDivertPluginGroup::changeDivertingStateRequested( + CpDivertItemData &item) +{ + DPRINT << ": IN"; + + DivertRequest event=ActivateDivert; + if (CpDivertSelectionCustomitem::Enabled == + item.contentWidgetData("state").toInt()) { + event = DeactivateDivert; + } else { + event = ActivateDivert; + } + + addToDivertingRequestQueue(event, item); + DPRINT << ": OUT"; +} + +/*! + CpDivertPluginGroup::handleDivertingChanged. + */ +void CpDivertPluginGroup::handleDivertingChanged( + const PSCallDivertingCommand& aSetting, + bool aPlural) +{ + DPRINT << ": IN"; + + CpPhoneNotes::instance()->cancelNote(m_activeNoteId); + DPRINT << "aPlural:" << aPlural; + DPRINT << "iCondition:" << aSetting.iCondition; + DPRINT << "iNoReplyTimer:" << aSetting.iNoReplyTimer; + DPRINT << "iNumber:" << aSetting.iNumber; + DPRINT << "iServiceGroup:" << aSetting.iServiceGroup; + DPRINT << "iSetting:" << aSetting.iSetting; + DPRINT << "iStatus:" << aSetting.iStatus; + + changeItemData( + aSetting.iCondition, aSetting.iStatus, + aSetting.iNumber, aSetting.iNoReplyTimer); + + updateDependentDivertOptions(); + + switch(aSetting.iStatus) { + case DivertingStatusActive: + if (aPlural) { + CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId, + hbTrId("Diverts activated"), + HbMessageBox::MessageTypeInformation); + } else { + CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId, + hbTrId("Divert activated"), + HbMessageBox::MessageTypeInformation); + } + if (!m_divertToVoiceMailBox) { + // 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("Diverts cancelled"), + HbMessageBox::MessageTypeInformation); + } else { + CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId, + hbTrId("Divert cancelled"), + HbMessageBox::MessageTypeInformation); + } + break; + case DivertingStatusNotProvisioned: + case DivertingStatusUnknown: + default: + CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId, + hbTrId("Not done"), + 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"; +} + +/*! + CpDivertPluginGroup::handleDivertingStatus. + */ +void CpDivertPluginGroup::handleDivertingStatus( + QList &divertList, + bool plural) +{ + DPRINT << ": IN"; + DPRINT << "divertList.Size():" << divertList.size(); + DPRINT << "plural:" << plural; + + foreach(PSCallDivertingStatus* status, divertList) { + DPRINT << status->iCondition; + DPRINT << status->iNumber; + DPRINT << status->iServiceGroup; + DPRINT << status->iStatus; + DPRINT << status->iTimeout; + changeItemData( + status->iCondition, status->iStatus, + status->iNumber, status->iTimeout); + } + + updateDependentDivertOptions(); + + DPRINT << ": OUT"; +} + +/*! + CpDivertPluginGroup::handleDivertingError. + */ +void CpDivertPluginGroup::handleDivertingError(int aReason) +{ + DPRINT << ": IN : aReason:" << aReason; + + // Update view item for failed request + revertItemData(m_divertRequestQueue.head().item->condition()); + + // Clear queue + m_divertRequestQueue.clear(); + + // Cancel previous note + CpPhoneNotes::instance()->cancelNote(m_activeNoteId); + + // Show error note + CpPhoneNotes::instance()->showGlobalErrorNote(m_activeNoteId, aReason); + + DPRINT << ": OUT"; +} + +/*! + CpDivertPluginGroup::popUpVoiceNumberListQuery. + */ +bool CpDivertPluginGroup::popUpVoiceNumberListQuery( + const QString& heading, QString& result) +{ + DPRINT << ": IN"; + + 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") ); + // 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") ); + // 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"); + 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")) { + 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 { + //TODO if matched contact name not work + result = data; + requestOK = true; + } + } + else { + DPRINT << ": Cancel"; + } + disconnect( + list, SIGNAL(activated(HbListWidgetItem*)), + dialog, SLOT(close())); + delete dialog; + + DPRINT << ": OUT : requestOK :" << requestOK; + return requestOK; +} + +/*! + CpDivertPluginGroup::popUpNumberEditor. + */ +bool CpDivertPluginGroup::popUpNumberEditor( + const QString& heading, QString& result) +{ + DPRINT << ": IN"; + + bool requestOK(false); + HbDialog *dialog = createDialog(heading); + HbLineEdit *editor = new HbLineEdit(dialog); + HbEditorInterface editorInterface(editor); + editorInterface.setUpAsPhoneNumberEditor(); + dialog->setContentWidget(editor); + HbAction *okAction = new HbAction(hbTrId("OK")); + dialog->addAction(okAction); + HbAction *cancelAction = new HbAction(hbTrId("Cancel")); + dialog->setSecondaryAction(cancelAction); + + HbAction *resultAction = dialog->exec(); + if (resultAction == cancelAction) { + DPRINT << ": canceled"; + } + else { + result = editor->text(); + DPRINT << ": number " + << result; + if (result.count()) { + requestOK = true; + } + else { + CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId, + hbTrId("Enter number"), HbMessageBox::MessageTypeWarning); + } + } + delete dialog; + + DPRINT << ": OUT : requestOK :" << requestOK; + return requestOK; +} + +/*! + CpDivertPluginGroup::setCallDiverting. + */ +void CpDivertPluginGroup::setCallDiverting(PSCallDivertingCommand& command) +{ + DPRINT << ": IN"; + DPRINT << "iCondition:" << command.iCondition; + DPRINT << "iNoReplyTimer:" << command.iNoReplyTimer; + DPRINT << "iNumber:" << command.iNumber; + DPRINT << "iServiceGroup:" << command.iServiceGroup; + DPRINT << "iSetting:" << command.iSetting; + DPRINT << "iStatus:" << command.iStatus; + + int result = m_callDivertingWrapper->setCallDiverting(command, bscParam()); + if (0 == result) { + if (!CpPhoneNotes::instance()->noteShowing()) { + CpPhoneNotes::instance()->showGlobalProgressNote( + m_activeProgressNoteId, hbTrId("Requesting")); + } + } else { + handleDivertingError(result); + } + + DPRINT << ": OUT "; +} + +/*! + CpDivertPluginGroup::popUpTimerQuery. + */ +bool CpDivertPluginGroup::popUpTimerQuery(int &timeout) const +{ + DPRINT << ": IN"; + + bool requestOK(false); + HbDialog *dialog = createDialog(hbTrId("Time out")); + HbListWidget *list = new HbListWidget(dialog); + addItemToListWidget(list, hbTrId("5 second"), 5 ); + addItemToListWidget(list, hbTrId("10 second"), 10); + addItemToListWidget(list, hbTrId("15 second"), 15); + addItemToListWidget(list, hbTrId("20 second"), 20); + addItemToListWidget(list, hbTrId("25 second"), 25); + addItemToListWidget(list, hbTrId("30 second"), 30); + // 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(hbTrId("Cancel")); + dialog->setPrimaryAction(cancelAction); + dialog->setContentWidget(list); + // Launch popup and handle the response + if (dialog->exec() != cancelAction) { + // Update the view with selected text + if (list->currentItem()) { + timeout = list->currentItem()->data().toInt(); + } + requestOK = true; + } + else { + DPRINT << ": Cancel"; + } + + disconnect( + list, SIGNAL(activated(HbListWidgetItem*)), + dialog, SLOT(close())); + delete dialog; + + DPRINT << ": OUT : requestOK :" << requestOK; + return requestOK; +} + +/*! + CpDivertPluginGroup::setbscParam. + */ +int CpDivertPluginGroup::bscParam() +{ + 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; + } + else { // ESSSettingsAlsAlternate + // EAltTele only activates alternate service nothing else or causes + // alternate service status request. + bsc = AltTele; + } + + DPRINT << ": OUT : bsc :" << bsc; + return bsc; +} + +/*! + CpDivertPluginGroup::createDialog. + */ +HbDialog* CpDivertPluginGroup::createDialog( const QString& heading ) const +{ + DPRINT << ": IN"; + + HbDialog *dialog = new HbDialog(); + dialog->setDismissPolicy(HbDialog::NoDismiss); + dialog->setTimeout(HbDialog::NoTimeout); + dialog->setHeadingWidget(new HbLabel(heading)); + + DPRINT << ": OUT"; + return dialog; +} + +/*! + CpDivertPluginGroup::addItemToListWidget. + */ +void CpDivertPluginGroup::addItemToListWidget(HbListWidget* w, + const QString& item, const QString& data) const +{ + DPRINT << ": IN"; + + HbListWidgetItem* o = new HbListWidgetItem(); + o->setText(item); + o->setData(data); + w->addItem(o); + + DPRINT << ": OUT"; +} + +/*! + CpDivertPluginGroup::addItemToListWidget. + */ +void CpDivertPluginGroup::addItemToListWidget(HbListWidget* w, + const QString& item, const int& data) const +{ + DPRINT << ": IN"; + + HbListWidgetItem* o = new HbListWidgetItem(); + o->setText(item); + o->setData(data); + w->addItem(o); + + DPRINT << ": OUT"; +} + +/*! + CpDivertPluginGroup::updateDependentDivertOptions. + Updates statuses of diverts which are dependent from the status of some + other divert. Logic for dependent changes are: + 1. Activation of all calls divert deactivates other diverts/puts them + into quiescent state. + 2. Deactivation of all calls divert enables diverts in quiescent state. + 3. Not available option is an abstraction of CFB, CFNry, CFNrc diverts. + Enabling/disabling that options changes all the aforementioned diverts + at once. +*/ +void CpDivertPluginGroup::updateDependentDivertOptions() +{ + DPRINT << ": IN"; + + // all calls divert activation deactivates automatically other diverts + QVariant itemState = m_DataItemAllVoiceCalls->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); + } + } + + // update not available divert option + updateNotAvailableDivertOption(); + + DPRINT << ": OUT"; +} + +/*! + CpDivertPluginGroup::updateNotAvailableDivertOption. + */ +void CpDivertPluginGroup::updateNotAvailableDivertOption() +{ + DPRINT << ": IN"; + + // 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. + int cfbState = + m_DataItemIfBusy->contentWidgetData("state").toInt(); + int cfnryState = + m_DataItemIfNotAnswered->contentWidgetData("state").toInt(); + int cfnrcState = + m_DataItemIfOutOfReach->contentWidgetData("state").toInt(); + QVariant cfbNumber = + m_DataItemIfBusy->contentWidgetData("number"); + QVariant cfnryNumber = + m_DataItemIfNotAnswered->contentWidgetData("number"); + QVariant cfnrcNumber = + m_DataItemIfOutOfReach->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")); + } else { + m_DataItemIfNotAvailable->setContentWidgetData("number", ""); + m_DataItemIfNotAvailable->setContentWidgetData("timeout", 0); + m_DataItemIfNotAvailable->setContentWidgetData( + "state", CpDivertSelectionCustomitem::Disabled); + } + + DPRINT << ": OUT"; +} + +// End of File.