diff -r 594d59766373 -r 7d48bed6ce0c satui/satapp/src/satappinputprovider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/satui/satapp/src/satappinputprovider.cpp Tue Aug 31 15:45:17 2010 +0300 @@ -0,0 +1,636 @@ +/* +* Copyright (c) 2010 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: Provides input methods like query dialogs +* +*/ + +// qt +#include +#include +// hb +#include +#include +#include +#include +#include +#include +#include +// satapp +#include "satappinputprovider.h" +#include "satappconstant.h" +#include "satappaction.h" + + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::SatAppInputProvider +// ---------------------------------------------------------------------------- +// +SatAppInputProvider::SatAppInputProvider(QObject *parent) + : QObject(parent), mCurrentAction(0), mCurrentDialog(0) +{ + qDebug("SATAPP: SatAppInputProvider::SatAppInputProvider >"); + mDurationTimer = new QTimer(this); + qDebug("SATAPP: SatAppInputProvider::SatAppInputProvider <"); +} + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::~SatAppInputProvider +// ---------------------------------------------------------------------------- +// +SatAppInputProvider::~SatAppInputProvider() +{ + qDebug("SATAPP: SatAppInputProvider::~SatAppInputProvider >"); + delete mCurrentDialog; + mCurrentDialog = 0; + qDebug("SATAPP: SatAppInputProvider::~SatAppInputProvider <"); +} + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::getInkey +// requests user to enter a SINGLE key, character or digit +// ---------------------------------------------------------------------------- +// +void SatAppInputProvider::getInkey(SatAppAction& action) +{ + qDebug("SATAPP: SatAppInputProvider::getInkey >"); + + delete mCurrentDialog; + mCurrentDialog=0; + + QString heading = action.value(KeyText).toString(); + qDebug() << "SATAPP: getInkey: heading=" << heading; + + TSatCharacterSet characterSet = + static_cast(action.value(KeyCharacterSet).toInt()); + + qDebug("SATAPP: SatAppInputProvider::getInkey char set %d", characterSet); + + // yes no query must have text. + if ((0 == heading.length()) && (ESatYesNo == characterSet)) { + action.completeWithFailure(); + return; + } + + // duration + int duration = action.value(KeyDuration).toInt(); + if (duration == 0) { + duration = KDefaultSelectionTimeoutMseconds; + } + qDebug("SATAPP: getInkey: duration=%d", duration); + mInputTimer.start(); + + if (heading.isEmpty()) { + if (ESatDigitOnly == characterSet) { + heading = hbTrId("txt_simatk_dialog_entern1_digit_09"); + } else { + // ESatCharSmsDefaultAlphabet or ESatCharUcs2Alphabet + heading = hbTrId("txt_simatk_dialog_entern1_character"); + } + } + qDebug() << "SATAPP: getInkey: heading=" << heading; + + mCurrentAction = &action; + bool immediate = action.value(KeyImmediate).toBool(); + qDebug() << "SATAPP: getInkey: immediate=" << immediate; + + if (characterSet == ESatYesNo) { + //Yes no imediate will be combine with YES no. + showGetYesNoQuery(heading, duration); + } + else if (immediate) { + // we only have digit immediate + showGetImmediateQuery(heading, duration); + } + else { + // Reminder, there is no default inkey in get inkey + // proactive command. + showGetInkeyQuery(heading, characterSet, duration); + } + SAT_ASSERT(connect(mCurrentAction, SIGNAL(actionCompleted(SatAppAction*)), + this, SLOT(clearDurationTimer()))); + qDebug("SATAPP: SatAppInputProvider::getInkey <"); +} + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::getInput +// requests user to enter a STRING of free text, number or password etc. +// ---------------------------------------------------------------------------- +// +void SatAppInputProvider::getInput(SatAppAction& action) +{ + qDebug("SATAPP: SatAppInputProvider::getInput >"); + + delete mCurrentDialog; + mCurrentDialog=0; + // character set + TSatCharacterSet characterSet = + static_cast(action.value(KeyCharacterSet).toInt()); + + qDebug("SATAPP: SatAppInputProvider::getInput char set %d", characterSet); + + // heading + QString heading = action.value(KeyText).toString(); + qDebug() << "SATAPP: getInput: heading=" << heading; + if (heading.isEmpty()) { + if (ESatDigitOnly == characterSet) { + heading = hbTrId("txt_simatk_dialog_entern1_digit_09"); + } else { + // ESatCharSmsDefaultAlphabet or ESatCharUcs2Alphabet + heading = hbTrId("txt_simatk_dialog_entern1_character"); + } + } + qDebug() << "SATAPP: getInput: heading=" << heading; + + // min length + int minLength = action.value(KeyMinLength).toInt(); + if (minLength<0) { + minLength=0; + } + if (minLength>KGetInputStringMaxSize){ + minLength=KGetInputStringMaxSize; + } + + // max length + int maxLength = action.value(KeyMaxLength).toInt(); + if (maxLengthKGetInputStringMaxSize) { + maxLength=KGetInputStringMaxSize; + } + qDebug("SATAPP: SatAppInputProvider::getInput min %d", minLength); + qDebug("SATAPP: SatAppInputProvider::getInput max %d", maxLength); + + // default input text + QString inputText = action.value(KeyInputString).toString(); + if (inputText.length() < minLength || inputText.length() > maxLength){ + inputText = ""; + } + qDebug() << "SATAPP: getInput: inputText=" << inputText; + + // hide input + bool hideInput = action.value(KeyHideInput).toBool(); + qDebug("SATAPP: SatAppInputProvider::getInput hide %d", hideInput); + + qDebug("SATAPP: getInput: min=%d,max=%d,hide=%d", + minLength, maxLength, hideInput); + + mCurrentAction = &action; + showGetInputQuery( heading, inputText, + characterSet, minLength, maxLength, hideInput); + + SAT_ASSERT(connect(mCurrentAction, SIGNAL(actionCompleted(SatAppAction*)), + this, SLOT(clearDurationTimer()))); + qDebug("SATAPP: SatAppInputProvider::getInput <"); +} + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::showGetInkeyQuery +// ---------------------------------------------------------------------------- +// +void SatAppInputProvider::showGetInkeyQuery( + const QString &heading, + TSatCharacterSet characterSet, + int duration) +{ + qDebug("SATAPP: SatAppInputProvider::showGetInkeyQuery >"); + + HbInputDialog* inputDialog = new HbInputDialog(); + mCurrentDialog = inputDialog; + // Set PromptText + inputDialog->setPromptText(heading); + // Set ContentText + HbEditorInterface inputMode(inputDialog->lineEdit()); + inputDialog->lineEdit()->setFocus(); + if (ESatDigitOnly == characterSet) { + // digit mode, digits only (0 9, *, #, and +) + inputMode.setFilter(HbPhoneNumberFilter::instance()); + inputMode.setMode(HbInputModeNumeric); + inputMode.setInputConstraints(HbEditorConstraintFixedInputMode); + } else { + // char mode + inputMode.setUpAsLatinAlphabetOnlyEditor(); + } + composeDialog(inputDialog, GetInkey); + mCurrentAction->set(KeyMinLength, 1); + inputDialog->lineEdit()->setMaxLength(1); + + // when input changed, enable/disable OK button + SAT_ASSERT(connect(inputDialog->lineEdit(), SIGNAL(textChanged(QString)), + this, SLOT(updateQueryAction(QString)))); + // when OK pressed, fill in data to action and complete it + SAT_ASSERT(connect(inputDialog->actions().at(0), SIGNAL(triggered()), + this, SLOT(transmitInkeyFromDialog()))); + // when cancel pressed, complete action with ESatBackwardModeRequestedByUser + SAT_ASSERT(connect(inputDialog->actions().at(1), SIGNAL(triggered()), + mCurrentAction, SLOT(completeWithBackRequested()))); + // after timeout, reset the provider + startDurationTimer(duration); + // open the dialog. When the dialog closes, reset everything + inputDialog->open(); + + qDebug("SATAPP: SatAppInputProvider::showGetInkeyQuery <"); +} + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::showGetImmediateQuery +// ---------------------------------------------------------------------------- +// +void SatAppInputProvider::showGetImmediateQuery( + const QString &heading, + int duration) +{ + qDebug("SATAPP: SatAppInputProvider::showGetImmediateQuery >"); + + HbInputDialog* inputDialog = new HbInputDialog(); + mCurrentDialog = inputDialog; + // Set PromptText + inputDialog->setPromptText(heading); + // Set ContentText + HbEditorInterface inputMode(inputDialog->lineEdit()); + inputDialog->lineEdit()->setFocus(); + + inputMode.setFilter(HbPhoneNumberFilter::instance()); + inputMode.setMode(HbInputModeNumeric); + inputMode.setInputConstraints(HbEditorConstraintFixedInputMode); + + composeDialog(inputDialog, GetImmediate); + + // when receiving first input character, send it immediately + SAT_ASSERT(connect(inputDialog->lineEdit(), SIGNAL(textChanged(QString)), + this, SLOT(transmitInkeyImmediately(QString)))); + // when cancel pressed, complete action with ESatBackwardModeRequestedByUser + SAT_ASSERT(connect(inputDialog->actions().at(0), SIGNAL(triggered()), + mCurrentAction, SLOT(completeWithBackRequested()))); + // after timeout, reset the provider + startDurationTimer(duration); + // open the dialog. When the dialog closes, reset everything + inputDialog->open(); + + qDebug("SATAPP: SatAppInputProvider::showGetImmediateQuery <"); +} + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::showGetYesNoQuery +// ---------------------------------------------------------------------------- +// +void SatAppInputProvider::showGetYesNoQuery( + const QString &text, + int duration) +{ + qDebug("SATAPP: SatAppInputProvider::showGetYesNoQuery >"); + HbMessageBox* messageBox = new HbMessageBox(HbMessageBox::MessageTypeInformation); + mCurrentDialog = messageBox; + + // Set the label as heading widget + HbLabel *lHeading = new HbLabel(text, messageBox); + messageBox->setHeadingWidget(lHeading); + messageBox->setIconVisible(false); + + composeDialog(messageBox, GetYesNo); + + // when YES pressed, complete action with ESatSuccess, inkey set to 1 + SAT_ASSERT(connect(messageBox->actions().at(0), SIGNAL(triggered()), + this, SLOT(transmitInkeyTrue()))); + // when NO pressed, complete action with ESatSuccess, inkey set to 0 + SAT_ASSERT(connect(messageBox->actions().at(1), SIGNAL(triggered()), + this, SLOT(transmitInkeyFalse()))); + + startDurationTimer(duration); + // show dialog. + messageBox->open(); + + qDebug("SATAPP: SatAppInputProvider::showGetYesNoQuery <"); +} + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::showGetInputQuery +// ---------------------------------------------------------------------------- +// +void SatAppInputProvider::showGetInputQuery( + const QString& heading, + const QString& content, + TSatCharacterSet characterSet, + int minLength, + int maxLength, + bool hideInput) +{ + Q_UNUSED(minLength); + qDebug("SATAPP: SatAppInputProvider::showGetInputQuery >"); + + HbInputDialog* inputQuery = new HbInputDialog(); + mCurrentDialog = inputQuery; + inputQuery->setPromptText(heading); + inputQuery->setValue(QVariant(content)); + HbEditorInterface inputMode(inputQuery->lineEdit()); + inputQuery->lineEdit()->setFocus(); + if (ESatDigitOnly == characterSet) { + // digit mode, digits only (0 9, *, #, and +) + inputMode.setFilter(HbPhoneNumberFilter::instance()); + inputMode.setMode(HbInputModeNumeric); + inputMode.setInputConstraints(HbEditorConstraintFixedInputMode); + } else { + // char mode + inputMode.setUpAsLatinAlphabetOnlyEditor(); + } + + inputQuery->lineEdit()->setMaxLength(maxLength); + + composeDialog(inputQuery, GetInput); + // initially set the button states + updateQueryAction(inputQuery->value().toString()); + + if (hideInput) { + inputQuery->lineEdit()->setEchoMode(HbLineEdit::Password); + qDebug("SATAPP: showGetInputQuery: hiding input"); + } + + // when dialog content changes, dim ok button accordingly, use + // use contentChanged signal from the base class of the editor + // to get the signal when in password mode + SAT_ASSERT(connect(inputQuery->lineEdit(), SIGNAL(contentsChanged()), + this, SLOT(updateQueryAction()))); + // transmit the text on OK press + SAT_ASSERT(connect(inputQuery->actions().at(0), SIGNAL(triggered()), + this, SLOT(transmitStringFromDialog()))); + // on Cancel key complete action with ESatBackwardModeRequestedByUser + SAT_ASSERT(connect(inputQuery->actions().at(1), SIGNAL(triggered()), + mCurrentAction, SLOT(completeWithBackRequested()))); + // after timeout, reset the provider + startDurationTimer(KDefaultSelectionTimeoutMseconds); + // open dialog. When it closes, reset everything + inputQuery->open(); + + qDebug("SATAPP: SatAppInputProvider::showGetInputQuery <"); +} + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::resetState +// ---------------------------------------------------------------------------- +// +void SatAppInputProvider::resetState() +{ + qDebug("SATAPP: SatAppInputProvider::resetState >"); + if (mCurrentAction) { + qDebug("SATAPP: SatAppInputProvider::resetState action"); + mCurrentAction->completeWithNoResponse(); + mCurrentAction = 0; + } + + qDebug("SATAPP: SatAppInputProvider::resetState action done"); + + delete mCurrentDialog; + mCurrentDialog = 0; + qDebug("SATAPP: SatAppInputProvider::resetState <"); +} + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::composeDialog +// make sure dlg has 2 buttons +// ---------------------------------------------------------------------------- +// +void SatAppInputProvider::composeDialog( + HbDialog *dlg, + DialogMode mode) +{ + qDebug("SATAPP: SatAppInputProvider::composeDialog >"); + Q_ASSERT(mCurrentAction); + + dlg->setModal(true); + dlg->setDismissPolicy(HbDialog::NoDismiss); + + dlg->clearActions(); + HbAction *primaryAction = new HbAction(dlg); + dlg->addAction(primaryAction); + + HbAction *secondaryAction = new HbAction(dlg); + dlg->addAction(secondaryAction); + + switch(mode){ + case GetYesNo: + { + primaryAction->setText(hbTrId("txt_common_button_yes")); + secondaryAction->setText(hbTrId("txt_common_button_no")); + break; + } + case GetImmediate: + { + dlg->removeAction(primaryAction); + secondaryAction->setText(hbTrId("txt_common_button_cancel")); + break; + } + default: + { + primaryAction->setText(hbTrId("txt_common_button_ok")); + primaryAction->setEnabled(false); + secondaryAction->setText(hbTrId("txt_common_button_cancel")); + break; + } + } + qDebug("SATAPP: SatAppInputProvider::composeDialog <"); +} + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::updateQueryAction +// Updates dialog's OK button according to input text length limits +// ---------------------------------------------------------------------------- +// +void SatAppInputProvider::updateQueryAction() +{ + qDebug("SATAPP: SatAppInputProvider::updateQueryAction >"); + Q_ASSERT(mCurrentDialog); + QString content = + qobject_cast(mCurrentDialog)->value().toString(); + qDebug() << "SATAPP: updateQueryAction: content=" << content; + updateQueryAction(content); + qDebug("SATAPP: SatAppInputProvider::updateQueryAction >"); +} + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::updateQueryAction +// Updates dialog's OK button according to input text length limits +// ---------------------------------------------------------------------------- +// +void SatAppInputProvider::updateQueryAction(QString text) +{ + qDebug("SATAPP: SatAppInputProvider::updateQueryAction 2>"); + Q_ASSERT(mCurrentDialog); + qDebug() << "SATAPP: updateQueryAction 2: text=" << text; + int min=0; + if (mCurrentAction->hasValue(KeyMinLength)) + min=mCurrentAction->value(KeyMinLength).toInt(); + int max=10; + if (mCurrentAction->hasValue(KeyMaxLength)) + max=mCurrentAction->value(KeyMaxLength).toInt(); + if (mCurrentDialog->actions().at(0)) { + if (text.length() >= min && text.length() <= max) { + mCurrentDialog->actions().at(0)->setEnabled(true); + } else { + mCurrentDialog->actions().at(0)->setEnabled(false); + } + } + qDebug("SATAPP: SatAppInputProvider::updateQueryAction 2<"); +} + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::transmitInkeyFromDialog +// ---------------------------------------------------------------------------- +// +void SatAppInputProvider::transmitInkeyFromDialog() +{ + qDebug("SATAPP: SatAppInputProvider::transmitInkeyFromDialog >"); + Q_ASSERT(mCurrentDialog); + Q_ASSERT(mCurrentAction->action()==ESatGetInkeyAction); + // grab the input string + HbInputDialog* inkeyQuery = static_cast(mCurrentDialog); + QString inputString = inkeyQuery->value().toString(); + qDebug() << "SATAPP: transmitInkeyFromDialog: input=" << inputString; + transmitInkeyImmediately(inputString); + qDebug("SATAPP: SatAppInputProvider::transmitInkeyFromDialog <"); +} + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::transmitInkeyImmediately +// ---------------------------------------------------------------------------- +// +void SatAppInputProvider::transmitInkeyImmediately(QString text) +{ + qDebug("SATAPP: SatAppInputProvider::transmitInkeyImmediately >"); + transmitInkey((int)text.utf16()[0]); + qDebug("SATAPP: SatAppInputProvider::transmitInkeyImmediately <"); +} + + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::transmitInkeyTrue +// ---------------------------------------------------------------------------- +// +void SatAppInputProvider::transmitInkeyTrue() +{ + qDebug("SATAPP: SatAppInputProvider::transmitInkeyTrue >"); + Q_ASSERT(mCurrentAction); + Q_ASSERT(mCurrentAction->action()==ESatGetInkeyAction); + Q_ASSERT(mCurrentAction->value(KeyCharacterSet).toInt()==ESatYesNo); + transmitInkey(1); + qDebug("SATAPP: SatAppInputProvider::transmitInkeyTrue <"); +} + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::transmitInkeyFalse +// ---------------------------------------------------------------------------- +// +void SatAppInputProvider::transmitInkeyFalse() +{ + qDebug("SATAPP: SatAppInputProvider::transmitInkeyFalse >"); + Q_ASSERT(mCurrentAction); + Q_ASSERT(mCurrentAction->action()==ESatGetInkeyAction); + Q_ASSERT(mCurrentAction->value(KeyCharacterSet).toInt()==ESatYesNo); + transmitInkey(0); + qDebug("SATAPP: SatAppInputProvider::transmitInkeyFalse >"); +} + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::transmit +// ---------------------------------------------------------------------------- +// +void SatAppInputProvider::transmitInkey(int key) +{ + qDebug("SATAPP: SatAppInputProvider::transmitInkey >"); + qDebug("SATAPP: SatAppInputProvider::transmitInkey %d",key); + Q_ASSERT(mCurrentAction); + Q_ASSERT(mCurrentAction->action()==ESatGetInkeyAction); + // write inkey + mCurrentAction->set(KeyInKey,key); + // overwrite timer duration + if (mCurrentAction->hasValue(KeyDuration)) { + int newDuration = mInputTimer.elapsed(); + qDebug("SATAPP: SatAppInputProvider::transmitInkey dur ", newDuration); + mCurrentAction->set(KeyDuration, newDuration); + } + bool immediate = mCurrentAction->value(KeyImmediate).toBool(); + if(immediate) { + mCurrentDialog->close(); + } + mCurrentAction->completeWithSuccess(); + mCurrentAction = 0; + qDebug("SATAPP: SatAppInputProvider::transmitInkey >"); +} + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::transmitStringFromDialog +// ---------------------------------------------------------------------------- +// +void SatAppInputProvider::transmitStringFromDialog() +{ + qDebug("SATAPP: SatAppInputProvider::transmitStringFromDialog >"); + Q_ASSERT(mCurrentDialog); + Q_ASSERT(mCurrentAction); + Q_ASSERT(mCurrentAction->action()==ESatGetInputAction); + // write input string + HbInputDialog* inputQuery = static_cast(mCurrentDialog); + QString inputString = inputQuery->value().toString(); + qDebug() << "SATAPP: transmitStringFromDialog: string=" << inputString; + + mCurrentAction->set(KeyInputString,inputString); + // overwrite timer duration + if (mCurrentAction->hasValue(KeyDuration)) { + int newDuration = mInputTimer.elapsed(); + qDebug("SATAPP: SatAppInputProvider::transmitStringFromDialog dur ", + newDuration); + mCurrentAction->set(KeyDuration, newDuration); + } + mCurrentAction->completeWithSuccess(); + mCurrentAction = 0; + qDebug("SATAPP: SatAppInputProvider::transmitStringFromDialog >"); +} + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::startDurationTimer +// ---------------------------------------------------------------------------- +// +void SatAppInputProvider::startDurationTimer(int duration) +{ + qDebug("SATAPP: SatAppInputProvider::startDurationTimer %d>", duration); + Q_ASSERT(mDurationTimer); + if (duration) { + mDurationTimer->setSingleShot(true); + SAT_ASSERT(connect(mDurationTimer, SIGNAL(timeout()), + this, SLOT(resetState()))); + mDurationTimer->start(duration); + } + qDebug("SATAPP: SatAppInputProvider::startDurationTimer <"); +} + +// ---------------------------------------------------------------------------- +// SatAppInputProvider::clearDurationTimer +// ---------------------------------------------------------------------------- +// +void SatAppInputProvider::clearDurationTimer() +{ + qDebug("SATAPP: SatAppInputProvider::clearDurationTimer >"); + Q_ASSERT(mDurationTimer); + Q_ASSERT(mCurrentAction); + + bool res = disconnect(mCurrentAction, SIGNAL(actionCompleted(SatAppAction*)), + this, SLOT(clearDurationTimer())); + qDebug("SATAPP: SatAppInputProvider::clearDurationTimer act %d>", res); + res = disconnect(mDurationTimer, SIGNAL(timeout()), + this, SLOT(resetState())); + qDebug("SATAPP: SatAppInputProvider::clearDurationTimer dur %d>", res); + + mDurationTimer->stop(); + qDebug("SATAPP: SatAppInputProvider::clearDurationTimer <"); +} + +//End of file