--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cellular/psuinotes/src/psuinotes.cpp Tue Aug 31 15:45:17 2010 +0300
@@ -0,0 +1,544 @@
+/*
+ * 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 <hbdevicemessagebox.h>
+#include <hbdevicenotificationdialog.h>
+#include <HbDeviceProgressDialog>
+#include <hblistview.h>
+#include <hbdialog.h>
+#include <hblabel.h>
+#include <hbaction.h>
+#include <hbmessagebox.h>
+#include <hbnotificationdialog.h>
+#include <QStandardItemModel>
+#include <QItemSelectionModel>
+#include <hbstringutil.h>
+#include <hbextendedlocale.h>
+#include <HbInputDialog>
+#include <HbEditorInterface>
+#include <hbinputdef.h>
+#include <hbinputstandardfilters.h>
+#include <xqserviceutil.h>
+#include <QApplication>
+#include <QTranslator>
+#include <Qt>
+
+#include "psuinotes.h"
+#include "psuiutils.h"
+#include "psuilogging.h"
+#include "psuilocalisation.h"
+
+/*!
+ PsUiNotes::instance.
+ */
+PsUiNotes* PsUiNotes::instance()
+{
+ DPRINT << ": IN";
+
+ static PsUiNotes theInstance;
+
+ DPRINT << ", instance address: " << reinterpret_cast<int>(&theInstance);
+ return &theInstance;
+}
+
+/*!
+ PsUiNotes::PsUiNotes.
+ */
+PsUiNotes::PsUiNotes():
+ QObject(NULL),
+ m_notesQueue(NULL),
+ m_isNoteShowingOngoing(false),
+ m_passwordDialog(NULL),
+ m_passwordValidator(NULL)
+ {
+ DPRINT << ": IN";
+
+ m_notesQueue = new QQueue<QObject*>();
+
+ m_psuiSettings = new PsUiSettingsWrapper();
+
+ // Localization file loading
+ m_localisation = new PsUiLocalisation(this);
+
+ // Install required translations
+ m_localisation->installTranslator(
+ PsUiLocalisation::
+ TranslationFileCommon);
+ m_localisation->installTranslator(
+ PsUiLocalisation::
+ TranslationFileTelephoneCp);
+ DPRINT << ": OUT";
+ }
+
+/*!
+ PsUiNotes::~PsUiNotes.
+ */
+PsUiNotes::~PsUiNotes()
+{
+ DPRINT << ": IN";
+
+ delete m_localisation;
+
+ qDeleteAll(*m_notesQueue);
+
+ delete m_psuiSettings;
+
+ delete m_notesQueue;
+
+ DPRINT << ": OUT";
+}
+
+/*!
+ PsUiNotes::showGlobalProgressNote.
+ */
+void PsUiNotes::showGlobalProgressNote(
+ int ¬eId, const QString& text)
+{
+ DPRINT << ": IN";
+
+ HbDeviceProgressDialog *note =
+ new HbDeviceProgressDialog(HbProgressDialog::WaitDialog, this);
+ note->setText(text);
+
+ if(hbTrId("txt_common_info_requesting") == text){
+ QAction *action = new QAction(hbTrId("txt_common_button_hide"), note);
+ note->setAction(action, HbDeviceProgressDialog::CancelButtonRole );
+ }
+
+ noteId = reinterpret_cast<int>(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";
+}
+
+/*!
+ PsUiNotes::showGlobalNote.
+ */
+void PsUiNotes::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<int>(note);
+ DPRINT << ", NOTEID: " << noteId;
+
+ QObject::connect(
+ note, SIGNAL(aboutToClose()),
+ this, SLOT(activeNoteAboutToClose()));
+
+ m_notesQueue->enqueue(note);
+ launchNextNoteIfReady();
+
+ DPRINT << ": OUT";
+}
+
+
+/*!
+ PsUiNotes::cancelNote.
+ */
+void PsUiNotes::cancelNote(int noteId)
+{
+ DPRINT << ": IN";
+
+ if (!m_notesQueue->isEmpty()) {
+ QObject *note = m_notesQueue->head();
+ if(note == reinterpret_cast<QObject *>(noteId)) {
+ int index = m_notesQueue->indexOf(reinterpret_cast<QObject *>(noteId));
+ Q_ASSERT(-1 < index);
+ QObject *note = m_notesQueue->at(index);
+ DPRINT << ": NOTEID: " << noteId;
+ if (qobject_cast<HbDeviceProgressDialog *>(note)) {
+ static_cast<HbDeviceProgressDialog *>(note)->close();
+ } else if (qobject_cast<HbDeviceMessageBox *>(note)) {
+ static_cast<HbDeviceMessageBox *>(note)->close();
+ } else {
+ DPRINT << ", UNKNOWN NOTE";
+ Q_ASSERT(false);
+ }
+ }
+ else {
+ DPRINT << ": remove from queue, noteId: " << noteId;
+ m_notesQueue->removeOne(reinterpret_cast<QObject *>(noteId));
+ }
+ }
+
+ DPRINT << ": OUT";
+}
+
+/*!
+ PsUiNotes::noteShowing.
+ */
+bool PsUiNotes::noteShowing()
+{
+ return !m_notesQueue->isEmpty();
+}
+
+/*!
+ PsUiNotes::showGlobalErrorNote.
+ */
+void PsUiNotes::showGlobalErrorNote(int ¬eId, int errorcode)
+{
+ DPRINT << ": IN";
+
+ QString errorText = "";
+ PsUiUtils::errorCodeTextMapping(errorcode, errorText);
+
+ HbDeviceMessageBox *note
+ = new HbDeviceMessageBox(errorText, HbMessageBox::MessageTypeWarning, this);
+ note->setTimeout(0);
+ noteId = reinterpret_cast<int>(note);
+ DPRINT << ", NOTEID: " << noteId;
+ QObject::connect(
+ note, SIGNAL(aboutToClose()),
+ this, SLOT(activeNoteAboutToClose()));
+ m_notesQueue->enqueue(note);
+ launchNextNoteIfReady();
+
+ DPRINT << ": OUT";
+}
+
+/*!
+ PsUiNotes::showCallDivertDetails.
+ */
+void PsUiNotes::showCallDivertDetails(
+ const QList<PSCallDivertingStatus*> &divertingStatusList)
+{
+ DPRINT << ": IN";
+
+ DPRINT << ": Status " << divertingStatusList.first()->iStatus;
+ DPRINT << ": ServiceGroup " << divertingStatusList.first()->iServiceGroup;
+
+ QString status;
+ QString content;
+
+ switch( divertingStatusList.first()->iStatus )
+ {
+ case DivertingStatusActive:
+ formatActiveDivertsNoteText(divertingStatusList,content);
+ break;
+ case DivertingStatusInactive:
+ case DivertingStatusNotRegistered:
+ status.append(hbTrId("txt_phone_dpopinfo_divert_not_active"));
+ break;
+ case DivertingStatusNotProvisioned:
+ status.append(hbTrId("txt_phone_info_not_allowed"));
+ break;
+ case DivertingStatusUnknown:
+ default:
+ status.append(hbTrId("txt_phone_info_request_not_completed"));
+ break;
+ }
+ if (divertingStatusList.first()->iStatus != DivertingStatusActive) {
+ showGlobalNotificationDialog(status);
+ }
+ else {
+ HbDeviceMessageBox * note =
+ new HbDeviceMessageBox(content, HbMessageBox::MessageTypeQuestion, this);
+ note->setIconVisible(EFalse);
+ note->setTimeout(0);
+ HbAction *backAction =
+ new HbAction(hbTrId("txt_common_button_close_singledialog") );
+ note->setAction(backAction, HbDeviceMessageBox::AcceptButtonRole );
+ note->setAction(NULL, HbDeviceMessageBox::RejectButtonRole);
+
+ QObject::connect(
+ note, SIGNAL(aboutToClose()),
+ this, SLOT(activeNoteAboutToClose()));
+
+ m_notesQueue->enqueue(note);
+ launchNextNoteIfReady();
+ }
+
+ DPRINT << ": OUT";
+}
+
+/*!
+ PsUiNotes::showPasswordQueryDialog.
+ */
+void PsUiNotes::showPasswordQueryDialog(
+ const QString &title,
+ const QValidator &validator,
+ int maxPasswordLength)
+{
+ DPRINT << ": IN";
+
+ QScopedPointer<HbInputDialog> passwordDialog(new HbInputDialog());
+
+ // configure editor so that only digits can be inputted
+ passwordDialog->setPromptText(title);
+ passwordDialog->setEchoMode(HbLineEdit::Password);
+ passwordDialog->setInputMethodHints(Qt::ImhDigitsOnly);
+ passwordDialog->actions().at(0)->setEnabled(false);
+
+ HbLineEdit *hbLineEdit = passwordDialog->lineEdit();
+ hbLineEdit->setMaxLength(maxPasswordLength);
+
+ HbEditorInterface editorInterface(hbLineEdit);
+ editorInterface.setMode(HbInputModeNumeric);
+ editorInterface.setInputConstraints(HbEditorConstraintFixedInputMode);
+ editorInterface.setFilter(HbDigitsOnlyFilter::instance());
+
+ m_passwordValidator = &validator;
+
+ connect(
+ hbLineEdit, SIGNAL(contentsChanged()),
+ this, SLOT(passwordTextChanged()));
+
+ passwordDialog->open(this, SLOT(finishedPasswordQueryDialog(HbAction*)));
+ if(m_passwordDialog) {
+ m_passwordDialog->deleteLater();
+ m_passwordDialog = NULL;
+ }
+ m_passwordDialog = passwordDialog.take();
+ m_passwordDialog->setParent(this);
+ DPRINT << ": OUT";
+}
+
+/*!
+ PsUiNotes::finishedPasswordQueryDialog.
+ */
+void PsUiNotes::finishedPasswordQueryDialog(HbAction* action)
+{
+ bool ok;
+ QString password;
+ if(m_passwordDialog) {
+ if (action == m_passwordDialog->actions().at(1)) {
+ ok = false;
+ } else {
+ ok = true;
+ password = m_passwordDialog->value().toString();
+ }
+
+ disconnect(
+ m_passwordDialog->lineEdit(), SIGNAL(contentsChanged()),
+ this, SLOT(passwordTextChanged()));
+
+ m_passwordDialog->deleteLater();
+ m_passwordDialog = NULL;
+ m_passwordValidator = NULL;
+
+ emit passwordQueryCompleted(password, ok);
+ }
+}
+
+/*!
+ PsUiNotes::formatPhoneNumber.
+ Formats phone number according to locale specific rules.
+ */
+QString PsUiNotes::formatPhoneNumber(QString number) const
+{
+ DPRINT << ": IN";
+
+ QString formattedNumber = number;
+
+ if (m_psuiSettings->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;
+}
+
+/*!
+ PsUiNotes::launchNextNoteIfReady.
+ */
+void PsUiNotes::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<int>(note);
+ if (qobject_cast<HbDeviceProgressDialog *>(note)) {
+ DPRINT << ", show HbDeviceProgressDialog";
+ static_cast<HbDeviceProgressDialog *>(note)->show();
+ } else if (qobject_cast<HbDeviceMessageBox *>(note)) {
+ DPRINT << ", show HbDeviceMessageBox";
+ static_cast<HbDeviceMessageBox *>(note)->show();
+ } else {
+ DPRINT << ", UNKNOWN NOTE";
+ Q_ASSERT(false);
+ }
+ } else {
+ DPRINT << ", BUSY";
+ }
+
+ DPRINT << ": OUT";
+}
+
+/*!
+ PsUiNotes::handleActiveDiverts
+ */
+void PsUiNotes::formatActiveDivertsNoteText(
+ const QList<PSCallDivertingStatus*> &divertingStatusList,
+ QString &text)
+{
+ text.append(hbTrId("Active for:") + "\n\n"); //txt_phone_title_active_for
+
+ int entries = divertingStatusList.count();
+ DPRINT << ": entries " << entries;
+ bool dataSet = false;
+ bool voiceSet = false;
+ for (int i = 0; entries > i; i++) {
+ PSCallDivertingStatus *entry = divertingStatusList.at(i);
+
+ if (((entry->iServiceGroup & ServiceGroupVoice) && !voiceSet ) ||
+ ((entry->iServiceGroup & ServiceGroupData)) && !dataSet) {
+ if ((entry->iServiceGroup & ServiceGroupVoice) && !voiceSet) {
+ voiceSet = true;
+ text.append(hbTrId("Voice calls") + "\n"); //txt_phone_info_voice_calls
+
+ }
+ else if ((entry->iServiceGroup & ServiceGroupData) && !dataSet) {
+ dataSet = true;
+ text.append(hbTrId("Video calls") + "\n"); //txt_phone_info_video_calls
+ }
+
+ QString phoneNumber = formatPhoneNumber(divertingStatusList.at(i)->iNumber);
+ text.append(hbTrId("To number:\n%L1").arg(phoneNumber) +"\n"); //txt_phone_info_to_numbernl1
+ if (0 < entry->iTimeout) {
+ text.append(hbTrId("Delay time:\n%L1 seconds").
+ arg(entry->iTimeout) +"\n\n"); // txt_phone_info_delay_timenln_seconds
+ }
+ else {
+ text.append("\n");
+ }
+
+ }
+ }
+ // Convert plain text to html
+ text = Qt::convertFromPlainText(text);
+}
+
+/*!
+ PsUiNotes::activeNoteAboutToClose.
+ */
+void PsUiNotes::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<int>(note);
+ HbDeviceProgressDialog *pNote =
+ qobject_cast<HbDeviceProgressDialog *>(note);
+ note->deleteLater();
+ }
+ }
+
+ DPRINT << ": OUT";
+}
+
+/*!
+ PsUiNotes::handleProgressNoteCanceled().
+ */
+void PsUiNotes::handleProgressNoteCanceled()
+{
+ DPRINT << ": IN";
+
+ emit progressNoteCanceled();
+
+ DPRINT << ": OUT";
+}
+
+/*!
+ PsUiNotes::passwordTextChanged().
+ */
+void PsUiNotes::passwordTextChanged()
+{
+ DPRINT << ": IN";
+ Q_ASSERT(m_passwordDialog && m_passwordValidator);
+
+ HbLineEdit *hbLineEdit = m_passwordDialog->lineEdit();
+ int position = 0;
+ QString password = hbLineEdit->text();
+ bool isPasswordValid =
+ (QValidator::Acceptable == m_passwordValidator->validate(
+ password, position));
+ m_passwordDialog->actions().at(0)->setEnabled(isPasswordValid);
+
+ DPRINT << ": OUT";
+}
+
+
+/*!
+ PsUiNotes::showNotificationDialog.
+ */
+void PsUiNotes::showNotificationDialog(const QString& text)
+{
+ DPRINT << ": IN";
+
+ HbNotificationDialog *notifDialog = new HbNotificationDialog();
+
+ notifDialog->setDismissPolicy(HbPopup::TapAnywhere);
+ notifDialog->setAttribute(Qt::WA_DeleteOnClose, true);
+ notifDialog->setText(text);
+ notifDialog->show();
+
+ DPRINT << ": OUT";
+}
+
+/*!
+ PsUiNotes::showGlobalNotificationDialog
+ */
+void PsUiNotes::showGlobalNotificationDialog(const QString& text)
+{
+ DPRINT << ": IN";
+
+ HbDeviceNotificationDialog notifDialog;
+
+ notifDialog.setText(text);
+ notifDialog.show();
+
+ DPRINT << ": OUT";
+}
+
+// End of File.