diff -r 0ba996a9b75d -r 613943a21004 bluetoothengine/btnotif/btdevicedialogplugin/src/btdevicedialoginputwidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/btnotif/btdevicedialogplugin/src/btdevicedialoginputwidget.cpp Tue Aug 31 15:25:10 2010 +0300 @@ -0,0 +1,233 @@ +/* +* 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: BtDeviceDialogWidget class implementation. +* +*/ + + +#include "btdevicedialoginputwidget.h" +#include "btdevicedialogplugintrace.h" +#include +#include +#include +#include +#include +#include "btdevicedialogpluginerrors.h" + +const int PASSCODE_MAX_LEN = 16; // from BT specs + +/*! + class Constructor + */ +BtDeviceDialogInputWidget::BtDeviceDialogInputWidget( + const QVariantMap ¶meters) +{ + TRACE_ENTRY + // set properties + mLastError = NoError; + mShowEventReceived = false; + mInputDialog = new HbInputDialog(); + + resetProperties(); + constructInputDialog(parameters); + TRACE_EXIT +} + +/*! + Set parameters, implementation of interface + Invoked when HbDeviceDialog::update calls. + */ +bool BtDeviceDialogInputWidget::setDeviceDialogParameters( + const QVariantMap ¶meters) +{ + TRACE_ENTRY + mLastError = NoError; + processParam(parameters); + TRACE_EXIT + return true; +} + +/*! + Get error, implementation of interface + */ +int BtDeviceDialogInputWidget::deviceDialogError() const +{ + TRACE_ENTRY + TRACE_EXIT + return mLastError; +} + +/*! + Close notification, implementation of interface + */ +void BtDeviceDialogInputWidget::closeDeviceDialog(bool byClient) +{ + TRACE_ENTRY + Q_UNUSED(byClient); + // Closed by client or internally by server -> no action to be transmitted. + mSendAction = false; + mInputDialog->close(); + // If show event has been received, close is signalled from hide event. If not, + // hide event does not come and close is signalled from here. + if (!mShowEventReceived) { + emit deviceDialogClosed(); + } + TRACE_EXIT +} + +/*! + Return display widget, implementation of interface + */ +HbDialog *BtDeviceDialogInputWidget::deviceDialogWidget() const +{ + TRACE_ENTRY + TRACE_EXIT + return mInputDialog; +} + +QObject *BtDeviceDialogInputWidget::signalSender() const +{ + return const_cast(this); +} + +/*! + Construct display widget + */ +bool BtDeviceDialogInputWidget::constructInputDialog(const QVariantMap ¶meters) +{ + TRACE_ENTRY + // analyze the parameters to compose the properties of the widget + processParam(parameters); + connect(mInputDialog, SIGNAL(finished(HbAction*)), this, SLOT(inputClosed(HbAction*))); + + TRACE_EXIT + return true; +} + +/*! + Take parameter values and generate relevant property of this widget + */ +void BtDeviceDialogInputWidget::processParam(const QVariantMap ¶meters) +{ + TRACE_ENTRY + + QString keyStr, prompt,title,regExp; + QVariant name; + keyStr.setNum( TBluetoothDialogParams::EResource ); + // Validate if the resource item exists. + QVariantMap::const_iterator i = parameters.constFind( keyStr ); + // item of ResourceId is not found, can't continue. + if ( i == parameters.constEnd() ) { + mLastError = UnknownDeviceDialogError; + return; + } + + QVariant param = parameters.value( keyStr ); + if ( param.toInt() == EPinInput ) { + // Numeric value only + mInputDialog->setInputMode(HbInputDialog::RealInput); + title = QString(hbTrId("txt_bt_title_pairing_with_1")); + // todo: Fixe the multiline problem + prompt = QString( hbTrId( "txt_bt_dialog_please_enter_the_passcode_for_1" ) ); + } + else { + mLastError = ParameterError; + return; + } + + // check if minLength of passcode required + keyStr.setNum( TBluetoothDeviceDialog::EAdditionalDesc ); + i = parameters.constFind( keyStr ); + // Mini Length required, update prompt + // ToDo: The validator doesn't seem to work properly + if ( i != parameters.constEnd() ) { + // Todo : The string ID for the localization is not available yet + // for string : "Enter %1 digit passcode for device %2:" + // I'm using the "Enter the passcode for device %1" instead + prompt = QString( hbTrId( "txt_bt_dialog_please_enter_the_passcode_for_1" ) ); + param = parameters.value( keyStr ); + regExp = tr("^\\d{%1,}$"); + regExp.arg(param.toString()); + HbValidator* validator = new HbValidator(mInputDialog->lineEdit()); + validator->addField( + new QRegExpValidator( + QRegExp(regExp, Qt::CaseInsensitive), validator ),""); + mInputDialog->setValidator(validator); + }else{ + // Minimum requirement is to have at least 1 digit + regExp = tr("^\\d{1,}$"); + HbValidator* validator = new HbValidator(mInputDialog->lineEdit()); + validator->addField( + new QRegExpValidator( + QRegExp(regExp, Qt::CaseInsensitive), validator ),""); + mInputDialog->setValidator(validator); + } + // replace % with the miniLength and device name + int repls = prompt.count( QString( "%" ) ); + if ( repls > 1 ) { + prompt = prompt.arg( param.toString() ); + } + if ( repls > 0 ) { + name = parameters.value( QString::number( TBluetoothDeviceDialog::EDeviceName ) ); + prompt = prompt.arg( name.toString() ); + } + repls = title.count(QString("%")); + if(repls > 0){ + title = title.arg( name.toString() ); + } + mInputDialog->setHeadingWidget(new HbLabel(title)); + mInputDialog->lineEdit(0)->setMaxLength(PASSCODE_MAX_LEN); + mInputDialog->lineEdit(0)->setText(tr("")); // clear the input field + mInputDialog->setPromptText(prompt); + TRACE_EXIT +} + +/*! + Reset properties to default values + */ +void BtDeviceDialogInputWidget::resetProperties() +{ + TRACE_ENTRY + // set to default values + mInputDialog->setModal(true); + mInputDialog->setTimeout(HbDialog::NoTimeout); + mInputDialog->setDismissPolicy(HbDialog::NoDismiss); + mSendAction = true; + // Todo: clean the Validator + TRACE_EXIT + return; +} + +void BtDeviceDialogInputWidget::inputClosed(HbAction *action) +{ + QVariantMap data; + + HbInputDialog *dlg=static_cast(sender()); + if(dlg->actions().first() == action) { + //Ok + QVariant result( dlg->value().toString().toUtf8() ); + data.insert( QString( "result" ), QVariant(true)); + data.insert( QString( "input" ), result ); + } + else if(dlg->actions().at(1) == action) { + //Cancel + data.insert( QString( "result" ), QVariant(false)); + } + + emit deviceDialogData(data); + emit deviceDialogClosed(); + mSendAction = false; +} + +