telutils/dialpad/src/dialpadkeysequenceeventfilter.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 23 Jun 2010 18:49:32 +0300
changeset 31 a2467631ae02
parent 27 7eb70891911c
child 33 8d5d7fcf9b59
permissions -rw-r--r--
Revision: 201023 Kit: 2010125

/*
* 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: Implements key sequence recognition filter for Dialpad.
*
*/
#include <QDebug>
#include <QKeyEvent>
#include <hblineedit.h>
#include <hbstringutil.h>
#ifdef Q_OS_SYMBIAN
#include <xqservicerequest.h>
#include <xqserviceutil.h>
#endif //Q_OS_SYMBIAN
#include "dialpadkeysequenceeventfilter.h"
#include "dialpad.h"
#include "qtphonesrvlog.h"

/*!
  DialpadKeySequenceEventFilter::DialpadKeySequenceEventFilter.
 */
DialpadKeySequenceEventFilter::DialpadKeySequenceEventFilter(
    Dialpad* dialpad, QObject* parent) 
    :
    QObject(parent), mDialpad(dialpad)
{
    PHONE_TRACE;
    
    constructKeySequenceToHandlerMappings();
}


/*!
  DialpadKeySequenceEventFilter::~DialpadKeySequenceEventFilter.
 */
DialpadKeySequenceEventFilter::~DialpadKeySequenceEventFilter()
{
    PHONE_TRACE;
}


/*!
  DialpadKeySequenceEventFilter::eventFilter.
 */
bool DialpadKeySequenceEventFilter::eventFilter(QObject *watched, QEvent *event)
{
    Q_UNUSED(watched)
    
    const bool eventFiltered = false;
#ifdef Q_OS_SYMBIAN
    QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
    const int keyCode = keyEvent->key();
    const int eventType = event->type();
    
    // Code is executed after '#' is pressed as specified in Dialer UI 
    // specification.
    QString keySequenceCandidate = HbStringUtil::convertDigitsTo(
        mDialpad->editor().text(), WesternDigit);
    if (QEvent::KeyRelease == eventType && Qt::Key_NumberSign == keyCode) {
        XQAiwInterfaceDescriptor keySequenceHandler = 
            findKeySequenceHandler(keySequenceCandidate);
        if (keySequenceHandler.isValid()) {
            QScopedPointer<XQAiwRequest> request(mAiwMgr.create(
                keySequenceHandler, 
                "executeKeySequence(QString)",
                false));
            request->setSynchronous(true);
            request->setBackground(true);
            QList<QVariant> arguments;
            arguments << keySequenceCandidate;
            request->setArguments(arguments);
            
            QVariant keySequenceProcessed;
            bool requestOk = request->send(keySequenceProcessed);
            if (requestOk && keySequenceProcessed.toBool()) {
                mDialpad->editor().setText(QString(""));
            }
        }
    }
#else
    Q_UNUSED(event)
#endif // Q_OS_SYMBIAN
    
    return eventFiltered;
}


/*!
  DialpadKeySequenceEventFilter::constructKeySequenceToHandlerMappings.
 */
void DialpadKeySequenceEventFilter::constructKeySequenceToHandlerMappings()
{
    PHONE_TRACE;
    
    QList<XQAiwInterfaceDescriptor> implementations = mAiwMgr.list(
        "com.nokia.symbian.IKeySequenceRecognition", 
        "");
    
    foreach (XQAiwInterfaceDescriptor d, implementations)
    {
        QScopedPointer<XQAiwRequest> request(mAiwMgr.create(
            d,
            "keySequenceValidator()",
            false));
        request->setSynchronous(true);
        request->setBackground(true);
        
        QVariant keySequenceValidator;
        bool requestOk = request->send(keySequenceValidator);
        if (requestOk && keySequenceValidator.toString().size()) {
            QString validator = keySequenceValidator.toString();
            mValidators[validator] = d;
        }
    }
}


/*!
  DialpadKeySequenceEventFilter::findKeySequenceHandler.
 */
XQAiwInterfaceDescriptor DialpadKeySequenceEventFilter::findKeySequenceHandler(
    const QString &keySequenceCandidate) 
{
    PHONE_TRACE;

    XQAiwInterfaceDescriptor keySequenceHandler;
    
    QList<QString> validatorExpressions = mValidators.keys();
    QList<QString>::const_iterator it;
    for (it = validatorExpressions.constBegin(); 
         (it != validatorExpressions.constEnd()) && (!keySequenceHandler.isValid());
         ++it) {
        QString validatorExpression = *it;
        QRegExp expression(validatorExpression);
        if (expression.exactMatch(keySequenceCandidate)) {
            keySequenceHandler = mValidators.value(*it);
        }
    }
    
    return keySequenceHandler;
}