diff -r c84cf270c54f -r 92ab7f8d0eab phonesettings/cpphonesettingsplugins/cptelephonyutils/src/cpphonenotes.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonesettings/cpphonesettingsplugins/cptelephonyutils/src/cpphonenotes.cpp Fri Mar 19 09:28:42 2010 +0200 @@ -0,0 +1,527 @@ +/* + * 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 "cpphonenotes.h" +#include "cpplugincommon.h" +#include "cppluginlogging.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/*! + CpPhoneNotes::instance. + */ +CpPhoneNotes* CpPhoneNotes::instance() +{ + DPRINT << ": IN"; + + static CpPhoneNotes theInstance; + + DPRINT << ", instance address: " << reinterpret_cast(&theInstance); + return &theInstance; +} + +/*! + CpPhoneNotes::CpPhoneNotes. + */ +CpPhoneNotes::CpPhoneNotes(): + QObject(NULL), + m_notesQueue(NULL), + m_isNoteShowingOngoing(false) + { + DPRINT << ": IN"; + + m_notesQueue = new QQueue(); + m_cpSettingsWrapper = new CpSettingsWrapper; + + DPRINT << ": OUT"; + } + +/*! + CpPhoneNotes::~CpPhoneNotes. + */ +CpPhoneNotes::~CpPhoneNotes() +{ + DPRINT << ": IN"; + + delete m_cpSettingsWrapper; + QObject* note(NULL); + foreach (note, *m_notesQueue) { + delete note; + } + delete m_notesQueue; + + DPRINT << ": OUT"; +} + +/*! + CpPhoneNotes::showGlobalProgressNote. + */ +void CpPhoneNotes::showGlobalProgressNote( + int ¬eId, const QString& text) +{ + DPRINT << ": IN"; + + HbDeviceProgressDialog *note = + new HbDeviceProgressDialog(HbProgressDialog::WaitDialog, this); + note->setText(text); + noteId = reinterpret_cast(note); + DPRINT << ", NOTEID: " << noteId; + QObject::connect( + note, SIGNAL(aboutToClose()), + this, SLOT(activeNoteAboutToClose())); + QObject::connect( + note, SIGNAL(cancelled()), + this, SLOT(handleProgressNoteCanceled())); + m_notesQueue->enqueue(note); + launchNextNoteIfReady(); + + DPRINT << ": OUT"; +} + +/*! + CpPhoneNotes::showGlobalNote. + */ +void CpPhoneNotes::showGlobalNote(int ¬eId, const QString& text, + HbMessageBox::MessageBoxType messageBoxType) +{ + DPRINT << ": IN"; + + HbDeviceMessageBox *note + = new HbDeviceMessageBox(text, messageBoxType, this); + if (messageBoxType == HbMessageBox::MessageTypeQuestion || + messageBoxType == HbMessageBox::MessageTypeInformation) { + note->setTimeout(HbPopup::ConfirmationNoteTimeout); + } + else { + note->setTimeout(0); + } + noteId = reinterpret_cast(note); + DPRINT << ", NOTEID: " << noteId; + + QObject::connect( + note, SIGNAL(aboutToClose()), + this, SLOT(activeNoteAboutToClose())); + + m_notesQueue->enqueue(note); + launchNextNoteIfReady(); + + DPRINT << ": OUT"; +} + +/*! + CpPhoneNotes::showBasicServiceList. + */ +void CpPhoneNotes::showBasicServiceList( + const QString &title, + const QList &basicServiceGroupIds) +{ + DPRINT << ": IN"; + + Q_ASSERT(title != ""); + Q_ASSERT(0 < basicServiceGroupIds.count()); + + QScopedPointer serviceListPopup(new HbDialog()); + serviceListPopup->setDismissPolicy(HbDialog::NoDismiss); + serviceListPopup->setTimeout(HbPopup::NoTimeout); + + QScopedPointer heading( + new HbLabel(title, serviceListPopup.data())); + heading->setAlignment(Qt::AlignLeft | Qt::AlignTop); + serviceListPopup->setHeadingWidget(heading.take()); + + QScopedPointer serviceList( + new HbListView(serviceListPopup.data())); + QScopedPointer serviceListModel( + new QStandardItemModel(serviceList.data())); + for (int i = 0; i < basicServiceGroupIds.count(); i++) { + BasicServiceGroups groupId = + static_cast(basicServiceGroupIds.at(i)); + QString groupName = basicServiceGroupName(groupId); + QScopedPointer listItem(new QStandardItem(groupName)); + serviceListModel->appendRow(listItem.take()); + } + serviceList->setModel(serviceListModel.take()); + serviceList->setSelectionMode(HbAbstractItemView::NoSelection); + serviceListPopup->setContentWidget(serviceList.take()); + + HbAction *backAction = + new HbAction(hbTrId("Back"), serviceListPopup.data()); + serviceListPopup->setPrimaryAction(backAction); + serviceListPopup->exec(); + + DPRINT << ": OUT"; +} + +/*! + CpPhoneNotes::showBasicServiceCallDivertList. + */ +void CpPhoneNotes::showBasicServiceCallDivertList( + const QString &title, + const QList &divertStatuses, + int &selectionIndex, + CallDivertType divertType, + CallDivertType &divertDetailType) +{ + DPRINT << ": IN"; + + Q_ASSERT(title != ""); + Q_ASSERT(0 < divertStatuses.size()); + + HbDialog *serviceListPopup = new HbDialog(); + serviceListPopup->setDismissPolicy(HbDialog::NoDismiss); + serviceListPopup->setTimeout(HbPopup::NoTimeout); + + HbLabel *heading = new HbLabel(title, serviceListPopup); + heading->setAlignment(Qt::AlignLeft | Qt::AlignTop); + serviceListPopup->setHeadingWidget(heading); + + HbListView *serviceList = new HbListView(serviceListPopup); + QStandardItemModel *serviceListModel = new QStandardItemModel(serviceList); + for (int i = 0; i < divertStatuses.size(); i++) { + PSCallDivertingStatus *divertStatus = divertStatuses.at(i); + QString groupName = + basicServiceGroupName( + convertEtelMobileServiceCode(divertStatus->iServiceGroup) ); + QStandardItem *listItem = new QStandardItem(groupName); + serviceListModel->appendRow(listItem); + } + serviceList->setModel(serviceListModel); + serviceList->setSelectionMode(HbAbstractItemView::SingleSelection); + if (0 != serviceListModel->rowCount()) { + QModelIndex firstItem = serviceList->nextIndex(QModelIndex()); + serviceList->setCurrentIndex(firstItem, QItemSelectionModel::Select); + } + serviceListPopup->setContentWidget(serviceList); + + HbAction *backAction = new HbAction(hbTrId("Back"), serviceListPopup); + HbAction *numberQueryAction = new HbAction(hbTrId("Number"), serviceListPopup); + HbAction *detailsAction = new HbAction(hbTrId("Details"), serviceListPopup); + serviceListPopup->setSecondaryAction(backAction); + + switch (divertType) { + case NoCallDivert: + break; + case CallDivertWithNumber: + serviceListPopup->setPrimaryAction(numberQueryAction); + break; + case CallDivertWithNumberAndTimeout: + serviceListPopup->setPrimaryAction(detailsAction); + break; + default: + DPRINT << ", DEFAULT"; + Q_ASSERT(false); + break; + } + + HbAction *userAction = serviceListPopup->exec(); + if (userAction == numberQueryAction) { + divertDetailType = CallDivertWithNumber; + } else if (userAction == detailsAction) { + divertDetailType = CallDivertWithNumberAndTimeout; + } else if (userAction == backAction) { + divertDetailType = NoCallDivert; + } else { + DPRINT << ", WEIRD ACTION"; + Q_ASSERT(false); + } + + selectionIndex = serviceList->currentIndex().row(); + delete serviceListPopup; + + DPRINT << ": OUT"; +} + +/*! + CpPhoneNotes::cancelNote. + */ +void CpPhoneNotes::cancelNote(int noteId) +{ + DPRINT << ": IN"; + + if (!m_notesQueue->isEmpty()) { + QObject *note = m_notesQueue->head(); + if(note == reinterpret_cast(noteId)) { + int index = m_notesQueue->indexOf(reinterpret_cast(noteId)); + Q_ASSERT(-1 < index); + QObject *note = m_notesQueue->at(index); + DPRINT << ": NOTEID: " << noteId; + if (qobject_cast(note)) { + // QObject::disconnect( + // note, SIGNAL(cancelled()), + // this, SLOT(ProgresNoteCanceled())); + static_cast(note)->cancel(); + } else if (qobject_cast(note)) { + static_cast(note)->close(); + } else { + DPRINT << ", UNKNOWN NOTE"; + Q_ASSERT(false); + } + } + else { + DPRINT << ": remove from queue, noteId: " << noteId; + m_notesQueue->removeOne(reinterpret_cast(noteId)); + } + } + + DPRINT << ": OUT"; +} + +/*! + CpPhoneNotes::noteShowing. + */ +bool CpPhoneNotes::noteShowing() +{ + return !m_notesQueue->isEmpty(); +} + +/*! + CpPhoneNotes::activeNoteAboutToClose. + */ +void CpPhoneNotes::activeNoteAboutToClose() +{ + DPRINT << ": IN"; + + if (m_isNoteShowingOngoing) { + m_isNoteShowingOngoing = false; + QObject* note(NULL); + if (!m_notesQueue->isEmpty()) { + note = m_notesQueue->dequeue(); + } + if(note) { + launchNextNoteIfReady(); + note->disconnect(this); + DPRINT << ", delete note: " << reinterpret_cast(note); + note->deleteLater(); + } + } + + DPRINT << ": OUT"; +} + +/*! + CpPhoneNotes::basicServiceGroupName. + Resolves basic service group name by group identifier. + */ +QString CpPhoneNotes::basicServiceGroupName(BasicServiceGroups basicServiceGroupId) const +{ + DPRINT << ": IN"; + + QString string = ""; + switch (basicServiceGroupId) { + case AllTeleAndBearer: + string = hbTrId("All services"); + break; + case AllTele: + string = hbTrId("Voice, fax and messages"); + break; + case Telephony: + string = hbTrId("Voice calls"); + break; + case AllDataTele: + string = hbTrId("Fax and messages"); + break; + case Fax: + string = hbTrId("Fax"); + break; + case Sms: + string = hbTrId("Messages"); + break; + case AllTeleExcSms: + string = hbTrId("Voice calls and fax"); + break; + case AllBearer: + if (Tools::videoSupported()) { + string = hbTrId("Data and video services"); + } else { + string = hbTrId("Data services"); + } + break; + case AllAsync: + string = hbTrId("Asynchronous services"); + break; + case AllSync: + string = hbTrId("Synchronous services"); + break; + case SyncData: + string = hbTrId("Synchronous data services"); + break; + case AsyncData: + string = hbTrId("Asynchronous data services"); + break; + case PacketData: + string = hbTrId("Packet data"); + break; + case PadAccess: + string = hbTrId("PAD access"); + break; + case 30: + string = hbTrId("Video calls"); + break; + case AltTele: + string = hbTrId("Alternate line services"); + break; + default: + DPRINT << ", DEFAULT"; + break; + } + + DPRINT << ": OUT"; + return string; +} + +/*! + CpPhoneNotes::convertEtelMobileServiceCode. +*/ +BasicServiceGroups CpPhoneNotes::convertEtelMobileServiceCode(int serviceCode) const +{ + DPRINT << "serviceCode: " << serviceCode; + return Tools::convertEtelMobileServiceCode(serviceCode); +} + +/*! + CpPhoneNotes::showGlobalErrorNote. + */ +void CpPhoneNotes::showGlobalErrorNote(int ¬eId, int errorcode) +{ + DPRINT << ": IN"; + + QString errorText = ""; + Tools::errorCodeTextMapping(errorcode, errorText); + + HbDeviceMessageBox *note + = new HbDeviceMessageBox(errorText, HbMessageBox::MessageTypeWarning, this); + note->setTimeout(0); + noteId = reinterpret_cast(note); + DPRINT << ", NOTEID: " << noteId; + QObject::connect( + note, SIGNAL(aboutToClose()), + this, SLOT(activeNoteAboutToClose())); + m_notesQueue->enqueue(note); + launchNextNoteIfReady(); + + DPRINT << ": OUT"; +} + +/*! + CpPhoneNotes::showCallDivertDetails. + */ +void CpPhoneNotes::showCallDivertDetails( + const PSCallDivertingStatus &divertStatus) +{ + DPRINT << ": IN"; + + HbMessageBox *divertInfo = + new HbMessageBox(HbMessageBox::MessageTypeInformation); + divertInfo->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + + // TODO: Orbit layout support is insufficient currently and all text + // is not shown. + QString content = ""; + content.append(hbTrId("To number: ")); + content.append(formatPhoneNumber(divertStatus.iNumber)); + if (0 < divertStatus.iTimeout) { + content.append(hbTrId(" Delay time: ")); + content.append(QString::number(divertStatus.iTimeout)); + content.append(hbTrId(" seconds")); + } + divertInfo->setText(content); + HbAction *backAction = new HbAction(hbTrId("Back"), divertInfo); + divertInfo->setPrimaryAction(backAction); + divertInfo->exec(); + delete divertInfo; + + DPRINT << ": OUT"; +} + +/*! + CpPhoneNotes::formatPhoneNumber. + Formats phone number according to locale specific rules. + */ +QString CpPhoneNotes::formatPhoneNumber(QString number) const +{ + DPRINT << ": IN"; + + QString formattedNumber = number; + + if (m_cpSettingsWrapper->numberGroupingSupported() == true) { + // TODO: utilize HbNumberGrouping API when available + } + + // TODO: digit conversion e.g. into arabic-indic +// HbExtendedLocale locale = HbExtendedLocale::system(); +// HbStringUtil::convertDigitsTo(formattedNumber, ArabicIndicDigit); + + DPRINT << ": OUT"; + + return formattedNumber; +} + +/*! + CpPhoneNotes::launchNextNoteIfReady. + */ +void CpPhoneNotes::launchNextNoteIfReady() +{ + DPRINT << ": IN"; + + if (m_notesQueue->isEmpty()) { + DPRINT << ", QUEUE EMPTY"; + return; + } + if (!m_isNoteShowingOngoing) { + m_isNoteShowingOngoing = true; + // note is left in the queue so that it can be cancelled at request + QObject *note = m_notesQueue->head(); + DPRINT << ", note: " << reinterpret_cast(note); + if (qobject_cast(note)) { + DPRINT << ", show HbDeviceProgressDialog"; + static_cast(note)->show(); + } else if (qobject_cast(note)) { + DPRINT << ", show HbDeviceMessageBox"; + static_cast(note)->exec(); + } else { + DPRINT << ", UNKNOWN NOTE"; + Q_ASSERT(false); + } + } else { + DPRINT << ", BUSY"; + } + + DPRINT << ": OUT"; +} + + +/*! + CpPhoneNotes::handleProgressNoteCanceled(). + */ +void CpPhoneNotes::handleProgressNoteCanceled() +{ + DPRINT << ": IN"; + + emit progressNoteCanceled(); + + DPRINT << ": OUT"; +} + +// End of File.