hsappkeyhandler/tsrc/t_hsappkeyhandler/src/t_hsappkeyhandler.cpp
changeset 117 c63ee96dbe5f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hsappkeyhandler/tsrc/t_hsappkeyhandler/src/t_hsappkeyhandler.cpp	Thu Sep 16 12:11:40 2010 +0100
@@ -0,0 +1,343 @@
+/*
+* Copyright (c) 2007-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 "t_hsappkeyhandler.h"
+
+#include <QtTest/QtTest>
+#include <QScopedPointer>
+
+#include <QValueSpaceSubscriber>
+
+#include <hb/hbcore/hbsymbianvariant.h>
+
+#include <tspropertydefs.h>
+#include <homescreendomainpskeys.h>
+
+#include "hsappkeyplugin.h"
+
+QTM_USE_NAMESPACE
+
+namespace {
+    _LIT(KTsPluginName, "com.nokia.taskswitcher.tsdevicedialogplugin/1.0");
+}
+
+// -----------------------------------------------------------------------------
+//  CONSTRUCTOR
+// -----------------------------------------------------------------------------
+//
+T_HsAppKeyHandler::T_HsAppKeyHandler(QObject *parent) :
+    QObject(parent),
+    mCHsAppKeyPluginInstance(0),
+    mDialog(0)
+{
+}
+
+// -----------------------------------------------------------------------------
+//  INIT AND CLEANUP
+// -----------------------------------------------------------------------------
+//
+void T_HsAppKeyHandler::init()
+{
+    TRAPD(errNo, mCHsAppKeyPluginInstance = CHsAppKeyPlugin::NewL());
+    QCOMPARE(errNo, KErrNone);
+    QVERIFY(mCHsAppKeyPluginInstance);
+}
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void T_HsAppKeyHandler::cleanup()
+{
+    delete mCHsAppKeyPluginInstance;
+    mCHsAppKeyPluginInstance = 0;
+    
+    delete mDialog;
+    mDialog = 0;
+}
+
+// -----------------------------------------------------------------------------
+//  TEST CASES
+// -----------------------------------------------------------------------------
+//
+void T_HsAppKeyHandler::callDataReceived()
+{
+    // just call unused part of HbDeviceDialogMonitor interface
+    CHbSymbianVariantMap *dummy;
+    TRAPD(errNo, dummy = CHbSymbianVariantMap::NewL());
+    
+    QCOMPARE(errNo, KErrNone);
+    QVERIFY(dummy);
+
+    mCHsAppKeyPluginInstance->DataReceived(*dummy);
+    delete dummy;
+}
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void T_HsAppKeyHandler::testProvideKeyEvents()
+{    
+    RArray<TKeyEvent> keyEventArray;
+    CleanupClosePushL(keyEventArray);
+
+    TRAPD(errNo, mCHsAppKeyPluginInstance->ProvideKeyEventsL(keyEventArray));
+    QCOMPARE(errNo, KErrNone);
+
+    QCOMPARE(keyEventArray.Count(), 2);
+
+    TKeyEvent shortPress = keyEventArray[0];
+    QCOMPARE(shortPress.iCode, static_cast<TUint>(EKeyApplication0));
+    QCOMPARE(shortPress.iScanCode, static_cast<TInt>(EStdKeyApplication0));
+    QCOMPARE(shortPress.iModifiers, static_cast<TUint>(0));
+    QCOMPARE(shortPress.iRepeats, 0);
+    
+    TKeyEvent longPress = keyEventArray[0];
+    QCOMPARE(longPress.iCode, static_cast<TUint>(EKeyApplication0));
+    QCOMPARE(longPress.iScanCode, static_cast<TInt>(EStdKeyApplication0));
+    QCOMPARE(longPress.iModifiers, static_cast<TUint>(0));
+    QCOMPARE(longPress.iRepeats, 0);
+
+    CleanupStack::PopAndDestroy(&keyEventArray);
+}
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void T_HsAppKeyHandler::testDeviceDialogClosed()
+{
+    // @todo: verify that calling this method closes task switcher
+    mCHsAppKeyPluginInstance->DeviceDialogClosed(0);
+}
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void T_HsAppKeyHandler::testHandleKeyEventIgnoresKeysOtherThanAppKey()
+{
+    TInt errNo(KErrNone);
+    TKeyResponse keyResponse(EKeyWasNotConsumed);
+
+    TKeyEvent invalidKeyEvent;
+    invalidKeyEvent.iCode = !EKeyApplication0;
+
+    TRAP(errNo, keyResponse = mCHsAppKeyPluginInstance->HandleKeyEventL(invalidKeyEvent, EEventNull));
+    QCOMPARE(errNo, KErrNone);
+    QCOMPARE(keyResponse, EKeyWasNotConsumed);
+}
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void T_HsAppKeyHandler::testHandleKeyEventConsumesEverySecondEventForAppKey()
+{
+    TInt errNo(KErrNone);
+    TKeyResponse keyResponse(EKeyWasNotConsumed);
+
+    // verify that for every supported key we consume every second event and ignore the others
+    RArray<TKeyEvent> keyEventArray;
+    CleanupClosePushL(keyEventArray);    
+    TRAP(errNo, mCHsAppKeyPluginInstance->ProvideKeyEventsL(keyEventArray));
+    QCOMPARE(errNo, KErrNone);
+    
+    for (TInt i(0); i != keyEventArray.Count(); ++i) {
+        TKeyEvent keyEvent = keyEventArray[i];
+        
+        // first event ignored
+        TRAP(errNo, keyResponse = mCHsAppKeyPluginInstance->HandleKeyEventL(keyEvent, EEventNull));
+        QCOMPARE(errNo, KErrNone);
+        QCOMPARE(keyResponse, EKeyWasNotConsumed);
+
+        // second event consumed
+        TRAP(errNo, keyResponse = mCHsAppKeyPluginInstance->HandleKeyEventL(keyEvent, EEventNull));
+        QCOMPARE(errNo, KErrNone);
+        QCOMPARE(keyResponse, EKeyWasConsumed);
+    }    
+    
+    CleanupStack::PopAndDestroy(&keyEventArray);
+}
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void T_HsAppKeyHandler::testShortPressSwitchesBetweenHsAndApplibWhenTsIsNotVisible()
+{
+    // verify preconditions
+    QCOMPARE(isTaskSwitcherVisible(), false);
+
+    QValueSpaceSubscriber hsStateGetter(QString("%1/%2").arg(HsStatePSKeyPath).arg(HsStatePSKeySubPath));
+    QVERIFY(hsStateGetter.isConnected());
+    
+    // make sure we start from homescreen
+    if (hsStateGetter.value().toInt() != EHomeScreenIdleState) {
+        QVERIFY(makeShortPress()); 
+    }
+    
+    QVariant initialState = hsStateGetter.value();
+    
+    QVERIFY(makeShortPress()); 
+    QVERIFY(hsStateGetter.value() != initialState);
+
+    QVERIFY(makeShortPress());   
+    QVERIFY(hsStateGetter.value() == initialState);    
+}
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void T_HsAppKeyHandler::testLongPressShowsTaskSwitcher()
+{
+    // verify preconditions
+    QCOMPARE(isTaskSwitcherVisible(), false);
+    
+    QVERIFY(makeLongPress());
+    QCOMPARE(isTaskSwitcherVisible(), true);    
+    
+    // second longpress does nothing
+    QVERIFY(makeLongPress());
+    QCOMPARE(isTaskSwitcherVisible(), true);    
+}
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void T_HsAppKeyHandler::testShortPressDismissesTaskSwitcherShownByLongpress()
+{
+    // verify preconditions
+    QCOMPARE(isTaskSwitcherVisible(), false);
+    
+    QVERIFY(makeLongPress());
+    QCOMPARE(isTaskSwitcherVisible(), true);    
+    
+    QVERIFY(makeShortPress());
+    QCOMPARE(isTaskSwitcherVisible(), false);    
+}
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void T_HsAppKeyHandler::testLongpressDoesNothingIfTaskSwitcherIsShownByOtherComponent()
+{
+    // verify preconditions
+    QCOMPARE(isTaskSwitcherVisible(), false);
+    QVERIFY(!mDialog);
+    
+    QVERIFY(showTaskSwitcher());
+    QCOMPARE(isTaskSwitcherVisible(), true);
+    
+    QVERIFY(makeLongPress());
+    QCOMPARE(isTaskSwitcherVisible(), true);    
+}
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void T_HsAppKeyHandler::testShortPressDismissesTaskSwitcherShownByOtherComponent()
+{
+    // verify preconditions
+    QCOMPARE(isTaskSwitcherVisible(), false);
+    QVERIFY(!mDialog);
+    
+    QVERIFY(showTaskSwitcher());
+    QCOMPARE(isTaskSwitcherVisible(), true);
+    
+    // after short press the TaskSwitcher will call DeviceDialogClosed callback
+    // of MHbDeviceDialogObserver, which should delete and clear mDialog member.
+    QVERIFY(makeShortPress());
+    QTest::qWait(1000);
+    QCOMPARE(isTaskSwitcherVisible(), false);    
+    QVERIFY(!mDialog);
+}
+
+// -----------------------------------------------------------------------------
+//  HELPER MEHTODS
+// -----------------------------------------------------------------------------
+//
+
+bool T_HsAppKeyHandler::makeShortPress()
+{
+    TKeyEvent shortpress = {EKeyApplication0, EStdKeyApplication0, 0, 0};        
+    return sendKeyEventTwice(shortpress);
+}
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+bool T_HsAppKeyHandler::makeLongPress()
+{
+    TKeyEvent longpress = {EKeyApplication0, EStdKeyApplication0, 0, 1};        
+    return sendKeyEventTwice(longpress);
+}
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+bool T_HsAppKeyHandler::sendKeyEventTwice(TKeyEvent keyEvent)
+{
+    Q_ASSERT(mCHsAppKeyPluginInstance);
+    
+    TKeyResponse keyResponse(EKeyWasNotConsumed);
+    // send key event twice (HandleKeyEventL accepts every second event) 
+    TRAPD(errNo,
+        mCHsAppKeyPluginInstance->HandleKeyEventL(keyEvent, EEventNull);
+        keyResponse = mCHsAppKeyPluginInstance->HandleKeyEventL(keyEvent, EEventNull);
+    );
+    
+    return (KErrNone == errNo) && (EKeyWasConsumed == keyResponse);
+}
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+bool T_HsAppKeyHandler::isTaskSwitcherVisible()
+{
+    QValueSpaceSubscriber tsVisibilityGetter(QString("%1/%2").arg(TsProperty::KTsPath).arg(TsProperty::KVisibilityPath));
+    Q_ASSERT(tsVisibilityGetter.isConnected());
+    
+    QVariant tsVisibility = tsVisibilityGetter.value();
+    Q_ASSERT(tsVisibility.isValid());
+    return tsVisibility.toBool();
+}
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+bool T_HsAppKeyHandler::showTaskSwitcher()
+{
+    mDialog = CHbDeviceDialogSymbian::NewL();    
+    QScopedPointer<CHbSymbianVariantMap> params(CHbSymbianVariantMap::NewL());
+    return KErrNone == mDialog->Show(KTsPluginName, *params, this);
+}
+
+// ---------------------------------------------------------------------------
+// MHbDeviceDialogObserver implementation
+// ---------------------------------------------------------------------------
+//
+void T_HsAppKeyHandler::DataReceived(CHbSymbianVariantMap &/*aData*/)
+{
+    //no implementation required
+}
+
+void T_HsAppKeyHandler::DeviceDialogClosed(TInt /*aCompletionCode*/)
+{
+    delete mDialog;
+    mDialog = 0;
+}
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+QTEST_MAIN(T_HsAppKeyHandler)