homescreenapp/runtimeplugins/hsdefaultruntimeplugin/src/hsdefaultruntime.cpp
changeset 36 cdae8c6c3876
parent 35 f9ce957a272c
child 39 4e8ebe173323
equal deleted inserted replaced
35:f9ce957a272c 36:cdae8c6c3876
    27 
    27 
    28 #include <HbInstance>
    28 #include <HbInstance>
    29 
    29 
    30 #include "homescreendomainpskeys.h"
    30 #include "homescreendomainpskeys.h"
    31 #include "hsdefaultruntime.h"
    31 #include "hsdefaultruntime.h"
       
    32 #include "hsdatabase.h"
    32 #include "hscontentservice.h"
    33 #include "hscontentservice.h"
    33 #include "hsshortcutservice.h"
    34 #include "hsshortcutservice.h"
    34 #include "hsmenueventtransition.h"
    35 #include "hsmenueventtransition.h"
    35 #include "hswidgetpositioningonorientationchange.h"
    36 #include "hswidgetpositioningonorientationchange.h"
    36 #include "hswidgetpositioningonwidgetadd.h"
    37 #include "hswidgetpositioningonwidgetadd.h"
    60 */
    61 */
    61 HsDefaultRuntime::HsDefaultRuntime(QObject *parent)
    62 HsDefaultRuntime::HsDefaultRuntime(QObject *parent)
    62     : QStateMachine(parent),
    63     : QStateMachine(parent),
    63       mContentService(0),	  
    64       mContentService(0),	  
    64 	  mHomeScreenActive(false),
    65 	  mHomeScreenActive(false),
    65 	  mIdleStateActive(false)
    66 	  mIdleStateActive(false),
       
    67 	  mPublisher(NULL)
    66 {
    68 {
    67     HSTEST_FUNC_ENTRY("HS::HsDefaultRuntime::HsDefaultRuntime");
    69     HSTEST_FUNC_ENTRY("HS::HsDefaultRuntime::HsDefaultRuntime");
       
    70 
       
    71     HsDatabase *db = new HsDatabase;
       
    72     db->setConnectionName("homescreen.dbc");
       
    73 #ifdef Q_OS_SYMBIAN
       
    74     db->setDatabaseName("c:/private/20022f35/homescreen.db");
       
    75 #else
       
    76     db->setDatabaseName("homescreen.db");
       
    77 #endif    
       
    78     db->open();
       
    79     HsDatabase::setInstance(db);
    68 
    80 
    69     HsWidgetPositioningOnOrientationChange::setInstance(
    81     HsWidgetPositioningOnOrientationChange::setInstance(
    70         new HsAdvancedWidgetPositioningOnOrientationChange);
    82         new HsAdvancedWidgetPositioningOnOrientationChange);
    71 
    83 
    72     HsWidgetPositioningOnWidgetAdd::setInstance(
    84     HsWidgetPositioningOnWidgetAdd::setInstance(
    73         new HsAnchorPointInBottomRight);
    85         new HsAnchorPointInBottomRight);
    74 
    86 
       
    87     createStatePublisher();
    75     createContentServiceParts();
    88     createContentServiceParts();
    76     createStates();
    89     createStates();
    77     assignServices();
    90     assignServices();
    78     
    91     
    79 	QCoreApplication::instance()->installEventFilter(this);
    92 	QCoreApplication::instance()->installEventFilter(this);
    84     Destructor.
    97     Destructor.
    85 */
    98 */
    86 HsDefaultRuntime::~HsDefaultRuntime()
    99 HsDefaultRuntime::~HsDefaultRuntime()
    87 {
   100 {
    88     HsWidgetPositioningOnOrientationChange::setInstance(0);
   101     HsWidgetPositioningOnOrientationChange::setInstance(0);
       
   102 	delete mPublisher;
    89 }
   103 }
    90 
   104 
    91 /*!
   105 /*!
    92     \fn void HsDefaultRuntime::stopStateMachine()
   106     \fn void HsDefaultRuntime::stopStateMachine()
    93     Emission of this signal initiates a transition to the final state.
   107     Emission of this signal initiates a transition to the final state.
   119     
   133     
   120 	return QStateMachine::eventFilter(watched, event);
   134 	return QStateMachine::eventFilter(watched, event);
   121 }
   135 }
   122 
   136 
   123 /*!
   137 /*!
       
   138     Creates Home screen state publisher.
       
   139 */
       
   140 void HsDefaultRuntime::createStatePublisher()
       
   141 {
       
   142     mPublisher = new QValueSpacePublisher(QValueSpace::PermanentLayer, HsStatePSKeyPath);
       
   143 
       
   144     if (!mPublisher->isConnected()){
       
   145     	// No permanent layer available
       
   146     	mPublisher = new QValueSpacePublisher(HsStatePSKeyPath);
       
   147     }
       
   148 
       
   149     mPublisher->setValue(HsStatePSKeySubPath, EHomeScreenInactive);
       
   150 }
       
   151 
       
   152 /*!
   124     Creates content service parts.
   153     Creates content service parts.
   125 */
   154 */
   126 void HsDefaultRuntime::createContentServiceParts()
   155 void HsDefaultRuntime::createContentServiceParts()
   127 {
   156 {
   128     HSTEST_FUNC_ENTRY("HS::HsDefaultRuntime::createContentServiceParts");
   157     HSTEST_FUNC_ENTRY("HS::HsDefaultRuntime::createContentServiceParts");
   145     QState *guiRootState = new QState();
   174     QState *guiRootState = new QState();
   146     addState(guiRootState);
   175     addState(guiRootState);
   147 
   176 
   148     guiRootState->addTransition(this, SIGNAL(event_exit()), finalState);
   177     guiRootState->addTransition(this, SIGNAL(event_exit()), finalState);
   149 
   178 
   150     // Workaround to QtSF bug. Create in stack after the bug is fixed.
   179     QServiceManager manager;
   151     QServiceManager *manager = new QServiceManager(this);
   180 
   152     QServiceFilter filter;
   181     QServiceFilter filter;
   153 
   182 
   154     filter.setInterface("com.nokia.homescreen.state.HsLoadSceneState");
   183     filter.setInterface("com.nokia.homescreen.state.HsLoadSceneState");
   155     QList<QServiceInterfaceDescriptor> interfaces = manager->findInterfaces(filter);
   184 #ifdef HSDEFAULTRUNTIMEPLUGIN_UNITTEST
   156     QObject *loadSceneStateObj = manager->loadInterface(interfaces.first().interfaceName());
   185     filter.setServiceName("mockstateplugins");
       
   186 #endif    
       
   187     QList<QServiceInterfaceDescriptor> interfaces = manager.findInterfaces(filter);
       
   188 
       
   189     QObject *loadSceneStateObj = manager.loadInterface(interfaces.first());
   157     QState *loadSceneState = qobject_cast<QState *>(loadSceneStateObj);
   190     QState *loadSceneState = qobject_cast<QState *>(loadSceneStateObj);
   158     loadSceneState->setParent(guiRootState);
   191     loadSceneState->setParent(guiRootState);
   159     loadSceneState->setObjectName(interfaces.first().interfaceName());
   192     loadSceneState->setObjectName(interfaces.first().interfaceName());
   160 
   193 
   161     filter.setInterface("com.nokia.homescreen.state.HsIdleState");
   194     filter.setInterface("com.nokia.homescreen.state.HsIdleState");
   162     interfaces = manager->findInterfaces(filter);
   195     interfaces = manager.findInterfaces(filter);
   163     QObject *idleStateObj = manager->loadInterface(interfaces.first().interfaceName());
   196     QObject *idleStateObj = manager.loadInterface(interfaces.first());
   164     QState *idleState = qobject_cast<QState *>(idleStateObj);
   197     QState *idleState = qobject_cast<QState *>(idleStateObj);
   165     idleState->setParent(guiRootState);
   198     idleState->setParent(guiRootState);
   166     idleState->setObjectName(interfaces.first().interfaceName());
   199     idleState->setObjectName(interfaces.first().interfaceName());
   167 	connect(idleState, SIGNAL(entered()), SLOT(onIdleStateEntered()));
   200 	connect(idleState, SIGNAL(entered()), SLOT(onIdleStateEntered()));
   168 	connect(idleState, SIGNAL(exited()), SLOT(onIdleStateExited()));
   201 	connect(idleState, SIGNAL(exited()), SLOT(onIdleStateExited()));
   174     QState *menuParallelState = new QState(
   207     QState *menuParallelState = new QState(
   175             QState::ParallelStates, guiRootState);
   208             QState::ParallelStates, guiRootState);
   176     QState *menuRootState = new QState(menuParallelState);
   209     QState *menuRootState = new QState(menuParallelState);
   177 
   210 
   178     filter.setInterface("com.nokia.homescreen.state.HsAppLibraryState");
   211     filter.setInterface("com.nokia.homescreen.state.HsAppLibraryState");
   179     interfaces = manager->findInterfaces(filter);
   212     interfaces = manager.findInterfaces(filter);
   180     QObject *appLibraryStateObj = manager->loadInterface(interfaces.first().interfaceName());
   213     QObject *appLibraryStateObj = manager.loadInterface(interfaces.first());
   181     QState *appLibraryState = qobject_cast<QState *>(appLibraryStateObj);
   214     QState *appLibraryState = qobject_cast<QState *>(appLibraryStateObj);
   182     appLibraryState->setParent(menuRootState);
   215     appLibraryState->setParent(menuRootState);
   183     appLibraryState->setObjectName(interfaces.first().interfaceName());
   216     appLibraryState->setObjectName(interfaces.first().interfaceName());
   184     menuRootState->setInitialState(appLibraryState);
   217     menuRootState->setInitialState(appLibraryState);
   185 
   218 
   186     filter.setInterface("com.nokia.homescreen.state.HsMenuWorkerState");
   219     filter.setInterface("com.nokia.homescreen.state.HsMenuWorkerState");
   187     interfaces = manager->findInterfaces(filter);
   220     interfaces = manager.findInterfaces(filter);
   188     QObject *menuWorkerStateObj = manager->loadInterface(interfaces.first().interfaceName());
   221     QObject *menuWorkerStateObj = manager.loadInterface(interfaces.first());
   189     QState *menuWorkerState = qobject_cast<QState *>(menuWorkerStateObj);
   222     QState *menuWorkerState = qobject_cast<QState *>(menuWorkerStateObj);
   190     menuWorkerState->setParent(menuParallelState);
   223     menuWorkerState->setParent(menuParallelState);
   191     menuWorkerState->setObjectName(interfaces.first().interfaceName());
   224     menuWorkerState->setObjectName(interfaces.first().interfaceName());
   192 
   225 
   193     // root state transitions
   226     // root state transitions
   203     HsMenuEventTransition *appLibToIdleTransition =
   236     HsMenuEventTransition *appLibToIdleTransition =
   204         new HsMenuEventTransition(
   237         new HsMenuEventTransition(
   205             HsMenuEvent::OpenHomeScreen, appLibraryState, idleState);
   238             HsMenuEvent::OpenHomeScreen, appLibraryState, idleState);
   206     appLibraryState->addTransition(appLibToIdleTransition);
   239     appLibraryState->addTransition(appLibToIdleTransition);
   207 
   240 
   208     HbMainWindow *window = hbInstance->allMainWindows().at(0);
   241     HbMainWindow *window = hbInstance->allMainWindows().first();
   209 
   242 
   210     // key driven transition from idle to menu
   243     // key driven transition from idle to menu
   211     QKeyEventTransition *idleToMenuRootTransition =
   244     QKeyEventTransition *idleToMenuRootTransition =
   212         new QKeyEventTransition(
   245         new QKeyEventTransition(
   213                 window, QEvent::KeyRelease, applicationKey, idleState);
   246                 window, QEvent::KeyRelease, applicationKey, idleState);
   268 
   301 
   269     HSTEST_FUNC_EXIT("HS::HsDefaultRuntime::assignServices");
   302     HSTEST_FUNC_EXIT("HS::HsDefaultRuntime::assignServices");
   270 }
   303 }
   271 
   304 
   272 /*!
   305 /*!
   273     
   306     Publishes Home screen states via Publish & Subscribe.
   274 */
   307 */
   275 void HsDefaultRuntime::updatePSKeys()
   308 void HsDefaultRuntime::updatePSKeys()
   276 {
   309 {	
   277 	QValueSpacePublisher publisher(HsStatePSKeyPath);   
   310 	if (!mPublisher){
   278     		
   311 		createStatePublisher();
   279     if (mHomeScreenActive && mIdleStateActive){
   312 	}
       
   313 
       
   314 	if (mHomeScreenActive && mIdleStateActive){
   280     	qDebug() << "HsDefaultRuntime::updatePSKeys: EHomeScreenIdleState";
   315     	qDebug() << "HsDefaultRuntime::updatePSKeys: EHomeScreenIdleState";
   281     	publisher.setValue(HsStatePSKeySubPath, EHomeScreenIdleState);
   316     	mPublisher->setValue(HsStatePSKeySubPath, EHomeScreenIdleState);
   282     }
   317     }
   283     else{
   318     else{
   284     	qDebug() << "HsDefaultRuntime::updatePSKeys: EHomeScreenInactive";
   319     	qDebug() << "HsDefaultRuntime::updatePSKeys: EHomeScreenInactive";
   285     	publisher.setValue(HsStatePSKeySubPath, EHomeScreenInactive);
   320     	mPublisher->setValue(HsStatePSKeySubPath, EHomeScreenInactive);
   286     }    
   321     }	
   287 }
   322 }
   288 
   323 
   289 /*!
   324 /*!
   290     
   325     Called when state machine is in Idle state.
   291 */
   326 */
   292 void HsDefaultRuntime::onIdleStateEntered()
   327 void HsDefaultRuntime::onIdleStateEntered()
   293 {
   328 {
   294 	mIdleStateActive = true;
   329 	mIdleStateActive = true;
   295 	updatePSKeys();
   330 	updatePSKeys();
   296 }
   331 }
   297 
   332 
   298 /*!
   333 /*!
   299     
   334     Called when state machine leaves the Idle state.
   300 */
   335 */
   301 void HsDefaultRuntime::onIdleStateExited()
   336 void HsDefaultRuntime::onIdleStateExited()
   302 {
   337 {
   303 	mIdleStateActive = false;
   338 	mIdleStateActive = false;
   304 	updatePSKeys();
   339 	updatePSKeys();