homescreenapp/runtimeplugins/hsdefaultruntimeplugin/src/hsdefaultruntime.cpp
changeset 39 4e8ebe173323
parent 36 cdae8c6c3876
child 46 23b5d6a29cce
equal deleted inserted replaced
36:cdae8c6c3876 39:4e8ebe173323
    17 
    17 
    18 #include <QState>
    18 #include <QState>
    19 #include <QFinalState>
    19 #include <QFinalState>
    20 #include <QSignalTransition>
    20 #include <QSignalTransition>
    21 #include <QKeyEventTransition>
    21 #include <QKeyEventTransition>
       
    22 #include <QKeyEvent>
    22 
    23 
    23 #include <qvaluespacepublisher.h>
    24 #include <qvaluespacepublisher.h>
    24 #include <qservicemanager.h>
    25 #include <qservicemanager.h>
    25 #include <qservicefilter.h>
    26 #include <qservicefilter.h>
    26 #include <qserviceinterfacedescriptor.h>
    27 #include <qserviceinterfacedescriptor.h>
    27 
    28 
    28 #include <HbInstance>
    29 #include <HbInstance>
       
    30 #include <HbIconAnimationManager>
       
    31 #include <HbIconAnimationDefinition>
    29 
    32 
    30 #include "homescreendomainpskeys.h"
    33 #include "homescreendomainpskeys.h"
    31 #include "hsdefaultruntime.h"
    34 #include "hsdefaultruntime.h"
    32 #include "hsdatabase.h"
    35 #include "hsdatabase.h"
    33 #include "hscontentservice.h"
    36 #include "hscontentservice.h"
    37 #include "hswidgetpositioningonwidgetadd.h"
    40 #include "hswidgetpositioningonwidgetadd.h"
    38 #include "hstest_global.h"
    41 #include "hstest_global.h"
    39 
    42 
    40 QTM_USE_NAMESPACE
    43 QTM_USE_NAMESPACE
    41 
    44 
    42 #ifdef S60APP_KEY
    45 
    43 int applicationKey = Qt::Key_Launch0;
    46 #ifdef Q_OS_SYMBIAN
       
    47 const static Qt::Key applicationKey = Qt::Key_Menu;
    44 #else
    48 #else
    45 int applicationKey = Qt::Key_Any;
    49 const static Qt::Key applicationKey = Qt::Key_Home;
    46 #endif
    50 #endif
       
    51 
       
    52 namespace
       
    53 {
       
    54     const char KHsLoadSceneStateInterface[] = "com.nokia.homescreen.state.HsLoadSceneState";
       
    55     const char KHsIdleStateInterface[] = "com.nokia.homescreen.state.HsIdleState";
       
    56     const char KHsAppLibraryStateInterface[] = "com.nokia.homescreen.state.HsAppLibraryState";
       
    57     const char KHsMenuWorkerStateInterface[] = "com.nokia.homescreen.state.HsMenuWorkerState";
       
    58 }
       
    59 
    47 
    60 
    48 /*!
    61 /*!
    49     \class HsDefaultRuntime
    62     \class HsDefaultRuntime
    50     \ingroup group_hsdefaultruntimeplugin
    63     \ingroup group_hsdefaultruntimeplugin
    51     \brief Default implementation of the home screen runtime.
    64     \brief Default implementation of the home screen runtime.
    63     : QStateMachine(parent),
    76     : QStateMachine(parent),
    64       mContentService(0),	  
    77       mContentService(0),	  
    65 	  mHomeScreenActive(false),
    78 	  mHomeScreenActive(false),
    66 	  mIdleStateActive(false),
    79 	  mIdleStateActive(false),
    67 	  mPublisher(NULL)
    80 	  mPublisher(NULL)
       
    81 #ifdef Q_OS_SYMBIAN
       
    82 	  ,keyCapture()
       
    83 #endif
    68 {
    84 {
    69     HSTEST_FUNC_ENTRY("HS::HsDefaultRuntime::HsDefaultRuntime");
    85     HSTEST_FUNC_ENTRY("HS::HsDefaultRuntime::HsDefaultRuntime");
    70 
    86 
    71     HsDatabase *db = new HsDatabase;
    87     HsDatabase *db = new HsDatabase;
    72     db->setConnectionName("homescreen.dbc");
    88     db->setConnectionName("homescreen.dbc");
    73 #ifdef Q_OS_SYMBIAN
    89 #ifdef Q_OS_SYMBIAN
    74     db->setDatabaseName("c:/private/20022f35/homescreen.db");
    90     db->setDatabaseName("c:/private/20022f35/homescreen.db");
    75 #else
    91 #else
    76     db->setDatabaseName("homescreen.db");
    92     db->setDatabaseName("private/20022f35/homescreen.db");
    77 #endif    
    93 #endif    
    78     db->open();
    94     db->open();
    79     HsDatabase::setInstance(db);
    95     HsDatabase::setInstance(db);
    80 
    96 
    81     HsWidgetPositioningOnOrientationChange::setInstance(
    97     HsWidgetPositioningOnOrientationChange::setInstance(
    82         new HsAdvancedWidgetPositioningOnOrientationChange);
    98         new HsAdvancedWidgetPositioningOnOrientationChange);
    83 
    99 
    84     HsWidgetPositioningOnWidgetAdd::setInstance(
   100     HsWidgetPositioningOnWidgetAdd::setInstance(
    85         new HsAnchorPointInBottomRight);
   101         new HsAnchorPointInBottomRight);
       
   102     
       
   103     registerAnimations();
    86 
   104 
    87     createStatePublisher();
   105     createStatePublisher();
    88     createContentServiceParts();
   106     createContentServiceParts();
    89     createStates();
   107     createStates();
    90     assignServices();
   108     assignServices();
   114 {
   132 {
   115     Q_UNUSED(watched);
   133     Q_UNUSED(watched);
   116 
   134 
   117     switch (event->type()) {
   135     switch (event->type()) {
   118 		case QEvent::ApplicationActivate:
   136 		case QEvent::ApplicationActivate:
   119 		{			
   137             qDebug() << "HsDefaultRuntime::eventFilter: QEvent::ApplicationActivate";
   120 			qDebug() << "HsDefaultRuntime::eventFilter: QEvent::ApplicationActivate";
   138 #ifdef Q_OS_SYMBIAN
   121 			mHomeScreenActive = true;
   139 			keyCapture.captureKey(applicationKey);
   122 			updatePSKeys();
   140 #endif
   123 		}
   141             mHomeScreenActive = true;
   124 		break;
   142             updatePSKeys();
       
   143             break;
   125 		case QEvent::ApplicationDeactivate:
   144 		case QEvent::ApplicationDeactivate:
   126 		{		
   145             qDebug() << "HsDefaultRuntime::eventFilter: QEvent::ApplicationDeactivate";
   127 			qDebug() << "HsDefaultRuntime::eventFilter: QEvent::ApplicationDeactivate";
   146 #ifdef Q_OS_SYMBIAN
       
   147 			keyCapture.cancelCaptureKey(applicationKey);
       
   148 #endif
   128 			mHomeScreenActive = false;
   149 			mHomeScreenActive = false;
   129             updatePSKeys();			
   150             updatePSKeys();
   130 		}
   151             break;
   131 		break;
   152         default:
       
   153             break;
   132 	}
   154 	}
   133     
   155    
   134 	return QStateMachine::eventFilter(watched, event);
   156     bool result =  QStateMachine::eventFilter(watched, event);
       
   157     // temporary hack as we should not register twice for events
       
   158 	if (event->type() == QEvent::KeyPress ) {
       
   159         QKeyEvent* ke = static_cast<QKeyEvent *>(event);         
       
   160         // Key_Launch0 should be removed when QT starts to send Key_Menu
       
   161         result = (ke->key() == applicationKey) || ke->key() == Qt::Key_Launch0;        
       
   162 	}
       
   163 	return result;
       
   164 }
       
   165 
       
   166 /*!
       
   167     Registers framework animations.
       
   168 */
       
   169 void HsDefaultRuntime::registerAnimations()
       
   170 {
       
   171     HbIconAnimationManager *manager = HbIconAnimationManager::global();
       
   172     manager->addDefinitionFile(QLatin1String(":/resource/tapandhold.axml"));
   135 }
   173 }
   136 
   174 
   137 /*!
   175 /*!
   138     Creates Home screen state publisher.
   176     Creates Home screen state publisher.
   139 */
   177 */
   176 
   214 
   177     guiRootState->addTransition(this, SIGNAL(event_exit()), finalState);
   215     guiRootState->addTransition(this, SIGNAL(event_exit()), finalState);
   178 
   216 
   179     QServiceManager manager;
   217     QServiceManager manager;
   180 
   218 
   181     QServiceFilter filter;
   219     
   182 
   220     QObject *loadSceneStateObj = manager.loadInterface(KHsLoadSceneStateInterface);
   183     filter.setInterface("com.nokia.homescreen.state.HsLoadSceneState");
       
   184 #ifdef HSDEFAULTRUNTIMEPLUGIN_UNITTEST
       
   185     filter.setServiceName("mockstateplugins");
       
   186 #endif    
       
   187     QList<QServiceInterfaceDescriptor> interfaces = manager.findInterfaces(filter);
       
   188 
       
   189     QObject *loadSceneStateObj = manager.loadInterface(interfaces.first());
       
   190     QState *loadSceneState = qobject_cast<QState *>(loadSceneStateObj);
   221     QState *loadSceneState = qobject_cast<QState *>(loadSceneStateObj);
   191     loadSceneState->setParent(guiRootState);
   222     loadSceneState->setParent(guiRootState);
   192     loadSceneState->setObjectName(interfaces.first().interfaceName());
   223     loadSceneState->setObjectName(KHsLoadSceneStateInterface);
   193 
   224 
   194     filter.setInterface("com.nokia.homescreen.state.HsIdleState");
   225     QObject *idleStateObj = manager.loadInterface(KHsIdleStateInterface);
   195     interfaces = manager.findInterfaces(filter);
       
   196     QObject *idleStateObj = manager.loadInterface(interfaces.first());
       
   197     QState *idleState = qobject_cast<QState *>(idleStateObj);
   226     QState *idleState = qobject_cast<QState *>(idleStateObj);
   198     idleState->setParent(guiRootState);
   227     idleState->setParent(guiRootState);
   199     idleState->setObjectName(interfaces.first().interfaceName());
   228     idleState->setObjectName(KHsIdleStateInterface);
   200 	connect(idleState, SIGNAL(entered()), SLOT(onIdleStateEntered()));
   229 	connect(idleState, SIGNAL(entered()), SLOT(onIdleStateEntered()));
   201 	connect(idleState, SIGNAL(exited()), SLOT(onIdleStateExited()));
   230 	connect(idleState, SIGNAL(exited()), SLOT(onIdleStateExited()));
   202 
   231 
   203     loadSceneState->addTransition(
   232     loadSceneState->addTransition(
   204             loadSceneState, SIGNAL(event_idle()), idleState);
   233             loadSceneState, SIGNAL(event_idle()), idleState);
   206     //menu state
   235     //menu state
   207     QState *menuParallelState = new QState(
   236     QState *menuParallelState = new QState(
   208             QState::ParallelStates, guiRootState);
   237             QState::ParallelStates, guiRootState);
   209     QState *menuRootState = new QState(menuParallelState);
   238     QState *menuRootState = new QState(menuParallelState);
   210 
   239 
   211     filter.setInterface("com.nokia.homescreen.state.HsAppLibraryState");
   240     QObject *appLibraryStateObj = manager.loadInterface(KHsAppLibraryStateInterface);
   212     interfaces = manager.findInterfaces(filter);
       
   213     QObject *appLibraryStateObj = manager.loadInterface(interfaces.first());
       
   214     QState *appLibraryState = qobject_cast<QState *>(appLibraryStateObj);
   241     QState *appLibraryState = qobject_cast<QState *>(appLibraryStateObj);
   215     appLibraryState->setParent(menuRootState);
   242     appLibraryState->setParent(menuRootState);
   216     appLibraryState->setObjectName(interfaces.first().interfaceName());
   243     appLibraryState->setObjectName(KHsAppLibraryStateInterface);
   217     menuRootState->setInitialState(appLibraryState);
   244     menuRootState->setInitialState(appLibraryState);
   218 
   245 
   219     filter.setInterface("com.nokia.homescreen.state.HsMenuWorkerState");
   246     QObject *menuWorkerStateObj = manager.loadInterface(KHsMenuWorkerStateInterface);
   220     interfaces = manager.findInterfaces(filter);
       
   221     QObject *menuWorkerStateObj = manager.loadInterface(interfaces.first());
       
   222     QState *menuWorkerState = qobject_cast<QState *>(menuWorkerStateObj);
   247     QState *menuWorkerState = qobject_cast<QState *>(menuWorkerStateObj);
   223     menuWorkerState->setParent(menuParallelState);
   248     menuWorkerState->setParent(menuParallelState);
   224     menuWorkerState->setObjectName(interfaces.first().interfaceName());
   249     menuWorkerState->setObjectName(KHsMenuWorkerStateInterface);
   225 
   250 
   226     // root state transitions
   251     // root state transitions
   227     idleState->addTransition(idleState, SIGNAL(event_applicationLibrary()), menuRootState);
   252     idleState->addTransition(idleState, SIGNAL(event_applicationLibrary()), menuRootState);
   228     appLibraryState->addTransition(
   253     appLibraryState->addTransition(
   229             appLibraryState, SIGNAL(toHomescreenState()), idleState);
   254             appLibraryState, SIGNAL(toHomescreenState()), idleState);
   241     HbMainWindow *window = hbInstance->allMainWindows().first();
   266     HbMainWindow *window = hbInstance->allMainWindows().first();
   242 
   267 
   243     // key driven transition from idle to menu
   268     // key driven transition from idle to menu
   244     QKeyEventTransition *idleToMenuRootTransition =
   269     QKeyEventTransition *idleToMenuRootTransition =
   245         new QKeyEventTransition(
   270         new QKeyEventTransition(
   246                 window, QEvent::KeyRelease, applicationKey, idleState);
   271                 window, QEvent::KeyPress, applicationKey);
   247     idleToMenuRootTransition->setTargetState(menuRootState);
   272     idleToMenuRootTransition->setTargetState(menuRootState);
   248     idleState->addTransition(idleToMenuRootTransition);
   273     idleState->addTransition(idleToMenuRootTransition);
   249     // key driven transition from menu to idle
   274     // key driven transition from menu to idle
   250     QKeyEventTransition *menuToIdleTransition =
   275     QKeyEventTransition *menuToIdleTransition =
   251         new QKeyEventTransition(
   276         new QKeyEventTransition(
   252                 window, QEvent::KeyRelease, applicationKey, idleState);
   277                 window, QEvent::KeyPress, applicationKey);
   253     menuToIdleTransition->setTargetState(idleState);
   278     menuToIdleTransition->setTargetState(idleState);
   254     menuRootState->addTransition(menuToIdleTransition);
   279     menuRootState->addTransition(menuToIdleTransition);
       
   280     
       
   281     // transition for Key_Launch0 should be removed 
       
   282     // when OT starts to send Key_Menu (maybe wk14)
       
   283     QKeyEventTransition *idleToMenuRootTransition2 =
       
   284         new QKeyEventTransition(
       
   285                 window, QEvent::KeyPress, Qt::Key_Launch0);
       
   286     idleToMenuRootTransition2->setTargetState(menuRootState);
       
   287     idleState->addTransition(idleToMenuRootTransition2);
       
   288     // key driven transition from menu to idle
       
   289     QKeyEventTransition *menuToIdleTransition2 =
       
   290         new QKeyEventTransition(
       
   291                 window, QEvent::KeyPress, Qt::Key_Launch0);
       
   292     menuToIdleTransition2->setTargetState(idleState);
       
   293     menuRootState->addTransition(menuToIdleTransition2);
   255 
   294 
   256     // transitions to child states
   295     // transitions to child states
   257     // opening shortcut to a colleciton
   296     // opening shortcut to a colleciton
   258     QList<QState *> collectionStates =
   297     QList<QState *> collectionStates =
   259         appLibraryState->
   298         appLibraryState->