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-> |