--- a/homescreenapp/common.pri Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/common.pri Fri Jul 09 14:36:01 2010 +0300
@@ -73,8 +73,7 @@
win32 {
# add platfrom API for windows
INCLUDEPATH += \
- $$PWD/../../homescreensrv/homescreensrv_plat/contentstorage_api \
- $$PWD/../../homescreensrv/homescreensrv_plat/hswidgetmodel_api \
+ $$PWD/../../homescreensrv/homescreensrv_plat/contentstorage_api \
$$PWD/../../homescreensrv/homescreensrv_plat/homescreen_information_api/inc
}
--- a/homescreenapp/examples/batterywidgetplugin/sis/batterywidgetplugin.bat Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/examples/batterywidgetplugin/sis/batterywidgetplugin.bat Fri Jul 09 14:36:01 2010 +0300
@@ -19,7 +19,7 @@
if exist batterywidgetplugin.sisx del batterywidgetplugin.sisx
makesis batterywidgetplugin.pkg
-signsis batterywidgetplugin.sis batterywidgetplugin.sisx ../../../../sis/rd.cer ../../../../sis/rd-key.pem
+signsis batterywidgetplugin.sis batterywidgetplugin.sisx ../../../sis/rd.cer ../../../sis/rd-key.pem
if exist batterywidgetplugin.sisx (
echo batterywidgetplugin.sisx creation SUCCEEDED
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/examples/minibrowserwidgetplugin/inc/minibrowserwidget.h Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,77 @@
+/*
+* 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: Example of home screen widget
+*
+*/
+
+#ifndef MINIBROWSERWIDGET_H
+#define MINIBROWSERWIDGET_H
+
+#include <HbWidget>
+class HbLineEdit;
+class QGraphicsWebView;
+class HbIconItem;
+class HbPushButton;
+
+class MiniBrowserWidget : public HbWidget
+{
+ Q_OBJECT
+// Start of snippet 1
+ Q_PROPERTY(bool isOnline READ isOnline WRITE setOnline)
+// End of snippet 1
+// Start of snippet 2
+ Q_PROPERTY(QString url READ url WRITE setUrl)
+// End of snippet 2
+
+public:
+ MiniBrowserWidget(QGraphicsItem *parent = 0, Qt::WindowFlags flags = 0);
+ ~MiniBrowserWidget();
+
+public:
+ bool isOnline();
+ void setOnline(bool online);
+ QString url() const;
+ void setUrl(const QString& url);
+
+public slots:
+ void onInitialize();
+ void onShow();
+ void onHide();
+
+public slots:
+ void pressGoButton();
+ void pressStopButton();
+ void loadFinished(bool ok);
+ void loadProgress(int progress);
+ void loadStarted();
+
+// Start of snippet 3
+signals:
+ void setPreferences(const QStringList &names);
+// End of snippet 3
+
+private:
+ Q_DISABLE_COPY(MiniBrowserWidget)
+
+ HbPushButton *mGoButton;
+ HbPushButton *mStopButton;
+ HbLineEdit *mEditor;
+ QGraphicsWebView *mWeb;
+ HbIconItem *mSpinnerAnimationWidget;
+ bool mOnline;
+ QString mUrl;
+
+};
+
+#endif // MINIBROWSERWIDGET_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/examples/minibrowserwidgetplugin/inc/minibrowserwidgetplugin.h Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,38 @@
+/*
+* 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: Example of home screen widget
+*
+*/
+
+#ifndef MINIBROWSERWIDGETPLUGIN_H
+#define MINIBROWSERWIDGETPLUGIN_H
+
+#include <QObject>
+#include <qserviceplugininterface.h>
+
+QTM_USE_NAMESPACE
+// Start of snippet 1
+class MiniBrowserWidgetPlugin : public QObject, public QServicePluginInterface
+{
+ Q_OBJECT
+ Q_INTERFACES(QtMobility::QServicePluginInterface)
+
+public:
+ QObject *createInstance(const QServiceInterfaceDescriptor &descriptor,
+ QServiceContext *context,
+ QAbstractSecuritySession *session);
+};
+// End of snippet 1
+
+#endif // HELLOWORLDWIDGETPLUGIN_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/examples/minibrowserwidgetplugin/minibrowserwidgetplugin.pro Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,67 @@
+#
+# 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: Example of home screen widget
+#
+
+TEMPLATE = lib
+CONFIG += plugin mobility hb
+MOBILITY = serviceframework
+
+QT += webkit
+
+HEADERS += ./inc/*.h
+SOURCES += ./src/*.cpp
+
+INCLUDEPATH += ./inc
+
+symbian: {
+
+ DESTDIR = /private/20022F35/import/widgetregistry/20022F6F
+ INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+
+ TARGET.UID3 = 0x20022F6F
+ TARGET.EPOCALLOWDLLDATA=1
+ TARGET.CAPABILITY = ALL -TCB
+
+ plugins.path = $${DESTDIR}
+ plugins.sources = $${TARGET}.dll
+
+ widgetResources.path = $${DESTDIR}
+ widgetResources.sources += resource/$${TARGET}.xml
+ widgetResources.sources += resource/$${TARGET}.manifest
+ widgetResources.sources += resource/$${TARGET}preview.png
+ widgetResources.sources += resource/$${TARGET}.svg
+
+ DEPLOYMENT += plugins \
+ widgetResources
+}
+
+win32: {
+
+ CONFIG(debug, debug|release) {
+ SUBDIRPART = debug
+ } else {
+ SUBDIRPART = release
+ }
+
+ PLUGIN_SUBDIR = /private/20022F35/import/widgetregistry/20022F6F
+
+ DESTDIR = $$PWD/../../../../bin/$${SUBDIRPART}/$${PLUGIN_SUBDIR}
+
+ manifest.path = $${DESTDIR}
+ manifest.files = ./resource/*.manifest ./resource/*.xml ./resource/*.png ./resource/*.svg
+
+ INSTALLS += manifest
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/examples/minibrowserwidgetplugin/resource/minibrowserwidgetplugin.manifest Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<hswidgetmanifest>
+ <uri>minibrowserwidgetplugin</uri>
+ <title>Mini browser</title>
+ <description>Home screen example widget</description>
+ <icon>minibrowserwidgetplugin.svg</icon>
+ <previewimage>minibrowserwidgetpluginpreview.png</previewimage>
+ <hidden>false</hidden>
+ <servicexml>minibrowserwidgetplugin.xml</servicexml>
+</hswidgetmanifest>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/examples/minibrowserwidgetplugin/resource/minibrowserwidgetplugin.svg Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,1566 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd" [
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" baseProfile="tiny" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="88px" height="88px"
+ viewBox="0 0 88 88" xml:space="preserve">
+<switch>
+ <foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">
+ <i:pgfRef xlink:href="#adobe_illustrator_pgf">
+ </i:pgfRef>
+ </foreignObject>
+ <g i:extraneous="self">
+ <rect x="0.25" y="0.25" fill="none" width="87.5" height="87.5"/>
+ <g>
+
+ <image width="75" height="75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAABLCAYAAAA4TnrqAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
+GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAATRJREFUeNrs3EsOgzAMRVGCuiPv
+fwneU0VHqKpUJ9j5+b5ZJx0cnpMgAeWYI3LMGb3/KCDZ0QpQdrDzIOYUWmUPzQILLLDAAouABdba
+h1IBa3OcSCxhDEFywUqD9BQrHVQLVkqkFqzUUDVY6aGsWEAZsYAyYgHFjbR/s2iVEQsoxtC/WbSK
+Zvk3i1bRLP9m0ar/4ZEjKxRjWAF15ZUdoHaBZ71iNwQLLLDmjoBFs8ACCyySHkvBollgLYulMNAs
+sEbthHcsRpFmgTVkBL+xGEWa5VeG0/sPaRat+iTDY5Ia3SzGsaJZuzTM9aLvvGZp72at2i4dMYYr
+goWtt7u9bxi6MbW8ySoZoVqxZgPrdsx5+va9ZIHywBqFNuTQ7P3FENkRKQorAm6aW6+eX5OUlWB+
+5S3AAP7hH3db+S5HAAAAAElFTkSuQmCC" transform="matrix(1 0 0 1 8 8)">
+ </image>
+
+ <image width="58" height="41" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAApCAYAAABk+TodAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
+GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAALdJREFUeNrs2UsOgCAMBFCmJ+/R
+jRsSDYkRqPYzPYD02SEBRVsvbfa1vAacwrb3gWC46f4QGPeqZyQBPhqQEDn0IDHy4kJyZMdKAWSP
+bgmotCJFKKGEEkoooUYnozIT5cmI0IDXNClyTWN0U8X2DlVONPg0zyrzuVOSQktEdzio0r8komJ1
+Jbpp9muG34a6E+oVq7sn6hGrFtH1BlarPeoFPL0e/m7gq+fDW0NWLw+OJmGaikOAAQAEaxk/SH/M
+kwAAAABJRU5ErkJggg==" transform="matrix(1 0 0 1 10 40)">
+ </image>
+
+ <image width="58" height="58" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA6CAYAAADhu0ooAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
+GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAehJREFUeNrsm98rBFEUx+dM8y94
+kmVta/1MiU2S+BtEQpIHSnnx5h8gL1JEJGlDIn8DSdImRdau3daw5c+wY69tM2Z3tpmduTNzz51v
+zTzt1v30OWfunToDAsVE1xTFzO/jKwC01gJugjkJDV6CowkNXga0ExhYgbQKDCwBWoEFFiFrgQVW
+Ic0CA+uQRmEBA6QRWBELZE2lyzKknlVRQBY9SYC1ZLVmRcx9ibp09aSJPNhEbVQrT+TBJnqjXIGW
+qpUfozz0J1dGoW/1mwujksBH5QqSks/7oMhK1zeKDNQ36veob9TjPYr/wPC8XgeS4D91kR3qya1z
++Qt1/b5s1BdKtxDMD6TEZgMUt5ciKR+lS9K+JKMs39etoMookYrQanI7BGVGSVoXM6ispnbC8HcE
+VAeR1dRuBCr2aCmRhSQKq297bdVBSVrmE0zDpvc7oPztpVIY3lfTB11QdXvRJjz3xJzVzGG3+akU
+8ifyZsPSZejAoJfQ7CMTZrNHPWAJ9Bd25sHTsNlYr/URuVKap+OehH0/jhpiMDUKGpy69wysfNJP
+Z4z1H/DknavA8ukA3cFkdZombh2H/TgbdHbUXJ3G8RvqwJ/nQ+59PFApgbFrW6FzF8O2rY/aBzWB
+0SvT0LnLEWrr+RFgANIeQHR191JCAAAAAElFTkSuQmCC" transform="matrix(1 0 0 1 10 21)">
+ </image>
+
+ <image width="58" height="57" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA5CAYAAABnLziGAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
+GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAVhJREFUeNrkmkkOxCAMBDHiR/7/
+E/pPc5pDRqOwGW9wyyWhaC+NFSp+Fv88Q/Ll5BSySENTAEgRYAoEuQVcS8zFt4BOw0YN3elQJqMN
+Qxi0C9scqCEZHZAE5YgJXZNB8i4oB1KSV0FPAkILtjoIVWjITMqQUD5Q9KouR1QtqwWcytWapU/2
+VnMCiQ0bKdpHNfITJ7/VjKqs+sE2YxXVc5Qzwp3IUdeQX2fkTc0jA7Me6MgkQM2Y78CPKPoG6xny
+sU/ra5qaFczudZcmDFeAlptAEa13/psw8AKoyj1SWlEkz9NHe0kNS1oWzNowkKJysAStioXHckzz
+2l4sYcW/7dkwqP5+w04gtgtkFAuIzKErejhVuyh4NvUIGL5YDV1EDVmJa5pHVSFVjJA5R0OHbDZQ
+3KDoUDq17ICjXveEBzYpaDXSZk/eXqTVRWTQUWhEV3QE2jzUPwIMAN7BQw1ftQrxAAAAAElFTkSu
+QmCC" transform="matrix(1 0 0 1 10 22)">
+ </image>
+
+ <image width="58" height="57" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA5CAYAAABnLziGAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
+GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAodJREFUeNrkWEtKA0EQnWrmEn52
+5ga6EMGViIgLf8SFiHgCEUXREyiI4EZEEQn+Fop4BhFFRG+gJiZoTmFGezEyzLc/1dOVsaBIyGSq
+3quurqpucBBl46XD45+bvU1QfdcXFRtpApgEVYHGvY9NGrAJygLMsoFFGEwQlAEnY0uHMJgiKApO
+1aYsWZYHSYz3de0xGyCxVorjEsXG8iQpaks2LUXsMiorqesz6z0Xy2FwFajt58Sqq+uIk06yEZeW
+mMSS0h7yTFkTPVXUj5Xo5hHcsG9GqdeZFOYUVMJBdilG38Q4yWwAMnUUS7MBNqus6r5WsetSIWha
+3CKTQydKhWTaNMYwxj3qFTez6nKjVIjo3lIID9+6N322j3WuTKSDRvMiidX6SI+AmP2dUR3Isf2T
+u0qx1kc5WX8/Uh8KUle0ncFLp+5/IMvaZVZFLUacrPdbfsK6/hwtSvw3X00Ai8Oho5Gqu9XXhFYL
+nLCuPXX+EeLfk55hSRwGVeWcEtN19VEe/Hb/F1r6q/hPw5UKbOWhC8XZzsCndACwfPv+WdYfMPbH
+8r08aCzfnhe4M8qSpTuc6O4Oyq+srm/fpytaGGxJODiLt91KxIWIei06/VAVC/kV1cGyN9QASaIO
+IaIGD977ww3AaNx5DhIcs9INw8FIHfj+0FEMEcWhdZVyOFoH2ysqgoM/174zOhr7AL5PVBR7r8Yp
+x6d1C0itCsdhqIzXQKu9xB2hrPdTSQyuatpQazOnUzXAJ/pNIHUDGM7LVTCyolRS92KmCoZT1/6K
+ypDMdY9ezr5bjY6y8/JZj1ACX829kTgRaIOYPkknfD1fEKJBmayUIqRvFl6LfTk+cVzyuFLB8yPA
+AFDHuVDEzUzkAAAAAElFTkSuQmCC" transform="matrix(1 0 0 1 10 22)">
+ </image>
+
+ <image width="29" height="15" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAPCAYAAAAYjcSfAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
+GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUeNrUkzEOACAMAqmf5U39
+rXFzcVCTqzJ0vVAgJKU4eZwmVlkBVRk0Zts0FAXHKmwaugP3N0Vqt0Mnoaadmn6v6Uz9QpGO1QUY
+AHWdBoFn9+uOAAAAAElFTkSuQmCC" transform="matrix(1 0 0 1 38 37)">
+ </image>
+
+ <image width="56" height="43" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAArCAYAAAAtxEsrAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
+GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAOhJREFUeNrc2UEOwyAMBMAs4i39
+/3v6GapKTaWiiBRkY+/6lEMOjNag4OBwrNbaY+Z9AE/rNSAStAOLTCgPLDLDLKBgwa1CwQRbQYIR
+N4MEK+5fKNhxd0go4EbIooKbalFmXJ9iOcSqDweyrflJsijipFu0D6sopyed4BkalNN7HzRVFXY+
+V1WYFHB4m1D6LLuqqgqjA65O1qoqLD3QavBbVWHpgB7/JVIAvWDhQG9YCHAXajswArYFGAlzBWaA
+uQAzwb5rsrjRZ4SZJJgZtgxkQC0B2WA/e3C0D1lhtwmywy5LcT76EmAAdRZnpsQcRz8AAAAASUVO
+RK5CYII=" transform="matrix(1 0 0 1 10 21)">
+ </image>
+ <g>
+
+ <image width="19" height="7" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAHCAYAAADqF3ZBAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
+GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACxJREFUeNpiZGBgaGCgEmCE0lQx
+kImBioARiU2p6xqo6jKaeZNcr8L1AAQYACc2AwuT3AwCAAAAAElFTkSuQmCC" transform="matrix(1 0 0 1 63 36)">
+ </image>
+ </g>
+
+ <image width="44" height="40" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAoCAYAAACFFRgXAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
+GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANVJREFUeNrsl8sKgzAQRTMl+gPF
+PhDFx///lLpq+wMmhdSILkqtfVEyA/cuohvlcLgzIqkp1l6dYpwo0uSv42EMb9g5caxJG2MHWBG8
+Y6jvrRzaIdo5UbweWCkY/iewpIFDJWAYhrElUAkY/jgbpWAYHZZuGEMHwxg6GMaWCJQ03ZL2R9dd
+xGim+aZtz6yhsyyhO+A5TcMLPM8TWjT8CH5yr1+2owD/dMvhujxWgNeJi2JPzICfP1SWYWC/MlxV
+BxJTibo+UugOv/2l4wD709CFyk2AAQCXFWkw2gJhPgAAAABJRU5ErkJggg==" transform="matrix(1 0 0 1 38 10)">
+ </image>
+
+ <image width="37" height="39" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAnCAYAAACIVoEIAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
+GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAG9JREFUeNrs2MENwCAMQ1Gn6kbZ
+fwTv1Eu5Fk7Fan8k7k+2EApSzvR9dChwKiwpxSYFChQoUKBAgQIFChQoUKA+jfK5urX+OSnP/hL6
+bcyYWgA5ob7e3WFNQN6NigA93T4n1NcpoIGKAsW+fZcAAwDWawmu22GKXgAAAABJRU5ErkJggg==" transform="matrix(1 0 0 1 45 11)">
+ </image>
+
+ <image width="42" height="30" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAeCAYAAABaKIzgAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
+GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEtJREFUeNrs2MEJwDAQA0ErxaYo
+N3vBkIdLuIPZCgY9lfVXVe9q3DMBecqNTLJbLzohUFBQUFBQUFBQUFBQUFDQwdDO78jIRT8BBgC8
+VwueoiHqZwAAAABJRU5ErkJggg==" transform="matrix(1 0 0 1 38 10)">
+ </image>
+
+ <image width="7" height="4" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAECAYAAABCxiV9AAAACXBIWXMAAAsSAAALEgHS3X78AAAA
+GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAB5JREFUeNpiYIAAYwYsgBGXBEwS
+r05kgKzoLECAAQA0iQGdP+VRswAAAABJRU5ErkJggg==" transform="matrix(1 0 0 1 39 38)">
+ </image>
+
+ <image width="2" height="11" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAALCAYAAABVuVzsAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
+GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAB9JREFUeNpiYACC////pzGBCBCH
+iQEKKGQwwEwGCDAAcREKPHaGqlwAAAAASUVORK5CYII=" transform="matrix(1 0 0 1 44 39)">
+ </image>
+ <rect x="40.804" y="18.635" fill="none" width="37.431" height="14.661"/>
+ <text transform="matrix(1 0 0 1 40.8037 30.208)" font-family="'NokiaSans-Regular'" font-size="14.9724">Hello!</text>
+ </g>
+ </g>
+</switch>
+<i:pgf id="adobe_illustrator_pgf">
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ a1fsDJPEGc3LPKmi0zrTMqdUNJKCeVVCtWvPUC+puzMUMpwX0PNqRYMXIgrYYgW+5ne5/KiAVKQI
+Z0ERWpEiZPwFH4lIEUaKMFKE80UR9uUxJHIII4ewxfVgCuQ4UoORGpyJGozcwcgdjNRgpAYvWDUo
+n38NhUx3mMfaMPhIXIhnoNHaCr+27GhtMf6Cj0S0tqK1VWNtDaQfSGUGMomzQyGvnjZzUpGpKmbw
+BFE6p4fC5IhKXRrFY/SKttBDlk9N5OqVP2jV6kchCrREZXXEjjoqqzNX8qigTk1VkIn/VBX8/078
+Hf/diX9Q5m3qfjo7khpNZ9MhjpXyqclUotgbZklKXRrFaECTOW9KJhUmoWhSYGajkknVpjIqmdSc
+JZOazU2bz2+bHc7U0/QteIcjFFOtdosjirK0nu4If0bVKiUSwumPFlGKydzEZK6AveaDpTqKoYX1
+SL3JmB+Hiz18KltSewQPgZ6sk+0kTw60bViAIThHdZj3cYRagqM6h48+jowGxkqCcxTCTJ1soJWa
+ngffKjZ4WuaqFW3xeanc2ZjAcj5dHJ9IFUP4iJFRbs1Dn+kJdHTpdLpURIfzc3E4H7LmazNHi6LD
++ehwvsqQRYfzpG10OC/5iNHh/NxpYDie19TOcNo4OpCvLqnRgXz0DqPoQH5aVj86kM81e1g8OpCP
+DuSbJ3YXHci3ku6YlwfWI+nR0VKINya1it4Iy1erqY7g8V82Ej25LN6EZkOwWNGx+XmlszIY7v0n
+vk6N4vFsKpPJnQnMaCY9Nl7EDdqTUNo6OK/l/Rq2bw9u+Ur5UexWh5xTf6+Alq/ZDM58jiNG786O
+4ohNFEek6rdzLJ9KZTuxo5fqTGdH0mO5ztPpXCZV7MynRjpz+UR2LPhyjAKM1UW44QHGMLYzijJG
+UcYoyjg9Ri7cKCNygp9DJV6fnigV67yG0zc/vEOjRNAKzlwqg/8VLmYldWlwwKo3Tfa9cTAXDU1G
+6qUb8TizWy25JOZl8KwwmUpie5Cfz5c9sOd7wUQl0HkPSzQ9m0zC+x6YxN5VmOhhZc+GsRvcXnGi
+wwdLK3tGQaco6BQFnaKg05QRFwgx0aATi0CR2FMUdIqCTlHQKQCfUdApCjpFQacLIeiUYVGY+ZWl
+EoXSaiyuuSJkkG3TWjqWNr/vpE8nqBYFDJsnYBhVh2l+DRKi8kiLVIcJUXkkqg7T/By1SHWY0NnT
+LWOF5/cbkjLp4kAiXS++38JGOKoK0zrGOCrVFhnjppa6FjHG09s4topBDm2yWs0WRyXaImPc8iXa
+wgtzVJ5tulQ0koL5Vp5tcDwxkjszn16cFtUtm+aePyqO0XIORvCSilEdicYvs+AvEh6po7R8OYgP
+NE7+QnB0NgRHZ1tEXbSKDsyNjhZSRVg3+dRIODU/A43YSF1xkHB8IW5EZjDX83pH0mzzdN7OWVpn
+iqJNYytsGtuRuS6wvIbwYxroxoRiKYQj00A/BhlqcJbOpEfC5ISy5g1jTQ/B2niqfv6ozBtv3yjm
+vJDMPCqXH4VkopDMhRKSsaKQTAt54c68C8mE4CgKyUQhmSgk09RzPa/3+802T1FIpmKKopBMK4Rk
+YNNYTIRJM4q2jPNvyziaTySLicyBXDrExQTaPegwiYc1hMHknCZXNYalkFGeFrjaHIKlVtvbhygo
+lS1NHMSr8XSYmixyn0axqMaC1wgbThRS/fnUqVIqmwyxlyzr1ihOs7nBYrqYrBP39sVroPnhdCbM
+nPo6tahhmceVwcKI+2g+NxGCL9K6cXwFf8VQMRfCAcg1jqeoiFsrFnG7YAp9hbCGUZ2voHxGdb6i
+Ol+NqvM1V7Gvw6X8cCmDtUQrR0nnaxGiMBvyFokxRHV5ztvanldR5RBZVq2R5heCoRZJ8lPnb5Jf
+GNZaMMnPcwKG6tT2iE5tpoodtfypTVH2BuffmQ2wN2/PA4LnWrXucYAanQfUYPe8nQdEG9ELcCMa
+SnFGW9FoK1rNn4q2otFWtAn3a9FWtEm3osF9vWgrOv+2ovM+gXBeb0aD12Jp3c1ocB6jvWi0F432
+otFeNNqLRnvR2S4WMu92o6FYapH9qDl/96NhWGvB/ejRXG5kLJ8IoZ+jzej824zO7/fQhKtp0CI3
+v+Z1XZfgW8+orkvjtUdUajeq69LAWh/zTrVH5WpaSPmNZrAH3Z7MZXL5rcOZRPJkp0JBuclEMl08
+uzVMILVQPJsJEeBnzRslp4Tpebf6wnHVoguuH0S0JdfbjOo7tUoMOOTKahFzXSC1VnvmpdZojM2O
+YvlNEstvNi05L9390O+BbhHdEZavVlMYwStJsZHoyWULxUS9t3D6ttblHZufVzorg8lEGI/f16lR
+PJ4ZD1NgIgNnHLhBewCnRma1vF+juA2eplco5UcTyVTIKfX3Cmj1ms3eID34MCVen54ohTkCFB0a
+JQJEFOdf8TgreIW1VAb/K1yMXerSYFeuN02MQpwdzjYsMwMTQqxUnGm2yLNsFs9yOi81bzUvLLLa
+c2q1m71GJhfxvgcmc9lUGN+6smfzO9ec5vA7icqekUvWrC5Z5JFFHtnMCBlkq72lXbL5nQ8/Hd8s
+8jubx++MjguaX4MENzsn6xRQkicH2ja/q3iyTlMfR6hxHIWYozoJJz6OjJbgKISxOtlAWxX6hKpl
+rPD8zhDPpIsDiXS9bWILG+FEPl0cn0iFeWtRZIyb33S1iDEOoegjY9z8Utcixnh6G8dWMcihTVZk
+iyNb3Mq2uBVj8NHLaFvD5TofyrR1ZmdOqWhJ+Zj3xbqmd4TQGg7F4fBFv1vNpbgA3pUZ1cauyW5U
+j6yx1mEigdEFrzLSSnYBKSr7r9o3AQnMO/kaQkp5+xayHa1iFnfh3oX6SW+tf9eVXDjcz9do66mX
++eybXRAXJqNqNq203NrnXzmb9uCuc6vUszlfMbWGMHcwKgDTOvpiBpPVOqdN4Z3FVllrcD4Bk3d4
+Pperj3Iwm1+PTEsQW3GVBb9I22rLDMVCXDuLXP2GL7n5bdWOjaby/el808R3mm32i4nhEDPfSlFb
+TQl+HkRG4UjIsKyvU4O1UH8pmzzUkupn/gpgzFZU5cISwV2RCDaXCKILTQl2NzS5h2y+oDzA4Xwi
+WxgN8gqaJlwP073m0ipxnGn5ha3k9NIJPF9ubxTMiYI5VeeIpDp2ZTLR3mtWl2qUdjtdKhpJQcg3
+0q3r2oPUob7siHgzHYGZABo6kMsOYCykxFQ7g3enxtJZ+ZdlSw5Mcjzkx8GzE8O5DBwbJvIbl6lK
+17IlqnLszLIlJfhyEP7gWU3HzsK/9uJv92PYGcVQ9ivHT6jKCO527NCyJe2OajsxR9M1xdE0PYZ0
+5CgT5XAUs2zNVQDoxlzV0gGoxgxX1QDooJhmIE0C9gAGDekx23QcCR6ncDOmuobtQ6IhK4Zsy/E9
+TgYy2hhmATfsmGM5ArMHd2O6ZiPF9zhTjZmq6yg+2jiQYAZeLN2WG8cpXI3pKnJ8SKQhMpyYq6t2
+GdCOGTayGebKccaYu4dBHtvuzILkjChj+cRIGnudimNtVNrVmIoM29Xw7LW7eE5jKu7qsrmlf3Zj
+6YB28MHM6mrMcvET25GBYrqpmwr7zSKUWZwCzINrGkg5NuHvrscMS7fqdseDYZh4wruTvu6aEbNM
+PPr1uhtWzHUcXeme3tM1LabrCJGnj4J4d3fzKVINPD64hRHTHSHIElyPqTbSmcwi1TIoOlV1yHw6
+WsxAjikBmbhpMdOR28a5fDsuJljGoSEDD63te5gEY4QxtByMB8RClhBiAbZjrubYiu9RIGmuRpcM
+J4vDmAgLLjg8zkWbsezhkAbHe5oMZJT11BjhKUTYMIkI64Zm60iIsO64tlFThDFJOl40rotXP9Ix
+lQjz7JMCh1NgOljp4A6yCEN3N4alRKvb3cWMafgxIESYNrwiLRXV72baMd21TSK6wFJMNTFD9bsZ
+mCpb590QHhZNr9vLMLE2wzNStk4QwtMOqq1Od92IOaYpaMXCghdu/YHFcqtZjuV7aoiBxSrdhnnx
+rU4wTBhM9CZWPY6hI4P0t/FX8kUHecRqBf8fa3CsNvEXrEsszVaOJciyUPFouDaYHiwiqsuXt6Zi
+cgxThsfL4IYacwwPLvDUgkt4RulPKGYYLugerKN0QxeP9row+BSo/HhqwT08o2WoNDdmunol1xxe
+znVNkmrAJTz40XcuW+IqbRuVY0fJ93VD2L8s+v3pdUPcK8auiT6A/dFUPgtlFfPFw9ydWjekKh3d
+uVzG3ygLwaZdpfQIc17XDaFKVIewr1Mo5snpoIQQfKohiTrPwWJuUQ1PSdmfKxVSSm/uTLa60xQz
+QNxAAnUsgCoIuK7bmknsEAJhBJnkQmziXwwXvrgWFmMipZHf1Sp+1+isegzuzD0G/8MkWKXHINvl
+eBl4Jh6D22iPQd8IK03HYk69BWwpDNvEhnIKj1czsZnAi5aZJaOmLcXfEBgTvy3FSk9VTVS3u431
+NZZw5i6ogR9HbW/Y9u0G9q+1EFyJbqoGnl/dbnrMxGrL64Ys07DrdsMugInnUPJibFtz6nczY9z3
+mcbIY7kxXdfy+xPYSeAq2qXqF3+h3gLGYuEPfLHhF+JRMFVNlLgeORQNciha3okoFYu5CuehBMqs
+a1J4ERpeuFiu4T9JTC1wLYgnAS4v+UlFroVC+w1Ic/DOhYy7haccbxQn/GCsEfEmC1YRwkKhYyuj
+EANNjDICjaFaHihJOuPNlI00V25owU5HQ36EHpA/nPb34Fj9O/BIH1LTxAbZNf3P50CKwSNVaix4
+krBWsM/1Ar/OB//RFY5AAg1iGMvGSsAxb47rGmywHKTCthnZ2BfRnbLhYkAxYJqqI39jy4oZFvW7
+PLQesGzIBBwzp7lI8WHFG0bTtKyyEWNAMWKMXqmxx5mHtXIU6JAhn9RFwzXVcIHLwkWse7y6+4KQ
+uVGSQr/LghxMP2x6iTPA/sHJtWV5Bjvp3ziDolDBxBlcifANCnGR2IbEElsU+qOsWBCfYmxrNYuH
+AKUpJnCNOc8mdroIbRqeK0ujkQgTQVwRA7HTp9smBRqOyhewqePNiMYak+ggALEnbrLtgonomAMM
+mPdIYAh4WxM/1jaoCsFIddemk2YbmuanAIBIdRkCQq6jUbhlu4RcypjN0CJdV6qOQg8Z8+oGqmN/
+onCSfj22Hf4sUZMEOh/+llfRuiESw+9PZ1Jbxb+IFTmUKNDY/xA2OXg+dhHUkP5KTujPKscOAOS4
+mDEQehVItJUTimYoRHiOjU/RCEC0If3TkaTQUIjsEZrWEYJ6E8XEVkU3MOzYniUXTeuzxunevS8e
+37e721njQZVt9+Tf+DsPvfOdDz/4psLxztUMfNu+zFse/cTfffbJJz/3qU88+lsn9ygEvLIn/Tv/
+61P/9M1///73//2b//SpP31LqmslwNffceYP/uoL33r+xVdeefH5bz31F+8uDqwD+A==
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ ezn8ef8goi/IGeJkUNrjJLU2D1RVJtZdIMHN9gxLB9G8N5J+yKl7Yl0k741Pn0iQxXxQ5e+9Wfgn
+SrcieW/sZpTVbywuFz5zVu/N4czeG53SxOWNxVkdHN+HnpYeI2xCJgjxR6vRvTcefgEYHL828+BM
+741byEj4fLhQYecB50AdzsN7g8lwjiTZ6N4bkigY7L0hYIJwI4fAjX92kKbZHEZPEPJWpHc3Tic2
+RXqBZnoFhOmEUaRBx1vyHLUeDBsqZWz62Ah7RNfwaBYPkHVwicAI4jCDixI177nebJzFQwVDBKWx
+iSFTF4NS/EIF6BoqhzsTY4rfrAHziBji5fD3vQeGnRgIyocj6JDhgAmXDdmLEOcOhtu6mCUzj7XW
+mOS86GF7togbW2aeT9j1PDPzAihtXpl5xDU0Y4J6iMy80MGws2XmmTq0JTlvpnG5ZObZjMKQWeqR
+M/M8Q63mm5lHdQGPPJH5ZeYRSnMm5wUuZhEz89zmhg0bnFNmnq+15rEvVDYPZA6rJy545K3NLfTy
+ioRehtE6w4ReXvmHXoaWAteDWbL/jYBLEEmpmXUM0opbHHLUzWLaUOQ8MKfPhjY06xEApBWTGYMi
+74NDrDHPz9tfbou8Dxdi3Rw6+RHKAjKBaAxUGH7EQIlZ7Dbq68QUqHnx47XbMThBMs2TH69DhUIH
+qeqI85lP48BlPe2IgZq2oRBn4QSauLShWfMyF2g2UXp2fsRWQvhswin+tDXvDVyPpha8j55ccznv
+GDPNGgFqtpvZveCWJPvwM4ckWX6RDzRxwyfJ8oth0lp1MyooSZZflKY0bVhnCuK853/sVqjsvjkl
+yd7MK0n2Zi5JsjfzSpK9CXvQtTV20CuNzHnQtSUEImT8EhvOs+Zy0DUmhV35r2ihQ3steXkzxgq5
+J+Uxy1qYWKFpk/L0ufE08OeTlKezpyM8Zb5JedPanhGT8jyc9/NOylvwP2JiXkl5xJIOVBpDaIyO
+E5ItQoGYuKZcCDz9HvXlKU6/99bTOuM5HQmnIW1OjmeSRud1IGN0zaac9XZpevoz2aghWzpdgLsk
+8ORhTIXU10BTQvstFwHSDfoUQBZG2LV/MIKpJ+FVeq5Urc0DvWb9LZ7pn7Xi6eunajxTFJ8ATDxz
+WKjirfJl/NWk163Dn7146iV7iHfPl/EPXjtaWDZmddXWae2XJQ9tNOZXRlbPrTXtTloUNgruCXBb
+i6t+aXfZDEs09mS/1JbwdsZKDUtS2NLV8OveK+3uzu8Kvb8ByX6vfy48oa7yh60XL6hdt4ywBfOe
+wtIFM1xb2t3Se8+UkPZr5XZ+lr+Nsdqv0Gv6JfsBkre9k/24WoH74wFVWVo+/xaevJP9mr7JfmPJ
+G2o9/XztCRVvzX1f8Er224pn/aA21jyhjsZXO3Eb1AUz2U9Ziu89Zi4tU9sr6PDJL20ykuW77neY
+ek+/331LBLFHVWXp56l6exLYpPyuUZ+2mGLW00PRVFF1f5ru1Ek4T2es/XrfFhUivteh3LrsMt1X
+gu45CJdcRJB2ulbz8FNFvAPNM2TGK6LLO7nIqiCHzDh0egdnvl6P6ZPhizJl2tyu15vabVcJH4kZ
+EGeDN8WtexplLrGDfnfhOaO1g9x20W7W8xzhQsBdeJn5jNBFVZ86K3bTO4ZVd6aERnxgjHZ4vtkM
+uIPCNbTWlk9szerTjMJ5JvbN7rMJldjnZiW4ue1mTOyzDE7L6nPXoWdK7HPzIppBfXNL7LMKqqp+
+iuK8E/s8T+eZb2Kfh7t73ol9Mx5mEjaxLyAScl6JfW77PK67uLMl9rGV9aw+z42V6RP73FwyC+x5
+nfNJ7HMTtgv/zD2xL9QZXbMn9umV2aw+w8Sd1iHjTOxzW5zYwLE5Jfa59cnc+p5bYp9bVh8b0TWn
+xD63OdT4Zp6Jfd6bxXNN7AtxA/M8EvumQ1rkxD5fpM0vsS9Ums/siX3hM71mSuxz00lZS3pOiX1u
+DRhxNvNL7HPbbKGOrrkm9rENOA45nV9in1sam8fGyiyJfW5Zfd7rzdSJfW7ocPeqz5TY55bVp7On
+r+kaLbHPbUiGqu6lr2K35JltRLKxMu5krXu3BxHPnPK+06wft5lRU+f0ubK9j8oxp1v8fFWO+d3i
+53aFn1PlCImqtSheliTLN3ZUBWsbIengPcy9uJZueffJVyi4Bfj7dCtSui7TJ3vICHYrSCsI2yc5
+orDxQ1VDeggrbNgVxWoybU/sJhOmdgUFdjt9Zq62p+P+v2mS5yyX/7nH2YTV10Nf/rfwT7Cn+ftw
+5sv/FvACwcD7/8Lk9PnGXISMh5718j9dT/O//2/my/+iOSGnvvzPxQnpcv9fpHwpt8v/FmwHnrvf
+/xd5++nI5l1YmOqMLlBavQ/DiprjIe5e5UMk5IZIbiJ5BFEijr0Gl/QfnL5HEJjT5x7hGC26Gybe
+N7UpbE6fp8S1BcAE5TuGycoNSo878g1ujBKkhhmPFuXak6D97htjU5rarTVHSlO7ZaeIhYBTrbw2
+jDBX0eremzIk/vR7bqFWJAtvbqFWp99hQ638s0ParWlvzlywJWImE7MuOqSV9UASCNlQtI0dj8Ax
+bCg9l3FlwiUwhwgcw9YCgtnY7dUQ2b5J53bK7eU8jzeE1ma499kRRH4ZUrCxi5knNrurQi7c3LDG
+po9msUZOm7anUKwXN/xiByM4C+vXgxB6fXBiDKx3ARckhfDqG95BaC2UJAlzueP40x4YOZUUcBzr
+PH0i5ow6ht6Kb/holIbmcYwBaWjqG77NVvQ8As+tuUhhsRigwbm5DqbeLF5zOYMZkwLLrjiM7ryf
+6t4/Z2SK7eq/KfnRaEqILtOmv/cvlKo++71/C0Yi5hz40fvev2gm7tT3/jmWNfvVf9OPi2XGBe/7
+CEJkp4S+9491EPvmbkx371/Y49sxBes8xCFEAWlhBMy8sn1vPJWfBeMUxfDZvjfRbW+3iC7A+Ryy
+ffnFjJl6vzD1GV2kobDOL7+ILtrQPBJMMY9gDtm+0JDPpki6lDB16DC5VHiLYGD2vVsilanZ2Pmx
+NXLyI5RN5wZzxNlgoty950k4exETqTYSvN+y5plL5YHN1sjfumfyb0IY+NDadNa9K3u2RqH82yES
+qTYSytxsT5jN64Bbx622p4cQu/XNJw6jMVrcD9itkLfohdIYhdJtM0M0RisYe8THtBZcZ2yTUbZY
+joh5t80Ql2E6z7z3y0z79LebAnZ87Ej7CZEpG+oyzNLtZMWm2Uydd9sMdbRW6AsEZ7kM0zxiAu/p
+m1feLfTJJemWiYEKnXdravMYy9sYuwDUdEJMlYqvH23injRJGMQsw4t4utW9jK9fFhX8darlGR61
+ZC53+5nXFqLtwSeLNN0XZU3fStgy87RUEuNquhzHYtWSmTdeWx4M2ZXPcjVdorN8/ul1+d8DgPFL
+CXxyTUTUcuRKyokHVGVpuS9utiz2jTUl8MkHaj0ue0Ot10dNA6o9HxDALP0ovw9eOXI+mXnq2R57
+w6I1Ry61+XXF5AMu0NvjGCSv792sD70uxGv6Zea9cZ5QkW9qj/te6Y/K0spn7rrjBbXtd/kft2F1
+dNlTAt8Olzyhxh+WlCsvDKc9oQIYGO7Bqm1qkUczBD75paeE/nZD1TtZ6tnqaQuBo+riyXY8RJOj
+39bnCrNw4qgd6ihwsC5s4PN0wuaB8bOvTs5dlj/v6MwFekndt21HyfS5houQ8r5dbGhXoIKjkbzT
+ovYCYuY0iyBEtwJi6/33ypiF4L4yc+CW0Sd7IKuX5zZEqtB68TQedvro3Hiiai1MjFvI9LhogVs+
+6XEpzz4Z/rTwVLWZjj5CV3c3JtuFjQ0N6lM2kG/CJwAGxoAt/LMSsluu/uWp+MYvDOzkyj0O12aA
+N9N9u9xC3/RCQEJZONHVTHtnbIf33FZn9oUxSHuqzmsTvJlZtA1umm2iavQjdt0M9mZ6yM16CCUm
+yjHWte7rnGJIUTzS3lGqmJI48+m6gJjweWuBVg225h0DFsqfZkvldZ53VwuRxxtS2LQXbz0PEopq
+Sddm2UN35P5ZxKk9nCfaQV0134P/GWfOgpbsF+yBSTkjErr1wJMhNCWFMdg98+xU7xuNwya06RuS
+Dg/nDDfVuRwPwYjOiClQYa/E1UWnT7cmu4deq1ygqm6/b80q/qfISzSSEpdDnC8QOi+xH3CVjdsc
+ukcN1UOkCoWniPpFfyHomp0IrflcJKTFC0RpzbrKzIq0oGyiCB1r2a9Gnqk1nx3QKZDW85QWjixm
+62bx9CmJYdVGI/9mupRElj398hHZPYIpUhLD5iNa1MHoKYlh8xFpgP/UKYlBRpbnfdLRUhLD5iP6
+xdx6zNI0Fw3aox8ipiS6otRFgix4Z3qFSUkMNg/t26tTpSSGzUf0sKS1HjnHNeVlhaYU+K9eVrjg
+kSQ758sK/d0Pc7uscOGfsPJjpssKrTLtv3ZZoW1D8r91WSGdG59uzeeyQhqiGDpZedrLCs3I+//q
+ZYUu7gfSLR+9mnYnIGPZdtvhgnmt2xxOtfK87TBatJ3PhYeRT7Wa7sJDj8Fptx3OFNrLXng4fQxU
+pAsP/W87DHJChr7w0N9rsRB4qlXICw9D5HvO48JDHUHuTg8HQU974aH/bYe64THzhYeREsrmFBPp
+uO3Qbb2Z6sJD/8EteN/vGe3CQ6+exLk5XH5iXnjoPySyGzWPCw/9OHh4tOB/fHt43ISItpvHhYf+
+bKyp6rNfeOi/8lnNqBkuPDR3zN1uO3TaN1NeeOgfl2WEXc964aFv2PUFkQLzuPBwLhn5wRceRrqn
+cPoLD9lWfCO6Zrvw0NGKJZl3wSdJNtKFh/77MQv0AsHZLzz0zo7B2w6ZPYJZs9X8bjs0ZdqMFx76
+7vOkbFt401946B/i7e65neLCQxfeZ247NETn9CkXVyH2ykwpMOOFh6GlwGwXHhrJka63Hdp8NtNf
+eBg5b6031YWHrq3YD9Kc/cJDpynM7jaHCe0NdeGhfwyt1XM7w4WH/iePLOhXh8164eGO722HC0bS
+0owXHvrvXXuHJUS88NBjXrXbDmdU1c0LD2dNxw554WGgiTufCw/9bzu0LWsRLzwMc0WhT5LsFBce
+eqcGY/SHxjezX3jolq9lzsQMMs164aG/8mP4bGa98NBf+dGjH2a+8FBHuPtth9G8gz4XHkbMxZ32
+wkP/2w59MlaiXXg4bUSXy4WH06fqYxD5XC48NPnR7bZDGtE1hwsPU763HdKIrjlceOimGpj2OEXa
+HC489LfuKdLmcOGh3jH32w7D+joDLzyc1vaMeOGhV4Ykve1wPiGK2Cff2w4X2KP1Z7nw0F9j1EMU
+Z77w0D9J122RnurCQw9sarcd+utpES489I8+tmo2Qadw+Vx4GF2zmerCQ4/ZbDki7/1a82DUpu8a
+aI/rnMeFh/5rhem8N5YL5wHLZSh78044pxzsDCMZ2jSb5yTn4hG+9/MIB8T7W5Moaw==
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ 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
+ ]]>
+ <![CDATA[
+ yMIq3d4EJhVwf9dgSu2ZMiUn090yUkRd1AWZJxuyMt3OQxc0rNZk3wXda7RIUYjgElGkwqNK/Fbo
+fQJdEtsgDjnt+YVwtsjTJAFaRSEecAwp4PiYTRK4iwu7UGGkmV5kl0t20cVIMzYRRC+i250qVEYl
+BaZHEFCY2WYwwDCIplq5kAcptBMIKYxGIuQTO5GYhRHIhCj5dkIh+3w2UiFldmIhhRHJBb6JSDCM
+IWLSh5ZcYyUagoKoZEOVChvhMIWhSWdeeqglz8PFjJEYGYQ7qLjpTcYjk8wGvUinlwZThLqamkd/
+pUDUjbxMlQtF0J5Y1ULRMvCAjDhR0mvAkyKDEZDHvVmFKAgmRXOiJsFM3AiKrrTyVKWRFXylkmQA
+oqyoNLPG0GdU6rVltR4sYtQtvciiOOWlmEW3yiusuqUjiHVuFEjQDsanqDLZu6a0C73nJUIyvEi3
+QABungQ5FKg3knZFVFWqnSq4cWROBCeplmcCd66ixWXWzUJm3pnCMDNv8pQx91AUdfZtkk9QTHU/
+IgUwuXImDZAxRaUCixtGpwPG4xKaEgh0Oy2QwqjUMC9pIZrSYhZlRicGsgzwBSJIeCra9CJKOxh+
+I+SJkWLgQaA5byy+JF5nE5nk4OXplqikmWi6fLbbVGVXw0umbiS9Iw1ndxtzZS8nLkiwTzRskKAu
+Oz4o9UbEiOnlY5c6F6w4u96YH6FFWpZY/YGj9rRWRHom6+EO9pm2GoKWErKPCq1wIk0zA8ImCoap
+lNAdVDvs+ZKGc2BmITM0jylzDI8tCztAZy/mOMuaOCFHXOIBBdgEF8vhSZd44iV+RR7BDjvod3v/
+qxVcTAajf40C7AV+eLuNTdNTAyr2lCZYAEhMAgZeoceIqi4kJksvaphFSoGG1TXMD12KmA8BHbep
+hX82Y7nyoP/60f/ov522J+/aEZ7uEdvGRDfQisZDGKr9LjkmIUOOVzwQ6akM5dFgOAZWGPdGXUB2
+LIdv+gMsPm6PPsexz/7gf/qx/mAS+z+WIxR03yJFyXkEmZ24PwfI48mIJHg+Jgn73d55nceArkjn
+iQyZArxEH4OIu0SApAv8IkMkHPwrKloZi4pf8hl0SPuOBlGSDwt5+iFPtwGcH6Jng3yINYwP4Qf9
+En74fcrpX3Lmh7Sv+MO1s+zv/yf28apNGsyiNmUrK6ftt97lqP3xhedqvI3b/+nF2v0+Js72hvAq
+9jbqjYGYe7Hx++B/sAQ/Mj5YWame1Bb++X8B1IaZMw==
+ ]]>
+</i:pgf>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/examples/minibrowserwidgetplugin/resource/minibrowserwidgetplugin.xml Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<service>
+ <name>minibrowserwidgetplugin</name>
+ <filepath>minibrowserwidgetplugin</filepath>
+ <description>Example widget</description>
+ <interface>
+ <name>com.nokia.symbian.IHomeScreenWidget</name>
+ <version>1.0</version>
+ <description>Example of home screen widget</description>
+ </interface>
+</service>
Binary file homescreenapp/examples/minibrowserwidgetplugin/resource/minibrowserwidgetpluginpreview.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/examples/minibrowserwidgetplugin/sis/minibrowserwidgetplugin.bat Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,30 @@
+@rem
+@rem Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@echo off
+
+if exist minibrowserwidgetplugin.sisx del minibrowserwidgetplugin.sisx
+
+makesis minibrowserwidgetplugin.pkg
+signsis minibrowserwidgetplugin.sis minibrowserwidgetplugin.sisx ../../../sis/rd.cer ../../../sis/rd-key.pem
+
+if exist minibrowserwidgetplugin.sisx (
+echo minibrowserwidgetplugin.sisx creation SUCCEEDED
+del minibrowserwidgetplugin.sis
+)
+
+if not exist minibrowserwidgetplugin.sisx (
+echo minibrowserwidgetplugin.sisx creation FAILED
+)
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/examples/minibrowserwidgetplugin/sis/minibrowserwidgetplugin.pkg Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,45 @@
+;
+; 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:
+;
+
+; Language
+&EN
+
+; SIS header: name, uid, version
+#{"minibrowserwidgetplugin"},(0x20022F6F),1,0,0
+
+; Localised Vendor name
+%{"Vendor"}
+
+; Unique Vendor name
+:"Vendor"
+
+; Manual PKG pre-rules from PRO files
+; Default HW/platform dependencies
+[0x101F7961],0,0,0,{"S60ProductID"}
+[0x102032BE],0,0,0,{"S60ProductID"}
+[0x102752AE],0,0,0,{"S60ProductID"}
+[0x1028315F],0,0,0,{"S60ProductID"}
+
+
+"../resource/minibrowserwidgetplugin.manifest" - "!:/private/20022F35/import/widgetregistry/20022F6F/minibrowserwidgetplugin.manifest",FM,"application/hs-widget-uninstall+xml",RR,RW
+
+"/epoc32/release/armv5/urel/minibrowserwidgetplugin.dll" - "!:/sys/bin/minibrowserwidgetplugin.dll"
+"/epoc32/data/z/private/20022F35/import/widgetregistry/20022F6F/minibrowserwidgetplugin.qtplugin" - "!:/private/20022F35/import/widgetregistry/20022F6F/minibrowserwidgetplugin.qtplugin"
+"../resource/minibrowserwidgetplugin.manifest" - "!:/private/20022F35/import/widgetregistry/20022F6F/minibrowserwidgetplugin.manifest"
+"../resource/minibrowserwidgetplugin.xml" - "!:/private/20022F35/import/widgetregistry/20022F6F/minibrowserwidgetplugin.xml"
+"/epoc32/data/z/private/20022F35/import/widgetregistry/20022F6F/minibrowserwidgetplugin.svg" - "!:/private/20022F35/import/widgetregistry/20022F6F/minibrowserwidgetplugin.svg"
+"/epoc32/data/z/private/20022F35/import/widgetregistry/20022F6F/minibrowserwidgetpluginpreview.png" - "!:/private/20022F35/import/widgetregistry/20022F6F/minibrowserwidgetpluginpreview.png"
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/examples/minibrowserwidgetplugin/sis/minibrowserwidgetplugin_winscw.pkg Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,44 @@
+;
+; 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:
+;
+
+; Language
+&EN
+
+; SIS header: name, uid, version
+#{"minibrowserwidgetplugin"},(0x20022F6F),1,0,0
+
+; Localised Vendor name
+%{"Vendor"}
+
+; Unique Vendor name
+:"Vendor"
+
+; Manual PKG pre-rules from PRO files
+; Default HW/platform dependencies
+[0x101F7961],0,0,0,{"S60ProductID"}
+[0x102032BE],0,0,0,{"S60ProductID"}
+[0x102752AE],0,0,0,{"S60ProductID"}
+[0x1028315F],0,0,0,{"S60ProductID"}
+
+
+"../resource/minibrowserwidgetplugin.manifest" - "!:/private/20022F35/import/widgetregistry/20022F6F/minibrowserwidgetplugin.manifest",FM,"application/hs-widget-uninstall+xml",RR,RW
+
+"/epoc32/release/winscw/udeb/minibrowserwidgetplugin.dll" - "!:/sys/bin/minibrowserwidgetplugin.dll"
+"/epoc32/data/z/private/20022F35/import/widgetregistry/20022F6F/minibrowserwidgetplugin.qtplugin" - "!:/private/20022F35/import/widgetregistry/20022F6F/minibrowserwidgetplugin.qtplugin"
+"../resource/minibrowserwidgetplugin.manifest" - "!:/private/20022F35/import/widgetregistry/20022F6F/minibrowserwidgetplugin.manifest"
+"../resource/minibrowserwidgetplugin.xml" - "!:/private/20022F35/import/widgetregistry/20022F6F/minibrowserwidgetplugin.xml"
+"/epoc32/data/z/private/20022F35/import/widgetregistry/20022F6F/minibrowserwidgetplugin.svg" - "!:/private/20022F35/import/widgetregistry/20022F6F/minibrowserwidgetplugin.svg"
+"/epoc32/data/z/private/20022F35/import/widgetregistry/20022F6F/minibrowserwidgetpluginpreview.png" - "!:/private/20022F35/import/widgetregistry/20022F6F/minibrowserwidgetpluginpreview.png"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/examples/minibrowserwidgetplugin/src/minibrowserwidget.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,221 @@
+/*
+* 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: Example of home screen widget
+*
+*/
+
+#include <QDebug>
+#include <QGraphicsLinearLayout>
+#include <QGraphicsWebView>
+#include <HbPushButton>
+#include <HbLineEdit>
+#include <HbFrameDrawer>
+#include <HbFrameItem>
+#include <HbDeviceProfile>
+#include "minibrowserwidget.h"
+
+/*!
+ \ingroup group_minibrowser_widget
+ \class MiniBrowserWidget
+ \brief Example implementation for home screen widget.
+
+ MiniBrowserWidget derived from the HbWidget and implements
+ needed functions for the home screen widget.
+ As name suggests MiniBrowserWidget is a small web browser widget in
+ the home screen.
+
+ Mini browser widget demonstrates the following home screen widget features:
+ <ol>
+ <li> home screen online/offline state, see \ref sssection_isonline </li>
+ <li> preferences, see \ref sssection_setpreferences </li>
+ </ol>
+ It also shows use of HbPushButton and HbLineEdit widgets.
+ @image html hs_minibrowser.png
+
+
+*/
+
+/*!
+ Constructs a widget which is a child of \a parent, with widget flags set to \a flags.
+ Widget creates two buttons ('go' and 'stop'), text field to write url and browser view.
+ Note that this is just an simple example so this creates child widgets directly to the layout.
+ For more complicated widget layouting, see Orbit documentation and especially WidgetML section of it.
+*/
+MiniBrowserWidget::MiniBrowserWidget(QGraphicsItem* parent, Qt::WindowFlags flags)
+ : HbWidget(parent, flags)
+{
+ QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical);
+ setLayout(layout);
+
+ QGraphicsLinearLayout *buttonLayout = new QGraphicsLinearLayout(Qt::Horizontal);
+ mGoButton = new HbPushButton("Go");
+ connect(mGoButton, SIGNAL(pressed()), SLOT(pressGoButton()));
+ buttonLayout->addItem(mGoButton);
+ mStopButton = new HbPushButton("Stop");
+ connect(mStopButton, SIGNAL(pressed()), SLOT(pressStopButton()));
+ buttonLayout->addItem(mStopButton);
+ mStopButton->setEnabled(false);
+ mEditor = new HbLineEdit();
+ buttonLayout->addItem(mEditor);
+
+ layout->addItem(buttonLayout);
+
+ mWeb = new QGraphicsWebView();
+ layout->addItem(mWeb);
+
+ connect(mWeb, SIGNAL(loadStarted()), SLOT(loadStarted()));
+ connect(mWeb, SIGNAL(loadProgress(int)), SLOT(loadProgress(int)));
+ connect(mWeb, SIGNAL(loadFinished(bool)), SLOT(loadFinished(bool)));
+
+ // maximum size of the home screen widget is (48,39) units. Convert units to pixels and
+ // resize minibrowser as maximum size
+ HbFrameDrawer *drawer = new HbFrameDrawer(
+ QLatin1String("qtg_fr_hsshortcut_normal"), HbFrameDrawer::NinePieces);
+ setBackgroundItem(new HbFrameItem(drawer));
+
+ HbDeviceProfile profile;
+ qreal factor = profile.unitValue();
+ setPreferredSize(48*factor, 39*factor);
+ resize(preferredSize());
+
+ mUrl = QString("http://www.nokia.com");
+}
+
+/*!
+ Destructor
+*/
+MiniBrowserWidget::~MiniBrowserWidget()
+{
+}
+
+/*!
+ Returns widget's online state
+*/
+// Start of snippet 1
+bool MiniBrowserWidget::isOnline()
+{
+ return mOnline;
+}
+
+/*!
+ Sets online state of the widget as \a online
+*/
+void MiniBrowserWidget::setOnline(bool online)
+{
+ mOnline = online;
+}
+// End of snippet 1
+
+/*!
+ Returns url of the widget currently showing.
+*/
+// Start of snippet 2
+QString MiniBrowserWidget::url() const
+{
+ return mUrl;
+}
+
+/*!
+ Sets url of the widget as \a url
+*/
+void MiniBrowserWidget::setUrl(const QString& url)
+{
+ mUrl = url;
+}
+// End of snippet 2
+
+/*!
+ Called when widget is initialized and all to properties are set
+*/
+void MiniBrowserWidget::onInitialize()
+{
+ mGoButton->setEnabled(mOnline);
+ mEditor->setText(mUrl);
+}
+
+/*!
+ Called when widget is shown in the home screen
+*/
+// Start of snippet 3
+void MiniBrowserWidget::onShow()
+{
+ if (mOnline) {
+ mWeb->load(QUrl(mUrl));
+ mStopButton->setEnabled(true);
+ }
+}
+// End of snippet 3
+
+/*!
+ Called when widget is hidden from the home screen.
+ Widget can decide what is appropriate action when
+ widget is not visible on the screen. At least it
+ should not update itself as often as when on the
+ screen to save battery etc.
+*/
+// Start of snippet 4
+void MiniBrowserWidget::onHide()
+{
+ mWeb->stop();
+}
+// End of snippet 4
+
+/*!
+ Slot connected to 'go' button
+*/
+// Start of snippet 5
+void MiniBrowserWidget::pressGoButton()
+{
+ setUrl(mEditor->text());
+ if (mOnline) {
+ mWeb->load(QUrl(mUrl));
+ mStopButton->setEnabled(true);
+ }
+ QStringList list;
+ list.append("url");
+ emit setPreferences(list);
+}
+// End of snippet 5
+
+/*!
+ Slot connected to 'stop' button
+*/
+void MiniBrowserWidget::pressStopButton()
+{
+ mWeb->stop();
+ //mStopButton->setEnabled(false);
+}
+
+/*!
+ Slot connected to webview's loadProgress signal
+ TODO: check if this is needed.
+*/
+void MiniBrowserWidget::loadProgress(int progress)
+{
+ Q_UNUSED(progress)
+ qDebug() << progress;
+}
+
+/*!
+ Slot connected to webview's loadFinished signal
+*/
+void MiniBrowserWidget::loadFinished(bool ok)
+{
+ Q_UNUSED(ok)
+ mStopButton->setEnabled(false);
+}
+void MiniBrowserWidget::loadStarted()
+{
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/examples/minibrowserwidgetplugin/src/minibrowserwidgetplugin.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,49 @@
+/*
+* 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: Example of home screen widget
+*
+*/
+
+#include <qserviceinterfacedescriptor.h>
+#include <qabstractsecuritysession.h>
+#include <qservicecontext.h>
+
+#include "minibrowserwidgetplugin.h"
+#include "minibrowserwidget.h"
+
+/*!
+ \ingroup group_minibrowser_widget
+ \class MiniBrowserWidgetPlugin
+ \brief Example implementation for home screen widget plugin.
+*/
+
+/*!
+ Initialize plugin for minibrowser widget. Contains necessary information about
+ the minibrowser widget that it can be loaded through QT Service Framework.
+*/
+QObject *MiniBrowserWidgetPlugin::createInstance(const QServiceInterfaceDescriptor &descriptor,
+ QServiceContext *context,
+ QAbstractSecuritySession *session)
+{
+ Q_UNUSED(context);
+ Q_UNUSED(session);
+
+ if (descriptor.interfaceName() == QLatin1String("com.nokia.symbian.IHomeScreenWidget")) {
+ return new MiniBrowserWidget();
+ } else {
+ return 0;
+ }
+}
+
+Q_EXPORT_PLUGIN2(minibrowserwidgetplugin, MiniBrowserWidgetPlugin)
--- a/homescreenapp/homescreenapp.pro Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/homescreenapp.pro Fri Jul 09 14:36:01 2010 +0300
@@ -18,7 +18,6 @@
SUBDIRS += hsutils \
hsdomainmodel \
- runtimeplugins \
serviceproviders \
stateplugins \
widgetplugins \
@@ -27,7 +26,8 @@
symbian: {
SUBDIRS += hshomescreenclientplugin \
- hswidgetuninstaller
+ hswidgetuninstaller \
+ hsapplicationlauncher
}
SUBDIRS += ./../tsrc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsapplication/conf/base/confml/CI_homescreendb.confml Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="HomeScreen database settings">
+ <confml:feature ref="HomeScreenDbSettings" name="HomeScreen database settings">
+ <confml:setting ref="Pages" mapKey="id" mapValue="id" name="Pages" type="sequence">
+ <confml:setting ref="id" name="ID" type="int"/>
+ <confml:setting ref="indexPosition" name="Index Position" type="int"/>
+ </confml:setting>
+ <confml:setting ref="Widgets" mapKey="id" mapValue="id" name="Widgets" type="sequence">
+ <confml:setting ref="id" name="ID" type="int"/>
+ <confml:setting ref="uri" name="URI" type="string"/>
+ <confml:setting ref="pageId" name="Page ID" type="selection">
+ <confml:option map="HomeScreenDbSettings/Pages"/>
+ </confml:setting>
+ </confml:setting>
+ <confml:setting ref="WidgetPresentations" name="Widget presentations" type="sequence">
+ <confml:setting ref="key" name="Key" type="string"/>
+ <confml:setting ref="x" name="X position" type="real"/>
+ <confml:setting ref="y" name="Y position" type="real"/>
+ <confml:setting ref="zValue" name="Z value" type="real"/>
+ <confml:setting ref="widgetId" name="Widget ID" type="selection">
+ <confml:option map="HomeScreenDbSettings/Widgets"/>
+ </confml:setting>
+ </confml:setting>
+ <confml:setting ref="WidgetPreferences" name="Widget preferences" type="sequence">
+ <confml:setting ref="key" name="Key" type="string"/>
+ <confml:setting ref="value" name="Value" type="string"/>
+ <confml:setting ref="widgetId" name="Widget ID" type="selection">
+ <confml:option map="HomeScreenDbSettings/Widgets"/>
+ </confml:setting>
+ </confml:setting>
+ <confml:setting ref="Configuration" name="Configuration" type="sequence">
+ <confml:setting ref="key" name="Key" type="string"/>
+ <confml:setting ref="value" name="Value" type="string"/>
+ </confml:setting>
+ </confml:feature>
+ <confml:data>
+ <confml:HomeScreenDbSettings>
+ <confml:Widgets><confml:id>1</confml:id><confml:uri>hsclockwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='1']"></confml:pageId></confml:Widgets>
+ <confml:Widgets><confml:id>2</confml:id><confml:uri>dialerwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='1']"></confml:pageId></confml:Widgets>
+ <confml:Widgets><confml:id>3</confml:id><confml:uri>ftuhswidget</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='1']"></confml:pageId></confml:Widgets>
+ <confml:Widgets><confml:id>4</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='2']"></confml:pageId></confml:Widgets>
+ <confml:Widgets><confml:id>5</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='2']"></confml:pageId></confml:Widgets>
+ <confml:Widgets><confml:id>6</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='2']"></confml:pageId></confml:Widgets>
+ <confml:Widgets><confml:id>7</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='2']"></confml:pageId></confml:Widgets>
+ <confml:Widgets><confml:id>8</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='2']"></confml:pageId></confml:Widgets>
+ <confml:Widgets><confml:id>9</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='2']"></confml:pageId></confml:Widgets>
+ <confml:Widgets><confml:id>10</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='2']"></confml:pageId></confml:Widgets>
+ <confml:Widgets><confml:id>11</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='3']"></confml:pageId></confml:Widgets>
+ <confml:Widgets><confml:id>12</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='3']"></confml:pageId></confml:Widgets>
+ <confml:Widgets><confml:id>13</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='3']"></confml:pageId></confml:Widgets>
+ <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>15</confml:x><confml:y>80</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='1']"></confml:widgetId></confml:WidgetPresentations>
+ <confml:WidgetPresentations><confml:key>landscape</confml:key><confml:x>15</confml:x><confml:y>80</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='1']"></confml:widgetId></confml:WidgetPresentations>
+ <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>136</confml:x><confml:y>276</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='2']"></confml:widgetId></confml:WidgetPresentations>
+ <confml:WidgetPresentations><confml:key>landscape</confml:key><confml:x>136</confml:x><confml:y>176</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='2']"></confml:widgetId></confml:WidgetPresentations>
+ <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>15</confml:x><confml:y>400</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='3']"></confml:widgetId></confml:WidgetPresentations>
+ <confml:WidgetPresentations><confml:key>landscape</confml:key><confml:x>300</confml:x><confml:y>150</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='3']"></confml:widgetId></confml:WidgetPresentations>
+ <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>15</confml:x><confml:y>80</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='4']"></confml:widgetId></confml:WidgetPresentations>
+ <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>100</confml:x><confml:y>80</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='5']"></confml:widgetId></confml:WidgetPresentations>
+ <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>185</confml:x><confml:y>80</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='6']"></confml:widgetId></confml:WidgetPresentations>
+ <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>270</confml:x><confml:y>80</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='7']"></confml:widgetId></confml:WidgetPresentations>
+ <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>15</confml:x><confml:y>185</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='8']"></confml:widgetId></confml:WidgetPresentations>
+ <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>100</confml:x><confml:y>185</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='9']"></confml:widgetId></confml:WidgetPresentations>
+ <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>185</confml:x><confml:y>185</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='10']"></confml:widgetId></confml:WidgetPresentations>
+ <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>15</confml:x><confml:y>80</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='11']"></confml:widgetId></confml:WidgetPresentations>
+ <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>100</confml:x><confml:y>80</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='12']"></confml:widgetId></confml:WidgetPresentations>
+ <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>185</confml:x><confml:y>80</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='13']"></confml:widgetId></confml:WidgetPresentations>
+ <confml:WidgetPreferences><confml:key>clockType</confml:key><confml:value>Analog</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='1']"></confml:widgetId></confml:WidgetPreferences>
+ <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x20022EF9</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='4']"></confml:widgetId></confml:WidgetPreferences>
+ <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x10005901</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='5']"></confml:widgetId></confml:WidgetPreferences>
+ <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x20029F80</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='6']"></confml:widgetId></confml:WidgetPreferences>
+ <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x2001FE79</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='7']"></confml:widgetId></confml:WidgetPreferences>
+ <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x10207C62</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='8']"></confml:widgetId></confml:WidgetPreferences>
+ <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x10005951</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='9']"></confml:widgetId></confml:WidgetPreferences>
+ <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x20025FD9</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='10']"></confml:widgetId></confml:WidgetPreferences>
+ <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x102828D6</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='11']"></confml:widgetId></confml:WidgetPreferences>
+ <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x101FB751</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='12']"></confml:widgetId></confml:WidgetPreferences>
+ <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x100059EE</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='13']"></confml:widgetId></confml:WidgetPreferences>
+ <confml:Pages><confml:id>1</confml:id><confml:indexPosition>0</confml:indexPosition></confml:Pages>
+ <confml:Pages><confml:id>2</confml:id><confml:indexPosition>1</confml:indexPosition></confml:Pages>
+ <confml:Pages><confml:id>3</confml:id><confml:indexPosition>2</confml:indexPosition></confml:Pages>
+ <confml:Configuration><confml:key>bounceEffect</confml:key><confml:value>20</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>widgetTapAndHoldTimeout</confml:key><confml:value>500</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>sceneTapAndHoldTimeout</confml:key><confml:value>500</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>pageChangeAnimationDuration</confml:key><confml:value>200</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>pageChangeZoneAnimationDuration</confml:key><confml:value>800</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>pageChangeZoneReverseAnimationDuration</confml:key><confml:value>200</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>pageRemovedAnimationDuration</confml:key><confml:value>200</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>newPageAddedAnimationDuration</confml:key><confml:value>200</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>widgetDragEffectDuration</confml:key><confml:value>200</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>widgetDropEffectDuration</confml:key><confml:value>200</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>defaultPageId</confml:key><confml:value>1</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>maximumPageCount</confml:key><confml:value>8</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>isShortcutLabelVisible</confml:key><confml:value>true</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>bounceFeedbackEffectDistance</confml:key><confml:value>3</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>pageChangePanDistanceInPixels</confml:key><confml:value>120</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>tapAndHoldDistance</confml:key><confml:value>16</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>pageChangeZoneWidth</confml:key><confml:value>60</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>pageIndicatorSpacing</confml:key><confml:value>8</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>maximumWidgetHeight</confml:key><confml:value>39</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>maximumWidgetWidth</confml:key><confml:value>48</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>minimumWidgetHeight</confml:key><confml:value>8.75</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>minimumWidgetWidth</confml:key><confml:value>8.75</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>pageChangePanDistance</confml:key><confml:value>17.91</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>pageChangeFeedbackEffect</confml:key><confml:value>Sensitive</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>widgetPickFeedbackEffect</confml:key><confml:value>ItemPick</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>widgetDropFeedbackEffect</confml:key><confml:value>ItemDrop</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>widgetRepositionFeedbackEffect</confml:key><confml:value>BounceEffect</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>widgetOverTrashbinFeedbackEffect</confml:key><confml:value>ItemMoveOver</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>widgetDropToTrashbinFeedbackEffect</confml:key><confml:value>ItemDrop</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>shortcutWidgetTapFeedbackEffect</confml:key><confml:value>BasicItem</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>widgetMoveBlockedFeedbackEffect</confml:key><confml:value>Basic</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>clockWidgetTapFeedbackEffect</confml:key><confml:value>BasicItem</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>widgetSnappingFeedbackEffect</confml:key><confml:value>ItemMoveOver</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>isSnapEnabled</confml:key><confml:value>true</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>snapTimeout</confml:key><confml:value>100</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>snapForce</confml:key><confml:value>30</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>snapGap</confml:key><confml:value>6</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>pageMargin</confml:key><confml:value>0</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>snapLineFadeInDuration</confml:key><confml:value>200</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>snapLineFadeOutDuration</confml:key><confml:value>100</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>isSnapEffectsEnabled</confml:key><confml:value>true</confml:value></confml:Configuration>
+ <confml:Configuration><confml:key>sceneType</confml:key><confml:value>PageWallpapers</confml:value></confml:Configuration>
+ </confml:HomeScreenDbSettings>
+ </confml:data>
+</confml:configuration>
--- a/homescreenapp/hsapplication/conf/base/confml/homescreendb.confml Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsapplication/conf/base/confml/homescreendb.confml Fri Jul 09 14:36:01 2010 +0300
@@ -1,125 +1,125 @@
<?xml version="1.0" encoding="UTF-8"?>
-<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="HomeScreen database settings">
- <confml:feature ref="HomeScreenDbSettings" name="HomeScreen database settings">
- <confml:setting ref="Pages" mapKey="id" mapValue="id" name="Pages" type="sequence">
- <confml:setting ref="id" name="ID" type="int"/>
- <confml:setting ref="indexPosition" name="Index Position" type="int"/>
- </confml:setting>
- <confml:setting ref="Widgets" mapKey="id" mapValue="id" name="Widgets" type="sequence">
- <confml:setting ref="id" name="ID" type="int"/>
- <confml:setting ref="uri" name="URI" type="string"/>
- <confml:setting ref="pageId" name="Page ID" type="selection">
- <confml:option map="HomeScreenDbSettings/Pages"/>
- </confml:setting>
- </confml:setting>
- <confml:setting ref="WidgetPresentations" name="Widget presentations" type="sequence">
- <confml:setting ref="key" name="Key" type="string"/>
- <confml:setting ref="x" name="X position" type="real"/>
- <confml:setting ref="y" name="Y position" type="real"/>
- <confml:setting ref="zValue" name="Z value" type="real"/>
- <confml:setting ref="widgetId" name="Widget ID" type="selection">
- <confml:option map="HomeScreenDbSettings/Widgets"/>
- </confml:setting>
- </confml:setting>
- <confml:setting ref="WidgetPreferences" name="Widget preferences" type="sequence">
- <confml:setting ref="key" name="Key" type="string"/>
- <confml:setting ref="value" name="Value" type="string"/>
- <confml:setting ref="widgetId" name="Widget ID" type="selection">
- <confml:option map="HomeScreenDbSettings/Widgets"/>
- </confml:setting>
- </confml:setting>
- <confml:setting ref="Configuration" name="Configuration" type="sequence">
- <confml:setting ref="key" name="Key" type="string"/>
- <confml:setting ref="value" name="Value" type="string"/>
- </confml:setting>
- </confml:feature>
- <confml:data>
- <confml:HomeScreenDbSettings>
- <confml:Widgets><confml:id>1</confml:id><confml:uri>hsclockwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='1']"></confml:pageId></confml:Widgets>
- <confml:Widgets><confml:id>2</confml:id><confml:uri>hsdialerwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='1']"></confml:pageId></confml:Widgets>
- <confml:Widgets><confml:id>3</confml:id><confml:uri>ftuhswidget</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='1']"></confml:pageId></confml:Widgets>
- <confml:Widgets><confml:id>4</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='2']"></confml:pageId></confml:Widgets>
- <confml:Widgets><confml:id>5</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='2']"></confml:pageId></confml:Widgets>
- <confml:Widgets><confml:id>6</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='2']"></confml:pageId></confml:Widgets>
- <confml:Widgets><confml:id>7</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='2']"></confml:pageId></confml:Widgets>
- <confml:Widgets><confml:id>8</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='2']"></confml:pageId></confml:Widgets>
- <confml:Widgets><confml:id>9</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='2']"></confml:pageId></confml:Widgets>
- <confml:Widgets><confml:id>10</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='2']"></confml:pageId></confml:Widgets>
- <confml:Widgets><confml:id>11</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='3']"></confml:pageId></confml:Widgets>
- <confml:Widgets><confml:id>12</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='3']"></confml:pageId></confml:Widgets>
- <confml:Widgets><confml:id>13</confml:id><confml:uri>hsshortcutwidgetplugin</confml:uri><confml:pageId map="HomeScreenDbSettings/Pages[@key='3']"></confml:pageId></confml:Widgets>
- <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>15</confml:x><confml:y>80</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='1']"></confml:widgetId></confml:WidgetPresentations>
- <confml:WidgetPresentations><confml:key>landscape</confml:key><confml:x>15</confml:x><confml:y>80</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='1']"></confml:widgetId></confml:WidgetPresentations>
- <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>136</confml:x><confml:y>276</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='2']"></confml:widgetId></confml:WidgetPresentations>
- <confml:WidgetPresentations><confml:key>landscape</confml:key><confml:x>136</confml:x><confml:y>176</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='2']"></confml:widgetId></confml:WidgetPresentations>
- <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>15</confml:x><confml:y>400</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='3']"></confml:widgetId></confml:WidgetPresentations>
- <confml:WidgetPresentations><confml:key>landscape</confml:key><confml:x>300</confml:x><confml:y>150</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='3']"></confml:widgetId></confml:WidgetPresentations>
- <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>15</confml:x><confml:y>80</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='4']"></confml:widgetId></confml:WidgetPresentations>
- <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>100</confml:x><confml:y>80</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='5']"></confml:widgetId></confml:WidgetPresentations>
- <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>185</confml:x><confml:y>80</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='6']"></confml:widgetId></confml:WidgetPresentations>
- <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>270</confml:x><confml:y>80</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='7']"></confml:widgetId></confml:WidgetPresentations>
- <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>15</confml:x><confml:y>185</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='8']"></confml:widgetId></confml:WidgetPresentations>
- <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>100</confml:x><confml:y>185</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='9']"></confml:widgetId></confml:WidgetPresentations>
- <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>185</confml:x><confml:y>185</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='10']"></confml:widgetId></confml:WidgetPresentations>
- <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>15</confml:x><confml:y>80</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='11']"></confml:widgetId></confml:WidgetPresentations>
- <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>100</confml:x><confml:y>80</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='12']"></confml:widgetId></confml:WidgetPresentations>
- <confml:WidgetPresentations><confml:key>portrait</confml:key><confml:x>185</confml:x><confml:y>80</confml:y><confml:zValue>0.0</confml:zValue><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='13']"></confml:widgetId></confml:WidgetPresentations>
- <confml:WidgetPreferences><confml:key>clockType</confml:key><confml:value>Analog</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='1']"></confml:widgetId></confml:WidgetPreferences>
- <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x20022EF9</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='4']"></confml:widgetId></confml:WidgetPreferences>
- <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x10005901</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='5']"></confml:widgetId></confml:WidgetPreferences>
- <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x20029F80</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='6']"></confml:widgetId></confml:WidgetPreferences>
- <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x2001FE79</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='7']"></confml:widgetId></confml:WidgetPreferences>
- <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x10207C62</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='8']"></confml:widgetId></confml:WidgetPreferences>
- <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x10005951</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='9']"></confml:widgetId></confml:WidgetPreferences>
- <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x20025FD9</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='10']"></confml:widgetId></confml:WidgetPreferences>
- <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x102828D6</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='11']"></confml:widgetId></confml:WidgetPreferences>
- <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x101FB751</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='12']"></confml:widgetId></confml:WidgetPreferences>
- <confml:WidgetPreferences><confml:key>uid</confml:key><confml:value>0x100059EE</confml:value><confml:widgetId map="HomeScreenDbSettings/Widgets[@key='13']"></confml:widgetId></confml:WidgetPreferences>
- <confml:Pages><confml:id>1</confml:id><confml:indexPosition>0</confml:indexPosition></confml:Pages>
- <confml:Pages><confml:id>2</confml:id><confml:indexPosition>1</confml:indexPosition></confml:Pages>
- <confml:Pages><confml:id>3</confml:id><confml:indexPosition>2</confml:indexPosition></confml:Pages>
- <confml:Configuration><confml:key>bounceEffect</confml:key><confml:value>20</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>widgetTapAndHoldTimeout</confml:key><confml:value>500</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>sceneTapAndHoldTimeout</confml:key><confml:value>500</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>pageChangeAnimationDuration</confml:key><confml:value>200</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>pageChangeZoneAnimationDuration</confml:key><confml:value>800</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>pageChangeZoneReverseAnimationDuration</confml:key><confml:value>200</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>pageRemovedAnimationDuration</confml:key><confml:value>200</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>newPageAddedAnimationDuration</confml:key><confml:value>200</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>widgetDragEffectDuration</confml:key><confml:value>200</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>widgetDropEffectDuration</confml:key><confml:value>200</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>defaultPageId</confml:key><confml:value>1</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>maximumPageCount</confml:key><confml:value>8</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>isShortcutLabelVisible</confml:key><confml:value>true</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>bounceFeedbackEffectDistance</confml:key><confml:value>3</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>pageChangePanDistanceInPixels</confml:key><confml:value>120</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>tapAndHoldDistance</confml:key><confml:value>16</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>pageChangeZoneWidth</confml:key><confml:value>60</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>pageIndicatorSpacing</confml:key><confml:value>8</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>maximumWidgetHeight</confml:key><confml:value>39</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>maximumWidgetWidth</confml:key><confml:value>48</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>minimumWidgetHeight</confml:key><confml:value>8.75</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>minimumWidgetWidth</confml:key><confml:value>8.75</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>pageChangePanDistance</confml:key><confml:value>17.91</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>pageChangeFeedbackEffect</confml:key><confml:value>Sensitive</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>widgetPickFeedbackEffect</confml:key><confml:value>ItemPick</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>widgetDropFeedbackEffect</confml:key><confml:value>ItemDrop</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>widgetRepositionFeedbackEffect</confml:key><confml:value>BounceEffect</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>widgetOverTrashbinFeedbackEffect</confml:key><confml:value>ItemMoveOver</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>widgetDropToTrashbinFeedbackEffect</confml:key><confml:value>ItemDrop</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>shortcutWidgetTapFeedbackEffect</confml:key><confml:value>BasicItem</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>widgetMoveBlockedFeedbackEffect</confml:key><confml:value>Basic</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>clockWidgetTapFeedbackEffect</confml:key><confml:value>BasicItem</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>widgetSnappingFeedbackEffect</confml:key><confml:value>ItemMoveOver</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>isSnapEnabled</confml:key><confml:value>true</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>snapTimeout</confml:key><confml:value>100</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>snapForce</confml:key><confml:value>30</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>snapGap</confml:key><confml:value>6</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>snapBorderGap</confml:key><confml:value>0</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>snapLineFadeInDuration</confml:key><confml:value>200</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>snapLineFadeOutDuration</confml:key><confml:value>100</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>isSnapEffectsEnabled</confml:key><confml:value>true</confml:value></confml:Configuration>
- <confml:Configuration><confml:key>sceneType</confml:key><confml:value>PageWallpapers</confml:value></confml:Configuration>
- </confml:HomeScreenDbSettings>
- </confml:data>
-</confml:configuration>
+<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="HomeScreen database settings">
+ <feature ref="HomeScreenDbSettings" name="HomeScreen database settings">
+ <setting ref="Pages" mapKey="id" mapValue="id" name="Pages" type="sequence">
+ <setting ref="id" name="ID" type="int"/>
+ <setting ref="indexPosition" name="Index Position" type="int"/>
+ </setting>
+ <setting ref="Widgets" mapKey="id" mapValue="id" name="Widgets" type="sequence">
+ <setting ref="id" name="ID" type="int"/>
+ <setting ref="uri" name="URI" type="string"/>
+ <setting ref="pageId" name="Page ID" type="selection">
+ <option map="HomeScreenDbSettings/Pages"/>
+ </setting>
+ </setting>
+ <setting ref="WidgetPresentations" name="Widget presentations" type="sequence">
+ <setting ref="key" name="Key" type="string"/>
+ <setting ref="x" name="X position" type="real"/>
+ <setting ref="y" name="Y position" type="real"/>
+ <setting ref="zValue" name="Z value" type="real"/>
+ <setting ref="widgetId" name="Widget ID" type="selection">
+ <option map="HomeScreenDbSettings/Widgets"/>
+ </setting>
+ </setting>
+ <setting ref="WidgetPreferences" name="Widget preferences" type="sequence">
+ <setting ref="key" name="Key" type="string"/>
+ <setting ref="value" name="Value" type="string"/>
+ <setting ref="widgetId" name="Widget ID" type="selection">
+ <option map="HomeScreenDbSettings/Widgets"/>
+ </setting>
+ </setting>
+ <setting ref="Configuration" name="Configuration" type="sequence">
+ <setting ref="key" name="Key" type="string"/>
+ <setting ref="value" name="Value" type="string"/>
+ </setting>
+ </feature>
+ <data>
+ <HomeScreenDbSettings>
+ <Widgets><id>1</id><uri>hsclockwidgetplugin</uri><pageId map="HomeScreenDbSettings/Pages[@key='1']"></pageId></Widgets>
+ <Widgets><id>2</id><uri>hsdialerwidgetplugin</uri><pageId map="HomeScreenDbSettings/Pages[@key='1']"></pageId></Widgets>
+ <Widgets><id>3</id><uri>ftuhswidget</uri><pageId map="HomeScreenDbSettings/Pages[@key='1']"></pageId></Widgets>
+ <Widgets><id>4</id><uri>hsshortcutwidgetplugin</uri><pageId map="HomeScreenDbSettings/Pages[@key='2']"></pageId></Widgets>
+ <Widgets><id>5</id><uri>hsshortcutwidgetplugin</uri><pageId map="HomeScreenDbSettings/Pages[@key='2']"></pageId></Widgets>
+ <Widgets><id>6</id><uri>hsshortcutwidgetplugin</uri><pageId map="HomeScreenDbSettings/Pages[@key='2']"></pageId></Widgets>
+ <Widgets><id>7</id><uri>hsshortcutwidgetplugin</uri><pageId map="HomeScreenDbSettings/Pages[@key='2']"></pageId></Widgets>
+ <Widgets><id>8</id><uri>hsshortcutwidgetplugin</uri><pageId map="HomeScreenDbSettings/Pages[@key='2']"></pageId></Widgets>
+ <Widgets><id>9</id><uri>hsshortcutwidgetplugin</uri><pageId map="HomeScreenDbSettings/Pages[@key='2']"></pageId></Widgets>
+ <Widgets><id>10</id><uri>hsshortcutwidgetplugin</uri><pageId map="HomeScreenDbSettings/Pages[@key='2']"></pageId></Widgets>
+ <Widgets><id>11</id><uri>hsshortcutwidgetplugin</uri><pageId map="HomeScreenDbSettings/Pages[@key='3']"></pageId></Widgets>
+ <Widgets><id>12</id><uri>hsshortcutwidgetplugin</uri><pageId map="HomeScreenDbSettings/Pages[@key='3']"></pageId></Widgets>
+ <Widgets><id>13</id><uri>hsshortcutwidgetplugin</uri><pageId map="HomeScreenDbSettings/Pages[@key='3']"></pageId></Widgets>
+ <WidgetPresentations><key>portrait</key><x>15</x><y>80</y><zValue>0.0</zValue><widgetId map="HomeScreenDbSettings/Widgets[@key='1']"></widgetId></WidgetPresentations>
+ <WidgetPresentations><key>landscape</key><x>15</x><y>80</y><zValue>0.0</zValue><widgetId map="HomeScreenDbSettings/Widgets[@key='1']"></widgetId></WidgetPresentations>
+ <WidgetPresentations><key>portrait</key><x>136</x><y>276</y><zValue>0.0</zValue><widgetId map="HomeScreenDbSettings/Widgets[@key='2']"></widgetId></WidgetPresentations>
+ <WidgetPresentations><key>landscape</key><x>136</x><y>176</y><zValue>0.0</zValue><widgetId map="HomeScreenDbSettings/Widgets[@key='2']"></widgetId></WidgetPresentations>
+ <WidgetPresentations><key>portrait</key><x>15</x><y>400</y><zValue>0.0</zValue><widgetId map="HomeScreenDbSettings/Widgets[@key='3']"></widgetId></WidgetPresentations>
+ <WidgetPresentations><key>landscape</key><x>300</x><y>150</y><zValue>0.0</zValue><widgetId map="HomeScreenDbSettings/Widgets[@key='3']"></widgetId></WidgetPresentations>
+ <WidgetPresentations><key>portrait</key><x>15</x><y>80</y><zValue>0.0</zValue><widgetId map="HomeScreenDbSettings/Widgets[@key='4']"></widgetId></WidgetPresentations>
+ <WidgetPresentations><key>portrait</key><x>100</x><y>80</y><zValue>0.0</zValue><widgetId map="HomeScreenDbSettings/Widgets[@key='5']"></widgetId></WidgetPresentations>
+ <WidgetPresentations><key>portrait</key><x>185</x><y>80</y><zValue>0.0</zValue><widgetId map="HomeScreenDbSettings/Widgets[@key='6']"></widgetId></WidgetPresentations>
+ <WidgetPresentations><key>portrait</key><x>270</x><y>80</y><zValue>0.0</zValue><widgetId map="HomeScreenDbSettings/Widgets[@key='7']"></widgetId></WidgetPresentations>
+ <WidgetPresentations><key>portrait</key><x>15</x><y>185</y><zValue>0.0</zValue><widgetId map="HomeScreenDbSettings/Widgets[@key='8']"></widgetId></WidgetPresentations>
+ <WidgetPresentations><key>portrait</key><x>100</x><y>185</y><zValue>0.0</zValue><widgetId map="HomeScreenDbSettings/Widgets[@key='9']"></widgetId></WidgetPresentations>
+ <WidgetPresentations><key>portrait</key><x>185</x><y>185</y><zValue>0.0</zValue><widgetId map="HomeScreenDbSettings/Widgets[@key='10']"></widgetId></WidgetPresentations>
+ <WidgetPresentations><key>portrait</key><x>15</x><y>80</y><zValue>0.0</zValue><widgetId map="HomeScreenDbSettings/Widgets[@key='11']"></widgetId></WidgetPresentations>
+ <WidgetPresentations><key>portrait</key><x>100</x><y>80</y><zValue>0.0</zValue><widgetId map="HomeScreenDbSettings/Widgets[@key='12']"></widgetId></WidgetPresentations>
+ <WidgetPresentations><key>portrait</key><x>185</x><y>80</y><zValue>0.0</zValue><widgetId map="HomeScreenDbSettings/Widgets[@key='13']"></widgetId></WidgetPresentations>
+ <WidgetPreferences><key>clockType</key><value>Analog</value><widgetId map="HomeScreenDbSettings/Widgets[@key='1']"></widgetId></WidgetPreferences>
+ <WidgetPreferences><key>uid</key><value>0x20022EF9</value><widgetId map="HomeScreenDbSettings/Widgets[@key='4']"></widgetId></WidgetPreferences>
+ <WidgetPreferences><key>uid</key><value>0x10005901</value><widgetId map="HomeScreenDbSettings/Widgets[@key='5']"></widgetId></WidgetPreferences>
+ <WidgetPreferences><key>uid</key><value>0x20029F80</value><widgetId map="HomeScreenDbSettings/Widgets[@key='6']"></widgetId></WidgetPreferences>
+ <WidgetPreferences><key>uid</key><value>0x2001FE79</value><widgetId map="HomeScreenDbSettings/Widgets[@key='7']"></widgetId></WidgetPreferences>
+ <WidgetPreferences><key>uid</key><value>0x10207C62</value><widgetId map="HomeScreenDbSettings/Widgets[@key='8']"></widgetId></WidgetPreferences>
+ <WidgetPreferences><key>uid</key><value>0x10005951</value><widgetId map="HomeScreenDbSettings/Widgets[@key='9']"></widgetId></WidgetPreferences>
+ <WidgetPreferences><key>uid</key><value>0x20025FD9</value><widgetId map="HomeScreenDbSettings/Widgets[@key='10']"></widgetId></WidgetPreferences>
+ <WidgetPreferences><key>uid</key><value>0x102828D6</value><widgetId map="HomeScreenDbSettings/Widgets[@key='11']"></widgetId></WidgetPreferences>
+ <WidgetPreferences><key>uid</key><value>0x101FB751</value><widgetId map="HomeScreenDbSettings/Widgets[@key='12']"></widgetId></WidgetPreferences>
+ <WidgetPreferences><key>uid</key><value>0x100059EE</value><widgetId map="HomeScreenDbSettings/Widgets[@key='13']"></widgetId></WidgetPreferences>
+ <Pages><id>1</id><indexPosition>0</indexPosition></Pages>
+ <Pages><id>2</id><indexPosition>1</indexPosition></Pages>
+ <Pages><id>3</id><indexPosition>2</indexPosition></Pages>
+ <Configuration><key>bounceEffect</key><value>20</value></Configuration>
+ <Configuration><key>widgetTapAndHoldTimeout</key><value>500</value></Configuration>
+ <Configuration><key>sceneTapAndHoldTimeout</key><value>500</value></Configuration>
+ <Configuration><key>pageChangeAnimationDuration</key><value>200</value></Configuration>
+ <Configuration><key>pageChangeZoneAnimationDuration</key><value>800</value></Configuration>
+ <Configuration><key>pageChangeZoneReverseAnimationDuration</key><value>200</value></Configuration>
+ <Configuration><key>pageRemovedAnimationDuration</key><value>200</value></Configuration>
+ <Configuration><key>newPageAddedAnimationDuration</key><value>200</value></Configuration>
+ <Configuration><key>widgetDragEffectDuration</key><value>200</value></Configuration>
+ <Configuration><key>widgetDropEffectDuration</key><value>200</value></Configuration>
+ <Configuration><key>defaultPageId</key><value>1</value></Configuration>
+ <Configuration><key>maximumPageCount</key><value>8</value></Configuration>
+ <Configuration><key>isShortcutLabelVisible</key><value>true</value></Configuration>
+ <Configuration><key>bounceFeedbackEffectDistance</key><value>3</value></Configuration>
+ <Configuration><key>pageChangePanDistanceInPixels</key><value>120</value></Configuration>
+ <Configuration><key>tapAndHoldDistance</key><value>16</value></Configuration>
+ <Configuration><key>pageChangeZoneWidth</key><value>60</value></Configuration>
+ <Configuration><key>pageIndicatorSpacing</key><value>8</value></Configuration>
+ <Configuration><key>maximumWidgetHeight</key><value>39</value></Configuration>
+ <Configuration><key>maximumWidgetWidth</key><value>48</value></Configuration>
+ <Configuration><key>minimumWidgetHeight</key><value>8.75</value></Configuration>
+ <Configuration><key>minimumWidgetWidth</key><value>8.75</value></Configuration>
+ <Configuration><key>pageChangePanDistance</key><value>17.91</value></Configuration>
+ <Configuration><key>pageChangeFeedbackEffect</key><value>Sensitive</value></Configuration>
+ <Configuration><key>widgetPickFeedbackEffect</key><value>ItemPick</value></Configuration>
+ <Configuration><key>widgetDropFeedbackEffect</key><value>ItemDrop</value></Configuration>
+ <Configuration><key>widgetRepositionFeedbackEffect</key><value>BounceEffect</value></Configuration>
+ <Configuration><key>widgetOverTrashbinFeedbackEffect</key><value>ItemMoveOver</value></Configuration>
+ <Configuration><key>widgetDropToTrashbinFeedbackEffect</key><value>ItemDrop</value></Configuration>
+ <Configuration><key>shortcutWidgetTapFeedbackEffect</key><value>BasicItem</value></Configuration>
+ <Configuration><key>widgetMoveBlockedFeedbackEffect</key><value>Basic</value></Configuration>
+ <Configuration><key>clockWidgetTapFeedbackEffect</key><value>BasicItem</value></Configuration>
+ <Configuration><key>widgetSnappingFeedbackEffect</key><value>ItemMoveOver</value></Configuration>
+ <Configuration><key>isSnapEnabled</key><value>true</value></Configuration>
+ <Configuration><key>snapTimeout</key><value>100</value></Configuration>
+ <Configuration><key>snapForce</key><value>30</value></Configuration>
+ <Configuration><key>snapGap</key><value>6</value></Configuration>
+ <Configuration><key>snapBorderGap</key><value>0</value></Configuration>
+ <Configuration><key>snapLineFadeInDuration</key><value>200</value></Configuration>
+ <Configuration><key>snapLineFadeOutDuration</key><value>100</value></Configuration>
+ <Configuration><key>isSnapEffectsEnabled</key><value>true</value></Configuration>
+ <Configuration><key>sceneType</key><value>PageWallpapers</value></Configuration>
+ </HomeScreenDbSettings>
+ </data>
+</configuration>
--- a/homescreenapp/hsapplication/conf/base/implml/homescreendb.implml Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsapplication/conf/base/implml/homescreendb.implml Fri Jul 09 14:36:01 2010 +0300
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<container xmlns="http://www.symbianfoundation.org/xml/implml/1">
- <tag name="target" value="rofs3"/>
-
+ <tag name="target" value="rofs2"/>
+ <tag name="target" value="rofs3"/>
+
<!--
Override the setting refs so that modifying HomeScreenDbSettings
causes the execution of both the TemplateML and CommandML
@@ -15,6 +16,10 @@
<!-- TemplateML implementation to create the .sql files -->
<templateml xmlns="http://www.s60.com/xml/templateml/1">
+
+ <!-- just to create empty folder -->
+ <output dir="content/private/20022f35/" file="homescreen.db" encoding="UTF-8"></output>
+
<output dir="private/20022f35/sql/" file="create.sql" encoding="UTF-8">
<template file="homescreendb_templates/create.sql"></template>
</output>
@@ -26,13 +31,13 @@
<!-- CommandML implementation to create the database using the .sql files -->
<commandml xmlns="http://www.s60.com/xml/commandml/1">
<command executable="sqlite3" shell="true" cwd="%CONE_OUT_ABSOLUTE%/private/20022f35/sql">
- <argument value='../homescreen.db ".read create.sql"'/>
+ <argument value='%CONE_OUT_ABSOLUTE%/content/private/20022f35/homescreen.db ".read create.sql"'/>
</command>
<command executable="sqlite3" shell="true" cwd="%CONE_OUT_ABSOLUTE%/private/20022f35/sql">
- <argument value='../homescreen.db ".genfkey --exec"'/>
+ <argument value='%CONE_OUT_ABSOLUTE%/content/private/20022f35/homescreen.db ".genfkey --exec"'/>
</command>
<command executable="sqlite3" shell="true" cwd="%CONE_OUT_ABSOLUTE%/private/20022f35/sql">
- <argument value='../homescreen.db ".read fill.sql"'/>
+ <argument value='%CONE_OUT_ABSOLUTE%/content/private/20022f35/homescreen.db ".read fill.sql"'/>
</command>
</commandml>
</container>
\ No newline at end of file
--- a/homescreenapp/hsapplication/hsapplication.pri Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsapplication/hsapplication.pri Fri Jul 09 14:36:01 2010 +0300
@@ -14,10 +14,14 @@
# Description:
#
-HEADERS += ./inc/hshomescreen.h
+HEADERS += ./inc/hshomescreen.h \
+ ./inc/hsstatemachine.h
SOURCES += ./src/hshomescreen.cpp \
+ ./src/hsstatemachine.cpp \
./src/main.cpp
symbian:{
- HEADERS += ./inc/hshomescreenclientserviceprovider.h
- SOURCES += ./src/hshomescreenclientserviceprovider.cpp
+ HEADERS += ./inc/hshomescreenclientserviceprovider.h \
+ ./inc/hsrecoverymanager.h
+ SOURCES += ./src/hshomescreenclientserviceprovider.cpp \
+ ./src/hsrecoverymanager.cpp
}
--- a/homescreenapp/hsapplication/hsapplication.pro Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsapplication/hsapplication.pro Fri Jul 09 14:36:01 2010 +0300
@@ -18,13 +18,12 @@
include(../common.pri)
-LIBS += -lhsutils -lhsdomainmodel
CONFIG += console
-QT += xml
+#QT += xml
CONFIG += hb mobility
-MOBILITY = serviceframework
+MOBILITY = serviceframework publishsubscribe
fute:DEFINES += FUTE
@@ -56,7 +55,7 @@
include(hsapplication_exports_to_rom.pri)
CONFIG += service
- LIBS += -lxqservice -lxqserviceutil
+ LIBS += -lxqservice -lxqserviceutil -lXQKeyCapture
SERVICE.FILE = ipc_service_conf.xml
}
--- a/homescreenapp/hsapplication/hsapplication_exports_to_rom.pri Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsapplication/hsapplication_exports_to_rom.pri Fri Jul 09 14:36:01 2010 +0300
@@ -16,6 +16,7 @@
# configuration file exports
BLD_INF_RULES.prj_exports += \
+ "conf/base/confml/CI_homescreendb.confml APP_LAYER_CONFML(CI_homescreendb.confml)" \
"conf/base/confml/homescreendb.confml APP_LAYER_CONFML(homescreendb.confml)" \
"conf/base/implml/homescreendb.implml APP_LAYER_CRML(homescreendb.implml)" \
"conf/base/implml/homescreendb_templates/create.sql APP_LAYER_CRML(homescreendb_templates/create.sql)" \
--- a/homescreenapp/hsapplication/inc/hshomescreen.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsapplication/inc/hshomescreen.h Fri Jul 09 14:36:01 2010 +0300
@@ -53,7 +53,7 @@
bool eventFilter(QObject *watched, QEvent *event);
private:
- void registerServicePlugins(QServiceManager &serviceManager);
+ void registerServicePlugins();
void registerServicePlugins(const QString &root, QServiceManager &serviceManager);
private slots:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsapplication/inc/hsrecoverymanager.h Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,51 @@
+/*
+* Copyright (c) 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:
+*
+*/
+
+#ifndef HSRECOVERYMANAGER_H
+#define HSRECOVERYMANAGER_H
+
+#include <QObject>
+#include <QTimer>
+
+#include "hstest_global.h"
+HOMESCREEN_TEST_CLASS(t_hsapplication)
+
+class HsRecoveryManager : public QObject
+{
+ Q_OBJECT
+
+public:
+ HsRecoveryManager(QObject *parent = 0);
+ ~HsRecoveryManager();
+
+ void execute();
+
+private slots:
+ void restoreRomDatabase();
+ void resetCrashCount();
+
+private:
+ Q_DISABLE_COPY(HsRecoveryManager)
+ int crashCount();
+
+private:
+ QTimer mTimer;
+
+ HOMESCREEN_TEST_FRIEND_CLASS(t_hsapplication)
+};
+
+#endif // HSRECOVERYMANAGER_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsapplication/inc/hsstatemachine.h Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,84 @@
+/*
+* Copyright (c) 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: Default implementation of the home screen runtime.
+*
+*/
+
+#ifndef HSSTATEMACHINE_H
+#define HSSTATEMACHINE_H
+
+#include <QStateMachine>
+#include <qmobilityglobal.h>
+
+#ifdef Q_OS_SYMBIAN
+#include <XQKeyCapture>
+#endif
+
+#include "hstest_global.h"
+
+class HsContentService;
+QTM_BEGIN_NAMESPACE
+class QValueSpacePublisher;
+QTM_END_NAMESPACE
+
+QTM_USE_NAMESPACE
+
+HOMESCREEN_TEST_CLASS(t_hsapplication)
+
+class HsStateMachine : public QStateMachine
+{
+ Q_OBJECT
+
+public:
+ HsStateMachine(QObject *parent = 0);
+ ~HsStateMachine();
+
+signals:
+ void event_exit();
+ void event_toIdle();
+protected:
+ bool eventFilter(QObject *watched, QEvent *event);
+
+private:
+ Q_DISABLE_COPY(HsStateMachine)
+
+
+ void registerAnimations();
+ void createStatePublisher();
+ void createContentServiceParts();
+ void createStates();
+ void updatePSKeys();
+
+private slots:
+ void onIdleStateEntered();
+ void onIdleStateExited();
+ void activityRequested(const QString &name);
+
+
+private:
+ HsContentService *mContentService;
+
+ bool mHomeScreenActive;
+ bool mIdleStateActive;
+
+ QValueSpacePublisher *mPublisher;
+
+#ifdef Q_OS_SYMBIAN
+ XQKeyCapture keyCapture;
+#endif
+
+ HOMESCREEN_TEST_FRIEND_CLASS(t_hsapplication)
+};
+
+#endif
--- a/homescreenapp/hsapplication/installs_symbian.pri Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsapplication/installs_symbian.pri Fri Jul 09 14:36:01 2010 +0300
@@ -21,17 +21,23 @@
for(export1, exports1.sources):BLD_INF_RULES.prj_exports += "./$$export1 $$deploy.path$$exports1.path/$$basename(export1)"
exports2.path = /private/20022f35/wallpapers/scene
-exports2.sources += resource/scene/default_landscape.png
-exports2.sources += resource/scene/default_portrait.png
+exports2.sources += resource/wallpapers/scene/default_landscape.png
+exports2.sources += resource/wallpapers/scene/default_portrait.png
for(export2, exports2.sources):BLD_INF_RULES.prj_exports += "./$$export2 $$deploy.path$$exports2.path/$$basename(export2)"
exports3.path = /private/20022f35/wallpapers/page
-exports3.sources += resource/page/default_landscape.png
-exports3.sources += resource/page/default_portrait.png
-exports3.sources += resource/page/1_landscape.png
-exports3.sources += resource/page/1_portrait.png
-exports3.sources += resource/page/2_landscape.png
-exports3.sources += resource/page/2_portrait.png
-exports3.sources += resource/page/3_landscape.png
-exports3.sources += resource/page/3_portrait.png
+exports3.sources += resource/wallpapers/page/default_landscape.png
+exports3.sources += resource/wallpapers/page/default_portrait.png
+exports3.sources += resource/wallpapers/page/1_landscape.png
+exports3.sources += resource/wallpapers/page/1_portrait.png
+exports3.sources += resource/wallpapers/page/2_landscape.png
+exports3.sources += resource/wallpapers/page/2_portrait.png
+exports3.sources += resource/wallpapers/page/3_landscape.png
+exports3.sources += resource/wallpapers/page/3_portrait.png
for(export3, exports3.sources):BLD_INF_RULES.prj_exports += "./$$export3 $$deploy.path$$exports3.path/$$basename(export3)"
+
+exports4.path = /private/20022f35/wallpapers/originals
+exports4.sources += resource/wallpapers/page/originals/car.png
+exports4.sources += resource/wallpapers/page/originals/shapes.png
+exports4.sources += resource/wallpapers/page/originals/shoes.png
+for(export4, exports4.sources):BLD_INF_RULES.prj_exports += "./$$export4 $$deploy.path$$exports4.path/$$basename(export4)"
--- a/homescreenapp/hsapplication/installs_win.pri Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsapplication/installs_win.pri Fri Jul 09 14:36:01 2010 +0300
@@ -16,9 +16,9 @@
kqtihswallpapers.CONFIG += no_build
kqtihswallpapers.path = $$DESTDIR/resource/kqtihswallpapers
-kqtihswallpapers.files = ./resource/bg_1.png \
- ./resource/bg_2.png \
- ./resource/bg_3.png
+kqtihswallpapers.files = ./resource/wallpapers/page/originals/car.png \
+ ./resource/wallpapers/page/originals/shapes.png \
+ ./resource/wallpapers/page/originals/shoes.png
homescreendb.CONFIG += no_build
homescreendb.path = $$DESTDIR/private/20022f35
@@ -26,19 +26,19 @@
scenewallpapers.CONFIG += no_build
scenewallpapers.path = $$DESTDIR/private/20022f35/wallpapers/scene
-scenewallpapers.files = ./resource/scene/default_landscape.png \
- ./resource/scene/default_portrait.png
+scenewallpapers.files = ./resource/wallpapers/scene/default_landscape.png \
+ ./resource/wallpapers/scene/default_portrait.png
pagewallpapers.CONFIG += no_build
pagewallpapers.path = $$DESTDIR/private/20022f35/wallpapers/page
-pagewallpapers.files = ./resource/page/default_landscape.png \
- ./resource/page/default_portrait.png \
- ./resource/page/1_portrait.png \
- ./resource/page/1_landscape.png \
- ./resource/page/2_portrait.png \
- ./resource/page/2_landscape.png \
- ./resource/page/3_portrait.png \
- ./resource/page/3_landscape.png
+pagewallpapers.files = ./resource/wallpapers/page/default_landscape.png \
+ ./resource/wallpapers/page/default_portrait.png \
+ ./resource/wallpapers/page/1_portrait.png \
+ ./resource/wallpapers/page/1_landscape.png \
+ ./resource/wallpapers/page/2_portrait.png \
+ ./resource/wallpapers/page/2_landscape.png \
+ ./resource/wallpapers/page/3_portrait.png \
+ ./resource/wallpapers/page/3_landscape.png
INSTALLS += kqtihswallpapers homescreendb scenewallpapers pagewallpapers
PRE_TARGETDEPS += install_kqtihswallpapers install_homescreendb install_scenewallpapers install_pagewallpapers
Binary file homescreenapp/hsapplication/resource/bg_1.png has changed
Binary file homescreenapp/hsapplication/resource/bg_2.png has changed
Binary file homescreenapp/hsapplication/resource/bg_3.png has changed
Binary file homescreenapp/hsapplication/resource/page/1_landscape.png has changed
Binary file homescreenapp/hsapplication/resource/page/1_portrait.png has changed
Binary file homescreenapp/hsapplication/resource/page/2_landscape.png has changed
Binary file homescreenapp/hsapplication/resource/page/2_portrait.png has changed
Binary file homescreenapp/hsapplication/resource/page/3_landscape.png has changed
Binary file homescreenapp/hsapplication/resource/page/3_portrait.png has changed
Binary file homescreenapp/hsapplication/resource/page/default_landscape.png has changed
Binary file homescreenapp/hsapplication/resource/page/default_portrait.png has changed
Binary file homescreenapp/hsapplication/resource/resource_win/homescreen.db has changed
Binary file homescreenapp/hsapplication/resource/scene/default_landscape.png has changed
Binary file homescreenapp/hsapplication/resource/scene/default_portrait.png has changed
Binary file homescreenapp/hsapplication/resource/wallpapers/page/1_landscape.png has changed
Binary file homescreenapp/hsapplication/resource/wallpapers/page/1_portrait.png has changed
Binary file homescreenapp/hsapplication/resource/wallpapers/page/2_landscape.png has changed
Binary file homescreenapp/hsapplication/resource/wallpapers/page/2_portrait.png has changed
Binary file homescreenapp/hsapplication/resource/wallpapers/page/3_landscape.png has changed
Binary file homescreenapp/hsapplication/resource/wallpapers/page/3_portrait.png has changed
Binary file homescreenapp/hsapplication/resource/wallpapers/page/default_landscape.png has changed
Binary file homescreenapp/hsapplication/resource/wallpapers/page/default_portrait.png has changed
Binary file homescreenapp/hsapplication/resource/wallpapers/page/originals/car.png has changed
Binary file homescreenapp/hsapplication/resource/wallpapers/page/originals/shapes.png has changed
Binary file homescreenapp/hsapplication/resource/wallpapers/page/originals/shoes.png has changed
Binary file homescreenapp/hsapplication/resource/wallpapers/scene/default_landscape.png has changed
Binary file homescreenapp/hsapplication/resource/wallpapers/scene/default_portrait.png has changed
Binary file homescreenapp/hsapplication/resource/wallpapers/scene/originals/kites.png has changed
--- a/homescreenapp/hsapplication/src/hshomescreen.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsapplication/src/hshomescreen.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -26,6 +26,7 @@
#include "hshomescreen.h"
#include "hstest_global.h"
+#include "hsstatemachine.h"
#ifdef Q_OS_SYMBIAN
#include "hshomescreenclientserviceprovider.h"
#endif
@@ -35,8 +36,7 @@
\class HsHomeScreen
\ingroup group_hsapplication
\brief Homescreen application main class.
- Loads a runtime from a runtime provider plugin. Manages
- the state machine execution.
+ Manages the state machine execution.
*/
/*!
@@ -52,34 +52,17 @@
{
HSTEST_FUNC_ENTRY("HS::HsHomeScreen::HsHomeScreen");
- QServiceManager serviceManager;
-
- registerServicePlugins(serviceManager);
+ registerServicePlugins();
- QServiceFilter filter("com.nokia.symbian.IHomeScreenRuntime");
- QList<QServiceInterfaceDescriptor> interfaces = serviceManager.findInterfaces(filter);
-
- if (interfaces.isEmpty()) {
- emit exit();
- return;
- }
+ mRuntime = new HsStateMachine(this);
- QObject *object = serviceManager.loadInterface(interfaces.first().interfaceName());
- mRuntime = qobject_cast<QStateMachine *>(object);
-
- if (mRuntime) {
- mRuntime->setParent(this);
- connect(mRuntime, SIGNAL(started()), SLOT(onRuntimeStarted()));
- connect(mRuntime, SIGNAL(stopped()), SLOT(onRuntimeStopped()));
- hbInstance->allMainWindows().first()->installEventFilter(this);
+ connect(mRuntime, SIGNAL(started()), SLOT(onRuntimeStarted()));
+ connect(mRuntime, SIGNAL(stopped()), SLOT(onRuntimeStopped()));
+ hbInstance->allMainWindows().first()->installEventFilter(this);
#ifdef Q_OS_SYMBIAN
- mHomeScreenClientServiceProvider = new HsHomeScreenClientServiceProvider;
- mHomeScreenClientServiceProvider->setParent(this);
+ mHomeScreenClientServiceProvider = new HsHomeScreenClientServiceProvider;
+ mHomeScreenClientServiceProvider->setParent(this);
#endif
- } else {
- delete object;
- emit exit();
- }
HSTEST_FUNC_EXIT("HS::HsHomeScreen::HsHomeScreen");
}
@@ -97,26 +80,21 @@
*/
/*!
- Starts the runtime.
+ Starts the state machine.
*/
void HsHomeScreen::start()
{
HSTEST_FUNC_ENTRY("HS::HsHomeScreen::start");
- if (mRuntime) {
- mRuntime->start();
- } else {
- HSTEST_FUNC_EXIT("HS::HsHomeScreen::start, mRuntime not created, exit application");
- emit exit();
- }
+ mRuntime->start();
HSTEST_FUNC_EXIT("HS::HsHomeScreen::start");
}
/*!
- Stops the runtime.
+ Stops the state machine.
*/
void HsHomeScreen::stop()
{
- if (mRuntime && mRuntime->isRunning()) {
+ if (mRuntime->isRunning()) {
QEventLoop eventLoop;
connect(mRuntime, SIGNAL(finished()), &eventLoop, SLOT(quit()));
QMetaObject::invokeMethod(mRuntime, "event_exit", Qt::QueuedConnection);
@@ -137,14 +115,14 @@
}
/*!
- Called after the runtime has started.
+ Called after the state machine has started.
*/
void HsHomeScreen::onRuntimeStarted()
{
}
/*!
- Called after the runtime has stopped.
+ Called after the state machine has stopped.
*/
void HsHomeScreen::onRuntimeStopped()
{
@@ -154,9 +132,12 @@
/*!
Registers service plugins pre-installed on the device.
*/
-void HsHomeScreen::registerServicePlugins(QServiceManager &serviceManager)
-{
+void HsHomeScreen::registerServicePlugins()
+{
HSTEST_FUNC_ENTRY("HS::HsHomeScreen::registerServicePlugins()");
+
+ QServiceManager serviceManager;
+
QStringList pluginPaths;
pluginPaths << "private/20022F35";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsapplication/src/hsrecoverymanager.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,104 @@
+/*
+* Copyright (c) 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 <e32property.h>
+
+#include <QFile>
+
+#include "hsrecoverymanager.h"
+
+const TInt KPSCategoryUid(0x20022F36);
+const TInt KPSCrashCountKey(1);
+const int KCrashCountThreshold(3);
+const int KResetCrashCountInterval(60000);
+
+/*!
+ \class HsRecoveryManager
+ \ingroup group_hsapplication
+ \brief Used during homescreen startup for recovering from possible crash situations.
+*/
+
+/*!
+ Constructs a new recovery manager with the given \a parent item.
+*/
+HsRecoveryManager::HsRecoveryManager(QObject *parent)
+ : QObject(parent)
+{
+ mTimer.setInterval(KResetCrashCountInterval);
+ mTimer.setSingleShot(true);
+ connect(&mTimer, SIGNAL(timeout()), SLOT(resetCrashCount()));
+}
+
+/*!
+ Destructor.
+*/
+HsRecoveryManager::~HsRecoveryManager()
+{
+}
+
+/*!
+ Executes this recovery manager. If crash count exceeds the
+ threshold, the ROM configuration is selected. Otherwise,
+ the existing one is used.
+*/
+void HsRecoveryManager::execute()
+{
+ int count = crashCount();
+ if (KCrashCountThreshold <= count) {
+ restoreRomDatabase();
+ resetCrashCount();
+ return;
+ }
+ if (0 < count) {
+ mTimer.start();
+ }
+}
+
+/*!
+ Restores the ROM database to c: drive.
+*/
+void HsRecoveryManager::restoreRomDatabase()
+{
+ // If exists, remove the database from c:
+ QFile file("c:/private/20022f35/homescreen.db");
+ if (file.exists()) {
+ file.remove();
+ }
+ // Copy the rom database to c: and set permissions.
+ file.setFileName("z:/private/20022f35/homescreen.db");
+ file.copy("c:/private/20022f35/homescreen.db");
+ file.setFileName("c:/private/20022f35/homescreen.db");
+ file.setPermissions(QFile::ReadOwner | QFile::WriteOwner);
+}
+
+/*!
+ Resets the crash count to zero.
+*/
+void HsRecoveryManager::resetCrashCount()
+{
+ RProperty::Set(TUid::Uid(KPSCategoryUid), KPSCrashCountKey, 0);
+}
+
+/*!
+ Returns the current crash count.
+*/
+int HsRecoveryManager::crashCount()
+{
+ TInt count = 0;
+ RProperty::Get(TUid::Uid(KPSCategoryUid), KPSCrashCountKey, count);
+ return count;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsapplication/src/hsstatemachine.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,412 @@
+/*
+* Copyright (c) 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: Default implementation of the home state machine.
+*
+*/
+
+#include <QState>
+#include <QFinalState>
+#include <QHistoryState>
+#include <QSignalTransition>
+#include <QKeyEventTransition>
+#include <QKeyEvent>
+
+#include <qvaluespacepublisher.h>
+#include <qservicemanager.h>
+#include <qservicefilter.h>
+#include <qserviceinterfacedescriptor.h>
+
+#include <HbApplication>
+#include <HbActivityManager>
+#include <HbInstance>
+#include <HbIconAnimationManager>
+#include <HbIconAnimationDefinition>
+
+#include "hsmenueventfactory.h"
+#include "homescreendomainpskeys.h"
+#include "hsstatemachine.h"
+#include "hsdatabase.h"
+#include "hscontentservice.h"
+#include "hsshortcutservice.h"
+#include "hsmenueventtransition.h"
+#include "hswidgetpositioningonorientationchange.h"
+#include "hswidgetpositioningonwidgetadd.h"
+#include "hsconfiguration.h"
+#include "hstest_global.h"
+#include "hswidgetpositioningonwidgetmove.h"
+
+QTM_USE_NAMESPACE
+#define hbApp qobject_cast<HbApplication*>(qApp)
+
+#ifdef Q_OS_SYMBIAN
+const static Qt::Key applicationKey = Qt::Key_Menu;
+#else
+const static Qt::Key applicationKey = Qt::Key_Home;
+#endif
+
+namespace
+{
+ const char KHsRootStateInterface[] = "com.nokia.homescreen.state.HsRootState";
+ const char KHsLoadSceneStateInterface[] = "com.nokia.homescreen.state.HsLoadSceneState";
+ const char KHsIdleStateInterface[] = "com.nokia.homescreen.state.HsIdleState";
+ const char KHsAppLibraryStateInterface[] = "com.nokia.homescreen.state.HsAppLibraryState";
+ const char KHsMenuWorkerStateInterface[] = "com.nokia.homescreen.state.HsMenuWorkerState";
+ const char KHsBacupRestoreStateInterface[] = "com.nokia.homescreen.state.HsBackupRestoreState";
+}
+
+
+/*!
+ \class HsStateMachine
+ \ingroup group_hsstatemachine
+ \brief Default implementation of the home screen state machine.
+ Creates an execution context (EC) and populates it with
+ runtime services. States are loaded from state plugins.
+ Each state is given an access to the EC. States
+ are added to a state machine. Finally, the state machine
+ is started.
+*/
+
+/*!
+ Constructs state machine with \a parent as the parent object.
+*/
+HsStateMachine::HsStateMachine(QObject *parent)
+ : QStateMachine(parent),
+ mContentService(0),
+ mHomeScreenActive(false),
+ mIdleStateActive(false),
+ mPublisher(NULL)
+#ifdef Q_OS_SYMBIAN
+ ,keyCapture()
+#endif
+{
+ HSTEST_FUNC_ENTRY("HS::HsStateMachine::HsStateMachine");
+
+ HsDatabase *db = new HsDatabase;
+ db->setConnectionName("homescreen.dbc");
+#ifdef Q_OS_SYMBIAN
+ db->setDatabaseName("c:/private/20022f35/homescreen.db");
+#else
+ db->setDatabaseName("private/20022f35/homescreen.db");
+#endif
+ db->open();
+ HsDatabase::setInstance(db);
+
+ HsConfiguration::setInstance(new HsConfiguration);
+ HsConfiguration::instance()->load();
+
+ HsWidgetPositioningOnOrientationChange::setInstance(
+ new HsAdvancedWidgetPositioningOnOrientationChange);
+
+ HsWidgetPositioningOnWidgetAdd::setInstance(
+ new HsAnchorPointInBottomRight);
+
+ HsWidgetPositioningOnWidgetMove::setInstance(
+ new HsSnapToLines);
+
+ registerAnimations();
+
+ createStatePublisher();
+ createContentServiceParts();
+ createStates();
+
+ // create the instance so that singleton is accessible from elsewhere
+ HsShortcutService::instance(this);
+
+ QCoreApplication::instance()->installEventFilter(this);
+
+ if (hbApp) { // Qt test framework uses QApplication.
+ connect(hbApp->activityManager(), SIGNAL(activityRequested(QString)),
+ this, SLOT(activityRequested(QString)));
+ }
+ HSTEST_FUNC_EXIT("HS::HsStateMachine::HsStateMachine");
+}
+
+/*!
+ Destructor.
+*/
+HsStateMachine::~HsStateMachine()
+{
+ HsWidgetPositioningOnOrientationChange::setInstance(0);
+ delete mPublisher;
+}
+
+/*!
+ \fn void HsStateMachine::stopStateMachine()
+ Emission of this signal initiates a transition to the final state.
+*/
+
+/*!
+ \copydoc QObject::eventFilter(QObject *watched, QEvent *event)
+*/
+bool HsStateMachine::eventFilter(QObject *watched, QEvent *event)
+{
+ Q_UNUSED(watched);
+
+ switch (event->type()) {
+ case QEvent::ApplicationActivate:
+ qDebug() << "HsStateMachine::eventFilter: QEvent::ApplicationActivate";
+#ifdef Q_OS_SYMBIAN
+ keyCapture.captureKey(applicationKey);
+#endif
+ mHomeScreenActive = true;
+ updatePSKeys();
+ break;
+ case QEvent::ApplicationDeactivate:
+ qDebug() << "HsStateMachine::eventFilter: QEvent::ApplicationDeactivate";
+#ifdef Q_OS_SYMBIAN
+ keyCapture.cancelCaptureKey(applicationKey);
+#endif
+ mHomeScreenActive = false;
+ updatePSKeys();
+ break;
+ default:
+ break;
+ }
+
+ bool result = QStateMachine::eventFilter(watched, event);
+ // temporary hack as we should not register twice for events
+ if (event->type() == QEvent::KeyPress ) {
+ QKeyEvent* ke = static_cast<QKeyEvent *>(event);
+ // Key_Launch0 should be removed when QT starts to send Key_Menu
+ result = (ke->key() == applicationKey) || ke->key() == Qt::Key_Launch0;
+ }
+ return result;
+}
+
+
+/*!
+ Registers framework animations.
+*/
+void HsStateMachine::registerAnimations()
+{
+ HbIconAnimationManager *manager = HbIconAnimationManager::global();
+ manager->addDefinitionFile(QLatin1String("qtg_anim_loading.axml"));
+}
+
+/*!
+ Creates Home screen state publisher.
+*/
+void HsStateMachine::createStatePublisher()
+{
+ mPublisher = new QValueSpacePublisher(QValueSpace::PermanentLayer, HsStatePSKeyPath);
+
+ if (!mPublisher->isConnected()){
+ // No permanent layer available
+ mPublisher = new QValueSpacePublisher(HsStatePSKeyPath);
+ }
+
+ mPublisher->setValue(HsStatePSKeySubPath, EHomeScreenInactive);
+}
+
+/*!
+ Creates content service parts.
+*/
+void HsStateMachine::createContentServiceParts()
+{
+ HSTEST_FUNC_ENTRY("HS::HsStateMachine::createContentServiceParts");
+
+ mContentService = new HsContentService(this);
+
+ HSTEST_FUNC_EXIT("HS::HsStateMachine::createContentServiceParts");
+}
+
+/*!
+ Creates states.
+*/
+void HsStateMachine::createStates()
+{
+ HSTEST_FUNC_ENTRY("HS::HsStateMachine::createStates");
+
+ QFinalState *finalState = new QFinalState();
+ addState(finalState);
+
+ QState *guiRootState = new QState();
+ addState(guiRootState);
+
+ guiRootState->addTransition(this, SIGNAL(event_exit()), finalState);
+
+ QServiceManager manager;
+
+
+ QObject *loadSceneStateObj = manager.loadInterface(KHsLoadSceneStateInterface);
+ QState *loadSceneState = qobject_cast<QState *>(loadSceneStateObj);
+ loadSceneState->setParent(guiRootState);
+ loadSceneState->setObjectName(KHsLoadSceneStateInterface);
+
+ QObject *rootStateObj = manager.loadInterface(KHsRootStateInterface);
+ QState *rootState = qobject_cast<QState *>(rootStateObj);
+ rootState->setParent(guiRootState);
+ rootState->setObjectName(KHsRootStateInterface);
+
+ QObject *idleStateObj = manager.loadInterface(KHsIdleStateInterface);
+ QState *idleState = qobject_cast<QState *>(idleStateObj);
+ idleState->setParent(rootState);
+ idleState->setObjectName(KHsIdleStateInterface);
+ connect(idleState, SIGNAL(entered()), SLOT(onIdleStateEntered()));
+ connect(idleState, SIGNAL(exited()), SLOT(onIdleStateExited()));
+
+
+ //menu state
+ QState *menuParallelState = new QState(
+ QState::ParallelStates, rootState);
+ QState *menuRootState = new QState(menuParallelState);
+
+ QObject *appLibraryStateObj = manager.loadInterface(KHsAppLibraryStateInterface);
+ QState *appLibraryState = qobject_cast<QState *>(appLibraryStateObj);
+ appLibraryState->setParent(menuRootState);
+ appLibraryState->setObjectName(KHsAppLibraryStateInterface);
+ menuRootState->setInitialState(appLibraryState);
+
+ QHistoryState *historyState = new QHistoryState(rootState);
+ historyState->setDefaultState(idleState);
+
+ loadSceneState->addTransition(
+ loadSceneState, SIGNAL(event_history()), historyState);
+
+ QObject *menuWorkerStateObj = manager.loadInterface(KHsMenuWorkerStateInterface);
+ QState *menuWorkerState = qobject_cast<QState *>(menuWorkerStateObj);
+ menuWorkerState->setParent(menuParallelState);
+ menuWorkerState->setObjectName(KHsMenuWorkerStateInterface);
+
+ connect(appLibraryState, SIGNAL(collectionEntered()),
+ menuWorkerState, SIGNAL(reset()));
+
+ //Backup/Restore state
+ QObject *backupRestoreStateObj = manager.loadInterface(KHsBacupRestoreStateInterface);
+ QState *backupRestoreState = qobject_cast<QState *>(backupRestoreStateObj);
+ backupRestoreState->setParent(guiRootState);
+ backupRestoreState->setObjectName(KHsBacupRestoreStateInterface);
+ backupRestoreState->addTransition(
+ backupRestoreState, SIGNAL(event_loadScene()), loadSceneState);
+
+ // root state transitions
+ idleState->addTransition(idleState, SIGNAL(event_applicationLibrary()), menuRootState);
+ appLibraryState->addTransition(
+ appLibraryState, SIGNAL(toHomescreenState()), idleState);
+ rootState->addTransition(rootState, SIGNAL(event_backupRestore()), backupRestoreState);
+ // opening shortcut to Application Library
+ HsMenuEventTransition *idleToAppLibTransition =
+ new HsMenuEventTransition(HsMenuEvent::OpenApplicationLibrary,
+ idleState, appLibraryState);
+ idleState->addTransition(idleToAppLibTransition);
+
+ HsMenuEventTransition *appLibToIdleTransition =
+ new HsMenuEventTransition(
+ HsMenuEvent::OpenHomeScreen, appLibraryState, idleState);
+ appLibraryState->addTransition(appLibToIdleTransition);
+
+ HbMainWindow *window = hbInstance->allMainWindows().first();
+
+ // key driven transition from idle to menu
+ QKeyEventTransition *idleToMenuRootTransition =
+ new QKeyEventTransition(
+ window, QEvent::KeyPress, applicationKey);
+ idleToMenuRootTransition->setTargetState(menuRootState);
+ idleState->addTransition(idleToMenuRootTransition);
+ // key driven transition from menu to idle
+ QKeyEventTransition *menuToIdleTransition =
+ new QKeyEventTransition(
+ window, QEvent::KeyPress, applicationKey);
+ menuToIdleTransition->setTargetState(idleState);
+ menuRootState->addTransition(menuToIdleTransition);
+
+ // transition for Key_Launch0 should be removed
+ // when OT starts to send Key_Menu (maybe wk14)
+ QKeyEventTransition *idleToMenuRootTransition2 =
+ new QKeyEventTransition(
+ window, QEvent::KeyPress, Qt::Key_Launch0);
+ idleToMenuRootTransition2->setTargetState(menuRootState);
+ idleState->addTransition(idleToMenuRootTransition2);
+ // key driven transition from menu to idle
+ QKeyEventTransition *menuToIdleTransition2 =
+ new QKeyEventTransition(
+ window, QEvent::KeyPress, Qt::Key_Launch0);
+ menuToIdleTransition2->setTargetState(idleState);
+ menuRootState->addTransition(menuToIdleTransition2);
+ // add transition to switch to idle
+ menuRootState->addTransition( this, SIGNAL(event_toIdle()), idleState);
+
+ // transitions to child states
+ // opening shortcut to a colleciton
+ QList<QState *> collectionStates =
+ appLibraryState->
+ findChildren<QState *>
+ ("homescreen.nokia.com/state/applibrarystate/collectionstate");
+ qDebug(
+ "Found %d \"collectionstate\" children for Application Library State",
+ collectionStates.count());
+ if (collectionStates.count()) {
+ HsMenuEventTransition *idleToCollectionTransition =
+ new HsMenuEventTransition(HsMenuEvent::OpenCollection,
+ idleState, collectionStates[0]);
+ idleState->addTransition(idleToCollectionTransition);
+ }
+
+ guiRootState->setInitialState(loadSceneState);
+ setInitialState(guiRootState);
+
+ HSTEST_FUNC_EXIT("HS::HsStateMachine::createStates");
+}
+
+
+/*!
+ Publishes Home screen states via Publish & Subscribe.
+*/
+void HsStateMachine::updatePSKeys()
+{
+ if (!mPublisher){
+ createStatePublisher();
+ }
+
+ if (mHomeScreenActive && mIdleStateActive){
+ qDebug() << "HsStateMachine::updatePSKeys: EHomeScreenIdleState";
+ mPublisher->setValue(HsStatePSKeySubPath, EHomeScreenIdleState);
+ }
+ else{
+ qDebug() << "HsStateMachine::updatePSKeys: EHomeScreenInactive";
+ mPublisher->setValue(HsStatePSKeySubPath, EHomeScreenInactive);
+ }
+}
+
+/*!
+ Called when state machine is in Idle state.
+*/
+void HsStateMachine::onIdleStateEntered()
+{
+ mIdleStateActive = true;
+ updatePSKeys();
+}
+
+/*!
+ Called when state machine leaves the Idle state.
+*/
+void HsStateMachine::onIdleStateExited()
+{
+ mIdleStateActive = false;
+ updatePSKeys();
+}
+
+/*!
+ Activity requested by another client
+*/
+void HsStateMachine::activityRequested(const QString &name)
+{
+ if (name == groupAppLibRecentView()) {
+ this->postEvent(
+ HsMenuEventFactory::createOpenCollectionEvent(0,
+ collectionDownloadedTypeName()));
+ } else if (name == activityHsIdleView()) {
+ emit event_toIdle();
+ }
+}
--- a/homescreenapp/hsapplication/src/main.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsapplication/src/main.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -36,6 +36,7 @@
#include <e32debug.h>
#include <apgwgnam.h>
+#include "hsrecoverymanager.h"
void loadTranslationFilesOnSymbian(QTranslator &commonTranslator,
QTranslator &hsTranslator,
@@ -43,6 +44,7 @@
void copyWallpapersFromRom();
void copyHsDatabaseFileFromRom();
void createPrivateFolder();
+void copyWallpaperOriginalsFromRomToPhotos();
/*!
\fn setHomescreenAsSystemAppL(CEikonEnv* eikonEnv)
@@ -133,6 +135,8 @@
#ifdef Q_OS_SYMBIAN
copyHsDatabaseFileFromRom();
+ HsRecoveryManager recoveryManager;
+ recoveryManager.execute();
copyWallpapersFromRom();
#endif
@@ -203,7 +207,7 @@
HSTEST("HS::main() - homescreen.db not in c:");
file.setFileName("z:/private/20022f35/homescreen.db");
if(!file.exists()) {
- HSTEST("HS::main() - homescreen.db not in ROM!");
+ qWarning() << "HS::main() - homescreen.db not in ROM!";
} else {
HSTEST("HS::main() - homescreen.db found from z:");
createPrivateFolder();
@@ -214,10 +218,12 @@
HSTEST("HS::main() - homescreen.db copied from ROM to c:!");
file.setFileName("c:/private/20022f35/homescreen.db");
if(!file.setPermissions(QFile::ReadOwner | QFile::WriteOwner)) {
- HSTEST("HS::main() - homescreen.db ReadWrite permission settings on c: failed!");
+ qWarning() << "HS::main() - homescreen.db ReadWrite permission settings on c: failed!";
}
HSTEST("HS::main() - homescreen.db permission set to ReadWrite!");
}
+ // Copy wallpaper originals to C drive user data to be visible in Photos
+ copyWallpaperOriginalsFromRomToPhotos();
}
#ifdef __WINS__
else if(!file.setPermissions(QFile::ReadOwner | QFile::WriteOwner)) {
@@ -280,6 +286,36 @@
}
/*!
+ \fn copyWallpaperOriginalFromRomToPhotos()
+ \ingroup group_hsapplication
+ \internal
+ \brief Wallpaper original copier
+ Copies homescreen wallpaper originals from rom to C for Photos
+ does not exist on c: drive
+*/
+void copyWallpaperOriginalsFromRomToPhotos()
+{
+ QString targetPath("e:/data/images/wallpapers");
+ QDir dir(targetPath);
+ if(!dir.exists()) {
+ dir.mkpath(targetPath);
+ QDir dir2("z:/private/20022f35/wallpapers/originals");
+ dir2.setFilter(QDir::Files);
+ QStringList files = dir2.entryList();
+ foreach(QString file, files) {
+ QString targetFile(targetPath + "/" + file);
+ if ( QFile::copy(dir2.absoluteFilePath(file), targetFile) ) {
+ qDebug() << "Wallpaper original copied from " << dir2.absoluteFilePath(file) << "to " << targetFile;
+ }
+ QFile createdFile(targetFile);
+ if(!createdFile.setPermissions(QFile::ReadOwner | QFile::WriteOwner)) {
+ qDebug() << "Read write permission set failed for wallpaper original" << targetFile;
+ }
+ }
+ }
+}
+
+/*!
\fn loadTranslationFilesOnSymbian(QTranslator &commonTranslator,
QTranslator &hsTranslator,
QTranslator &alTranslator)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsapplicationlauncher/group/hsapplicationlauncher.mmp Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,50 @@
+/*
+* 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: Makefile of hsapplicationlauncher
+*
+*/
+
+#include <platform_paths.hrh>
+
+TARGET hsapplicationlauncher.exe
+
+targettype exe
+
+UID 0x1000008d 0x20022F36
+CAPABILITY ReadDeviceData WriteDeviceData
+VENDORID VID_DEFAULT
+SECUREID 0x20022F36
+
+EPOCHEAPSIZE 0x1000 0x100000 // 4KB - 1 MB
+EPOCSTACKSIZE 0x5000
+
+SOURCEPATH ../src
+SOURCE hsapplicationlauncher.cpp
+SOURCE hsprocessmonitor.cpp
+SOURCE hsshutdownmonitor.cpp
+
+USERINCLUDE .
+USERINCLUDE ../inc
+
+MW_LAYER_SYSTEMINCLUDE
+
+LIBRARY euser.lib // CBase etc
+LIBRARY bafl.lib // descriptors
+LIBRARY ssmcmn.lib // state manager
+LIBRARY centralrepository.lib
+LIBRARY cenrepnotifhandler.lib
+
+LANG SC
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsapplicationlauncher/hsapplicationlauncher.pro Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,21 @@
+#
+# 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: Main project file for homescreen application
+#
+
+TEMPLATE = subdirs
+
+symbian: {
+ BLD_INF_RULES.prj_mmpfiles += "./group/hsapplicationlauncher.mmp"
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsapplicationlauncher/inc/hsapplicationlauncher.h Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,186 @@
+/*
+* Copyright (c) 1020 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: application class.
+*/
+
+#ifndef __HS_LAUNCH_
+#define __HS_LAUNCH_
+
+#include <e32base.h>
+#include <centralrepository.h>
+#include <cenrepnotifyhandler.h>
+#include "hsprocessmonitor.h"
+#include "hsshutdownmonitor.h"
+
+class t_hsapplicationlauncher;
+
+/**
+ * CHsLaunch
+ *
+ * application class.
+ *
+ * @since S60 5.2
+ */
+class CHsLaunch : public CActive,
+ MCenRepNotifyHandlerCallback,
+ MHsProcessMonitorObserver,
+ MHsShutdownMonitorObserver
+ {
+ public:
+ /**
+ * Create new launcher
+ *
+ * @since S60 5.2
+ */
+ static CHsLaunch* NewL();
+
+ /**
+ * Destructor.
+ *
+ * @since S60 5.2
+ */
+ virtual ~CHsLaunch();
+
+ /**
+ * Set active object to be ran
+ *
+ * @since S60 5.2
+ */
+ void Activate();
+
+ /**
+ * Get application return value
+ *
+ * @return TInt Application return value
+ * @since S60 5.2
+ */
+ TInt ApplicationReturnValue();
+
+ protected:
+ /**
+ * C++ constructor.
+ *
+ * @since S60 5.2
+ */
+ CHsLaunch();
+
+ /**
+ * Symbian 2nd phase constructor
+ *
+ * @since S60 5.2
+ */
+ void ConstructL();
+
+ private: // From CActive.
+ /**
+ * From CActive
+ */
+ void RunL();
+
+ /**
+ * From CActive
+ *
+ * @since S60 5.2
+ */
+ void DoCancel();
+
+ /**
+ * From CActive
+ *
+ * @since S60 5.2
+ */
+ TInt RunError( TInt aError );
+
+ private: // From MCenRepNotifyHandlerCallback
+ /**
+ * From MCenRepNotifyHandlerCallback
+ */
+ void HandleNotifyInt(TUint32 aId, TInt aNewValue);
+
+ private: // From MHsProcessMonitorObserver
+ /**
+ * From MHsProcessMonitorObserver
+ */
+ void ProcessEnded( const TExitType& aExitType,
+ const TInt aExitReason,
+ const TExitCategoryName& aExitCategory );
+
+ /**
+ * From MHsProcessMonitorObserver
+ */
+ void ProcessMonitoringError( TInt aError );
+
+ private: // From MHsShutdownMonitorObserver
+ /**
+ * From MHsShutdownMonitorObserver
+ */
+ void SystemShutdownEvent();
+
+ private:
+ /**
+ * Initialize process monitor
+ *
+ * @param aProcessId Id of process to monitor
+ */
+ void InitProcessMonitorL( const TInt aProcessId );
+
+ /**
+ * Shut down application
+ *
+ * @param aApplicationReturnValue Application return value.
+ */
+ void ShutdownApp( const TInt aApplicationReturnValue );
+
+ /**
+ * Starts the home screen application.
+ */
+ void StartHomeScreen();
+
+ /**
+ * Checks if the language is selected.
+ */
+ TBool IsLanguageSelectedL();
+
+ /**
+ * Starts listening the repository notifications for
+ * language selection.
+ */
+ void StartListeningLanguageSelectionL();
+
+ /**
+ * Stops listening the repository notifications for
+ * language selection.
+ */
+ void StopListeningLanguageSelection();
+
+ private: // data.
+ // Process monitor. Owned.
+ CHsProcessMonitor* iProcessMonitor;
+
+ // Shutdown monitor. Owned.
+ CHsShutdownMonitor* iShutdownMonitor;
+
+ // Repository.
+ CRepository *iRepository;
+
+ // Repository notify handler.
+ CCenRepNotifyHandler* iCenRepNotifyHandler;
+
+ // Application return value
+ TInt iApplicationReturnValue;
+
+ friend class t_hsapplicationlauncher;
+ };
+
+#endif // __HS_LAUNCH_
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsapplicationlauncher/inc/hsprocessmonitor.h Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,159 @@
+/*
+* Copyright (c) 1020 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: process monitor.
+*/
+
+
+#ifndef __HS_PROCESS_MONITOR__
+#define __HS_PROCESS_MONITOR__
+
+#include <e32base.h>
+
+class t_hsapplicationlauncher;
+
+/**
+ * MHsProcessMonitorObserver
+ *
+ * Monitor component observer.
+ *
+ * @since S60 5.2
+ */
+class MHsProcessMonitorObserver
+ {
+ public:
+ /**
+ * Called when monitored process is ended.
+ *
+ * @param aExitType Exit type
+ * @param aExitReason Exit reason
+ * @param aExitCategory Exit category
+ */
+ virtual void ProcessEnded( const TExitType& aExitType,
+ const TInt aExitReason,
+ const TExitCategoryName& aExitCategory ) = 0;
+
+ /**
+ * Called when error occured during monitoring.
+ *
+ * @param aError System wide error code.
+ */
+ virtual void ProcessMonitoringError( TInt aError ) = 0;
+ };
+
+/**
+ * HsProcessMonitor
+ *
+ * Component for monitoring process states.
+ *
+ * @since S60 5.2
+ */
+class CHsProcessMonitor : public CActive
+ {
+ public:
+ /**
+ * Create new monitor
+ *
+ * @param aProcessName process id
+ * @param aObserver monitor observer
+ * @since S60 5.2
+ */
+ static CHsProcessMonitor* NewL( const TInt aProcessId,
+ MHsProcessMonitorObserver& aObserver );
+
+ /**
+ * Destructor
+ *
+ * @since S60 5.2
+ */
+ ~CHsProcessMonitor();
+
+ /**
+ * Attach monitor
+ *
+ * @return TInt System wide error code.
+ * @since S60 5.2
+ */
+ TInt AttachMonitor();
+
+ /**
+ * Start monitor
+ *
+ * @return TInt System wide error code.
+ * @since S60 5.2
+ */
+ TInt StartMonitor();
+
+ protected:
+ /**
+ * C++ constructor
+ *
+ * @param aProcessName process id
+ * @param aObserver watchdog observer.
+ * @since S60 5.2
+ */
+ CHsProcessMonitor( const TInt aProcessId,
+ MHsProcessMonitorObserver& aObserver );
+
+ /**
+ * Symbian 2nd phase constructor
+ *
+ * @since S60 5.2
+ */
+ void ConstructL();
+
+ private: // From CActive
+ /**
+ * From CActive
+ */
+ void RunL();
+
+ /**
+ * From CActive
+ *
+ * @since S60 5.2
+ */
+ void DoCancel();
+
+ /**
+ * From CActive
+ *
+ * @since S60 5.2
+ */
+ TInt RunError( TInt aError );
+
+ private: // New methods
+ /**
+ * Close process handle if open
+ *
+ * @since S60 5.2
+ */
+ void SecureProcessHandleAsClosed();
+
+ private:
+ // process id
+ TInt iProcessId;
+
+ // watchdog observer
+ MHsProcessMonitorObserver& iObserver;
+
+ // Process handle
+ RProcess iProcess;
+
+ // boolean to represent whether process handle is open
+ TBool iProcessHandleOpen;
+
+ friend class t_hsapplicationlauncher;
+ };
+
+#endif // __HS_PROCESS_MONITOR__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsapplicationlauncher/inc/hsshutdownmonitor.h Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,121 @@
+/*
+* Copyright (c) 1020 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: shutdown monitor.
+*/
+
+
+#ifndef __HS_SHUTDOWN_MONITOR__
+#define __HS_SHUTDOWN_MONITOR__
+
+#include <e32base.h>
+#include <ssm/ssmstateawaresession.h>
+
+class t_hsapplicationlauncher;
+
+/**
+ * MHsShutdownMonitorObserver
+ *
+ * Monitor component observer.
+ *
+ * @since S60 5.2
+ */
+class MHsShutdownMonitorObserver
+ {
+ public:
+ /**
+ * Called when shutdown occurs
+ */
+ virtual void SystemShutdownEvent() = 0;
+ };
+
+/**
+ * HsShutdownMonitor
+ *
+ * Component for monitoring shutdown
+ *
+ * @since S60 5.2
+ */
+class CHsShutdownMonitor : public CActive
+ {
+ public:
+ /**
+ * Create new monitor
+ *
+ * @param aObserver monitor observer
+ * @since S60 5.2
+ */
+ static CHsShutdownMonitor* NewL(
+ MHsShutdownMonitorObserver& aObserver );
+
+ /**
+ * Destructor
+ *
+ * @since S60 5.2
+ */
+ ~CHsShutdownMonitor();
+
+ /**
+ * Start monitor
+ *
+ * @since S60 5.2
+ */
+ void StartMonitor();
+
+ protected:
+ /**
+ * C++ constructor
+ *
+ * @param aObserver monitor observer.
+ * @since S60 5.2
+ */
+ CHsShutdownMonitor( MHsShutdownMonitorObserver& aObserver );
+
+ /**
+ * Symbian 2nd phase constructor
+ *
+ * @since S60 5.2
+ */
+ void ConstructL();
+
+ private: // From CActive
+ /**
+ * From CActive
+ */
+ void RunL();
+
+ /**
+ * From CActive
+ *
+ * @since S60 5.2
+ */
+ void DoCancel();
+
+ /**
+ * From CActive
+ *
+ * @since S60 5.2
+ */
+ TInt RunError( TInt aError );
+
+ private:
+ // watchdog observer
+ MHsShutdownMonitorObserver& iObserver;
+
+ // State aware session.
+ RSsmStateAwareSession iSAS;
+
+ friend class t_hsapplicationlauncher;
+ };
+
+#endif // __HS_PROCESS_MONITOR__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsapplicationlauncher/src/hsapplicationlauncher.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,452 @@
+/*
+ * Copyright (c) 2008 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: application class.
+ *
+ */
+
+#include <e32property.h>
+#include <e32debug.h>
+#include "hsapplicationlauncher.h"
+
+// ========================= DECLARATIONS ==================================
+_LIT( KHsExeName, "hsapplication.exe" );
+_LIT( KHsProcessName, "hsapplication.exe" );
+const TInt KSleepOnRetry = 250000; // 250ms
+const TUid KPSCategoryUid = TUid::Uid( 0x20022F36 );
+const TInt KPSCrashCountKey = 1;
+_LIT_SECURITY_POLICY_C1( KPSReadPolicy, ECapabilityReadDeviceData );
+_LIT_SECURITY_POLICY_C1( KPSWritePolicy, ECapabilityWriteDeviceData );
+
+// ========================= LOCAL FUNCTIONS ==================================
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC SKIP
+#endif //COVERAGE_MEASUREMENT
+void RunAppL()
+ {
+ // Construct active scheduler.
+ CActiveScheduler* activeScheduler = new ( ELeave )CActiveScheduler();
+ CleanupStack::PushL( activeScheduler );
+ CActiveScheduler::Install( activeScheduler );
+
+ // Construct app.
+ CHsLaunch* app = CHsLaunch::NewL();
+ CleanupStack::PushL( app );
+
+ app->Activate();
+
+ // Signal startup.
+ RProcess::Rendezvous(KErrNone);
+
+ // Start active scheduler.
+ CActiveScheduler::Start();
+
+ User::LeaveIfError( app->ApplicationReturnValue() );
+
+ // Cleanup.
+ CleanupStack::PopAndDestroy( app );
+ CleanupStack::PopAndDestroy( activeScheduler );
+ }
+
+#ifndef HOMESCREEN_TEST
+// -----------------------------------------------------------------------------
+// E32Main
+// entry-point
+// -----------------------------------------------------------------------------
+//
+TInt E32Main()
+ {
+ TInt error = KErrNone;
+
+ __UHEAP_MARK;
+
+ // Construct cleanup stack.
+ CTrapCleanup* cleanupstack = CTrapCleanup::New();
+ if( !cleanupstack )
+ {
+ error = KErrNoMemory;
+ }
+
+ // Call next phase of startup.
+ if( !error )
+ {
+ TRAP( error, RunAppL() );
+ }
+
+ // Cleanup.
+ delete cleanupstack;
+ cleanupstack = NULL;
+
+ __UHEAP_MARKEND;
+
+ return error;
+ }
+#endif //HOMESCREEN_TEST
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC ENDSKIP
+#endif //COVERAGE_MEASUREMENT
+// ========================= MEMBER FUNCTIONS ==================================
+
+// -----------------------------------------------------------------------------
+// CHsLaunch::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+CHsLaunch* CHsLaunch::NewL()
+ {
+ CHsLaunch* self = new ( ELeave ) CHsLaunch();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CHsLaunch::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CHsLaunch::ConstructL()
+ {
+ iRepository = CRepository::NewL(TUid::Uid(0x2002b3aa));
+
+ iShutdownMonitor = CHsShutdownMonitor::NewL( *this );
+ iShutdownMonitor->StartMonitor();
+
+ // Create property to pub/sub.
+ TInt error = RProperty::Define( KPSCrashCountKey,
+ RProperty::EInt,
+ KPSReadPolicy,
+ KPSWritePolicy );
+ if( error == KErrNone )
+ {
+ // Init it to zero.
+ error = RProperty::Set( KPSCategoryUid, KPSCrashCountKey, 0 );
+ }
+ else if( error == KErrAlreadyExists )
+ {
+ error = KErrNone;
+ }
+
+ User::LeaveIfError( error );
+ }
+
+// -----------------------------------------------------------------------------
+// CHsLaunch::CHsLaunch()
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+CHsLaunch::CHsLaunch() :
+ CActive( EPriorityStandard ),
+ iApplicationReturnValue( KErrNone )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// -----------------------------------------------------------------------------
+// CHsLaunch::~CHsLaunch()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CHsLaunch::~CHsLaunch()
+ {
+ Cancel();
+
+ delete iRepository;
+ iRepository = NULL;
+
+ delete iProcessMonitor;
+ iProcessMonitor = NULL;
+
+ delete iShutdownMonitor;
+ iShutdownMonitor = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CHsLaunch::Activate()
+// Set active object to be ran
+// -----------------------------------------------------------------------------
+//
+void CHsLaunch::Activate()
+ {
+ SetActive();
+ TRequestStatus* tmp = &iStatus;
+ User::RequestComplete( tmp, KErrNone );
+ }
+
+// -----------------------------------------------------------------------------
+// CHsLaunch::ApplicationReturnValue()
+// Get application return value
+// -----------------------------------------------------------------------------
+//
+TInt CHsLaunch::ApplicationReturnValue()
+ {
+ return iApplicationReturnValue;
+ }
+
+// -----------------------------------------------------------------------------
+// CHsLaunch::RunL
+// -----------------------------------------------------------------------------
+//
+void CHsLaunch::RunL()
+ {
+#if defined( __WINS__ )
+ StartHomeScreen();
+#else
+ if (IsLanguageSelectedL())
+ {
+ StartHomeScreen();
+ }
+ else
+ {
+ StartListeningLanguageSelectionL();
+ }
+#endif //__WINS__
+ }
+
+// -----------------------------------------------------------------------------
+// CHsLaunch::DoCancel()
+// From CActive.
+// -----------------------------------------------------------------------------
+//
+void CHsLaunch::DoCancel()
+ {
+ if( iProcessMonitor )
+ {
+ iProcessMonitor->Cancel();
+ }
+
+ if( iShutdownMonitor )
+ {
+ iShutdownMonitor->Cancel();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CHsLaunch::RunError()
+// From CActive.
+// -----------------------------------------------------------------------------
+//
+TInt CHsLaunch::RunError( TInt aError )
+ {
+ /* Shutdown. This application
+ * will be restarted by startup sw. */
+ ShutdownApp( KErrGeneral );
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CHsLaunch::HandleNotifyInt()
+// From MCenRepNotifyHandlerCallback
+// -----------------------------------------------------------------------------
+//
+void CHsLaunch::HandleNotifyInt(TUint32 aId, TInt aNewValue)
+{
+ if (aId == 0x00000007 && aNewValue)
+ {
+ StopListeningLanguageSelection();
+ StartHomeScreen();
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CHsLaunch::ProcessEndedL()
+// From MHsProcessMonitorObserver
+// -----------------------------------------------------------------------------
+//
+void CHsLaunch::ProcessEnded( const TExitType& aExitType,
+ const TInt aExitReason,
+ const TExitCategoryName& /*aExitCategory*/ )
+ {
+ TInt crashCount = 0;
+ TInt error = RProperty::Get( KPSCategoryUid,
+ KPSCrashCountKey,
+ crashCount );
+
+ // increment crash count in cenrep if the process has panic'd or killed with
+ // an error code
+ if( aExitType == EExitPanic ||
+ ( aExitType == EExitKill && aExitReason != KErrNone ) )
+ {
+ if( error == KErrNone )
+ {
+ crashCount++;
+ error = RProperty::Set( KPSCategoryUid,
+ KPSCrashCountKey,
+ crashCount );
+ }
+
+ if( error == KErrNone )
+ {
+ User::After( KSleepOnRetry );
+ Activate();
+ }
+ else
+ {
+ ShutdownApp( error );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CHsLaunch::ProcessMonitoringErrorL()
+// From MHsProcessMonitorObserver
+// -----------------------------------------------------------------------------
+//
+void CHsLaunch::ProcessMonitoringError( TInt aError )
+ {
+ /* Error in this method is critical and it might cause
+ * endless active scheduler loop if no active objects are
+ * not triggered. Therefore shutdown. This application
+ * will be restarted by startup sw. */
+ ShutdownApp( aError );
+ }
+
+// -----------------------------------------------------------------------------
+// CHsLaunch::SystemShutdownEvent()
+// From MHsShutdownMonitorObserver
+// -----------------------------------------------------------------------------
+//
+void CHsLaunch::SystemShutdownEvent()
+ {
+ // Do not shut down app. Startup app would try to restart this app.
+ // Just deactivate all active objects and wait for power off.
+ if( IsActive() )
+ {
+ Cancel();
+ }
+ else
+ {
+ DoCancel();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CHsLaunch::InitProcessMonitorL()
+// Initialize process monitor
+// -----------------------------------------------------------------------------
+//
+void CHsLaunch::InitProcessMonitorL( const TInt aProcessId )
+ {
+ if( iProcessMonitor )
+ {
+ delete iProcessMonitor;
+ iProcessMonitor = NULL;
+ }
+ iProcessMonitor = CHsProcessMonitor::NewL( aProcessId, *this );
+ User::LeaveIfError( iProcessMonitor->StartMonitor() );
+ }
+
+// -----------------------------------------------------------------------------
+// CHsLaunch::ShutdownApp()
+// Shut down application
+// -----------------------------------------------------------------------------
+//
+void CHsLaunch::ShutdownApp( const TInt aApplicationReturnValue )
+ {
+ if( IsActive() )
+ {
+ Cancel();
+ }
+ else
+ {
+ DoCancel();
+ }
+
+ iApplicationReturnValue = aApplicationReturnValue;
+#ifndef HOMESCREEN_TEST
+ CActiveScheduler::Stop();
+#endif //HOMESCREEN_TEST
+ }
+
+// -----------------------------------------------------------------------------
+// CHsLaunch::StartHomeScreen()
+// Starts the homescreen application.
+// -----------------------------------------------------------------------------
+//
+void CHsLaunch::StartHomeScreen()
+ {
+ // Create app or connect to existing.
+ TInt processExisted = EFalse;
+
+ RProcess process;
+ TInt processError = process.Create( KHsExeName, KNullDesC );
+ if( processError == KErrAlreadyExists )
+ {
+ processError = process.Open( KHsProcessName, EOwnerProcess );
+ processExisted = ETrue;
+ }
+ TInt monitorError = KErrNone;
+ if( processError == KErrNone )
+ {
+ TRAP( monitorError, InitProcessMonitorL( process.Id() ) );
+ }
+
+ if( processError == KErrNone &&
+ !processExisted )
+ {
+ // Make sure process is started even if monitor startup
+ // fails. This will assure that process is not left in
+ // suspended state. Resume can not be called for
+ // already running process (will cause KERN-EXEC 46).
+ process.Resume();
+ }
+
+ process.Close();
+
+ if( processError != KErrNone ||
+ monitorError != KErrNone )
+ {
+ /* Error in this method is critical and it might cause
+ * endless active scheduler loop if no active objects are
+ * not triggered. Therefore shutdown. This application
+ * will be restarted by startup sw. */
+ ShutdownApp( KErrGeneral );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CHsLaunch::IsLanguageSelected()
+// Checks if the language is selected.
+// -----------------------------------------------------------------------------
+//
+TBool CHsLaunch::IsLanguageSelectedL()
+ {
+ TInt value;
+ User::LeaveIfError(iRepository->Get(0x00000007, value));
+ return value;
+ }
+
+// -----------------------------------------------------------------------------
+// CHsLaunch::StartListeningLanguageSelection()
+// Starts to listen repository notifications.
+// -----------------------------------------------------------------------------
+//
+void CHsLaunch::StartListeningLanguageSelectionL()
+ {
+ iCenRepNotifyHandler = CCenRepNotifyHandler::NewL(
+ *this, *iRepository, CCenRepNotifyHandler::EIntKey, 0x00000007);
+ iCenRepNotifyHandler->StartListeningL();
+ }
+
+// -----------------------------------------------------------------------------
+// CHsLaunch::StopListeningLanguageSelection()
+// Stops to listen repository notifications.
+// -----------------------------------------------------------------------------
+//
+void CHsLaunch::StopListeningLanguageSelection()
+ {
+ iCenRepNotifyHandler->StopListening();
+ delete iCenRepNotifyHandler;
+ iCenRepNotifyHandler = NULL;
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsapplicationlauncher/src/hsprocessmonitor.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,184 @@
+/*
+ * Copyright (c) 2008 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: process monitor.
+ *
+ */
+
+#include "hsprocessmonitor.h"
+
+// ========================= MEMBER FUNCTIONS ==================================
+
+// -----------------------------------------------------------------------------
+// CHsProcessMonitor::NewL()
+// Two-phased constructor
+// -----------------------------------------------------------------------------
+CHsProcessMonitor* CHsProcessMonitor::NewL( const TInt iProcessId,
+ MHsProcessMonitorObserver& aObserver )
+ {
+ CHsProcessMonitor* self = new ( ELeave ) CHsProcessMonitor( iProcessId,
+ aObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CHsProcessMonitor::~CHsProcessMonitor()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CHsProcessMonitor::~CHsProcessMonitor()
+ {
+ Cancel();
+ SecureProcessHandleAsClosed();
+ iProcessId = KErrNotFound;
+ }
+
+// -----------------------------------------------------------------------------
+// CHsProcessMonitor::AttachMonitor()
+// Attach monitor
+// -----------------------------------------------------------------------------
+//
+TInt CHsProcessMonitor::AttachMonitor()
+ {
+ SecureProcessHandleAsClosed();
+
+ TInt error = iProcess.Open( iProcessId, EOwnerProcess );
+
+ if( error == KErrNone )
+ {
+ iProcessHandleOpen = ETrue;
+ }
+
+ return error;
+ }
+
+// -----------------------------------------------------------------------------
+// CHsProcessMonitor::StartMonitor()
+// Start monitor
+// -----------------------------------------------------------------------------
+//
+TInt CHsProcessMonitor::StartMonitor()
+ {
+ TInt error = KErrNone;
+
+ if( !iProcessHandleOpen )
+ {
+ error = AttachMonitor();
+ }
+
+ if( error == KErrNone )
+ {
+ iProcess.Logon( iStatus );
+ SetActive();
+ }
+
+ return error;
+ }
+
+// -----------------------------------------------------------------------------
+// CHsProcessMonitor::CHsProcessMonitor()
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+CHsProcessMonitor::CHsProcessMonitor( const TInt aProcessId,
+ MHsProcessMonitorObserver& aObserver ) :
+ CActive( EPriorityStandard ),
+ iProcessId( aProcessId ),
+ iObserver( aObserver ),
+ iProcessHandleOpen( EFalse )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// -----------------------------------------------------------------------------
+// CHsProcessMonitor::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CHsProcessMonitor::ConstructL()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CHsProcessMonitor::RunL
+// -----------------------------------------------------------------------------
+//
+void CHsProcessMonitor::RunL()
+ {
+ iProcess.LogonCancel( iStatus );
+
+ const TInt error = iStatus.Int();
+
+ if( error == KErrCancel )
+ {
+ }
+ else if( error == KErrNoMemory )
+ {
+ User::Leave( KErrNoMemory );
+ }
+ else
+ {
+ const TExitType exitType = iProcess.ExitType();
+ if( exitType == EExitPending )
+ {
+ User::LeaveIfError( StartMonitor() );
+ }
+ else
+ {
+ iObserver.ProcessEnded( exitType,
+ iProcess.ExitReason(),
+ iProcess.ExitCategory() );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CHsProcessMonitor::DoCancel()
+// From CActive.
+// -----------------------------------------------------------------------------
+//
+void CHsProcessMonitor::DoCancel()
+ {
+ iProcess.LogonCancel( iStatus );
+ }
+
+// -----------------------------------------------------------------------------
+// CHsProcessMonitor::RunError()
+// From CActive.
+// -----------------------------------------------------------------------------
+//
+TInt CHsProcessMonitor::RunError( TInt aError )
+ {
+ iObserver.ProcessMonitoringError( aError );
+
+ // Observer will handle error. Return green light.
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CHsProcessMonitor::SecureProcessHandleAsClosed()
+// Close process handle if open
+// -----------------------------------------------------------------------------
+//
+void CHsProcessMonitor::SecureProcessHandleAsClosed()
+ {
+ if( iProcessHandleOpen )
+ {
+ iProcess.Close();
+ iProcessHandleOpen = EFalse;
+ }
+ }
+
+// End of File
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsapplicationlauncher/src/hsshutdownmonitor.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2008 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: shutdown monitor.
+ *
+ */
+
+#include <ssm/ssmstate.h>
+#include <ssm/ssmdomaindefs.h>
+
+#include "hsshutdownmonitor.h"
+
+// ========================= MEMBER FUNCTIONS ==================================
+
+// -----------------------------------------------------------------------------
+// CHsShutdownMonitor::NewL()
+// Two-phased constructor
+// -----------------------------------------------------------------------------
+CHsShutdownMonitor* CHsShutdownMonitor::NewL(
+ MHsShutdownMonitorObserver& aObserver )
+ {
+ CHsShutdownMonitor* self = new ( ELeave ) CHsShutdownMonitor( aObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CHsShutdownMonitor::~CHsShutdownMonitor()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CHsShutdownMonitor::~CHsShutdownMonitor()
+ {
+ Cancel();
+ iSAS.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// CHsShutdownMonitor::StartMonitor()
+// Start monitor
+// -----------------------------------------------------------------------------
+//
+void CHsShutdownMonitor::StartMonitor()
+ {
+ iSAS.RequestStateNotification( iStatus );
+ SetActive();
+ }
+
+// -----------------------------------------------------------------------------
+// CHsShutdownMonitor::CHsShutdownMonitor()
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+CHsShutdownMonitor::CHsShutdownMonitor( MHsShutdownMonitorObserver& aObserver ) :
+ CActive( EPriorityStandard ),
+ iObserver( aObserver )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// -----------------------------------------------------------------------------
+// CHsShutdownMonitor::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CHsShutdownMonitor::ConstructL()
+ {
+ User::LeaveIfError( iSAS.Connect( KSM2GenMiddlewareDomain3 ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CHsShutdownMonitor::RunL
+// -----------------------------------------------------------------------------
+//
+void CHsShutdownMonitor::RunL()
+ {
+ User::LeaveIfError( iStatus.Int() );
+
+ TBool registerForMoreEvents = ETrue;
+
+ TSsmState state = iSAS.State();
+ if( state.MainState() == ESsmShutdown )
+ {
+ iObserver.SystemShutdownEvent();
+ registerForMoreEvents = EFalse;
+ }
+
+ if( registerForMoreEvents )
+ {
+ iSAS.AcknowledgeAndRequestStateNotification( KErrNone, iStatus );
+ SetActive();
+ }
+ else
+ {
+ iSAS.AcknowledgeStateNotification( KErrNone );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CHsShutdownMonitor::DoCancel()
+// From CActive.
+// -----------------------------------------------------------------------------
+//
+void CHsShutdownMonitor::DoCancel()
+ {
+ iSAS.RequestStateNotificationCancel();
+ }
+
+// -----------------------------------------------------------------------------
+// CHsShutdownMonitor::RunError()
+// From CActive.
+// -----------------------------------------------------------------------------
+//
+TInt CHsShutdownMonitor::RunError( TInt aError )
+ {
+ return aError;
+ }
+
+// End of File
--- a/homescreenapp/hsdomainmodel/inc/hsconfiguration.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsdomainmodel/inc/hsconfiguration.h Fri Jul 09 14:36:01 2010 +0300
@@ -47,7 +47,7 @@
Q_PROPERTY(int widgetDragEffectDuration READ widgetDragEffectDuration WRITE setWidgetDragEffectDuration)
Q_PROPERTY(int widgetDropEffectDuration READ widgetDropEffectDuration WRITE setWidgetDropEffectDuration)
Q_PROPERTY(int defaultPageId READ defaultPageId WRITE setDefaultPageId)
- Q_PROPERTY(int maximumPageCount READ maximumPageCount WRITE setMaximumPageCount)
+ Q_PROPERTY(int maximumPageCount READ maximumPageCount WRITE setMaximumPageCount)
Q_PROPERTY(bool isShortcutLabelVisible READ isShortcutLabelVisible WRITE setShortcutLabelVisible)
Q_PROPERTY(qreal bounceFeedbackEffectDistance READ bounceFeedbackEffectDistance WRITE setBounceFeedbackEffectDistance)
Q_PROPERTY(qreal pageChangePanDistanceInPixels READ pageChangePanDistanceInPixels WRITE setPageChangePanDistanceInPixels)
@@ -73,7 +73,7 @@
Q_PROPERTY(int snapTimeout READ snapTimeout WRITE setSnapTimeout)
Q_PROPERTY(qreal snapForce READ snapForce WRITE setSnapForce)
Q_PROPERTY(qreal snapGap READ snapGap WRITE setSnapGap)
- Q_PROPERTY(qreal snapBorderGap READ snapBorderGap WRITE setSnapBorderGap)
+ Q_PROPERTY(qreal pageMargin READ pageMargin WRITE setPageMargin)
Q_PROPERTY(int snapLineFadeInDuration READ snapLineFadeInDuration WRITE setSnapLineFadeInDuration)
Q_PROPERTY(int snapLineFadeOutDuration READ snapLineFadeOutDuration WRITE setSnapLineFadeOutDuration)
Q_PROPERTY(bool isSnapEffectsEnabled READ isSnapEffectsEnabled WRITE setSnapEffectsEnabled)
@@ -91,107 +91,117 @@
SceneWallpaper
};
+#define SETVALUE(member, name) \
+ if (member != value) { \
+ member = value; \
+ emit propertyChanged(name); \
+ }
+
int bounceEffect() const { return mBounceEffect; }
- void setBounceEffect(int effect) { mBounceEffect = effect; }
+ void setBounceEffect(int value) { SETVALUE(mBounceEffect, "bounceEffect") }
int widgetTapAndHoldTimeout() const { return mWidgetTapAndHoldTimeout; }
- void setWidgetTapAndHoldTimeout(int timeout) { mWidgetTapAndHoldTimeout = timeout; }
+ void setWidgetTapAndHoldTimeout(int value) { SETVALUE(mWidgetTapAndHoldTimeout, "widgetTapAndHoldTimeout") }
int sceneTapAndHoldTimeout() const { return mSceneTapAndHoldTimeout; }
- void setSceneTapAndHoldTimeout(int timeout) { mSceneTapAndHoldTimeout = timeout; }
+ void setSceneTapAndHoldTimeout(int value) { SETVALUE(mSceneTapAndHoldTimeout, "sceneTapAndHoldTimeout") }
int pageChangeAnimationDuration() const { return mPageChangeAnimationDuration; }
- void setPageChangeAnimationDuration(int duration) { mPageChangeAnimationDuration = duration; }
+ void setPageChangeAnimationDuration(int value) { SETVALUE(mPageChangeAnimationDuration, "pageChangeAnimationDuration") }
int pageChangeZoneAnimationDuration() const { return mPageChangeZoneAnimationDuration; }
- void setPageChangeZoneAnimationDuration(int duration) { mPageChangeZoneAnimationDuration = duration; }
+ void setPageChangeZoneAnimationDuration(int value) { SETVALUE(mPageChangeZoneAnimationDuration, "pageChangeZoneAnimationDuration") }
int pageChangeZoneReverseAnimationDuration() const { return mPageChangeZoneReverseAnimationDuration; }
- void setPageChangeZoneReverseAnimationDuration(int duration) { mPageChangeZoneReverseAnimationDuration = duration; }
+ void setPageChangeZoneReverseAnimationDuration(int value) { SETVALUE(mPageChangeZoneReverseAnimationDuration, "pageChangeZoneReverseAnimationDuration") }
int pageRemovedAnimationDuration() const { return mPageRemovedAnimationDuration; }
- void setPageRemovedAnimationDuration(int duration) { mPageRemovedAnimationDuration = duration; }
+ void setPageRemovedAnimationDuration(int value) { SETVALUE(mPageRemovedAnimationDuration, "pageRemovedAnimationDuration") }
int newPageAddedAnimationDuration() const { return mNewPageAddedAnimationDuration; }
- void setNewPageAddedAnimationDuration(int duration) { mNewPageAddedAnimationDuration = duration; }
+ void setNewPageAddedAnimationDuration(int value) { SETVALUE(mNewPageAddedAnimationDuration, "newPageAddedAnimationDuration") }
int widgetDragEffectDuration() const { return mWidgetDragEffectDuration; }
- void setWidgetDragEffectDuration(int duration) { mWidgetDragEffectDuration = duration; }
+ void setWidgetDragEffectDuration(int value) { SETVALUE(mWidgetDragEffectDuration, "widgetDragEffectDuration") }
int widgetDropEffectDuration() const { return mWidgetDropEffectDuration; }
- void setWidgetDropEffectDuration(int duration) { mWidgetDropEffectDuration = duration; }
+ void setWidgetDropEffectDuration(int value) { SETVALUE(mWidgetDropEffectDuration, "widgetDropEffectDuration") }
int defaultPageId() const { return mDefaultPageId; }
- void setDefaultPageId(int id) { mDefaultPageId = id; }
+ void setDefaultPageId(int value) { SETVALUE(mDefaultPageId, "defaultPageId") }
int maximumPageCount() const { return mMaximumPageCount; }
- void setMaximumPageCount(int count) { mMaximumPageCount = count; }
+ void setMaximumPageCount(int value) { SETVALUE(mMaximumPageCount, "maximumPageCount") }
bool isShortcutLabelVisible() const { return mIsShortcutLabelVisible; }
- void setShortcutLabelVisible(bool visible) { mIsShortcutLabelVisible = visible; }
+ void setShortcutLabelVisible(bool value) { SETVALUE(mIsShortcutLabelVisible, "isShortcutLabelVisible") }
qreal bounceFeedbackEffectDistance() const { return mBounceFeedbackEffectDistance; }
- void setBounceFeedbackEffectDistance(qreal distance) { mBounceFeedbackEffectDistance = distance; }
+ void setBounceFeedbackEffectDistance(qreal value) { SETVALUE(mBounceFeedbackEffectDistance, "bounceFeedbackEffectDistance") }
qreal pageChangePanDistanceInPixels() const { return mPageChangePanDistanceInPixels; }
- void setPageChangePanDistanceInPixels(qreal distance) { mPageChangePanDistanceInPixels = distance; }
+ void setPageChangePanDistanceInPixels(qreal value) { SETVALUE(mPageChangePanDistanceInPixels, "pageChangePanDistanceInPixels") }
qreal tapAndHoldDistance() const { return mTapAndHoldDistance; }
- void setTapAndHoldDistance(qreal distance) { mTapAndHoldDistance = distance; }
+ void setTapAndHoldDistance(qreal value) { SETVALUE(mTapAndHoldDistance, "tapAndHoldDistance") }
qreal pageChangeZoneWidth() const { return mPageChangeZoneWidth; }
- void setPageChangeZoneWidth(qreal width) { mPageChangeZoneWidth = width; }
+ void setPageChangeZoneWidth(qreal value) { SETVALUE(mPageChangeZoneWidth, "pageChangeZoneWidth") }
qreal pageIndicatorSpacing() const { return mPageIndicatorSpacing; }
- void setPageIndicatorSpacing(qreal spacing) { mPageIndicatorSpacing = spacing; }
+ void setPageIndicatorSpacing(qreal value) { SETVALUE(mPageIndicatorSpacing, "pageIndicatorSpacing") }
qreal maximumWidgetHeight() const { return mMaximumWidgetHeight; }
- void setMaximumWidgetHeight(qreal height) { mMaximumWidgetHeight = height; }
+ void setMaximumWidgetHeight(qreal value) { SETVALUE(mMaximumWidgetHeight, "maximumWidgetHeight") }
qreal maximumWidgetWidth() const { return mMaximumWidgetWidth; }
- void setMaximumWidgetWidth(qreal width) { mMaximumWidgetWidth = width; }
+ void setMaximumWidgetWidth(qreal value) { SETVALUE(mMaximumWidgetWidth, "maximumWidgetWidth") }
qreal minimumWidgetHeight() const { return mMinimumWidgetHeight; }
- void setMinimumWidgetHeight(qreal height) { mMinimumWidgetHeight = height; }
+ void setMinimumWidgetHeight(qreal value) { SETVALUE(mMinimumWidgetHeight, "minimumWidgetHeight") }
qreal minimumWidgetWidth() const { return mMinimumWidgetWidth; }
- void setMinimumWidgetWidth(qreal width) { mMinimumWidgetWidth = width; }
+ void setMinimumWidgetWidth(qreal value) { SETVALUE(mMinimumWidgetWidth, "minimumWidgetWidth") }
qreal pageChangePanDistance() const { return mPageChangePanDistance; }
- void setPageChangePanDistance(qreal distance) { mPageChangePanDistance = distance; }
+ void setPageChangePanDistance(qreal value) { SETVALUE(mPageChangePanDistance, "pageChangePanDistance") }
HbFeedback::InstantEffect pageChangeFeedbackEffect() const { return mPageChangeFeedbackEffect; }
- void setPageChangeFeedbackEffect(HbFeedback::InstantEffect effect) { mPageChangeFeedbackEffect = effect; }
+ void setPageChangeFeedbackEffect(HbFeedback::InstantEffect value) { SETVALUE(mPageChangeFeedbackEffect, "pageChangeFeedbackEffect") }
HbFeedback::InstantEffect widgetPickFeedbackEffect() const { return mWidgetPickFeedbackEffect; }
- void setWidgetPickFeedbackEffect(HbFeedback::InstantEffect effect) { mWidgetPickFeedbackEffect = effect; }
+ void setWidgetPickFeedbackEffect(HbFeedback::InstantEffect value) { SETVALUE(mWidgetPickFeedbackEffect, "widgetPickFeedbackEffect") }
HbFeedback::InstantEffect widgetDropFeedbackEffect() const { return mWidgetDropFeedbackEffect; }
- void setWidgetDropFeedbackEffect(HbFeedback::InstantEffect effect) { mWidgetDropFeedbackEffect = effect; }
+ void setWidgetDropFeedbackEffect(HbFeedback::InstantEffect value) { SETVALUE(mWidgetDropFeedbackEffect, "widgetDropFeedbackEffect") }
HbFeedback::InstantEffect widgetRepositionFeedbackEffect() const { return mWidgetRepositionFeedbackEffect; }
- void setWidgetRepositionFeedbackEffect(HbFeedback::InstantEffect effect) { mWidgetRepositionFeedbackEffect = effect; }
+ void setWidgetRepositionFeedbackEffect(HbFeedback::InstantEffect value) { SETVALUE(mWidgetRepositionFeedbackEffect, "widgetRepositionFeedbackEffect") }
HbFeedback::InstantEffect widgetOverTrashbinFeedbackEffect() const { return mWidgetOverTrashbinFeedbackEffect; }
- void setWidgetOverTrashbinFeedbackEffect(HbFeedback::InstantEffect effect) { mWidgetOverTrashbinFeedbackEffect = effect; }
+ void setWidgetOverTrashbinFeedbackEffect(HbFeedback::InstantEffect value) { SETVALUE(mWidgetOverTrashbinFeedbackEffect, "widgetOverTrashbinFeedbackEffect") }
HbFeedback::InstantEffect widgetDropToTrashbinFeedbackEffect() const { return mWidgetDropToTrashbinFeedbackEffect; }
- void setWidgetDropToTrashbinFeedbackEffect(HbFeedback::InstantEffect effect) { mWidgetDropToTrashbinFeedbackEffect = effect; }
+ void setWidgetDropToTrashbinFeedbackEffect(HbFeedback::InstantEffect value) { SETVALUE(mWidgetDropToTrashbinFeedbackEffect, "widgetDropToTrashbinFeedbackEffect") }
HbFeedback::InstantEffect shortcutWidgetTapFeedbackEffect() const { return mShortcutWidgetTapFeedbackEffect; }
- void setShortcutWidgetTapFeedbackEffect(HbFeedback::InstantEffect effect) { mShortcutWidgetTapFeedbackEffect = effect; }
+ void setShortcutWidgetTapFeedbackEffect(HbFeedback::InstantEffect value) { SETVALUE(mShortcutWidgetTapFeedbackEffect, "shortcutWidgetTapFeedbackEffect") }
HbFeedback::InstantEffect widgetMoveBlockedFeedbackEffect() const { return mWidgetMoveBlockedFeedbackEffect; }
- void setWidgetMoveBlockedFeedbackEffect(HbFeedback::InstantEffect effect) { mWidgetMoveBlockedFeedbackEffect = effect; }
+ void setWidgetMoveBlockedFeedbackEffect(HbFeedback::InstantEffect value) { SETVALUE(mWidgetMoveBlockedFeedbackEffect, "widgetMoveBlockedFeedbackEffect") }
HbFeedback::InstantEffect clockWidgetTapFeedbackEffect() const { return mClockWidgetTapFeedbackEffect; }
- void setClockWidgetTapFeedbackEffect(HbFeedback::InstantEffect effect) { mClockWidgetTapFeedbackEffect = effect; }
+ void setClockWidgetTapFeedbackEffect(HbFeedback::InstantEffect value) { SETVALUE(mClockWidgetTapFeedbackEffect, "clockWidgetTapFeedbackEffect") }
HbFeedback::InstantEffect widgetSnappingFeedbackEffect() const { return mWidgetSnappingFeedbackEffect; }
- void setWidgetSnappingFeedbackEffect(HbFeedback::InstantEffect effect) { mWidgetSnappingFeedbackEffect = effect; }
+ void setWidgetSnappingFeedbackEffect(HbFeedback::InstantEffect value) { SETVALUE(mWidgetSnappingFeedbackEffect, "widgetSnappingFeedbackEffect") }
bool isSnapEnabled() const { return mIsSnapEnabled; }
- void setSnapEnabled(bool enabled) { mIsSnapEnabled = enabled; }
+ void setSnapEnabled(bool value) { SETVALUE(mIsSnapEnabled, "isSnapEnabled") }
int snapTimeout() const { return mSnapTimeout; }
- void setSnapTimeout(int timeout) { mSnapTimeout = timeout; }
+ void setSnapTimeout(int value) { SETVALUE(mSnapTimeout, "snapTimeout") }
qreal snapForce() const { return mSnapForce; }
- void setSnapForce(qreal force) { mSnapForce = force; }
+ void setSnapForce(qreal value) { SETVALUE(mSnapForce, "snapForce") }
qreal snapGap() const { return mSnapGap; }
- void setSnapGap(qreal gap) { mSnapGap = gap; }
- qreal snapBorderGap() const { return mSnapBorderGap; }
- void setSnapBorderGap(qreal gap) { mSnapBorderGap = gap; }
+ void setSnapGap(qreal value) { SETVALUE(mSnapGap, "snapGap") }
+ qreal pageMargin() const { return mPageMargin; }
+ void setPageMargin(qreal value) { SETVALUE(mPageMargin, "pageMargin") }
int snapLineFadeInDuration() const { return mSnapLineFadeInDuration; }
- void setSnapLineFadeInDuration(int duration) { mSnapLineFadeInDuration = duration; }
+ void setSnapLineFadeInDuration(int value) { SETVALUE(mSnapLineFadeInDuration, "snapLineFadeInDuration") }
int snapLineFadeOutDuration() const { return mSnapLineFadeOutDuration; }
- void setSnapLineFadeOutDuration(int duration) { mSnapLineFadeOutDuration = duration; }
+ void setSnapLineFadeOutDuration(int value) { SETVALUE(mSnapLineFadeOutDuration, "snapLineFadeOutDuration") }
bool isSnapEffectsEnabled() const { return mIsSnapEffectsEnabled; }
- void setSnapEffectsEnabled(bool enabled) { mIsSnapEffectsEnabled = enabled; }
+ void setSnapEffectsEnabled(bool value) { SETVALUE(mIsSnapEffectsEnabled, "isSnapEffectsEnabled") }
SceneType sceneType() const { return mSceneType; }
- void setSceneType(SceneType type) { mSceneType = type; }
-
+ void setSceneType(SceneType value) { SETVALUE(mSceneType, "sceneType") }
+#undef SETVALUE
+
QSizeF minimumWidgetSizeInUnits() const;
QSizeF maximumWidgetSizeInUnits() const;
QSizeF minimumWidgetSizeInPixels() const;
QSizeF maximumWidgetSizeInPixels() const;
-
+
bool load();
bool importFromFile(const QString &path);
bool exportToFile(const QString &path);
-
+
static HsConfiguration *instance();
static HsConfiguration *takeInstance();
static void setInstance(HsConfiguration *instance);
+signals:
+ void propertyChanged(const QString &name);
+
private:
Q_DISABLE_COPY(HsConfiguration)
-
+
private:
int mBounceEffect;
int mWidgetTapAndHoldTimeout;
@@ -230,7 +240,7 @@
int mSnapTimeout;
qreal mSnapForce;
qreal mSnapGap;
- qreal mSnapBorderGap;
+ qreal mPageMargin;
int mSnapLineFadeInDuration;
int mSnapLineFadeOutDuration;
bool mIsSnapEffectsEnabled;
--- a/homescreenapp/hsdomainmodel/inc/hspage.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsdomainmodel/inc/hspage.h Fri Jul 09 14:36:01 2010 +0300
@@ -18,6 +18,7 @@
#ifndef HSPAGE_H
#define HSPAGE_H
+#include <QPointF>
#include <HbWidget>
#include <HbIconItem>
#include "hsdomainmodel_global.h"
@@ -38,44 +39,35 @@
public:
HsPage(QGraphicsItem *parent = 0);
~HsPage();
-
int databaseId() const;
void setDatabaseId(int id);
-
void setGeometry(const QRectF &rect);
-
bool load();
-
HsWallpaper *wallpaper() const;
-
bool addExistingWidget(HsWidgetHost *widgetHost);
bool removeWidget(HsWidgetHost *widgeHost);
-
QList<HsWidgetHost *> newWidgets();
bool addNewWidget(HsWidgetHost *widgetHost, const QPointF &position = QPointF());
void layoutNewWidgets();
void resetNewWidgets();
bool deleteFromDatabase();
-
QList<HsWidgetHost *> widgets() const;
-
bool isRemovable() const;
void setRemovable(bool removable);
-
bool isDefaultPage() const;
bool isActivePage() const;
-
static HsPage *createInstance(const HsPageData &pageData);
-
- QPointF mTouchPoint;
+ QPointF adjustedWidgetPosition(const QRectF &origWidgetRect);
+ QRectF contentGeometry();
+ QRectF contentGeometry(Qt::Orientation orientation);
+ QRectF contentRect();
+ QRectF contentRect(Qt::Orientation orientation);
public slots:
void showWidgets();
void hideWidgets();
void setOnline(bool online = true);
-
void updateZValues();
-
int pageIndex();
private:
@@ -90,8 +82,8 @@
void onWidgetResized();
void onWidgetAvailable();
void onWidgetUnavailable();
-
void onOrientationChanged(Qt::Orientation orientation);
+ void onPageMarginChanged(const QString &value);
private:
int mDatabaseId;
@@ -101,7 +93,8 @@
QList<HsWidgetHost*> mNewWidgets;
QList<HsWidgetHost*> mUnavailableWidgets;
HsPageTouchArea *mTouchArea;
-
+ QPointF mTouchPoint;
+ qreal mPageMargin;
HOMESCREEN_TEST_FRIEND_CLASS(TestHsDomainModel)
};
--- a/homescreenapp/hsdomainmodel/src/hsconfiguration.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsdomainmodel/src/hsconfiguration.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -73,7 +73,7 @@
mSnapTimeout(100),
mSnapForce(30),
mSnapGap(6),
- mSnapBorderGap(0),
+ mPageMargin(0),
mSnapLineFadeInDuration(200),
mSnapLineFadeOutDuration(100),
mIsSnapEffectsEnabled(true),
--- a/homescreenapp/hsdomainmodel/src/hspage.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsdomainmodel/src/hspage.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -48,13 +48,18 @@
mDatabaseId(-1),
mWallpaper(0),
mRemovable(true),
- mTouchArea(0)
+ mTouchArea(0),
+ mPageMargin(0.0)
{
setFlag(QGraphicsItem::ItemHasNoContents);
setSizePolicy(QSizePolicy(QSizePolicy::Ignored,
QSizePolicy::Ignored));
setupTouchArea();
+
+ //Page margin
+ mPageMargin = HSCONFIGURATION_GET(pageMargin);
+ connect(HsConfiguration::instance(), SIGNAL(propertyChanged(QString)), SLOT(onPageMarginChanged(QString)));
}
/*!
@@ -127,7 +132,7 @@
}
/*!
- Return wallpaper.
+ Return wallpaper.
*/
HsWallpaper *HsPage::wallpaper() const
{
@@ -156,6 +161,7 @@
return true;
}
+
/*!
Remove given \a widgetHost from a page. Widget is not deleted.
Returns true if successful
@@ -172,6 +178,7 @@
return true;
}
+
/*!
Returns list of new widgets belonging to a page. Widgets which are
not yet layouted are considered as new widgets.
@@ -197,16 +204,17 @@
}
HsWidgetPresentationData presentation;
+ QPointF adjustedWidgetPos = adjustedWidgetPosition(widgetHost->geometry());
presentation.orientation = HsScene::orientation();
if (!widgetHost->getPresentation(presentation)) {
presentation.orientation = HsScene::orientation();
- presentation.setPos(mTouchPoint);
+ presentation.setPos(adjustedWidgetPos);
presentation.zValue = 0;
widgetHost->savePresentation(presentation);
}
widgetHost->hide();
- widgetHost->setPos(presentation.x, presentation.y);
+ widgetHost->setPos(adjustedWidgetPos);
widgetHost->setZValue(presentation.zValue);
connectWidget(widgetHost);
@@ -244,6 +252,15 @@
}
/*!
+ Clears new widgets list and resets layout.
+*/
+void HsPage::resetNewWidgets()
+{
+ mNewWidgets.clear();
+ setLayout(0);
+}
+
+/*!
Remove page and all it's contained widgets from database
*/
bool HsPage::deleteFromDatabase()
@@ -262,9 +279,13 @@
widget->remove();
}
mUnavailableWidgets.clear();
-
+
+ if (mWallpaper) {
+ mWallpaper->remove();
+ }
return HsDatabase::instance()->deletePage(mDatabaseId);
}
+
/*!
Return list of widgets belonging to a page
*/
@@ -289,6 +310,7 @@
{
mRemovable = removable;
}
+
/*!
Return true if page is default page.
*/
@@ -296,6 +318,7 @@
{
return mDatabaseId == HSCONFIGURATION_GET(defaultPageId);
}
+
/*!
Return true if page is active page.
*/
@@ -303,6 +326,7 @@
{
return this == HsScene::instance()->activePage();
}
+
/*!
Create page into database and return instance of a new page.
*/
@@ -322,6 +346,65 @@
}
/*!
+ The widget is bounded in the rectangle which is smaller by pageMargin on all sides of page.
+*/
+QPointF HsPage::adjustedWidgetPosition(const QRectF &origWidgetRect)
+{
+ QRectF widgetAreaRect = contentGeometry();
+ qreal widgetX = qBound(widgetAreaRect.left(), origWidgetRect.x(), widgetAreaRect.right() - origWidgetRect.width());
+ qreal widgetY = qBound(widgetAreaRect.top(), origWidgetRect.y(), widgetAreaRect.bottom() - origWidgetRect.height());
+
+ return QPointF(widgetX, widgetY);
+}
+
+/*!
+ Returns rect of rectangular where widgets are allowed to be placed in the page.
+*/
+QRectF HsPage::contentGeometry()
+{
+ return contentGeometry(HsScene::mainWindow()->orientation());
+}
+
+/*!
+ Returns rect of rectangular where widgets are allowed to be placed in the page.
+*/
+QRectF HsPage::contentGeometry(Qt::Orientation orientation)
+{
+ QRectF pageRect = HsScene::mainWindow()->layoutRect();
+
+ if (orientation != HsScene::orientation()) {
+ qreal width = pageRect.width();
+ qreal height = pageRect.height();
+ pageRect.setWidth(height);
+ pageRect.setHeight(width);
+ }
+
+ //Take care of chrome in both orientation
+ pageRect.setTop(64);
+
+ //Shrink by page margins at each side
+ return pageRect.adjusted(mPageMargin, mPageMargin, -mPageMargin, -mPageMargin);
+}
+
+/*!
+ Returns rect of rectangular where widgets are allowed to be placed in the page.
+*/
+QRectF HsPage::contentRect()
+{
+ return contentRect(HsScene::mainWindow()->orientation());
+}
+
+/*!
+ Returns rect of rectangular where widgets are allowed to be placed in the page.
+*/
+QRectF HsPage::contentRect(Qt::Orientation orientation)
+{
+ QRectF rect = contentGeometry(orientation);
+ rect.moveTopLeft(QPointF(0,0));
+ return rect;
+}
+
+/*!
Calls onShow() for contained widgets.
*/
void HsPage::showWidgets()
@@ -346,7 +429,7 @@
}
/*!
- Propogate online state to widgets.
+ Propagate online state to widgets.
*/
void HsPage::setOnline(bool online)
{
@@ -357,6 +440,7 @@
widget->setOnline(online);
}
}
+
/*!
Update widgets z-values and persist those. Active widget has top most
z-value.
@@ -457,11 +541,7 @@
{
if ( !layout() ) {
HsWidgetHost *widget = qobject_cast<HsWidgetHost *>(sender());
- QRectF widgetRect = widget->geometry();
- QRectF pageRect = HsScene::mainWindow()->layoutRect();
- qreal widgetX = qBound(qreal(0), widgetRect.x(), pageRect.width() - widgetRect.width());
- qreal widgetY = qBound(qreal(64), widgetRect.y(), pageRect.height() - widgetRect.height());
- widget->setPos(widgetX, widgetY);
+ widget->setPos(adjustedWidgetPosition(widget->geometry()));
} else {
layout()->invalidate();
}
@@ -500,20 +580,19 @@
widget->hide();
widget->setParentItem(0);
}
+
/*!
Run positioning algorithm for widgets which don't have position on
target orientation. Otherwise set orientation positions for widgets.
*/
void HsPage::onOrientationChanged(Qt::Orientation orientation)
{
- QRectF rect = HsScene::mainWindow()->layoutRect();
-
HsWidgetPositioningOnOrientationChange *converter =
HsWidgetPositioningOnOrientationChange::instance();
- qreal chrome = 64;
- QRectF from(0, chrome, rect.height(), rect.width() - chrome);
- QRectF to(0, chrome, rect.width(), rect.height() - chrome);
+ Qt::Orientation orientationFrom = orientation == Qt::Vertical ? Qt::Horizontal : Qt::Vertical;
+ QRectF from = contentGeometry(orientationFrom);
+ QRectF to = contentGeometry(orientation);
HsWidgetPresentationData presentation;
presentation.orientation = orientation;
@@ -525,18 +604,33 @@
widget->setGeometry(geometries.first());
widget->savePresentation();
} else {
- widget->setPos(presentation.pos());
+ QRectF adjustWidgetPosition;
+ adjustWidgetPosition = widget->geometry();
+ adjustWidgetPosition.moveTopLeft(presentation.pos());
+ widget->setPos(adjustedWidgetPosition(adjustWidgetPosition));
widget->setZValue(presentation.zValue);
+ widget->savePresentation(); //Needed to follow pageMargin dynamic change
}
}
}
-/*!
- Clears new widgets list and resets layout.
-*/
-void HsPage::resetNewWidgets()
+void HsPage::onPageMarginChanged(const QString &value)
{
- mNewWidgets.clear();
- setLayout(0);
+ if (value == "pageMargin") {
+ mPageMargin = HSCONFIGURATION_GET(pageMargin);
+
+ if (!mWidgets.isEmpty()) {
+ foreach (HsWidgetHost *widget, mWidgets) {
+ widget->setPos(adjustedWidgetPosition(widget->geometry()));
+ widget->savePresentation();
+ }
+ }
+
+ if (!mNewWidgets.isEmpty()) {
+ foreach (HsWidgetHost *widget, mNewWidgets) {
+ widget->setPos(adjustedWidgetPosition(widget->geometry()));
+ widget->savePresentation();
+ }
+ }
+ }
}
-
--- a/homescreenapp/hsdomainmodel/src/hspagenewwidgetlayout.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsdomainmodel/src/hspagenewwidgetlayout.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -20,6 +20,7 @@
#include "hsdomainmodeldatastructures.h"
#include "hspagenewwidgetlayout.h"
#include "hsscene.h"
+#include "hspage.h"
#include "hsdatabase.h"
#include "hswidgethost.h"
#include "hswallpaper.h"
@@ -113,13 +114,10 @@
-> set widget center point to this touch point
*/
if (mTouchPoint != QPointF() && mNewWidgets.count() == 1) {
- QRectF pageRect = HsScene::mainWindow()->layoutRect();
- qreal widgetX = qBound(qreal(0), mTouchPoint.x() - rects.at(0).width() / 2, pageRect.width() - rects.at(0).width());
- qreal widgetY = qBound(qreal(64), mTouchPoint.y() - rects.at(0).height() / 2, pageRect.height() - rects.at(0).height());
- mNewWidgets.at(0)->setGeometry(widgetX,
- widgetY,
- rects.at(0).width(),
- rects.at(0).height());
+ QRectF widgetRect = rects.at(0);
+ widgetRect.moveCenter(mTouchPoint);
+ widgetRect.moveTopLeft(HsScene::instance()->activePage()->adjustedWidgetPosition(widgetRect));
+ mNewWidgets.at(0)->setGeometry(widgetRect);
/* we have to save widget presentation data here after drawing
to get correct position for later use
*/
@@ -129,8 +127,7 @@
else {
HsWidgetPositioningOnWidgetAdd *algorithm =
HsWidgetPositioningOnWidgetAdd::instance();
- QRectF pageRect = HsScene::mainWindow()->layoutRect();
- pageRect.adjust( (qreal)0,(qreal)64,(qreal)0,(qreal)0);
+ QRectF pageRect = HsScene::instance()->activePage()->contentGeometry();
QList<QRectF> calculatedRects =
algorithm->convert(pageRect, rects, QPointF());
--- a/homescreenapp/hsdomainmodel/src/hsscene.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsdomainmodel/src/hsscene.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -164,29 +164,41 @@
return true;
}
- int index = mPages.indexOf(page) + 1;
+ int nextIndex = mPages.indexOf(page) + 1;
HsDatabase *db = HsDatabase::instance();
db->transaction();
-
+ // update page indexes
HsPageData data;
- for (int i = index; i < mPages.count(); ++i) {
- data.id = mPages.at(i)->databaseId();
- data.indexPosition = i - 1;
+ int pageCount(mPages.count());
+ for (;nextIndex < pageCount; ++nextIndex) {
+ data.id = mPages.at(nextIndex)->databaseId();
+ data.indexPosition = nextIndex - 1;
if (!db->updatePage(data)) {
db->rollback();
return false;
}
}
-
+ // page will remove itself from database
if (!page->deleteFromDatabase()) {
db->rollback();
return false;
}
db->commit();
-
+ // update internal list
+ int index = mPages.indexOf(page);
+ bool lastPage(mPages.last() == page);
mPages.removeOne(page);
+ if (mPages.isEmpty()) {
+ mActivePage = NULL;
+ }else if (mActivePage == page) {
+ if (lastPage) {
+ index--;
+ }
+ setActivePageIndex(index);
+ }
+
return true;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsutils/inc/hsmenudialogfactory.h Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,44 @@
+/*
+* 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: Menu Dialog
+*
+*/
+
+
+#ifndef HSMENUDIALOG_H
+#define HSMENUDIALOG_H
+
+#include <QScopedPointer>
+
+class QStringList;
+class HbAction;
+class HbMessageBox;
+
+#include "hsutils_global.h"
+
+class HSUTILS_EXPORT HsMenuDialogFactory
+{
+public:
+ enum Options { OkCancel, Close };
+
+ virtual HbMessageBox *create(const QString &text,
+ Options options = OkCancel) const;
+ virtual ~HsMenuDialogFactory();
+private:
+ void setUpActions(HbMessageBox *box,
+ const QStringList &translationIdentifiers) const;
+};
+
+#endif
+
--- a/homescreenapp/hsutils/inc/hsmenuevent.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsutils/inc/hsmenuevent.h Fri Jul 09 14:36:01 2010 +0300
@@ -46,10 +46,12 @@
OpenInstalledView,
OpenHomeScreen,
ArrangeCollection,
+ ArrangeAllCollections,
CreateCollection,
PreviewHSWidget,
ShowAppSettings,
ShowAppDetails,
+ ShowInstallationLog,
Unknown
};
--- a/homescreenapp/hsutils/inc/hsmenueventfactory.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsutils/inc/hsmenueventfactory.h Fri Jul 09 14:36:01 2010 +0300
@@ -63,19 +63,20 @@
static QEvent *createAddAppsFromApplicationsViewEvent(
HsSortAttribute aApplicationsSortOder,
- HsSortAttribute aCollectionsSortOder,
int aItemId = 0);
- static QEvent *createAddAppsFromCallectionViewEvent(
+ static QEvent *createAddAppsFromCollectionViewEvent(
int aCollectionId,
- int aApplicationId = 0,
- HsSortAttribute aCollectionsSortOder = NoHsSortAttribute);
+ int aApplicationId = 0);
static QEvent *createRemoveAppFromCollectionEvent(int aItemId, int aCollectionId);
static QEvent *createUninstallApplicationEvent(int aItemId);
- static QEvent *createArrangeCollectionEvent(int aTopItemId);
+ static QEvent *createArrangeCollectionEvent(int aTopItemId,
+ int aCollectionId);
+
+ static QEvent *createArrangeAllCollectionsEvent(int aTopItemId);
static QEvent *createPreviewHSWidgetEvent(
int entryId,
@@ -87,6 +88,8 @@
static QEvent *createAppSettingsViewEvent(int entryId);
static QEvent *createAppDetailsViewEvent(int entryId);
+
+ static QEvent *createInstallationLogEvent();
static QEvent *createUnknownEvent();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsutils/inc/hsmessageboxwrapper.h Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,60 @@
+/*
+* Copyright (c) 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:
+*
+*/
+
+#ifndef HSMESSAGEBOXWRAPPER_H
+#define HSMESSAGEBOXWRAPPER_H
+
+#include <HbWidget>
+
+#include "hsutils_global.h"
+
+#include "hstest_global.h"
+HOMESCREEN_TEST_CLASS(t_hsUtils)
+
+class HbAction;
+struct HsMessageBoxWrapperImpl;
+
+class HSUTILS_EXPORT HsMessageBoxWrapper : public QObject
+{
+ Q_OBJECT
+
+public:
+ HsMessageBoxWrapper(QObject *parent=0);
+ ~HsMessageBoxWrapper();
+
+ void setHeader(const QString &header);
+ void setQueryText(const QString &queryText);
+
+signals:
+ void accepted();
+ void rejected();
+public slots:
+ void show();
+
+private:
+ Q_DISABLE_COPY(HsMessageBoxWrapper)
+
+private slots:
+ void onDialogClosed(int action);
+
+private:
+ HsMessageBoxWrapperImpl *mImpl;
+
+ HOMESCREEN_TEST_FRIEND_CLASS(t_hsUtils)
+};
+
+#endif // HSPAGEINDICATOR_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsutils/inc/hspropertyanimationwrapper.h Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,57 @@
+/*
+* Copyright (c) 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:
+*
+*/
+
+#ifndef HSPROPERTYANIMATIONWRAPPER_H
+#define HSPROPERTYANIMATIONWRAPPER_H
+
+#include <QScopedPointer>
+#include "hsutils_global.h"
+
+#include "hstest_global.h"
+HOMESCREEN_TEST_CLASS(t_hsUtils)
+
+struct HsPropertyAnimationWrapperImpl;
+class HSUTILS_EXPORT HsPropertyAnimationWrapper : public QObject
+{
+ Q_OBJECT
+
+public:
+ HsPropertyAnimationWrapper(QObject *parent=0);
+ ~HsPropertyAnimationWrapper();
+
+ void setTargetObject(QObject *target);
+ void setPropertyName(const QByteArray &propertyName);
+ bool isRunning();
+ void setEndValue(const QVariant &value);
+ void setDuration(int msecs);
+signals:
+ void finished();
+
+public slots:
+ void start();
+ void stop();
+
+private:
+ Q_DISABLE_COPY(HsPropertyAnimationWrapper)
+
+
+private:
+ QScopedPointer<HsPropertyAnimationWrapperImpl> mImpl;
+ HOMESCREEN_TEST_FRIEND_CLASS(t_hsUtils)
+};
+
+#endif // HSPAGEINDICATOR_H
--- a/homescreenapp/hsutils/inc/hswidgetpositioningonwidgetmove.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsutils/inc/hswidgetpositioningonwidgetmove.h Fri Jul 09 14:36:01 2010 +0300
@@ -156,7 +156,6 @@
bool mSnapEnabled;
qreal mSnapForce;
qreal mSnapGap;
- qreal mSnapBorderGap;
bool mRectVerticalEdgeLiesInLineWithVerticalLine;
bool mRectLieAboveVerticalLine;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsutils/src/hsmenudialogfactory.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,110 @@
+/*
+* 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: Menu Dialog
+*
+*/
+
+#include <QString>
+#include <QStringList>
+#include <QList>
+#include <QAction>
+
+#include <HbAction>
+#include <HbMessageBox>
+#include "hsmenudialogfactory.h"
+
+/*!
+ \class HsMenuDialogFactory
+ \ingroup group_hsutils
+
+ \brief Creates dialog instances for Application Library.
+
+ \sa HsMenuEvent
+*/
+
+/*! \enum HsMenuDialogFactory::Options
+ Describes what actions the dialog will have.
+ */
+
+/*! \var HsMenuDialogFactory::Options HsMenuDialogFactory::OkCancel
+ Requested dialog should have two actions in the following order: Ok (confirm) and Cancel (reject).
+ */
+/*! \var HsMenuDialogFactory::Options HsMenuDialogFactory::Close
+ Requested dialog should have one action: Close.
+ */
+/*!
+ Creates dialog.
+ \param text to be displayed in the dialog.
+ \param options specify dialog actions.
+ \return requested dialog.
+*/
+HbMessageBox *HsMenuDialogFactory::create(const QString &text,
+ Options options) const
+{
+
+ QStringList actionIdentifiers; // head of the list will be first action in dialog
+ HbMessageBox::MessageBoxType type(HbMessageBox::MessageTypeNone);
+
+ switch (options) {
+
+ case OkCancel:
+
+ actionIdentifiers << hbTrId("txt_common_button_ok");
+ actionIdentifiers << hbTrId("txt_common_button_cancel");
+ type = HbMessageBox::MessageTypeQuestion;
+ break;
+
+ case Close:
+
+ actionIdentifiers << hbTrId("txt_common_button_close");
+ type = HbMessageBox::MessageTypeInformation;
+ break;
+
+ default:
+ break;
+ }
+
+ QScopedPointer<HbMessageBox> box(new HbMessageBox(type));
+
+ setUpActions(box.data(), actionIdentifiers);
+
+ box->setText(text);
+ box->setAttribute(Qt::WA_DeleteOnClose);
+
+ return box.take();
+}
+
+
+/*!
+ Destructor.
+*/
+HsMenuDialogFactory::~HsMenuDialogFactory() {}
+
+/*!
+ Sets up dialog actions
+ \param box dialog to operate on.
+ \param actionIdentifiers list of translation identifiers for actions. Order of
+ actions in the dialog will reflect the identifiers order in the list.
+*/
+void HsMenuDialogFactory::setUpActions(HbMessageBox *box,
+ const QStringList &translationIdentifiers) const
+{
+ box->clearActions();
+
+ foreach (QString identifier, translationIdentifiers) {
+ QScopedPointer<HbAction> action(new HbAction(identifier));
+ action->setParent(box);
+ box->addAction(action.take());
+ }
+}
--- a/homescreenapp/hsutils/src/hsmenuevent.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsutils/src/hsmenuevent.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -57,7 +57,7 @@
Opening application library from shortcut.
*/
/*! \var HsMenuEvent::OperationType HsMenuEvent::ArrangeCollection
- Swith to arrange mode.
+ Switch to arrange mode.
*/
/*! \var HsMenuEvent::OperationType HsMenuEvent::Unknown
Unknown menu event.
--- a/homescreenapp/hsutils/src/hsmenueventfactory.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsutils/src/hsmenueventfactory.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -177,18 +177,15 @@
Creates an HsMenuEvent::AddAppsToCollection event.
\param aApplicationsSortOder applications sort order.
- \param aCollectionsSortOder collections sort order.
\param aItemId item id.
\return Add applications to collection event.
*/
QEvent *HsMenuEventFactory::createAddAppsFromApplicationsViewEvent(
HsSortAttribute aApplicationsSortOder,
- HsSortAttribute aCollectionsSortOder,
int aItemId)
{
QVariantMap params;
params.insert(appSortOrderKey(), aApplicationsSortOder);
- params.insert(collectionSortOrderKey(), aCollectionsSortOder);
params.insert(itemIdKey(), aItemId);
return new HsMenuEvent(HsMenuEvent::AddAppsToCollection, params);
}
@@ -198,18 +195,15 @@
\param aCollectionId collection id.
\param aApplicationId application id.
- \param aCollectionsSortOder collections sort order.
\return Add applications to collection event.
*/
-QEvent *HsMenuEventFactory::createAddAppsFromCallectionViewEvent(
+QEvent *HsMenuEventFactory::createAddAppsFromCollectionViewEvent(
int aCollectionId,
- int aApplicationId,
- HsSortAttribute aCollectionsSortOder)
+ int aApplicationId)
{
QVariantMap params;
params.insert(itemIdKey(), aApplicationId);
params.insert(collectionIdKey(), aCollectionId);
- params.insert(collectionSortOrderKey(), aCollectionsSortOder);
return new HsMenuEvent(HsMenuEvent::AddAppsToCollection, params);
}
@@ -247,16 +241,33 @@
Creates an HsMenuEvent::ArrangeCollection event.
\param aTopItemId Item id to be scrolled.
- \return ArrangeCollection event.
+ \param aCollectionId Collection id.
+ \retval ArrangeCollection event.
*/
-QEvent *HsMenuEventFactory::createArrangeCollectionEvent(int aTopItemId)
+QEvent *HsMenuEventFactory::createArrangeCollectionEvent(
+ int aTopItemId,
+ int aCollectionId)
{
QVariantMap params;
params.insert(itemIdKey(), aTopItemId);
+ params.insert(collectionIdKey(), aCollectionId);
return new HsMenuEvent(HsMenuEvent::ArrangeCollection, params);
}
/*!
+ Creates an HsMenuEvent::ArrangeAllCollections event.
+
+ \param aTopItemId Item id to be scrolled.
+ \retval ArrangeAllCollections event.
+ */
+QEvent *HsMenuEventFactory::createArrangeAllCollectionsEvent(int aTopItemId)
+{
+ QVariantMap params;
+ params.insert(itemIdKey(), aTopItemId);
+ return new HsMenuEvent(HsMenuEvent::ArrangeAllCollections, params);
+}
+
+/*!
Prepares event triggered on tap on Widget.
\param entryId Id of an item.
\param entryTypeName Name of the entry type (e.g. application, widget).
@@ -315,6 +326,16 @@
}
/*!
+ Creates an HsMenuEvent::ShowInstallationLog event.
+
+ \return Event for installation log.
+*/
+QEvent *HsMenuEventFactory::createInstallationLogEvent()
+{
+ return new HsMenuEvent(HsMenuEvent::ShowInstallationLog);
+}
+
+/*!
Creates an HsMenuEvent::Unknown event.
\return Unknown event.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsutils/src/hsmessageboxwrapper.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,95 @@
+/*
+* Copyright (c) 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 <HbMessageBox>
+#include <HbLabel>
+#include <HbAction>
+#include "hsmessageboxwrapper.h"
+
+/*!
+ \class HsMessageBoxWrapper
+ \ingroup group_hsutils
+ \brief
+*/
+
+
+struct HsMessageBoxWrapperImpl{
+ QString mHeader;
+ QString mQueryText;
+
+};
+/*!
+
+*/
+HsMessageBoxWrapper::HsMessageBoxWrapper(QObject *parent)
+ : QObject(parent),mImpl(new HsMessageBoxWrapperImpl)
+{
+}
+
+/*!
+
+*/
+HsMessageBoxWrapper::~HsMessageBoxWrapper()
+{
+ delete mImpl;
+}
+
+/*!
+
+*/
+void HsMessageBoxWrapper::setHeader(const QString &header)
+{
+ mImpl->mHeader = header;
+}
+/*!
+
+*/
+void HsMessageBoxWrapper::setQueryText(const QString &queryText)
+{
+ mImpl->mQueryText = queryText;
+}
+/*!
+
+*/
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC SKIP
+#endif
+
+void HsMessageBoxWrapper::show()
+{
+ HbMessageBox *box = new HbMessageBox(HbMessageBox::MessageTypeQuestion);
+ box->setAttribute(Qt::WA_DeleteOnClose);
+ box->setHeadingWidget(new HbLabel(mImpl->mHeader));
+ box->setText(mImpl->mQueryText);
+ box->setStandardButtons(HbMessageBox::Yes | HbMessageBox::No);
+
+ box->open(this,SLOT(onDialogClosed(int)));
+}
+/*!
+
+*/
+void HsMessageBoxWrapper::onDialogClosed(int action)
+{
+ if (action == HbMessageBox::Yes){
+ emit accepted();
+ } else {
+ emit rejected();
+ }
+}
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC ENDSKIP
+#endif //COVERAGE_MEASUREMENT
--- a/homescreenapp/hsutils/src/hspageindicator.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsutils/src/hspageindicator.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -79,7 +79,7 @@
*/
void HsPageIndicator::setActiveItemIndex(int activeItemIndex)
{
- if (activeItemIndex < 0 || itemCount() <= activeItemIndex) {
+ if (activeItemIndex < 0 || itemCount()-1 < activeItemIndex) {
return;
}
@@ -116,13 +116,18 @@
*/
void HsPageIndicator::removeItem(int activeItemIndex)
{
- if (activeItemIndex < 0 || itemCount() - 1 <= activeItemIndex) {
+ if (activeItemIndex < 0 || itemCount() <= activeItemIndex) {
return;
}
+ if (activeItemIndex == itemCount()-1) {
+ activeItemIndex--;
+ }
+
delete mItems.last();
mItems.removeLast();
layoutItems();
+
setActiveItemIndex(activeItemIndex);
}
--- a/homescreenapp/hsutils/src/hspageindicatoritem.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsutils/src/hspageindicatoritem.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -111,9 +111,12 @@
setTransformOriginPoint(rect().center());
QPropertyAnimation *animation =
new QPropertyAnimation(graphicsEffect(), "strength");
+
animation->setDuration(800);
animation->setKeyValueAt(0.2, 1);
animation->setEndValue(0);
+
+ connect(this,SIGNAL(destroyed()),animation,SLOT(stop()));
connect(animation, SIGNAL(finished()), SLOT(animationFinished()));
animation->start(QAbstractAnimation::DeleteWhenStopped);
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/hsutils/src/hspropertyanimationwrapper.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 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 <QPropertyAnimation>
+#include "hspropertyanimationwrapper.h"
+
+/*!
+ \class HsMessageBoxWrapper
+ \ingroup group_hsutils
+ \brief
+*/
+
+struct HsPropertyAnimationWrapperImpl
+{
+public:
+ QPropertyAnimation *mPropertyAnimation;
+};
+
+/*!
+
+*/
+HsPropertyAnimationWrapper::HsPropertyAnimationWrapper(QObject *parent)
+ : QObject(parent),mImpl(new HsPropertyAnimationWrapperImpl)
+{
+ mImpl->mPropertyAnimation = new QPropertyAnimation(parent);
+ connect(mImpl->mPropertyAnimation,SIGNAL(finished()),SIGNAL(finished()));
+}
+
+/*!
+
+*/
+HsPropertyAnimationWrapper::~HsPropertyAnimationWrapper()
+{
+
+}
+
+/*!
+
+*/
+void HsPropertyAnimationWrapper::setTargetObject(QObject *target)
+{
+ mImpl->mPropertyAnimation->setTargetObject(target);
+}
+/*!
+
+*/
+void HsPropertyAnimationWrapper::setPropertyName(const QByteArray &propertyName)
+{
+ mImpl->mPropertyAnimation->setPropertyName(propertyName);
+}
+
+bool HsPropertyAnimationWrapper::isRunning()
+{
+ return (mImpl->mPropertyAnimation->state() == QAbstractAnimation::Running);
+}
+void HsPropertyAnimationWrapper::setEndValue(const QVariant &value)
+{
+ mImpl->mPropertyAnimation->setEndValue(value);
+}
+void HsPropertyAnimationWrapper::setDuration(int msecs)
+{
+ mImpl->mPropertyAnimation->setDuration(msecs);
+}
+/*!
+
+*/
+void HsPropertyAnimationWrapper::start()
+{
+ mImpl->mPropertyAnimation->start();
+}
+/*!
+
+*/
+void HsPropertyAnimationWrapper::stop()
+{
+ mImpl->mPropertyAnimation->stop();
+}
--- a/homescreenapp/hsutils/src/hswidgetpositioningonwidgetmove.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/hsutils/src/hswidgetpositioningonwidgetmove.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -63,7 +63,7 @@
mRectLieLeft(false), mTopInRange(false), mBottomInRange(false),
mMinHorizontalEdgesDistance(0.0), mHorizontalDistance(0.0),
mHorizontalDistanceFromSelectedRect(0.0), mContainerHorizontalEdgeDistance(0.0),
- mSnapEnabled(false), mSnapForce(0.0), mSnapGap(0.0), mSnapBorderGap(0.0),
+ mSnapEnabled(false), mSnapForce(0.0), mSnapGap(0.0),
mRectVerticalEdgeLiesInLineWithVerticalLine(false), mRectLieAboveVerticalLine(false), mRectLieBelowVerticalLine(false),
mRectHorizontalEdgeLiesInLineWithHorizontalLine(false), mRectLieLeftOfHorizontalLine(false), mRectLiesRightOfHorizontalLine(false)
{
@@ -80,7 +80,6 @@
//The following values should be in qreal, so the status received in canConvert is ignored
mSnapForce = configuration[SNAPFORCE].toDouble(&canConvert);
mSnapGap = configuration[SNAPGAP].toDouble(&canConvert);
- mSnapBorderGap = configuration[SNAPBORDERGAP].toDouble(&canConvert);
}
/*!
@@ -91,11 +90,7 @@
const QList<QRectF> &inactiveRects,
const QRectF &activeRect)
{
- mContainerRect.setLeft(containerRect.left() + mSnapBorderGap);
- mContainerRect.setTop(containerRect.top() + mSnapBorderGap);
- mContainerRect.setRight(containerRect.right() - mSnapBorderGap);
- mContainerRect.setBottom(containerRect.bottom() - mSnapBorderGap);
-
+ mContainerRect = containerRect;
mActiveRectWidth = activeRect.width();
mActiveRectHeight = activeRect.height();
--- a/homescreenapp/inc/hsapp_defs.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/inc/hsapp_defs.h Fri Jul 09 14:36:01 2010 +0300
@@ -47,7 +47,7 @@
inline const QString groupNameAttributeName();
inline const QString componentIdAttributeName();
inline const QString entryShortName();
-inline const QString appLibActivity();
+
// Sort attribute
enum HsSortAttribute {
NoHsSortAttribute,
--- a/homescreenapp/inc/hsapp_defs.inl Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/inc/hsapp_defs.inl Fri Jul 09 14:36:01 2010 +0300
@@ -308,15 +308,6 @@
}
/*!
- \return app lib activity name
-*/
-inline const QString appLibActivity()
-{
- static const QString key("AppLibMainView");
- return key;
-}
-
-/*!
\return homescreen activitity name to open idle iew
*/
inline const QString activityHsIdleView()
--- a/homescreenapp/rom/homescreenapp_core.iby Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/rom/homescreenapp_core.iby Fri Jul 09 14:36:01 2010 +0300
@@ -20,6 +20,7 @@
// ---- hsapplication --------------------------------------------
+file=ABI_DIR\BUILD_DIR\hsapplicationlauncher.exe PROGRAMS_DIR\hsapplicationlauncher.exe
file=ABI_DIR\BUILD_DIR\hsapplication.exe PROGRAMS_DIR\hsapplication.exe
data=ZPRIVATE\10003a3f\import\apps\hsapplication_reg.rsc private\10003a3f\import\apps\hsapplication_reg.rsc
data=\epoc32\data\z\resource\apps\hsapplication.mif resource\apps\hsapplication.mif
@@ -34,6 +35,9 @@
data=ZPRIVATE\20022f35\wallpapers\page\2_landscape.png private\20022f35\wallpapers\page\2_landscape.png
data=ZPRIVATE\20022f35\wallpapers\page\3_portrait.png private\20022f35\wallpapers\page\3_portrait.png
data=ZPRIVATE\20022f35\wallpapers\page\3_landscape.png private\20022f35\wallpapers\page\3_landscape.png
+data=ZPRIVATE\20022f35\wallpapers\originals\car.png private\20022f35\wallpapers\originals\car.png
+data=ZPRIVATE\20022f35\wallpapers\originals\shapes.png private\20022f35\wallpapers\originals\shapes.png
+data=ZPRIVATE\20022f35\wallpapers\originals\shoes.png private\20022f35\wallpapers\originals\shoes.png
// ---- hswidgetuninstaller --------------------------------------------
file=ABI_DIR\BUILD_DIR\hswidgetuninstaller.exe PROGRAMS_DIR\hswidgetuninstaller.exe
@@ -53,12 +57,10 @@
data=\epoc32\data\z\resource\qt\plugins\hshomescreenclientplugin.qtplugin resource\qt\plugins\hshomescreenclientplugin.qtplugin
data=ZPRIVATE\20022f35\hshomescreenclientplugin.xml private\20022f35\hshomescreenclientplugin.xml
-// ---- runtimeplugins --------------------------------------------
+
-// -------- hsdefaultruntimeplugin
-file=ABI_DIR\BUILD_DIR\hsdefaultruntimeplugin.dll SHARED_LIB_DIR\hsdefaultruntimeplugin.dll
-data=ZPRIVATE\20022f35\plugins\runtimeplugins\hsdefaultruntimeplugin.qtplugin private\20022f35\plugins\runtimeplugins\hsdefaultruntimeplugin.qtplugin
-data=ZPRIVATE\20022f35\plugins\runtimeplugins\hsdefaultruntimeplugin.xml private\20022f35\plugins\runtimeplugins\hsdefaultruntimeplugin.xml
+
+
// ---- serviceproviders --------------------------------------------
--- a/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/hsdefaultruntimeplugin.pri Fri Jun 25 19:19:22 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# Copyright (c) 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:
-#
-
-HEADERS += ./inc/hsdefaultruntime.h \
- ./inc/hsdefaultruntimeplugin.h
-SOURCES += ./src/hsdefaultruntime.cpp \
- ./src/hsdefaultruntimeplugin.cpp
--- a/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/hsdefaultruntimeplugin.pro Fri Jun 25 19:19:22 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-#
-# Copyright (c) 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:
-#
-
-TEMPLATE = lib
-CONFIG += plugin hb mobility
-MOBILITY = serviceframework publishsubscribe
-
-PLUGIN_SUBDIR = /private/20022F35/plugins/runtimeplugins
-
-include (../../common.pri)
-
-LIBS += -lhsdomainmodel \
- -lhsutils
-
-QT += xml sql
-
-DEPENDPATH += ./inc \
- ./src
-INCLUDEPATH += ./inc \
- ../../hsutils/inc \
- ../../hsdomainmodel/inc \
-
-symbian: {
- TARGET.UID3 = 0x20022F3E
- LIBS += -lxqkeycapture
-}
-
-
-include(hsdefaultruntimeplugin.pri)
--- a/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/inc/hsdefaultruntime.h Fri Jun 25 19:19:22 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-/*
-* Copyright (c) 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: Default implementation of the home screen runtime.
-*
-*/
-
-#ifndef HSDEFAULTRUNTIME_H
-#define HSDEFAULTRUNTIME_H
-
-#include <QStateMachine>
-#include <qmobilityglobal.h>
-
-#ifdef Q_OS_SYMBIAN
-#include <xqkeycapture.h>
-#endif
-
-#ifndef HSDEFAULTRUNTIMEPLUGIN_UNITTEST
- #define TEST_CLASS_FWD
- #define TEST_FRIEND
-#else
- #define TEST_CLASS_FWD class DefaultRuntimePluginTest;
- #define TEST_FRIEND friend class DefaultRuntimePluginTest;
-#endif
-
-class HsContentService;
-QTM_BEGIN_NAMESPACE
-class QValueSpacePublisher;
-QTM_END_NAMESPACE
-
-QTM_USE_NAMESPACE
-
-TEST_CLASS_FWD
-
-class HsDefaultRuntime : public QStateMachine
-{
- Q_OBJECT
-
-public:
- HsDefaultRuntime(QObject *parent = 0);
- ~HsDefaultRuntime();
-
-signals:
- void event_exit();
- void event_toIdle();
-protected:
- bool eventFilter(QObject *watched, QEvent *event);
-
-private:
- Q_DISABLE_COPY(HsDefaultRuntime)
-
- void registerAnimations();
- void createStatePublisher();
- void createContentServiceParts();
- void createStates();
- void assignServices();
- void updatePSKeys();
-
-private slots:
- void onIdleStateEntered();
- void onIdleStateExited();
- void activityRequested(const QString &name);
-
-
-private:
- HsContentService *mContentService;
-
- bool mHomeScreenActive;
- bool mIdleStateActive;
-
- QValueSpacePublisher *mPublisher;
-
-#ifdef Q_OS_SYMBIAN
- XqKeyCapture keyCapture;
-#endif
-
- TEST_FRIEND
-};
-
-#endif
--- a/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/inc/hsdefaultruntimeplugin.h Fri Jun 25 19:19:22 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-/*
-* Copyright (c) 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: Default runtime provider.
-*
-*/
-
-#ifndef HSDEFAULTRUNTIMEPLUGIN_H
-#define HSDEFAULTRUNTIMEPLUGIN_H
-
-#include <QObject>
-#include <qserviceplugininterface.h>
-
-QTM_USE_NAMESPACE
-
-class HsDefaultRuntimePlugin : public QObject, public QServicePluginInterface
-{
- Q_OBJECT
- Q_INTERFACES(QtMobility::QServicePluginInterface)
-
-public:
- QObject *createInstance(const QServiceInterfaceDescriptor &descriptor,
- QServiceContext *context,
- QAbstractSecuritySession *session);
-};
-
-#endif //HSDEFAULTRUNTIMEPLUGIN_H
--- a/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/resource/hsdefaultruntimeplugin.xml Fri Jun 25 19:19:22 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<service>
- <name>hsdefaultruntimeplugin</name>
- <filepath>hsdefaultruntimeplugin</filepath>
- <description>Homescreen Runtime Plugin</description>
- <interface>
- <name>com.nokia.symbian.IHomeScreenRuntime</name>
- <version>1.0</version>
- <description>Default implementation for homescreen runtime</description>
- <capabilities></capabilities>
- </interface>
-</service>
--- a/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/src/hsdefaultruntime.cpp Fri Jun 25 19:19:22 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,447 +0,0 @@
-/*
-* Copyright (c) 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: Default implementation of the home screen runtime.
-*
-*/
-
-#include <QState>
-#include <QFinalState>
-#include <QHistoryState>
-#include <QSignalTransition>
-#include <QKeyEventTransition>
-#include <QKeyEvent>
-
-#include <qvaluespacepublisher.h>
-#include <qservicemanager.h>
-#include <qservicefilter.h>
-#include <qserviceinterfacedescriptor.h>
-
-#include <HbApplication>
-#include <HbActivityManager>
-#include <HbInstance>
-#include <HbIconAnimationManager>
-#include <HbIconAnimationDefinition>
-
-#include "hsmenueventfactory.h"
-#include "homescreendomainpskeys.h"
-#include "hsdefaultruntime.h"
-#include "hsdatabase.h"
-#include "hscontentservice.h"
-#include "hsshortcutservice.h"
-#include "hsmenueventtransition.h"
-#include "hswidgetpositioningonorientationchange.h"
-#include "hswidgetpositioningonwidgetadd.h"
-#include "hsconfiguration.h"
-#include "hstest_global.h"
-#include "hswidgetpositioningonwidgetmove.h"
-
-QTM_USE_NAMESPACE
-#define hbApp qobject_cast<HbApplication*>(qApp)
-
-#ifdef Q_OS_SYMBIAN
-const static Qt::Key applicationKey = Qt::Key_Menu;
-#else
-const static Qt::Key applicationKey = Qt::Key_Home;
-#endif
-
-namespace
-{
- const char KHsRootStateInterface[] = "com.nokia.homescreen.state.HsRootState";
- const char KHsLoadSceneStateInterface[] = "com.nokia.homescreen.state.HsLoadSceneState";
- const char KHsIdleStateInterface[] = "com.nokia.homescreen.state.HsIdleState";
- const char KHsAppLibraryStateInterface[] = "com.nokia.homescreen.state.HsAppLibraryState";
- const char KHsMenuWorkerStateInterface[] = "com.nokia.homescreen.state.HsMenuWorkerState";
- const char KHsBacupRestoreStateInterface[] = "com.nokia.homescreen.state.HsBackupRestoreState";
-}
-
-
-/*!
- \class HsDefaultRuntime
- \ingroup group_hsdefaultruntimeplugin
- \brief Default implementation of the home screen runtime.
- Creates an execution context (EC) and populates it with
- runtime services. States are loaded from state plugins.
- Each state is given an access to the EC. States
- are added to a state machine. Finally, the state machine
- is started.
-*/
-
-/*!
- Constructs runtime with \a parent as the parent object.
-*/
-HsDefaultRuntime::HsDefaultRuntime(QObject *parent)
- : QStateMachine(parent),
- mContentService(0),
- mHomeScreenActive(false),
- mIdleStateActive(false),
- mPublisher(NULL)
-#ifdef Q_OS_SYMBIAN
- ,keyCapture()
-#endif
-{
- HSTEST_FUNC_ENTRY("HS::HsDefaultRuntime::HsDefaultRuntime");
-
- HsDatabase *db = new HsDatabase;
- db->setConnectionName("homescreen.dbc");
-#ifdef Q_OS_SYMBIAN
- db->setDatabaseName("c:/private/20022f35/homescreen.db");
-#else
- db->setDatabaseName("private/20022f35/homescreen.db");
-#endif
- db->open();
- HsDatabase::setInstance(db);
-
- HsConfiguration::setInstance(new HsConfiguration);
- HsConfiguration::instance()->load();
-
- HsWidgetPositioningOnOrientationChange::setInstance(
- new HsAdvancedWidgetPositioningOnOrientationChange);
-
- HsWidgetPositioningOnWidgetAdd::setInstance(
- new HsAnchorPointInBottomRight);
-
- HsWidgetPositioningOnWidgetMove::setInstance(
- new HsSnapToLines);
-
- registerAnimations();
-
- createStatePublisher();
- createContentServiceParts();
- createStates();
- assignServices();
-
- // create the instance so that singleton is accessible from elsewhere
- HsShortcutService::instance(this);
-
- QCoreApplication::instance()->installEventFilter(this);
-
- if (hbApp) { // Qt test framework uses QApplication.
- connect(hbApp->activityManager(), SIGNAL(activityRequested(QString)),
- this, SLOT(activityRequested(QString)));
- }
- HSTEST_FUNC_EXIT("HS::HsDefaultRuntime::HsDefaultRuntime");
-}
-
-/*!
- Destructor.
-*/
-HsDefaultRuntime::~HsDefaultRuntime()
-{
- HsWidgetPositioningOnOrientationChange::setInstance(0);
- delete mPublisher;
-}
-
-/*!
- \fn void HsDefaultRuntime::stopStateMachine()
- Emission of this signal initiates a transition to the final state.
-*/
-
-/*!
- \copydoc QObject::eventFilter(QObject *watched, QEvent *event)
-*/
-bool HsDefaultRuntime::eventFilter(QObject *watched, QEvent *event)
-{
- Q_UNUSED(watched);
-
- switch (event->type()) {
- case QEvent::ApplicationActivate:
- qDebug() << "HsDefaultRuntime::eventFilter: QEvent::ApplicationActivate";
-#ifdef Q_OS_SYMBIAN
- keyCapture.captureKey(applicationKey);
-#endif
- mHomeScreenActive = true;
- updatePSKeys();
- break;
- case QEvent::ApplicationDeactivate:
- qDebug() << "HsDefaultRuntime::eventFilter: QEvent::ApplicationDeactivate";
-#ifdef Q_OS_SYMBIAN
- keyCapture.cancelCaptureKey(applicationKey);
-#endif
- mHomeScreenActive = false;
- updatePSKeys();
- break;
- default:
- break;
- }
-
- bool result = QStateMachine::eventFilter(watched, event);
- // temporary hack as we should not register twice for events
- if (event->type() == QEvent::KeyPress ) {
- QKeyEvent* ke = static_cast<QKeyEvent *>(event);
- // Key_Launch0 should be removed when QT starts to send Key_Menu
- result = (ke->key() == applicationKey) || ke->key() == Qt::Key_Launch0;
- }
- return result;
-}
-
-
-/*!
- Registers framework animations.
-*/
-void HsDefaultRuntime::registerAnimations()
-{
- HbIconAnimationManager *manager = HbIconAnimationManager::global();
- manager->addDefinitionFile(QLatin1String("qtg_anim_loading.axml"));
-}
-
-/*!
- Creates Home screen state publisher.
-*/
-void HsDefaultRuntime::createStatePublisher()
-{
- mPublisher = new QValueSpacePublisher(QValueSpace::PermanentLayer, HsStatePSKeyPath);
-
- if (!mPublisher->isConnected()){
- // No permanent layer available
- mPublisher = new QValueSpacePublisher(HsStatePSKeyPath);
- }
-
- mPublisher->setValue(HsStatePSKeySubPath, EHomeScreenInactive);
-}
-
-/*!
- Creates content service parts.
-*/
-void HsDefaultRuntime::createContentServiceParts()
-{
- HSTEST_FUNC_ENTRY("HS::HsDefaultRuntime::createContentServiceParts");
-
- mContentService = new HsContentService(this);
-
- HSTEST_FUNC_EXIT("HS::HsDefaultRuntime::createContentServiceParts");
-}
-
-/*!
- Creates states.
-*/
-void HsDefaultRuntime::createStates()
-{
- HSTEST_FUNC_ENTRY("HS::HsDefaultRuntime::createStates");
-
- QFinalState *finalState = new QFinalState();
- addState(finalState);
-
- QState *guiRootState = new QState();
- addState(guiRootState);
-
- guiRootState->addTransition(this, SIGNAL(event_exit()), finalState);
-
- QServiceManager manager;
-
-
- QObject *loadSceneStateObj = manager.loadInterface(KHsLoadSceneStateInterface);
- QState *loadSceneState = qobject_cast<QState *>(loadSceneStateObj);
- loadSceneState->setParent(guiRootState);
- loadSceneState->setObjectName(KHsLoadSceneStateInterface);
-
- QObject *rootStateObj = manager.loadInterface(KHsRootStateInterface);
- QState *rootState = qobject_cast<QState *>(rootStateObj);
- rootState->setParent(guiRootState);
- rootState->setObjectName(KHsRootStateInterface);
-
- QObject *idleStateObj = manager.loadInterface(KHsIdleStateInterface);
- QState *idleState = qobject_cast<QState *>(idleStateObj);
- idleState->setParent(rootState);
- idleState->setObjectName(KHsIdleStateInterface);
- connect(idleState, SIGNAL(entered()), SLOT(onIdleStateEntered()));
- connect(idleState, SIGNAL(exited()), SLOT(onIdleStateExited()));
-
-
- //menu state
- QState *menuParallelState = new QState(
- QState::ParallelStates, rootState);
- QState *menuRootState = new QState(menuParallelState);
-
- QObject *appLibraryStateObj = manager.loadInterface(KHsAppLibraryStateInterface);
- QState *appLibraryState = qobject_cast<QState *>(appLibraryStateObj);
- appLibraryState->setParent(menuRootState);
- appLibraryState->setObjectName(KHsAppLibraryStateInterface);
- menuRootState->setInitialState(appLibraryState);
-
- QHistoryState *historyState = new QHistoryState(rootState);
- historyState->setDefaultState(idleState);
-
- loadSceneState->addTransition(
- loadSceneState, SIGNAL(event_history()), historyState);
-
- QObject *menuWorkerStateObj = manager.loadInterface(KHsMenuWorkerStateInterface);
- QState *menuWorkerState = qobject_cast<QState *>(menuWorkerStateObj);
- menuWorkerState->setParent(menuParallelState);
- menuWorkerState->setObjectName(KHsMenuWorkerStateInterface);
-
- connect(appLibraryState, SIGNAL(collectionEntered()),
- menuWorkerState, SIGNAL(reset()));
- connect(appLibraryState, SIGNAL(allAppsStateEntered ()),
- menuWorkerState, SIGNAL(reset()));
- connect(appLibraryState, SIGNAL(allCollectionsStateEntered ()),
- menuWorkerState, SIGNAL(reset()));
-
- //Backup/Restore state
- QObject *backupRestoreStateObj = manager.loadInterface(KHsBacupRestoreStateInterface);
- QState *backupRestoreState = qobject_cast<QState *>(backupRestoreStateObj);
- backupRestoreState->setParent(guiRootState);
- backupRestoreState->setObjectName(KHsBacupRestoreStateInterface);
- backupRestoreState->addTransition(
- backupRestoreState, SIGNAL(event_loadScene()), loadSceneState);
-
- // root state transitions
- idleState->addTransition(idleState, SIGNAL(event_applicationLibrary()), menuRootState);
- appLibraryState->addTransition(
- appLibraryState, SIGNAL(toHomescreenState()), idleState);
- rootState->addTransition(rootState, SIGNAL(event_backupRestore()), backupRestoreState);
- // opening shortcut to Application Library
- HsMenuEventTransition *idleToAppLibTransition =
- new HsMenuEventTransition(HsMenuEvent::OpenApplicationLibrary,
- idleState, appLibraryState);
- idleState->addTransition(idleToAppLibTransition);
-
- HsMenuEventTransition *appLibToIdleTransition =
- new HsMenuEventTransition(
- HsMenuEvent::OpenHomeScreen, appLibraryState, idleState);
- appLibraryState->addTransition(appLibToIdleTransition);
-
- HbMainWindow *window = hbInstance->allMainWindows().first();
-
- // key driven transition from idle to menu
- QKeyEventTransition *idleToMenuRootTransition =
- new QKeyEventTransition(
- window, QEvent::KeyPress, applicationKey);
- idleToMenuRootTransition->setTargetState(menuRootState);
- idleState->addTransition(idleToMenuRootTransition);
- // key driven transition from menu to idle
- QKeyEventTransition *menuToIdleTransition =
- new QKeyEventTransition(
- window, QEvent::KeyPress, applicationKey);
- menuToIdleTransition->setTargetState(idleState);
- menuRootState->addTransition(menuToIdleTransition);
-
- // transition for Key_Launch0 should be removed
- // when OT starts to send Key_Menu (maybe wk14)
- QKeyEventTransition *idleToMenuRootTransition2 =
- new QKeyEventTransition(
- window, QEvent::KeyPress, Qt::Key_Launch0);
- idleToMenuRootTransition2->setTargetState(menuRootState);
- idleState->addTransition(idleToMenuRootTransition2);
- // key driven transition from menu to idle
- QKeyEventTransition *menuToIdleTransition2 =
- new QKeyEventTransition(
- window, QEvent::KeyPress, Qt::Key_Launch0);
- menuToIdleTransition2->setTargetState(idleState);
- menuRootState->addTransition(menuToIdleTransition2);
- // add transition to switch to idle
- menuRootState->addTransition( this, SIGNAL(event_toIdle()), idleState);
-
- // transitions to child states
- // opening shortcut to a colleciton
- QList<QState *> collectionStates =
- appLibraryState->
- findChildren<QState *>
- ("homescreen.nokia.com/state/applibrarystate/collectionstate");
- qDebug(
- "Found %d \"collectionstate\" children for Application Library State",
- collectionStates.count());
- if (collectionStates.count()) {
- HsMenuEventTransition *idleToCollectionTransition =
- new HsMenuEventTransition(HsMenuEvent::OpenCollection,
- idleState, collectionStates[0]);
- idleState->addTransition(idleToCollectionTransition);
- }
-
- guiRootState->setInitialState(loadSceneState);
- setInitialState(guiRootState);
-
- HSTEST_FUNC_EXIT("HS::HsDefaultRuntime::createStates");
-}
-
-/*!
- Assigns services to states based on value of property HS_SERVICES_REGISTRATION_KEY.
-*/
-void HsDefaultRuntime::assignServices()
-{
- HSTEST_FUNC_ENTRY("HS::HsDefaultRuntime::assignServices");
-
- QList<QState*> children = findChildren<QState*>();
- foreach (QState *state, children) {
- QList<QVariant> services = state->property(HS_SERVICES_REGISTRATION_KEY).toList();
- foreach (const QVariant &service, services) {
- QString name = service.toString();
- qDebug() << "Assign service:" << name << "\n to " << state->objectName();
- if (name == CONTENT_SERVICE_KEY) {
- state->setProperty(name.toAscii().data(), qVariantFromValue(mContentService));
- } else if (name == SHORTCUT_SERVICE_KEY) {
- state->setProperty(name.toAscii().data(),
- qVariantFromValue(HsShortcutService::instance(this)));
- } else {
- qWarning() << "WARNING: Service " << name << " is unknown";
- }
- }
- }
-
- HSTEST_FUNC_EXIT("HS::HsDefaultRuntime::assignServices");
-}
-
-/*!
- Publishes Home screen states via Publish & Subscribe.
-*/
-void HsDefaultRuntime::updatePSKeys()
-{
- if (!mPublisher){
- createStatePublisher();
- }
-
- if (mHomeScreenActive && mIdleStateActive){
- qDebug() << "HsDefaultRuntime::updatePSKeys: EHomeScreenIdleState";
- mPublisher->setValue(HsStatePSKeySubPath, EHomeScreenIdleState);
- }
- else{
- qDebug() << "HsDefaultRuntime::updatePSKeys: EHomeScreenInactive";
- mPublisher->setValue(HsStatePSKeySubPath, EHomeScreenInactive);
- }
-}
-
-/*!
- Called when state machine is in Idle state.
-*/
-void HsDefaultRuntime::onIdleStateEntered()
-{
- mIdleStateActive = true;
- updatePSKeys();
-}
-
-/*!
- Called when state machine leaves the Idle state.
-*/
-void HsDefaultRuntime::onIdleStateExited()
-{
- mIdleStateActive = false;
- updatePSKeys();
-}
-
-/*!
- Activity requested by another client
-*/
-void HsDefaultRuntime::activityRequested(const QString &name)
-{
- if (name == appLibActivity()) {
- this->postEvent(
- HsMenuEventFactory::createOpenAppLibraryEvent(NormalHsMenuMode));
- }
- else if (name == groupAppLibRecentView()) {
- this->postEvent(
- HsMenuEventFactory::createOpenCollectionEvent(0,
- collectionDownloadedTypeName()));
- } else if (name == activityHsIdleView()) {
- emit event_toIdle();
- }
-}
--- a/homescreenapp/runtimeplugins/hsdefaultruntimeplugin/src/hsdefaultruntimeplugin.cpp Fri Jun 25 19:19:22 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
-* Copyright (c) 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: Default runtime plugin.
-*
-*/
-
-#include <qserviceinterfacedescriptor.h>
-#include <qabstractsecuritysession.h>
-#include <qservicecontext.h>
-
-#include "hsdefaultruntimeplugin.h"
-#include "hsdefaultruntime.h"
-
-#ifdef COVERAGE_MEASUREMENT
-#pragma CTC SKIP
-#endif //COVERAGE_MEASUREMENT
-
-QObject *HsDefaultRuntimePlugin::createInstance(const QServiceInterfaceDescriptor &descriptor,
- QServiceContext *context,
- QAbstractSecuritySession *session)
-{
- Q_UNUSED(context);
- Q_UNUSED(session);
-
- if (descriptor.interfaceName() == QLatin1String("com.nokia.symbian.IHomeScreenRuntime")) {
- return new HsDefaultRuntime(this);
- } else {
- return 0;
- }
-}
-
-Q_EXPORT_PLUGIN2(hsdefaultruntimeplugin, HsDefaultRuntimePlugin)
-
-#ifdef COVERAGE_MEASUREMENT
-#pragma CTC ENDSKIP
-#endif //COVERAGE_MEASUREMENT
--- a/homescreenapp/runtimeplugins/runtimeplugins.pro Fri Jun 25 19:19:22 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-#
-# Copyright (c) 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:
-#
-
-TEMPLATE = subdirs
-SUBDIRS = hsdefaultruntimeplugin
--- a/homescreenapp/serviceproviders/hsmenuserviceprovider/inc/hsmenuservice.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/serviceproviders/hsmenuserviceprovider/inc/hsmenuservice.h Fri Jul 09 14:36:01 2010 +0300
@@ -40,8 +40,7 @@
// Function declarations
static HsMenuItemModel *getAllApplicationsModel(
HsSortAttribute sortAttribute = DescendingNameHsSortAttribute);
- static HsMenuItemModel *getAllCollectionsModel(
- HsSortAttribute sortAttribute = LatestOnTopHsSortAttribute);
+ static HsMenuItemModel *getAllCollectionsModel();
static HsMenuItemModel *getInstalledModel(
HsSortAttribute sortAttribute = DescendingNameHsSortAttribute);
static HsMenuItemModel *getCollectionModel(int collectionId,
--- a/homescreenapp/serviceproviders/hsmenuserviceprovider/src/hsmenuitemmodel.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/serviceproviders/hsmenuserviceprovider/src/hsmenuitemmodel.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -77,9 +77,9 @@
} else if (role == Hb::IndexFeedbackRole){
QVariant display = CaItemModel::data(index, Qt::DisplayRole);
if (display.type() == QVariant::String){
- variant = display;
+ variant = QVariant(display.toString().at(0).toUpper());;
} else {
- variant = QVariant(display.toList().at(0));
+ variant = QVariant(display.toList().at(0).toString().at(0).toUpper());
}
} else {
variant = CaItemModel::data(index, role);
--- a/homescreenapp/serviceproviders/hsmenuserviceprovider/src/hsmenuservice.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/serviceproviders/hsmenuserviceprovider/src/hsmenuservice.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -63,22 +63,16 @@
/*!
Returns all collections model
- \param sortAttribute :: SortAttribute
- \param details : switch to return details or not
\retval HsMenuItemModel: all collections model
*/
-HsMenuItemModel *HsMenuService::getAllCollectionsModel(
- HsSortAttribute sortAttribute)
+HsMenuItemModel *HsMenuService::getAllCollectionsModel()
{
- qDebug() << "HsMenuService::getAllCollectionsModel" << "sortAttribute:"
- << sortAttribute;
+ qDebug() << "HsMenuService::getAllCollectionsModel";
HSMENUTEST_FUNC_ENTRY("HsMenuService::getAllCollectionsModel");
CaQuery query;
query.setParentId(allCollectionsId());
query.setFlagsOn(VisibleEntryFlag);
query.setFlagsOff(MissingEntryFlag);
- query.setSort(HsMenuServiceUtils::sortBy(sortAttribute),
- HsMenuServiceUtils::sortOrder(sortAttribute));
HsMenuItemModel *model = new HsMenuCollectionsItemModel(query);
HSMENUTEST_FUNC_EXIT("HsMenuService::getAllCollectionsModel");
return model;
--- a/homescreenapp/sis/homescreenapp.pkg Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/sis/homescreenapp.pkg Fri Jul 09 14:36:01 2010 +0300
@@ -59,13 +59,6 @@
"/epoc32/release/armv5/urel/hsdomainmodel.dll" - "c:/sys/bin/hsdomainmodel.dll"
-; ---- runtimeplugins --------------------------------------------
-
-; -------- hsdefaultruntimeplugin
-"/epoc32/release/armv5/urel/hsdefaultruntimeplugin.dll" - "c:/sys/bin/hsdefaultruntimeplugin.dll"
-"/epoc32/data/z/hsresources/plugins/runtimeplugins/hsdefaultruntimeplugin.qtplugin" - "c:/hsresources/plugins/runtimeplugins/hsdefaultruntimeplugin.qtplugin"
-"/epoc32/data/z/hsresources/plugins/runtimeplugins/hsdefaultruntimeplugin.manifest" - "c:/hsresources/plugins/runtimeplugins/hsdefaultruntimeplugin.manifest"
-
; ---- serviceproviders --------------------------------------------
; -------- hsmenuserviceprovider
--- a/homescreenapp/sis/homescreenapp_ut_hs.pkg Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/sis/homescreenapp_ut_hs.pkg Fri Jul 09 14:36:01 2010 +0300
@@ -33,16 +33,14 @@
"/epoc32/release/armv5/urel/t_hsapplicationexe.exe" - "c:/sys/bin/t_hsapplicationexe.exe"
"/epoc32/data/z/private/10003a3f/import/apps/t_hsapplicationexe_reg.rsc" - "c:/private/10003a3f/import/apps/t_hsapplicationexe_reg.rsc"
"/epoc32/data/z/resource/apps/t_hsapplicationexe.rsc" - "c:/resource/apps/t_hsapplicationexe.rsc"
-"/epoc32/release/armv5/urel/mockruntimeplugin.dll" - "c:/sys/bin/mockruntimeplugin.dll"
-"/epoc32/data/z/private/20022f5f/hsresources/plugins/runtimeplugins/mockruntimeplugin.qtplugin" - "c:/private/20022f5f/hsresources/plugins/runtimeplugins/mockruntimeplugin.qtplugin"
-"/epoc32/data/z/private/20022f5f/hsresources/plugins/runtimeplugins/mockruntimeplugin.xml" - "c:/private/20022f5f/hsresources/plugins/runtimeplugins/mockruntimeplugin.xml"
+"/epoc32/release/armv5/urel/mockstateplugins.dll" - "c:/sys/bin/mockstateplugins.dll"
+"/epoc32/data/z/private/20022f5f/hsresources/plugins/stateplugins/mockstateplugins.qtplugin" - "c:/private/20022f5f/hsresources/plugins/stateplugins/mockstateplugins.qtplugin"
+"/epoc32/data/z/private/20022f5f/hsresources/plugins/stateplugins/mockstateplugins.xml" - "c:/private/20022f5f/hsresources/plugins/stateplugins/mockstateplugins.xml"
;--------------- hsutils ---------------
"/epoc32/release/armv5/urel/t_hsutils.exe" - "c:/sys/bin/t_hsutils.exe"
"/epoc32/data/z/private/10003a3f/import/apps/t_hsutils_reg.rsc" - "c:/private/10003a3f/import/apps/t_hsutils_reg.rsc"
"/epoc32/data/z/resource/apps/t_hsutils.rsc" - "c:/resource/apps/t_hsutils.rsc"
-"../hsutils/tsrc/t_hsutils/nokia.png" - "c:/hsresources/testresources/nokia.png"
-"../hsutils/tsrc/t_hsutils/large.jpg" - "c:/hsresources/testresources/large.jpg"
;--------------- hsdomainmodel ---------------
"/epoc32/release/armv5/urel/t_hsdomainmodel.exe" - "c:/sys/bin/t_hsdomainmodel.exe"
@@ -69,15 +67,10 @@
"/epoc32/data/z/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugintoobig.qtplugin" - "c:/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugintoobig.qtplugin"
"/epoc32/data/z/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugintoobig.xml" - "c:/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugintoobig.xml"
+"/epoc32/release/armv5/urel/mockwidgetplugincheater.dll" - "c:/sys/bin/mockwidgetplugincheater.dll"
+"/epoc32/data/z/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugincheater.qtplugin" - "c:/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugincheater.qtplugin"
+"/epoc32/data/z/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugincheater.xml" - "c:/private/20022F59/hsresources/plugins/widgetplugins/mockwidgetplugincheater.xml"
-;--------------- runtimeplugins ---------------
-;hsdefaultruntimeplugin
-"/epoc32/release/armv5/urel/t_hsdefaultruntimeplugin.exe" - "c:/sys/bin/t_hsdefaultruntimeplugin.exe"
-"/epoc32/data/z/private/10003a3f/import/apps/t_hsdefaultruntimeplugin_reg.rsc" - "c:/private/10003a3f/import/apps/t_hsdefaultruntimeplugin_reg.rsc"
-"/epoc32/data/z/resource/apps/t_hsdefaultruntimeplugin.rsc" - "c:/resource/apps/t_hsdefaultruntimeplugin.rsc"
-"/epoc32/release/armv5/urel/mockstateplugins.dll" - "c:/sys/bin/mockstateplugins.dll"
-"/epoc32/data/z/private/20022f63/hsresources/plugins/stateplugins/mockstateplugins.qtplugin" - "c:/private/20022f63/hsresources/plugins/stateplugins/mockstateplugins.qtplugin"
-"/epoc32/data/z/private/20022f63/hsresources/plugins/stateplugins/mockstateplugins.xml" - "c:/private/20022f63/hsresources/plugins/stateplugins/mockstateplugins.xml"
;--------------- serviceproviders ---------------
@@ -102,9 +95,9 @@
;--------------- hshomescreenclientplugin -----------------------
;hshomescreenclientplugin
-;"/epoc32/release/armv5/urel/t_hshomescreenclientplugin.exe" - "c:/sys/bin/t_hshomescreenclientplugin.exe"
-;"/epoc32/data/z/private/10003a3f/import/apps/t_hshomescreenclientplugin_reg.rsc" - "c:/private/10003a3f/import/apps/t_hshomescreenclientplugin_reg.rsc"
-;"/epoc32/data/z/resource/apps/t_hshomescreenclientplugin.rsc" - "c:/resource/apps/t_hshomescreenclientplugin.rsc"
+"/epoc32/release/armv5/urel/t_hshomescreenclientplugin.exe" - "c:/sys/bin/t_hshomescreenclientplugin.exe"
+"/epoc32/data/z/private/10003a3f/import/apps/t_hshomescreenclientplugin_reg.rsc" - "c:/private/10003a3f/import/apps/t_hshomescreenclientplugin_reg.rsc"
+"/epoc32/data/z/resource/apps/t_hshomescreenclientplugin.rsc" - "c:/resource/apps/t_hshomescreenclientplugin.rsc"
;--------------- hswidgetuninstaller -----------------------
;hswidgetuninstaller
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsallappsstate.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsallappsstate.h Fri Jul 09 14:36:01 2010 +0300
@@ -18,10 +18,7 @@
#ifndef HSALLAPPSSTATE_H
#define HSALLAPPSSTATE_H
-#include <qstate.h>
-#include <QModelIndex>
-#include <QPointer>
-
+#include <QState>
#include "hsbaseviewstate.h"
#include "hsmenumodewrapper.h"
@@ -29,8 +26,6 @@
HS_STATES_TEST_CLASS(MenuStatesTest)
class HbView;
-class HbAction;
-class HbMenu;
class HbAbstractViewItem;
class QPointF;
class HsMenuViewBuilder;
@@ -52,22 +47,13 @@
signals:
void toAppLibraryState();
-public slots:
- void scrollToBeginning();
- void collectionsSortOrder(HsSortAttribute sortAttribute);
private slots:
- bool openTaskSwitcher();
- int checkSoftwareUpdates();
- void listItemActivated(const QModelIndex &index);
void addActivated(const QModelIndex &index);
- void listItemLongPressed(HbAbstractViewItem *item, const QPointF &coords);
void addLongPressed(HbAbstractViewItem *item, const QPointF &coords);
void addToCollection();
void openInstalledView();
void ascendingMenuAction();
void descendingMenuAction();
- void stateEntered();
- void addModeEntered();
void normalModeEntered();
void stateExited();
void contextMenuAction(HbAction *action);
@@ -75,17 +61,10 @@
void construct();
void setMenuOptions();
void addToHomeScreen(const QModelIndex &index);
+ void setContextMenuOptions(HbAbstractViewItem *item, EntryFlags flags);
+
private:
- HbAction *mSecondarySoftkeyAction;
HsSortAttribute mSortAttribute;
- HsSortAttribute mCollectionsSortAttribute;
- HsMenuView mMenuView;
- HsMenuModeWrapper &mMenuMode;
- HsMenuItemModel *mAllAppsModel;
- HsMainWindow &mMainWindow;
- QModelIndex mContextModelIndex;
- QPointer<HbMenu> mContextMenu;
-
};
#endif // HSALLAPPSSTATE_H
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsallcollectionsstate.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsallcollectionsstate.h Fri Jul 09 14:36:01 2010 +0300
@@ -18,17 +18,14 @@
#ifndef HSALLCOLLECTIONSSTATE_H
#define HSALLCOLLECTIONSSTATE_H
-#include <qstate.h>
-#include <QModelIndex>
+#include <QState>
#include <QPointF>
-#include <QPointer>
#include "hsbaseviewstate.h"
#include "hsmenumodewrapper.h"
HS_STATES_TEST_CLASS(MenuStatesTest)
-class HbMenu;
class HsMenuViewBuilder;
class HbAbstractViewItem;
class HbAction;
@@ -49,24 +46,13 @@
~HsAllCollectionsState();
protected:
signals:
- void sortOrderChanged(HsSortAttribute sortAttribute);
void toAppLibraryState();
-public slots:
- void scrollToBeginning();
private slots:
- bool openTaskSwitcher();
- void listItemActivated(const QModelIndex &index);
void addActivated(const QModelIndex &index);
- void listItemLongPressed(HbAbstractViewItem *item, const QPointF &coords);
void addLongPressed(HbAbstractViewItem *item, const QPointF &coords);
void createNewCollection();
void createArrangeCollection();
- void customMenuAction();
- void ascendingMenuAction();
- void descendingMenuAction();
- void stateEntered();
- void addModeEntered();
void normalModeEntered();
void normalModeExited();
void stateExited();
@@ -74,15 +60,7 @@
private:
void construct();
void setMenuOptions();
-private:
- HbAction *mSecondarySoftkeyAction;
- HsSortAttribute mSortAttribute;
- HsMenuView mMenuView;
- HsMenuModeWrapper &mMenuMode;
- HsMenuItemModel *mAllCollectionsModel;
- HsMainWindow &mMainWindow;
- QModelIndex mContextModelIndex;
- QPointer<HbMenu> mContextMenu;
+ void setContextMenuOptions(HbAbstractViewItem *item, EntryFlags flags);
};
#endif // HSALLCOLLECTIONSSTATE_H
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsapplibrarystate.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsapplibrarystate.h Fri Jul 09 14:36:01 2010 +0300
@@ -84,28 +84,13 @@
private:
HsMenuViewBuilder mMenuViewBuilder;
- /**
- * All Applications state.
- * Own.
- */
+
HsAllAppsState *mAllAppsState;
- /**
- * Transition to remember last visited child state in Application Library.
- * Own.
- */
HsMenuModeTransition *mHistoryTransaction;
- /**
- * All Collections state.
- * Own.
- */
HsAllCollectionsState *mAllCollectionsState;
- /**
- * Collection state.
- * Own.
- */
HsCollectionState *mCollectionState;
HsInstalledAppsState *mInstalledAppsState;
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsbaseviewstate.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsbaseviewstate.h Fri Jul 09 14:36:01 2010 +0300
@@ -18,14 +18,21 @@
#ifndef HSBASEVIEWSTATE_H
#define HSBASEVIEWSTATE_H
-#include <qstate.h>
+#include <QState>
+#include <QPointer>
+#include <QModelIndex>
#include "hsmenustates_global.h"
#include "hsmenuservice.h"
#include "hsmenuview.h"
+class HbMenu;
+class HbAction;
class HbMessageBox;
+class HbAbstractViewItem;
class CaNotifier;
+class HsMenuModeWrapper;
+class HsMainWindow;
HS_STATES_TEST_CLASS(MenuStatesTest)
@@ -37,35 +44,59 @@
public:
- HsBaseViewState(QState *parent);
+ HsBaseViewState(HsMainWindow &mainWindow, QState *parent);
+ HsBaseViewState(HsMainWindow &mainWindow,
+ HsMenuModeWrapper& menuMode, QState *parent);
~HsBaseViewState();
-
+ void scrollToBeginning();
+
private slots:
- void applicationLaunchFailMessageFinished(HbAction*);
-
+ virtual void applicationLaunchFailMessageFinished(HbAction*);
+ virtual void openAppLibrary();
+
protected slots:
- void stateExited();
-
+ virtual void stateEntered();
+ virtual void stateExited();
+ virtual void addModeEntered();
+ virtual void normalModeEntered();
+ virtual void normalModeExited();
+ virtual void launchItem(const QModelIndex &index);
+ virtual void openCollection(const QModelIndex &index);
+ virtual void showContextMenu(HbAbstractViewItem *item, const QPointF &coords);
+ virtual int checkSoftwareUpdates();
+ virtual bool openTaskSwitcher();
protected:
+ void initialize(HsMenuViewBuilder &menuViewBuilder, HsViewContext viewContext);
void createApplicationLaunchFailMessage(int errorCode,int itemId);
void subscribeForMemoryCardRemove();
-
+
+ void defineTransitions();
+
private:
- void construct();
void cleanUpApplicationLaunchFailMessage();
-
+
+ virtual void setContextMenuOptions(HbAbstractViewItem *item, EntryFlags flags) = 0;
+ virtual void setMenuOptions() = 0;
+
+
private:
CaNotifier *mNotifier;
-
int mMessageRelatedItemId;
-
HbMessageBox *mApplicationLaunchFailMessage;
+protected:
+ HsMenuItemModel *mModel;
+ QPointer<HbMenu> mContextMenu;
+ QModelIndex mContextModelIndex;
+ HbAction *mBackKeyAction;
+ QScopedPointer<HsMenuView> mMenuView;
+ HsMenuModeWrapper *mMenuMode;
+ HsMainWindow &mMainWindow;
};
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hscollectionstate.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hscollectionstate.h Fri Jul 09 14:36:01 2010 +0300
@@ -18,9 +18,8 @@
#ifndef HSCOLLECTIONSTATE_H
#define HSCOLLECTIONSTATE_H
-#include <qstate.h>
-#include <qabstractitemmodel.h>
-#include <QPointer>
+#include <QState>
+#include <QAbstractItemModel>
#include "hsbaseviewstate.h"
@@ -30,7 +29,6 @@
class HbAction;
class HbMenu;
class HbAbstractViewItem;
-class QModelIndex;
class HsMenuItemModel;
class HsMenuModeWrapper;
class HsMenuViewBuilder;
@@ -46,29 +44,25 @@
HsMainWindow &mainWindow,
QState *parent = 0);
~HsCollectionState();
-public slots:
- void collectionsSortOrder(HsSortAttribute sortAttribute);
protected:
void onEntry(QEvent *event);
signals:
void sortOrderChanged(HsSortAttribute sortAttribute);
private slots:
- bool openTaskSwitcher();
- void listItemActivated(const QModelIndex &index);
- void listItemLongPressed(HbAbstractViewItem *item, const QPointF &coords);
void addAppsAction(bool addApps = true);
void addCollectionShortcutToHomeScreenAction();
void renameAction();
void deleteAction();
- void backSteppingAction();
void updateLabel();
void stateEntered();
+
void stateExited();
void latestOnTopMenuAction();
void oldestOnTopMenuAction();
void contextMenuAction(HbAction *action);
void handleEmptyChange(bool empty);
void lockSearchButton(bool lock);
+ void createArrangeCollection();
private:
void construct();
@@ -76,20 +70,13 @@
void makeConnect();
void makeDisconnect();
void addElementToHomeScreen(const QModelIndex &index);
+ void setContextMenuOptions(HbAbstractViewItem *item, EntryFlags flags);
+ void setMenuOptions();
private:
HsSortAttribute mSortAttribute;
- HsSortAttribute mCollectionsSortAttribute;
int mCollectionId;
QString mCollectionType;
- HsMenuView mMenuView;
- HsMenuModeWrapper &mMenuMode;
- HbAction *const mSecondarySoftkeyAction;
- HsMenuItemModel *mCollectionModel;
- HbMenu *mOptions;
- QModelIndex mContextModelIndex;
- QPointer<HbMenu> mContextMenu;
- HsMainWindow &mMainWindow;
};
#endif // HSCOLLECTIONSTATE_H
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsinstalledappsstate.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsinstalledappsstate.h Fri Jul 09 14:36:01 2010 +0300
@@ -18,9 +18,7 @@
#ifndef HSINSTALLEDAPPSSTATE_H
#define HSINSTALLEDAPPSSTATE_H
-#include <qstate.h>
-#include <QModelIndex>
-#include <QPointer>
+#include <QState>
#include "hsbaseviewstate.h"
@@ -51,15 +49,7 @@
private slots:
- bool openTaskSwitcher();
-
- void listItemActivated(const QModelIndex &index);
-
- void listItemLongPressed(HbAbstractViewItem *item,
- const QPointF &coords);
-
- void backAction();
-
+ void openInstallationLog();
void stateEntered();
void stateExited();
@@ -71,33 +61,8 @@
private:
void construct();
-
void setMenuOptions();
-
-private:
- /**
- * The View widget.
- * Own.
- */
- HsMenuView mMenuView;
-
- /**
- * Item Model for the List.
- * Own.
- */
- HsMenuItemModel *mInstalledAppsModel;
-
- /**
- * Secondary Softkey action.
- * Backstepping functionality.
- * Own.
- */
- HbAction *const mSecondarySoftkeyAction;
-
- HsMainWindow &mMainWindow;
-
- QModelIndex mContextModelIndex;
- QPointer<HbMenu> mContextMenu;
+ void setContextMenuOptions(HbAbstractViewItem *item, EntryFlags flags);
};
#endif // HSINSTALLEDAPPSSTATE_H
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsmainwindow.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsmainwindow.h Fri Jul 09 14:36:01 2010 +0300
@@ -20,31 +20,20 @@
#include <QObject>
#include <QPixmap>
+#include "hsmenustates_global.h"
+
+HS_STATES_TEST_CLASS(MenuStatesTest)
class HsMenuView;
-class HsMainWindow: public QObject
+class HsMainWindow
{
- Q_OBJECT
-
+
public:
HsMainWindow();
virtual ~HsMainWindow();
- virtual void setCurrentView(const HsMenuView &menuView);
- virtual QPixmap grabScreenshot();
-
- public slots:
- virtual void saveActivity();
-
- signals:
- void viewIsReady();
-
- private:
- /*
- * not owned
- *
- */
- QObject* mActivityClient;
+ virtual void setCurrentView(const HsMenuView &menuView);
+
};
#endif // HS_MAIN_WINDOW_H
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsmenuview.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/inc/hsmenuview.h Fri Jul 09 14:36:01 2010 +0300
@@ -21,6 +21,7 @@
#include <QObject>
#include <QModelIndex>
#include <QAbstractItemView>
+#include <QScopedPointer>
#include <QSortFilterProxyModel>
#include <HbAbstractItemView>
#include "hsmenustates_global.h"
@@ -36,7 +37,7 @@
class HbListView;
class HbGroupBox;
class HbWidget;
-class HbStaticVkbHost;
+class HbShrinkingVkbHost;
class HsMenuItemModel;
@@ -89,9 +90,6 @@
QAbstractItemView::PositionAtTop);
void findItem(QString criteriaStr);
- void vkbOpened();
- void vkbClosed();
-
private:
QModelIndex firstVisibleItemIndex(const HbListView *view) const;
@@ -123,7 +121,7 @@
HbListView *mSearchListView;
HbSearchPanel *mSearchPanel;
- HbStaticVkbHost* mVkbHost;
+ QScopedPointer<HbShrinkingVkbHost> mVkbHost;
HbPushButton *mCollectionButton;
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/resource/applibrary.docml Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/resource/applibrary.docml Fri Jul 09 14:36:01 2010 +0300
@@ -18,8 +18,6 @@
<widget name="view" type="HbView">
<widget name="container" role="HbView:widget" type="HbWidget">
<widget name="collectionLabel" type="HbGroupBox">
-
- <sizehint height="6un" type="MAXIMUM" width="100un"/>
<bool name="visible" value="FALSE"/>
<string name="heading" value="."/>
<bool name="marqueeHeading" value="TRUE"/>
@@ -52,7 +50,7 @@
<widget name="allAppsSearchListView" type="HbListView">
<bool name="visible" value="FALSE"/>
</widget>
- <layout orientation="Vertical" type="linear">
+ <layout orientation="Vertical" spacing="0.0un" type="linear">
<contentsmargins bottom="0un" left="0un" right="0un" top="0un"/>
<linearitem itemname="allAppsListView"/>
</layout>
@@ -79,7 +77,7 @@
<bool name="frictionEnabled" value="TRUE"/>
<bool name="visible" value="TRUE"/>
</widget>
- <layout orientation="Vertical" type="linear">
+ <layout orientation="Vertical" spacing="0.0un" type="linear">
<contentsmargins bottom="0un" left="0un" right="0un" top="0un"/>
<linearitem itemname="allAppsSearchListView"/>
<linearitem itemname="searchPanel"/>
@@ -99,7 +97,7 @@
<bool name="frictionEnabled" value="TRUE"/>
<bool name="visible" value="TRUE"/>
</widget>
- <layout orientation="Vertical" type="linear">
+ <layout orientation="Vertical" spacing="0.0un" type="linear">
<contentsmargins bottom="0un" left="0un" right="0un" top="0un"/>
<linearitem itemname="allCollectionsListView"/>
</layout>
@@ -134,7 +132,7 @@
<bool name="frictionEnabled" value="TRUE"/>
<bool name="visible" value="TRUE"/>
</widget>
- <layout orientation="Vertical" type="linear">
+ <layout orientation="Vertical" spacing="0.0un" type="linear">
<contentsmargins bottom="0un" left="0un" right="0un" top="0un"/>
<linearitem itemname="allCollectionsSearchListView"/>
<linearitem itemname="searchPanel"/>
@@ -150,7 +148,6 @@
<widget name="installedAppsLabel" type="HbGroupBox">
<string locid="txt_applib_subtitle_installed" name="heading"/>
<bool name="marqueeHeading" value="TRUE"/>
- <sizehint height="6un" type="MAXIMUM" width="-1"/>
<fontspec name="fontSpec" role="Title" textheight="0"/>
<integer name="groupBoxType" value="1"/>
</widget>
@@ -174,7 +171,7 @@
<sizehint height="0un" type="MAXIMUM" width="0un"/>
<bool name="visible" value="FALSE"/>
</widget>
- <layout orientation="Vertical" type="linear">
+ <layout orientation="Vertical" spacing="0.0un" type="linear">
<contentsmargins bottom="0un" left="0un" right="0un" top="0un"/>
<linearitem itemname="installedAppsLabel"/>
<linearitem itemname="installedAppsListView"/>
@@ -190,7 +187,6 @@
<widget name="installedAppsLabel" type="HbGroupBox">
<string locid="txt_applib_subtitle_installed" name="heading"/>
<bool name="marqueeHeading" value="TRUE"/>
- <sizehint height="6un" type="MAXIMUM" width="-1"/>
<fontspec name="fontSpec" role="Title" textheight="0"/>
<integer name="groupBoxType" value="1"/>
</widget>
@@ -214,7 +210,7 @@
<sizehint height="0un" type="MAXIMUM" width="0un"/>
<bool name="visible" value="FALSE"/>
</widget>
- <layout orientation="Vertical" type="linear">
+ <layout orientation="Vertical" spacing="0.0un" type="linear">
<contentsmargins bottom="0un" left="0un" right="0un" top="0un"/>
<linearitem itemname="installedAppsLabel"/>
<linearitem itemname="installedAppsSearchListView"/>
@@ -231,7 +227,6 @@
<widget name="installedAppsLabel" type="HbGroupBox">
<string locid="txt_applib_subtitle_installed" name="heading"/>
<bool name="marqueeHeading" value="TRUE"/>
- <sizehint height="6un" type="MAXIMUM" width="-1"/>
<fontspec name="fontSpec" role="Title" textheight="0"/>
<integer name="groupBoxType" value="1"/>
</widget>
@@ -259,13 +254,13 @@
<fontspec name="fontSpec" role="Title" textheight="4un"/>
</widget>
<sizehint height="11.9403un" type="PREFERRED" width="23.8806un"/>
- <layout orientation="Horizontal" type="linear">
+ <layout orientation="Horizontal" spacing="0.0un" type="linear">
<stretchitem stretchfactor="1"/>
<linearitem itemname="installedAppsEmptyLabel"/>
<stretchitem stretchfactor="1"/>
</layout>
</widget>
- <layout orientation="Vertical" type="linear">
+ <layout orientation="Vertical" spacing="0.0un" type="linear">
<contentsmargins bottom="0un" left="0un" right="0un" top="0un"/>
<linearitem itemname="installedAppsLabel"/>
<stretchitem stretchfactor="1"/>
@@ -281,7 +276,6 @@
<widget name="collectionView" type="HbView">
<widget name="collectionContainer" role="HbView:widget" type="HbWidget">
<widget name="collectionLabel" type="HbGroupBox">
- <sizehint height="6un" type="MAXIMUM" width="100un"/>
<bool name="visible" value="TRUE"/>
<integer name="groupBoxType" value="1"/>
</widget>
@@ -310,7 +304,7 @@
<sizehint height="0un" type="MAXIMUM" width="0un"/>
<bool name="visible" value="FALSE"/>
</widget>
- <layout orientation="Vertical" type="linear">
+ <layout orientation="Vertical" spacing="0.0un" type="linear">
<contentsmargins bottom="0un" left="0un" right="0un" top="0un"/>
<linearitem itemname="collectionLabel"/>
<linearitem itemname="collectionListView"/>
@@ -324,7 +318,6 @@
<widget name="collectionView" type="HbView">
<widget name="collectionContainer" role="HbView:widget" type="HbWidget">
<widget name="collectionLabel" type="HbGroupBox">
- <sizehint height="6un" type="MAXIMUM" width="100un"/>
<bool name="visible" value="TRUE"/>
<integer name="groupBoxType" value="1"/>
</widget>
@@ -352,7 +345,7 @@
<sizehint height="0un" type="MAXIMUM" width="0un"/>
<bool name="visible" value="FALSE"/>
</widget>
- <layout orientation="Vertical" type="linear">
+ <layout orientation="Vertical" spacing="0.0un" type="linear">
<contentsmargins bottom="0un" left="0un" right="0un" top="0un"/>
<linearitem itemname="collectionLabel"/>
<linearitem itemname="collectionSearchListView"/>
@@ -368,7 +361,6 @@
<widget name="collectionContainer" role="HbView:widget" type="HbWidget">
<widget name="collectionLabel" type="HbGroupBox">
<sizepolicy horizontalPolicy="Expanding" horizontalStretch="0" verticalPolicy="Preferred" verticalStretch="0"/>
- <sizehint height="6un" type="MAXIMUM" width="100un"/>
<bool name="visible" value="TRUE"/>
<integer name="groupBoxType" value="1"/>
</widget>
@@ -393,7 +385,7 @@
<bool name="visible" value="TRUE"/>
</widget>
<sizehint height="11.9403un" type="PREFERRED" width="23.8806un"/>
- <layout orientation="Horizontal" type="linear">
+ <layout orientation="Horizontal" spacing="0.0un" type="linear">
<stretchitem stretchfactor="1"/>
<linearitem itemname="collectionButton"/>
<stretchitem stretchfactor="1"/>
@@ -404,7 +396,7 @@
<sizehint height="0un" type="MAXIMUM" width="0un"/>
<bool name="visible" value="FALSE"/>
</widget>
- <layout orientation="Vertical" type="linear">
+ <layout orientation="Vertical" spacing="0.0un" type="linear">
<contentsmargins bottom="0un" left="0un" right="0un" top="0un"/>
<linearitem itemname="collectionLabel"/>
<stretchitem stretchfactor="1"/>
@@ -420,7 +412,6 @@
<widget name="collectionView" type="HbView">
<widget name="collectionContainer" role="HbView:widget" type="HbWidget">
<widget name="collectionLabel" type="HbGroupBox">
- <sizehint height="6un" type="MAXIMUM" width="100un"/>
<bool name="visible" value="TRUE"/>
<integer name="groupBoxType" value="1"/>
</widget>
@@ -452,13 +443,13 @@
<fontspec name="fontSpec" role="Title" textheight="4un"/>
</widget>
<sizehint height="11.9403un" type="PREFERRED" width="23.8806un"/>
- <layout orientation="Horizontal" type="linear">
+ <layout orientation="Horizontal" spacing="0.0un" type="linear">
<stretchitem stretchfactor="1"/>
<linearitem itemname="collectionAppsEmptyLabel"/>
<stretchitem stretchfactor="1"/>
</layout>
</widget>
- <layout orientation="Vertical" type="linear">
+ <layout orientation="Vertical" spacing="0.0un" type="linear">
<contentsmargins bottom="0un" left="0un" right="0un" top="0un"/>
<linearitem itemname="collectionLabel"/>
<stretchitem stretchfactor="1"/>
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsallappsstate.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsallappsstate.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -15,29 +15,26 @@
*
*/
-#include <qstatemachine.h>
-#include <hbview.h>
-#include <hblistview.h>
-#include <hbaction.h>
-#include <hbmenu.h>
-#include <hbabstractviewitem.h>
-#include <hsmenueventfactory.h>
-#include <hbinstance.h>
+#include <QStateMachine>
+#include <HbMenu>
+#include <HbAction>
+#include <HbAbstractViewItem>
+#include <HbIndexFeedback>
+#include <HbListView>
+#include <HbScrollBar>
+#include <HbView>
+
+#include <cadefs.h>
#include <caentry.h>
-#include <hbsearchpanel.h>
-#include <HbScrollBar>
-#include <HbIndexFeedback>
+#include <caitemmodel.h>
+#include <caservice.h>
+#include "hsapp_defs.h"
+#include "hsmenueventfactory.h"
#include "hsmenuitemmodel.h"
-#include "cadefs.h"
#include "hsallappsstate.h"
-#include "hsaddappstocollectionstate.h"
-#include "hsapp_defs.h"
#include "hsmenumodewrapper.h"
#include "hsmenuviewbuilder.h"
-#include "hsmenumodetransition.h"
-#include "caentry.h"
-#include "caservice.h"
#include "hsmainwindow.h"
/*!
@@ -55,39 +52,20 @@
*/
/*!
- \var HsAllAppsState::mCollectionsSortAttribute
- Collections sort order
- */
-
-/*!
- \var HsAllAppsState::mMenuView
- Wrapper for All Applications View.
- */
-
-/*!
- \var HsAllAppsState::mMenuMode
- Menu view mode wrapper.
- Not Own.
- */
-
-/*!
Constructor.
\param menuViewBuilder Menu view builder.
- \param menuMode reference to object representing menu mode (add mode on/add mode off).
+ \param menuMode Menu mode object(add mode on/add mode off).
+ \param mainWindow Main window wrapper.
\param parent Owner.
*/
HsAllAppsState::HsAllAppsState(HsMenuViewBuilder &menuViewBuilder,
HsMenuModeWrapper &menuMode,
HsMainWindow &mainWindow,
QState *parent) :
- HsBaseViewState(parent), mSortAttribute(AscendingNameHsSortAttribute),
- mCollectionsSortAttribute(LatestOnTopHsSortAttribute),
- mMenuView(menuViewBuilder, HsAllAppsContext),
- mMenuMode(menuMode),
- mAllAppsModel(0),
- mMainWindow(mainWindow),
- mContextModelIndex(), mContextMenu(0)
+ HsBaseViewState(mainWindow, menuMode, parent),
+ mSortAttribute(AscendingNameHsSortAttribute)
{
+ initialize(menuViewBuilder, HsAllAppsContext);
construct();
}
@@ -98,46 +76,26 @@
{
HSMENUTEST_FUNC_ENTRY("HsAllAppsState::construct");
- QState *initialState = new QState(this);
- setInitialState(initialState);
-
- QState *addModeState = new QState(this);
- connect(addModeState, SIGNAL(entered()),SLOT(addModeEntered()));
-
- QState *normalModeState = new QState(this);
- connect(normalModeState, SIGNAL(entered()),SLOT(normalModeEntered()));
-
- initialState->addTransition(new HsMenuModeTransition(
- mMenuMode, NormalHsMenuMode, normalModeState));
- initialState->addTransition(new HsMenuModeTransition(
- mMenuMode, AddHsMenuMode, addModeState));
+ defineTransitions();
const QString parentName =
parent() != 0 ? parent()->objectName() : QString("");
setObjectName(parentName + "/allappsstate");
- connect(this, SIGNAL(entered()),SLOT(stateEntered()));
- connect(this, SIGNAL(exited()),SLOT(stateExited()));
+ connect(mBackKeyAction, SIGNAL(triggered()), SIGNAL(toAppLibraryState()));
- mSecondarySoftkeyAction = new HbAction(Hb::BackNaviAction, this);
-
- mMenuView.view()->setNavigationAction(
- mSecondarySoftkeyAction);
+ mModel = HsMenuService::getAllApplicationsModel(mSortAttribute);
+ mMenuView->setModel(mModel);
- connect(mSecondarySoftkeyAction, SIGNAL(triggered()),
- SIGNAL(toAppLibraryState()));
-
- mAllAppsModel = HsMenuService::getAllApplicationsModel(mSortAttribute);
- mMenuView.setModel(mAllAppsModel);
-
- mMenuView.listView()->verticalScrollBar()->setInteractive(true);
- HbIndexFeedback *indexFeedback = new HbIndexFeedback(mMenuView.view());
+ mMenuView->listView()->verticalScrollBar()->setInteractive(true);
+ HbIndexFeedback *indexFeedback = new HbIndexFeedback(mMenuView->view());
indexFeedback->setIndexFeedbackPolicy(HbIndexFeedback::IndexFeedbackSingleCharacter);
- indexFeedback->setItemView(mMenuView.listView());
+ indexFeedback->setItemView(mMenuView->listView());
HSMENUTEST_FUNC_EXIT("HsAllAppsState::construct");
}
+
/*!
Creates and installs menu options for the view
*/
@@ -146,11 +104,11 @@
HSMENUTEST_FUNC_ENTRY("HsAllAppsState::setMenuOptions");
QScopedPointer<HbMenu> viewOptions(new HbMenu);
viewOptions->addAction(hbTrId("txt_applib_opt_task_switcher"),
- this, SLOT(openTaskSwitcher()));
+ static_cast<HsBaseViewState*>(this), SLOT(openTaskSwitcher()));
viewOptions->addAction(hbTrId("txt_applib_opt_add_to_collection"),
this, SLOT(addToCollection()));
viewOptions->addAction(hbTrId("txt_applib_opt_check_software_updates"),
- this, SLOT(checkSoftwareUpdates()));
+ static_cast<HsBaseViewState*>(this), SLOT(checkSoftwareUpdates()));
HbMenu *const sortMenu = viewOptions->addMenu(hbTrId(
"txt_applib_opt_sort_by"));
@@ -184,7 +142,7 @@
if (currentSortingPosition >= 0) {
sortGroup->actions().at(currentSortingPosition)->setChecked(true);
}
- mMenuView.view()->setMenu(viewOptions.take());
+ mMenuView->view()->setMenu(viewOptions.take());
HSMENUTEST_FUNC_EXIT("HsAllAppsState::setMenuOptions");
}
@@ -195,63 +153,18 @@
HsAllAppsState::~HsAllAppsState()
{
- mMenuView.setModel(NULL);
- delete mAllAppsModel;
-}
-
-/*!
- Scrolls view to first item at top
- */
-void HsAllAppsState::scrollToBeginning()
-{
- mMenuView.listView()->scrollTo(
- mAllAppsModel->index(0), HbAbstractItemView::PositionAtTop);
}
-/*!
- Slot invoked when a state is entered.
- */
-
-
-void HsAllAppsState::stateEntered()
-{
- qDebug("AllAppsState::stateEntered()");
- HSMENUTEST_FUNC_ENTRY("HsAllAppsState::stateEntered");
-
- mMainWindow.setCurrentView(mMenuView);
- mMenuView.activate();
-
- HSMENUTEST_FUNC_EXIT("HsAllAppsState::stateEntered");
-}
/*!
Slot invoked when add mode entered.
*/
void HsAllAppsState::normalModeEntered()
-{
- setMenuOptions();
- connect(&mMainWindow, SIGNAL(viewIsReady()),
- &mMainWindow, SLOT(saveActivity()),
- Qt::UniqueConnection);
- connect(&mMenuView,
+{
+ HsBaseViewState::normalModeEntered();
+ connect(mMenuView.data(),
SIGNAL(activated(QModelIndex)),
- SLOT(listItemActivated(QModelIndex)));
- connect(&mMenuView,
- SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
- SLOT(listItemLongPressed(HbAbstractViewItem *, QPointF)));
-}
-
-/*!
- Add mode entered.
- */
-void HsAllAppsState::addModeEntered()
-{
- connect(&mMenuView,
- SIGNAL(activated(QModelIndex)),
- SLOT(addActivated(QModelIndex)));
- connect(&mMenuView,
- SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
- SLOT(addLongPressed(HbAbstractViewItem *, QPointF)));
+ static_cast<HsBaseViewState*>(this), SLOT(launchItem(QModelIndex)));
}
/*!
@@ -261,20 +174,6 @@
{
HSMENUTEST_FUNC_ENTRY("HsAllAppsState::stateExited");
- disconnect(&mMainWindow, SIGNAL(viewIsReady()),
- &mMainWindow, SLOT(saveActivity()));
-
- mMenuView.setSearchPanelVisible(false);
-
- mMenuView.disconnect(this);
-
- mMenuView.view()->setMenu(NULL);
-
- mMenuView.inactivate();
-
- if (mContextMenu)
- mContextMenu->close();
-
HsBaseViewState::stateExited();
HSMENUTEST_FUNC_EXIT("HsAllAppsState::stateExited");
@@ -282,133 +181,17 @@
}
/*!
- Open task switcher.
- \retval true if operation is successful.
- */
-bool HsAllAppsState::openTaskSwitcher()
-{
- return HsMenuService::launchTaskSwitcher();
-}
-
-/*!
- Check software updates.
- \retval 0 if operation is successful.
- */
-int HsAllAppsState::checkSoftwareUpdates()
-{
- int errCode = HsMenuService::launchSoftwareUpdate();
- if (errCode != 0){
- createApplicationLaunchFailMessage(errCode,0);
- }
- return errCode;
-}
-
-/*!
- Slot connected to List widget in normal mode.
- \param index Model index of the activated item.
- */
-void HsAllAppsState::listItemActivated(const QModelIndex &index)
-{
- HSMENUTEST_FUNC_ENTRY("HsAllAppsState::listItemActivated");
-
- QSharedPointer<const CaEntry> entry = mAllAppsModel->entry(index);
-
- if (entry->entryTypeName() == widgetTypeName()) {
- EntryFlags flags = index.data(CaItemModel::FlagsRole).value<
- EntryFlags> ();
- if (!(flags & UninstallEntryFlag)) {
- machine()->postEvent(
- HsMenuEventFactory::createPreviewHSWidgetEvent(
- entry->id(), entry->entryTypeName(), entry->attribute(
- widgetUriAttributeName()), entry->attribute(
- widgetLibraryAttributeName())));
-
- const int itemId = index.data(CaItemModel::IdRole).toInt();
- HsMenuService::touch(itemId);
- }
- } else {
- QVariant data = mAllAppsModel->data(index, CaItemModel::IdRole);
- int errCode = HsMenuService::executeAction(data.toInt());
- if (errCode != 0) {
- createApplicationLaunchFailMessage(errCode,index.data(CaItemModel::IdRole).toInt());
- }
- }
-
- mMenuView.setSearchPanelVisible(false);
-
- HSMENUTEST_FUNC_EXIT("HsAllAppsState::listItemActivated");
-}
-
-/*!
Slot connected to List widget in add mode.
\param index Model index of the activated item.
*/
void HsAllAppsState::addActivated(const QModelIndex &index)
{
+ mMenuView->disconnect(this);
HSMENUTEST_FUNC_ENTRY("HsAllAppsState::addActivated");
addToHomeScreen(index);
HSMENUTEST_FUNC_EXIT("HsAllAppsState::addActivated");
}
-/*!
- Handles long-item-pressed event in all apps view by showing context menu
- \param item View item
- \param coords Press point coordinates
- */
-void HsAllAppsState::listItemLongPressed(HbAbstractViewItem *item,
- const QPointF &coords)
-{
- HSMENUTEST_FUNC_ENTRY("HsAllAppsState::listItemLongPressed");
-
- EntryFlags flags = item->modelIndex().data(
- CaItemModel::FlagsRole).value<EntryFlags> ();
-
- if (!(flags & UninstallEntryFlag)) {
- // create context menu
- mContextMenu = new HbMenu;
-
- HbAction *addToHomeScreenAction = mContextMenu->addAction(
- hbTrId("txt_applib_menu_add_to_home_screen"));
- addToHomeScreenAction->setData(AddToHomeScreenContextAction);
-
- HbAction *addToCollectionAction = mContextMenu->addAction(
- hbTrId("txt_applib_menu_add_to_collection"));
- addToCollectionAction->setData(AddToCollectionContextAction);
-
- HbAction *uninstallAction = mContextMenu->addAction(
- hbTrId("txt_common_menu_delete"));
- uninstallAction->setData(UninstallContextAction);
- HbAction *appSettingsAction(NULL);
- HbAction *appDetailsAction(NULL);
-
- // check conditions and hide irrelevant menu items
- QSharedPointer<const CaEntry> entry = mAllAppsModel->entry(item->modelIndex());
-
- if (!(entry->attribute(appSettingsPlugin()).isEmpty())) {
- appSettingsAction = mContextMenu->addAction(
- hbTrId("txt_common_menu_settings"));
- appSettingsAction->setData(AppSettingContextAction);
- }
- if (!(entry->attribute(componentIdAttributeName()).isEmpty()) &&
- (flags & RemovableEntryFlag) ) {
- appDetailsAction = mContextMenu->addAction(
- hbTrId("txt_common_menu_details"));
- appDetailsAction->setData(AppDetailsContextAction);
- }
-
- if (!(flags & RemovableEntryFlag)) {
- uninstallAction->setVisible(false);
- }
-
- mContextModelIndex = item->modelIndex();
- mContextMenu->setPreferredPos(coords);
- mContextMenu->setAttribute(Qt::WA_DeleteOnClose);
- mContextMenu->open(this, SLOT(contextMenuAction(HbAction*)));
- }
-
-
- HSMENUTEST_FUNC_EXIT("HsAllAppsState::listItemLongPressed");
-}
/*!
Handles context menu actions
@@ -429,7 +212,7 @@
// an existing collection via item specific menu.
machine()->postEvent(
HsMenuEventFactory::createAddAppsFromApplicationsViewEvent(
- mSortAttribute, mCollectionsSortAttribute, itemId));
+ mSortAttribute, itemId));
break;
case UninstallContextAction:
machine()->postEvent(
@@ -446,8 +229,7 @@
default:
break;
}
-
- mMenuView.setSearchPanelVisible(false);
+ mMenuView->setSearchPanelVisible(false);
}
/*!
@@ -460,6 +242,7 @@
const QPointF &coords)
{
Q_UNUSED(coords);
+ mMenuView->disconnect(this);
HSMENUTEST_FUNC_ENTRY("HsAllAppsState::addLongPressed");
addToHomeScreen(item->modelIndex());
HSMENUTEST_FUNC_EXIT("HsAllAppsState::addLongPressed");
@@ -475,7 +258,7 @@
// a new/an existing collection via the All view
machine()->postEvent(
HsMenuEventFactory::createAddAppsFromApplicationsViewEvent(
- mSortAttribute, mCollectionsSortAttribute));
+ mSortAttribute));
}
/*!
@@ -495,50 +278,79 @@
/*!
Triggers event so that a state adding to Home Screen is reached
- \param index of an item to be added to homescreen
+ \param index of an item to be added to homescreen.
\retval void
*/
void HsAllAppsState::addToHomeScreen(const QModelIndex &index)
{
HSMENUTEST_FUNC_ENTRY("HsAllAppsState::addToHomeScreen");
- QSharedPointer<const CaEntry> entry = mAllAppsModel->entry(index);
+ QSharedPointer<const CaEntry> entry = mModel->entry(index);
machine()-> postEvent(HsMenuEventFactory::createAddToHomeScreenEvent(
- entry->id(), mMenuMode.getHsMenuMode(),
- mMenuMode.getHsToken()));
+ entry->id(), mMenuMode->getHsMenuMode(),
+ mMenuMode->getHsToken()));
HSMENUTEST_FUNC_EXIT("HsAllAppsState::addToHomeScreen");
}
/*!
+ Method seting context menu options.
+ */
+void HsAllAppsState::setContextMenuOptions(HbAbstractViewItem *item, EntryFlags flags)
+{
+ HbAction *addToHomeScreenAction = mContextMenu->addAction(
+ hbTrId("txt_applib_menu_add_to_home_screen"));
+ addToHomeScreenAction->setData(AddToHomeScreenContextAction);
+
+ HbAction *addToCollectionAction = mContextMenu->addAction(
+ hbTrId("txt_applib_menu_add_to_collection"));
+ addToCollectionAction->setData(AddToCollectionContextAction);
+
+ HbAction *uninstallAction = mContextMenu->addAction(
+ hbTrId("txt_common_menu_delete"));
+ uninstallAction->setData(UninstallContextAction);
+ HbAction *appSettingsAction(NULL);
+ HbAction *appDetailsAction(NULL);
+
+ // check conditions and hide irrelevant menu items
+ QSharedPointer<const CaEntry> entry = mModel->entry(item->modelIndex());
+
+ if (!(entry->attribute(appSettingsPlugin()).isEmpty())) {
+ appSettingsAction = mContextMenu->addAction(
+ hbTrId("txt_common_menu_settings"));
+ appSettingsAction->setData(AppSettingContextAction);
+ }
+ if (!(entry->attribute(componentIdAttributeName()).isEmpty()) &&
+ (flags & RemovableEntryFlag) ) {
+ appDetailsAction = mContextMenu->addAction(
+ hbTrId("txt_common_menu_details"));
+ appDetailsAction->setData(AppDetailsContextAction);
+ }
+
+ if (!(flags & RemovableEntryFlag)) {
+ uninstallAction->setVisible(false);
+ }
+}
+
+/*!
Menu ascending sort action slot.
*/
void HsAllAppsState::ascendingMenuAction()
{
HSMENUTEST_FUNC_ENTRY("HsAllAppsState::ascendingMenuAction");
mSortAttribute = AscendingNameHsSortAttribute;
- mAllAppsModel->setSort(mSortAttribute);
+ mModel->setSort(mSortAttribute);
HSMENUTEST_FUNC_EXIT("HsAllAppsState::ascendingMenuAction");
}
/*!
- Sets collections sort order
- /param sortOrder sort order.
- */
-void HsAllAppsState::collectionsSortOrder(
- HsSortAttribute sortOrder)
-{
- mCollectionsSortAttribute = sortOrder;
-}
-
-/*!
Menu descending sort action slot.
*/
void HsAllAppsState::descendingMenuAction()
{
HSMENUTEST_FUNC_ENTRY("HsAllAppsState::descendingMenuAction");
mSortAttribute = DescendingNameHsSortAttribute;
- mAllAppsModel->setSort(mSortAttribute);
+ mModel->setSort(mSortAttribute);
HSMENUTEST_FUNC_EXIT("HsAllAppsState::descendingMenuAction");
}
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsallcollectionsstate.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsallcollectionsstate.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -18,21 +18,18 @@
#include <QStateMachine>
#include <HbView>
#include <HbListView>
-#include <HbMainWindow>
#include <HbMenu>
#include <HbAction>
#include <HbAbstractViewItem>
-#include <HbInstance>
-#include <HbSearchPanel>
+
+#include <cadefs.h>
-#include <hsmenueventfactory.h>
+#include "hsmenueventfactory.h"
#include "hsmenumodewrapper.h"
-#include "hsmenuviewbuilder.h"
#include "hsmenuitemmodel.h"
-#include "cadefs.h"
#include "hsallcollectionsstate.h"
#include "hsaddappstocollectionstate.h"
-#include "hsmenumodetransition.h"
+//#include "hsmenumodetransition.h"
#include "hsmainwindow.h"
/*!
@@ -45,28 +42,6 @@
*/
/*!
- \var HsAllCollectionsState::mSortAttribute
- Sort order
- */
-
-/*!
- \var HsAllCollectionsState::mMenuView
- Wrapper for All Collections View.
- */
-
-/*!
- \var HsAllCollectionsState::mAllCollectionsModel
- Item Model for the List.
- Own.
- */
-
-/*!
- \fn void HsAllCollectionsState::sortOrderChanged(HsSortAttribute sortAttribute);
- Signal emitted when sort order is changed.
- \param sortOrder new sort order.
- */
-
-/*!
Constructor.
\param menuViewBuilder Menu view builder.
\param menuMode reference to object representing menu mode (add mode on/add mode off).
@@ -77,14 +52,9 @@
HsMenuModeWrapper &menuMode,
HsMainWindow &mainWindow,
QState *parent):
- HsBaseViewState(parent),
- mSortAttribute(CustomHsSortAttribute),
- mMenuView(menuViewBuilder, HsAllCollectionsContext),
- mMenuMode(menuMode),
- mAllCollectionsModel(0),
- mMainWindow(mainWindow),
- mContextModelIndex(), mContextMenu(0)
+ HsBaseViewState(mainWindow, menuMode, parent)
{
+ initialize(menuViewBuilder, HsAllCollectionsContext);
construct();
}
@@ -94,46 +64,21 @@
void HsAllCollectionsState::construct()
{
HSMENUTEST_FUNC_ENTRY("HsAllCollectionsState::construct");
-
- QState *initialState = new QState(this);
- setInitialState(initialState);
-
- QState *addModeState = new QState(this);
- connect(addModeState, SIGNAL(entered()),SLOT(addModeEntered()));
-
- QState *normalModeState = new QState(this);
- connect(normalModeState, SIGNAL(entered()),SLOT(normalModeEntered()));
- connect(normalModeState, SIGNAL(exited()),SLOT(normalModeExited()));
-
- initialState->addTransition(new HsMenuModeTransition(
- mMenuMode, NormalHsMenuMode, normalModeState));
- initialState->addTransition(new HsMenuModeTransition(
- mMenuMode, AddHsMenuMode, addModeState));
-
+ defineTransitions();
const QString parentName =
parent() != 0 ? parent()->objectName() : QString("");
setObjectName(parentName + "/allcollectionsstate");
- connect(this, SIGNAL(entered()),SLOT(stateEntered()));
- connect(this, SIGNAL(exited()),SLOT(stateExited()));
- mSecondarySoftkeyAction = new HbAction(Hb::BackNaviAction, this);
-
- mMenuView.view()->setNavigationAction(
- mSecondarySoftkeyAction);
+ connect(mBackKeyAction, SIGNAL(triggered()), SIGNAL(toAppLibraryState()));
- connect(mSecondarySoftkeyAction, SIGNAL(triggered()),
- SIGNAL(toAppLibraryState()));
-
- mAllCollectionsModel = HsMenuService::getAllCollectionsModel(
- mSortAttribute);
-
- mMenuView.setModel(mAllCollectionsModel);
+ mModel = HsMenuService::getAllCollectionsModel();
+ mMenuView->setModel(mModel);
HSMENUTEST_FUNC_EXIT("HsAllCollectionsState::construct");
}
/*!
- Creates and installs menu options for the view
+ Creates and installs menu options for the view.
*/
void HsAllCollectionsState::setMenuOptions()
{
@@ -142,86 +87,47 @@
QScopedPointer<HbMenu> viewOptions(new HbMenu);
viewOptions->addAction(hbTrId("txt_applib_opt_task_switcher"),
- this,
+ static_cast<HsBaseViewState*>(this),
SLOT(openTaskSwitcher()));
viewOptions->addAction(hbTrId("txt_applib_opt_new_collection"),
this, SLOT(createNewCollection()));
- HbMenu *const sortMenu = viewOptions->addMenu(
- hbTrId("txt_applib_opt_sort_by"));
-
- //Grouped options are exclusive by default.
- QActionGroup *sortGroup = new QActionGroup(viewOptions.data());
- sortGroup->addAction(sortMenu->addAction(
- hbTrId("txt_applib_opt_sub_custom"),
- this, SLOT(customMenuAction())));
- sortGroup->addAction(sortMenu->addAction(
- hbTrId("txt_applib_opt_sub_ascending"),
- this, SLOT(ascendingMenuAction())));
- sortGroup->addAction(sortMenu->addAction(
- hbTrId("txt_applib_opt_sub_descending"),
- this, SLOT(descendingMenuAction())));
-
- if (mSortAttribute == CustomHsSortAttribute) {
- viewOptions->addAction(hbTrId("txt_applib_opt_arrange"),
- this, SLOT(createArrangeCollection()));
- }
-
- foreach(QAction *action, sortMenu->actions()) {
- action->setCheckable(true);
- }
-
- switch (mSortAttribute) {
- case AscendingNameHsSortAttribute:
- sortGroup->actions().at(1)->setChecked(true);
- break;
- case DescendingNameHsSortAttribute:
- sortGroup->actions().at(2)->setChecked(true);
- break;
- case CustomHsSortAttribute:
- default:
- sortGroup->actions().at(0)->setChecked(true);
- break;
- }
-
- mMenuView.view()->setMenu(viewOptions.take());
+ viewOptions->addAction(hbTrId("txt_applib_opt_arrange"),
+ this, SLOT(createArrangeCollection()));
+ mMenuView->view()->setMenu(viewOptions.take());
HSMENUTEST_FUNC_EXIT("HsAllCollectionsState::setMenuOptions");
}
/*!
+ Method seting context menu options.
+ \param item the context menu is requested for.
+ \param flags related to \a item.
+ */
+void HsAllCollectionsState::setContextMenuOptions(HbAbstractViewItem *item, EntryFlags flags)
+{
+ Q_UNUSED(item)
+ // create context menu
+ HbAction *addShortcutAction = mContextMenu->addAction(hbTrId(
+ "txt_applib_menu_add_to_home_screen"));
+ addShortcutAction->setData(AddToHomeScreenContextAction);
+ HbAction *renameAction = NULL;
+ HbAction *deleteAction = NULL;
+
+ if ((flags & RemovableEntryFlag)) {
+ renameAction = mContextMenu->addAction(
+ hbTrId("txt_common_menu_rename_item"));
+ renameAction->setData(RenameContextAction);
+ deleteAction = mContextMenu->addAction(hbTrId("txt_common_menu_delete"));
+ deleteAction->setData(DeleteContextAction);
+ }
+}
+
+/*!
Destructor.
*/
HsAllCollectionsState::~HsAllCollectionsState()
{
- mMenuView.setModel(NULL);
- delete mAllCollectionsModel;
-}
-
-/*!
- Populates all folders
- */
-void HsAllCollectionsState::scrollToBeginning()
-{
-
- mMenuView.listView()->scrollTo(
- mAllCollectionsModel->index(0), HbAbstractItemView::PositionAtTop);
-}
-
-/*!
- Slot invoked when a state is entered.
- */
-
-
-void HsAllCollectionsState::stateEntered()
-{
- qDebug("AllCollectionsState::stateEntered()");
- HSMENUTEST_FUNC_ENTRY("HsAllCollectionsState::stateEntered");
-
- mMainWindow.setCurrentView(mMenuView);
- mMenuView.activate();
-
- HSMENUTEST_FUNC_EXIT("HsAllCollectionsState::stateExited");
}
/*!
@@ -229,16 +135,11 @@
*/
void HsAllCollectionsState::normalModeEntered()
{
- setMenuOptions();
- connect(&mMainWindow, SIGNAL(viewIsReady()),
- &mMainWindow, SLOT(saveActivity()),
- Qt::UniqueConnection);
- connect(&mMenuView,
+ HsBaseViewState::normalModeEntered();
+ connect(mMenuView.data(),
SIGNAL(activated(QModelIndex)),
- SLOT(listItemActivated(QModelIndex)));
- connect(&mMenuView,
- SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
- SLOT(listItemLongPressed(HbAbstractViewItem *, QPointF)));
+ static_cast<HsBaseViewState*>(this),
+ SLOT(openCollection(QModelIndex)));
}
/*!
@@ -246,21 +147,9 @@
*/
void HsAllCollectionsState::normalModeExited()
{
- mMenuView.view()->setMenu(NULL);
+ mMenuView->view()->setMenu(NULL);
}
-/*!
- Slot invoked when add mode is entered.
- */
-void HsAllCollectionsState::addModeEntered()
-{
- connect(&mMenuView,
- SIGNAL(activated(QModelIndex)),
- SLOT(addActivated(QModelIndex)));
- connect(&mMenuView,
- SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
- SLOT(addLongPressed(HbAbstractViewItem *, QPointF)));
-}
/*!
Slot invoked when a state is exited.
@@ -268,19 +157,7 @@
void HsAllCollectionsState::stateExited()
{
HSMENUTEST_FUNC_ENTRY("HsAllCollectionsState::stateExited");
-
- disconnect(&mMainWindow, SIGNAL(viewIsReady()),
- &mMainWindow, SLOT(saveActivity()));
-
- mMenuView.setSearchPanelVisible(false);
- mMenuView.disconnect(this);
-
- mMenuView.inactivate();
-
- if (mContextMenu)
- mContextMenu->close();
-
HsBaseViewState::stateExited();
HSMENUTEST_FUNC_EXIT("HsAllCollectionsState::stateExited");
@@ -288,45 +165,16 @@
}
/*!
- Open task switcher.
- \retval true if operation is successful.
- */
-bool HsAllCollectionsState::openTaskSwitcher()
-{
- return HsMenuService::launchTaskSwitcher();
-}
-
-/*!
- Slot connected to List widget in normal mode.
- \param index Model index of the activated item.
- */
-void HsAllCollectionsState::listItemActivated(const QModelIndex &index)
-{
- HSMENUTEST_FUNC_ENTRY("HsAllCollectionsState::listItemActivated");
- QVariant data = mAllCollectionsModel->data(index, CaItemModel::IdRole);
- int id = data.toInt();
- QString collectionType =
- mAllCollectionsModel->data(index, CaItemModel::TypeRole).toString();
- qDebug("AllCollectionsState::listItemActivated - MCS ID: %d",
- data.toInt());
-
- mMenuView.setSearchPanelVisible(false);
-
- machine()->postEvent(HsMenuEventFactory::createOpenCollectionFromAppLibraryEvent(id,
- collectionType));
- HSMENUTEST_FUNC_EXIT("HsAllCollectionsState::listItemActivated");
-}
-
-/*!
Slot connected to List widget in add mode.
\param index Model index of the activated item.
*/
void HsAllCollectionsState::addActivated(const QModelIndex &index)
{
+ mMenuView->disconnect(this);
const int itemId = index.data(CaItemModel::IdRole).toInt();
machine()->postEvent(
HsMenuEventFactory::createAddToHomeScreenEvent(
- itemId, mMenuMode.getHsMenuMode(), mMenuMode.getHsToken()));
+ itemId, mMenuMode->getHsMenuMode(), mMenuMode->getHsToken()));
}
/*!
@@ -339,53 +187,16 @@
const QPointF &coords)
{
Q_UNUSED(coords);
+ mMenuView->disconnect(this);
const int itemId = item->modelIndex().data(CaItemModel::IdRole).toInt();
machine()->postEvent(
HsMenuEventFactory::createAddToHomeScreenEvent(itemId,
- mMenuMode.getHsMenuMode(), mMenuMode.getHsToken()));
+ mMenuMode->getHsMenuMode(), mMenuMode->getHsToken()));
}
/*!
- Slot connected to List widget in normal mode.
- Called when item long pressed.
- \param item View item.
- \param coords Press point coordinates.
- */
-void HsAllCollectionsState::listItemLongPressed(HbAbstractViewItem *item,
- const QPointF &coords)
-{
- HSMENUTEST_FUNC_ENTRY("HsAllCollectionsState::listItemLongPressed");
-
- mContextMenu = new HbMenu;
-
- // create context menu
- HbAction *addShortcutAction = mContextMenu->addAction(hbTrId(
- "txt_applib_menu_add_to_home_screen"));
- addShortcutAction->setData(AddToHomeScreenContextAction);
- HbAction *renameAction = NULL;
- HbAction *deleteAction = NULL;
-
- EntryFlags flags = item->modelIndex().data(CaItemModel::FlagsRole).value<
- EntryFlags> ();
-
- if ((flags & RemovableEntryFlag)) {
- renameAction = mContextMenu->addAction(
- hbTrId("txt_common_menu_rename_item"));
- renameAction->setData(RenameContextAction);
- deleteAction = mContextMenu->addAction(hbTrId("txt_common_menu_delete"));
- deleteAction->setData(DeleteContextAction);
- }
-
- mContextModelIndex = item->modelIndex();
- mContextMenu->setPreferredPos(coords);
- mContextMenu->setAttribute(Qt::WA_DeleteOnClose);
- mContextMenu->open(this, SLOT(contextMenuAction(HbAction*)));
-
- HSMENUTEST_FUNC_EXIT("HsAllCollectionsState::listItemLongPressed");
-}
-
-/*!
- Handles context menu actions
+ Handles context menu actions.
+ \param action to be handled.
*/
void HsAllCollectionsState::contextMenuAction(HbAction *action)
{
@@ -398,7 +209,7 @@
case AddToHomeScreenContextAction:
machine()->postEvent(
HsMenuEventFactory::createAddToHomeScreenEvent(
- itemId, mMenuMode.getHsMenuMode(), mMenuMode.getHsToken()));
+ itemId, mMenuMode->getHsMenuMode(), mMenuMode->getHsToken()));
break;
case RenameContextAction:
machine()->postEvent(
@@ -412,7 +223,7 @@
break;
}
- mMenuView.setSearchPanelVisible(false);
+ mMenuView->setSearchPanelVisible(false);
}
/*!
@@ -433,7 +244,7 @@
int topItemId(0);
const QList<HbAbstractViewItem *> array =
- mMenuView.listView()->visibleItems();
+ mMenuView->listView()->visibleItems();
if (array.count() >= 1) {
QModelIndex idx = array[0]->modelIndex();
@@ -441,45 +252,5 @@
}
machine()->postEvent(
- HsMenuEventFactory::createArrangeCollectionEvent(topItemId));
-}
-
-/*!
- Menu custom sort action slot.
- */
-void HsAllCollectionsState::customMenuAction()
-{
- HSMENUTEST_FUNC_ENTRY("HsAllCollectionsState::customMenuAction");
- mSortAttribute = CustomHsSortAttribute;
- setMenuOptions();
- mAllCollectionsModel->setSort(mSortAttribute);
- emit sortOrderChanged(mSortAttribute);
- HSMENUTEST_FUNC_EXIT("HsAllCollectionsState::customMenuAction");
+ HsMenuEventFactory::createArrangeAllCollectionsEvent(topItemId));
}
-
-/*!
- Menu ascending sort action slot.
- */
-void HsAllCollectionsState::ascendingMenuAction()
-{
- HSMENUTEST_FUNC_ENTRY("HsAllCollectionsState::ascendingMenuAction");
- mSortAttribute = AscendingNameHsSortAttribute;
- setMenuOptions();
- mAllCollectionsModel->setSort(mSortAttribute);
- emit sortOrderChanged(mSortAttribute);
- HSMENUTEST_FUNC_EXIT("HsAllCollectionsState::ascendingMenuAction");
-}
-
-/*!
- Menu descending sort action slot.
- */
-void HsAllCollectionsState::descendingMenuAction()
-{
- HSMENUTEST_FUNC_ENTRY("HsAllCollectionsState::descendingMenuAction");
- mSortAttribute = DescendingNameHsSortAttribute;
- setMenuOptions();
- mAllCollectionsModel->setSort(mSortAttribute);
- emit sortOrderChanged(mSortAttribute);
- HSMENUTEST_FUNC_EXIT("HsAllCollectionsState::descendingMenuAction");
-}
-
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsapplibrarystate.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsapplibrarystate.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -14,18 +14,11 @@
* Description: Menu Application Library state.
*
*/
-#include <hbmainwindow.h>
-#include <hbview.h>
-#include <hbaction.h>
+
+#include <HbAction>
#include <HbToolBar>
-#include <HbIcon>
-#include <hbinstance.h>
-#include <hblistview.h>
-#include <hbsearchpanel.h>
#include <HbToolBarExtension>
#include <HbStyleLoader>
-#include <hsmenueventtransition.h>
-
#include "hstest_global.h"
#include "hsapplibrarystate.h"
@@ -34,7 +27,7 @@
#include "hscollectionstate.h"
#include "hsinstalledappsstate.h"
#include "hsoperatorhandler.h"
-#include "hsmenuview.h"
+#include "hsmenueventtransition.h"
#include "hsmenumodetransition.h"
@@ -180,11 +173,6 @@
constructToolbar();
- connect(mAllCollectionsState, SIGNAL(sortOrderChanged(HsSortAttribute)),
- mAllAppsState, SLOT(collectionsSortOrder(HsSortAttribute)));
- connect(mAllCollectionsState, SIGNAL(sortOrderChanged(HsSortAttribute)),
- mCollectionState, SLOT(collectionsSortOrder(HsSortAttribute)));
-
connect(mAllAppsState, SIGNAL(entered()),
this, SLOT(allAppsStateEntered()));
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsbaseviewstate.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsbaseviewstate.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -15,38 +15,91 @@
*
*/
-#include <hbmessagebox.h>
+#include <QStateMachine>
+#include <HbMessageBox>
#include <HbParameterLengthLimiter>
-#include <hbaction.h>
+#include <HbAction>
+#include <HbMenu>
+#include <HbAbstractViewItem>
+#include <HbView>
+#include <HbListView>
+
#include <canotifier.h>
#include "hsbaseviewstate.h"
+#include "hsmenueventfactory.h"
+#include "hsmenudialogfactory.h"
+#include "hsmenuitemmodel.h"
+#include "hsmenumodetransition.h"
+#include "hsmainwindow.h"
+
/*!
Constructor.
+ \param mainWindow main window wrapper object.
+ \param parent Owner.
*/
-HsBaseViewState::HsBaseViewState(
+HsBaseViewState::HsBaseViewState(HsMainWindow &mainWindow, QState *parent):
+ QState(parent),
+ mNotifier(0),
+ mMessageRelatedItemId(0),
+ mApplicationLaunchFailMessage(0),
+ mModel(0),
+ mContextMenu(0),
+ mContextModelIndex(),
+ mBackKeyAction(0),
+ mMenuView(0),
+ mMenuMode(0),
+ mMainWindow(mainWindow)
+{
+ mBackKeyAction = new HbAction(Hb::BackNaviAction, this);
+}
+
+/*!
+ Constructor.
+ \param mainWindow main window wrapper object.
+ \param menuMode menu mode object.
+ \param parent Owner.
+ */
+HsBaseViewState::HsBaseViewState(HsMainWindow &mainWindow,
+ HsMenuModeWrapper& menuMode,
QState *parent):
QState(parent),
mNotifier(0),
mMessageRelatedItemId(0),
- mApplicationLaunchFailMessage(0)
+ mApplicationLaunchFailMessage(0),
+ mModel(0),
+ mContextMenu(0),
+ mContextModelIndex(),
+ mBackKeyAction(0),
+ mMenuView(0),
+ mMenuMode(&menuMode),
+ mMainWindow(mainWindow)
{
- construct();
+ mBackKeyAction = new HbAction(Hb::BackNaviAction, this);
}
+/*!
+ Initialize contained objects.
+ \param menuViewBuilder object providing widgets for menu view.
+ \param viewContext state context of the view the builder is to provide widgets for.
+ */
+void HsBaseViewState::initialize(HsMenuViewBuilder &menuViewBuilder,
+ HsViewContext viewContext)
+{
+ mMenuView.reset(new HsMenuView(menuViewBuilder, viewContext));
+ mMenuView->view()->setNavigationAction(mBackKeyAction);
-/*!
- Constructs contained objects.
- */
-void HsBaseViewState::construct()
-{
+ connect(this, SIGNAL(entered()),SLOT(stateEntered()));
+ connect(this, SIGNAL(exited()),SLOT(stateExited()));
}
/*!
Creates and open application launch fail message.
\param errorCode eroor code to display.
+ \param itemId id of the launched item.
*/
-void HsBaseViewState::createApplicationLaunchFailMessage(int errorCode,int itemId)
+void HsBaseViewState::createApplicationLaunchFailMessage(int errorCode,
+ int itemId)
{
QString message;
message.append(
@@ -56,15 +109,7 @@
mMessageRelatedItemId = itemId;
// create and show message box
- mApplicationLaunchFailMessage = new HbMessageBox(HbMessageBox::MessageTypeInformation);
- mApplicationLaunchFailMessage->setAttribute(Qt::WA_DeleteOnClose);
-
- mApplicationLaunchFailMessage->setText(message);
-
- mApplicationLaunchFailMessage->clearActions();
- HbAction *mClosemAction = new HbAction(hbTrId("txt_common_button_close"),
- mApplicationLaunchFailMessage);
- mApplicationLaunchFailMessage->addAction(mClosemAction);
+ mApplicationLaunchFailMessage = HsMenuDialogFactory().create(message, HsMenuDialogFactory::Close);
mApplicationLaunchFailMessage->open(this, SLOT(applicationLaunchFailMessageFinished(HbAction*)));
@@ -115,19 +160,214 @@
cleanUpApplicationLaunchFailMessage();
}
+
+/*!
+ Slot invoked when a state is entered.
+ */
+void HsBaseViewState::stateEntered()
+{
+ qDebug("HsBaseViewState::stateEntered()");
+ HSMENUTEST_FUNC_ENTRY("HsBaseViewState::stateEntered");
+
+ mMainWindow.setCurrentView(*mMenuView);
+ mMenuView->activate();
+
+ HSMENUTEST_FUNC_EXIT("HsBaseViewState::stateEntered");
+}
+
/*!
Slot invoked when a state is exited.
*/
void HsBaseViewState::stateExited()
{
HSMENUTEST_FUNC_ENTRY("HsBaseViewState::stateExited");
+ mMenuView->setSearchPanelVisible(false);
+ mMenuView->disconnect(this);
+ mMenuView->view()->setMenu(NULL);
+ mMenuView->inactivate();
cleanUpApplicationLaunchFailMessage();
+ if (mContextMenu){
+ mContextMenu->close();
+ }
HSMENUTEST_FUNC_EXIT("HsBaseViewState::stateExited");
}
/*!
+ Add mode entered.
+ */
+void HsBaseViewState::addModeEntered()
+{
+ connect(mMenuView.data(),
+ SIGNAL(activated(QModelIndex)),
+ SLOT(addActivated(QModelIndex)));
+ connect(mMenuView.data(),
+ SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
+ SLOT(addLongPressed(HbAbstractViewItem *, QPointF)));
+}
+
+/*!
+ Slot invoked when add mode entered.
+ */
+void HsBaseViewState::normalModeEntered()
+{
+ setMenuOptions();
+ connect(mMenuView.data(),
+ SIGNAL(activated(QModelIndex)),
+ mMenuView.data(),
+ SLOT(hideSearchPanel()));
+ connect(mMenuView.data(),
+ SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
+ SLOT(showContextMenu(HbAbstractViewItem *, QPointF)));
+}
+
+/*!
Destructor.
*/
HsBaseViewState::~HsBaseViewState()
{
+ mMenuView->setModel(NULL);
+ delete mModel;
}
+
+/*!
+ Slot connected to List widget in normal mode.
+ \param index Model index of the activated item.
+ */
+void HsBaseViewState::launchItem(const QModelIndex &index)
+{
+ HSMENUTEST_FUNC_ENTRY("HsBaseViewState::launchItem");
+
+ QSharedPointer<const CaEntry> entry = mModel->entry(index);
+
+ if (entry->entryTypeName() == widgetTypeName()) {
+ EntryFlags flags = index.data(CaItemModel::FlagsRole).value<
+ EntryFlags> ();
+ if (!(flags & UninstallEntryFlag)) {
+ machine()->postEvent(
+ HsMenuEventFactory::createPreviewHSWidgetEvent(
+ entry->id(), entry->entryTypeName(), entry->attribute(
+ widgetUriAttributeName()), entry->attribute(
+ widgetLibraryAttributeName())));
+
+ const int itemId = index.data(CaItemModel::IdRole).toInt();
+ HsMenuService::touch(itemId);
+ }
+ } else {
+ QVariant data = mModel->data(index, CaItemModel::IdRole);
+ int errCode = HsMenuService::executeAction(data.toInt());
+ if (errCode != 0) {
+ createApplicationLaunchFailMessage(errCode,index.data(CaItemModel::IdRole).toInt());
+ }
+ }
+
+ HSMENUTEST_FUNC_EXIT("HsBaseViewState::launchItem");
+}
+
+/*!
+ Slot connected to List widget in normal mode.
+ \param index Model index of the activated item.
+ */
+void HsBaseViewState::openCollection(const QModelIndex &index)
+{
+ HSMENUTEST_FUNC_ENTRY("HsBaseViewState::openCollection");
+ QVariant data = mModel->data(index, CaItemModel::IdRole);
+ int id = data.toInt();
+ QString collectionType =
+ mModel->data(index, CaItemModel::TypeRole).toString();
+ qDebug("HsBaseViewState::openCollection - MCS ID: %d",
+ data.toInt());
+
+ machine()->postEvent(HsMenuEventFactory::createOpenCollectionFromAppLibraryEvent(id,
+ collectionType));
+ HSMENUTEST_FUNC_EXIT("HsBaseViewState::openCollection");
+}
+
+/*!
+ Slot connected to List widget in normal mode.
+ \param index Model index of the activated item.
+ */
+void HsBaseViewState::showContextMenu(HbAbstractViewItem *item, const QPointF &coords)
+{
+
+ HSMENUTEST_FUNC_ENTRY("HsBaseViewState::showContextMenu");
+
+ EntryFlags flags = item->modelIndex().data(
+ CaItemModel::FlagsRole).value<EntryFlags> ();
+
+ if (!(flags & UninstallEntryFlag)) {
+ mContextMenu = new HbMenu;
+ setContextMenuOptions(item,flags);
+ mContextModelIndex = item->modelIndex();
+ mContextMenu->setPreferredPos(coords);
+ mContextMenu->setAttribute(Qt::WA_DeleteOnClose);
+ mContextMenu->open(this, SLOT(contextMenuAction(HbAction*)));
+ }
+ HSMENUTEST_FUNC_EXIT("HsBaseViewState::showContextMenu");
+
+}
+
+/*!
+ Open task switcher.
+ \retval true if operation is successful.
+ */
+bool HsBaseViewState::openTaskSwitcher()
+{
+ return HsMenuService::launchTaskSwitcher();
+}
+
+/*!
+ Menu softkey back action slot
+ */
+void HsBaseViewState::openAppLibrary()
+{
+ machine()->postEvent(HsMenuEventFactory::createOpenAppLibraryEvent());
+}
+
+/*!
+ Check software updates.
+ \retval 0 if operation is successful.
+ */
+int HsBaseViewState::checkSoftwareUpdates()
+{
+ int errCode = HsMenuService::launchSoftwareUpdate();
+ if (errCode != 0){
+ createApplicationLaunchFailMessage(errCode,0);
+ }
+ return errCode;
+}
+/*!
+ Scrolls view to first item at top
+ */
+void HsBaseViewState::scrollToBeginning()
+{
+ mMenuView->listView()->scrollTo(
+ mModel->index(0), HbAbstractItemView::PositionAtTop);
+}
+
+/*!
+ Normal mode exited dummy implementation.
+ */
+void HsBaseViewState::normalModeExited()
+{
+}
+
+/*!
+ Defines transitions
+ */
+void HsBaseViewState::defineTransitions()
+{
+ QState *initialState = new QState(this);
+ setInitialState(initialState);
+
+ QState *addModeState = new QState(this);
+ connect(addModeState, SIGNAL(entered()),SLOT(addModeEntered()));
+
+ QState *normalModeState = new QState(this);
+ connect(normalModeState, SIGNAL(entered()),SLOT(normalModeEntered()));
+ connect(normalModeState, SIGNAL(exited()),SLOT(normalModeExited()));
+
+ initialState->addTransition(new HsMenuModeTransition(
+ *mMenuMode, NormalHsMenuMode, normalModeState));
+ initialState->addTransition(new HsMenuModeTransition(
+ *mMenuMode, AddHsMenuMode, addModeState));
+}
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hscollectionstate.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hscollectionstate.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -15,30 +15,26 @@
*
*/
-#include <qstatemachine.h>
-
+#include <QStateMachine>
+#include <HbAction>
+#include <HbView>
#include <HbGroupBox>
#include <HbListView>
#include <HbPushButton>
-#include <hbview.h>
-#include <hbaction.h>
-#include <hbabstractviewitem.h>
-#include <hsmenueventfactory.h>
-#include <hbmenu.h>
-#include <hbinstance.h>
-#include <hbsearchpanel.h>
+#include <HbAbstractViewItem>
+#include <HbMenu>
+#include <cadefs.h>
+#include <caentry.h>
+
+#include "hsapp_defs.h"
#include "hsmenuevent.h"
+#include "hsmenueventfactory.h"
#include "hsmenuservice.h"
#include "hsmenumodewrapper.h"
#include "hsmenuitemmodel.h"
-#include "hsmenuviewbuilder.h"
-#include "cadefs.h"
-#include "caentry.h"
#include "hscollectionstate.h"
#include "hsaddappstocollectionstate.h"
-#include "hsapp_defs.h"
-#include "hsmainwindow.h"
/*!
\class HsCollectionState
@@ -55,11 +51,6 @@
*/
/*!
- \var HsCollectionState::mCollectionsSortAttribute
- All collections sort order.
- */
-
-/*!
\var HsCollectionState::mCollectionId
The id of the current collection.
*/
@@ -69,35 +60,6 @@
The type of the current collection.
*/
-/*!
- \var HsCollectionState::mMenuView
- The List View widget.
- */
-
-/*!
- \var HsCollectionState::mSecondarySoftkeyAction
- Secondary Softkey action.
- Backstepping functionality.
- Own.
- */
-
-/*!
- \var HsCollectionState::mOldNavigationAction
- Old navigation icon.
- Not own.
- */
-
-/*!
- \var HsCollectionState::mCollectionModel
- Item Model for the List.
- Own.
- */
-
-/*!
- \var HsCollectionState::mOptions
- Options menu.
- Own.
- */
/*!
\fn void HsCollectionState::sortOrderChanged(SHsSortAttribute sortOrder);
@@ -114,24 +76,19 @@
/*!
Constructor.
\param menuViewBuilder Menu view builder.
- \param menuMode reference to object representing menu mode (add mode on/add mode off).
+ \param menuMode menu mode object (add mode on/add mode off).
+ \param mainWindow main window wrapper.
\param parent Owner.
*/
HsCollectionState::HsCollectionState(HsMenuViewBuilder &menuViewBuilder,
HsMenuModeWrapper &menuMode,
HsMainWindow &mainWindow,
QState *parent) :
- HsBaseViewState(parent),
+ HsBaseViewState(mainWindow, menuMode, parent),
mSortAttribute(LatestOnTopHsSortAttribute),
- mCollectionsSortAttribute(CustomHsSortAttribute),
- mCollectionId(-1),
- mMenuView(menuViewBuilder, HsCollectionContext),
- mMenuMode(menuMode),
- mSecondarySoftkeyAction(new HbAction(Hb::BackNaviAction, this)),
- mCollectionModel(0),
- mOptions(0), mContextModelIndex(), mContextMenu(0),
- mMainWindow(mainWindow)
+ mCollectionId(-1)
{
+ initialize(menuViewBuilder, HsCollectionContext);
construct();
}
@@ -146,12 +103,7 @@
parent() != 0 ? parent()->objectName() : QString("");
setObjectName(parentName + "/collectionstate");
- connect(this, SIGNAL(entered()),SLOT(stateEntered()));
- connect(this, SIGNAL(exited()),SLOT(stateExited()));
-
- mMenuView.collectionButton()->setCheckable(true);
- makeConnect();
- mMenuView.view()->setNavigationAction(mSecondarySoftkeyAction);
+ mMenuView->collectionButton()->setCheckable(true);
HSMENUTEST_FUNC_EXIT("HsCollectionState::construct");
}
@@ -161,11 +113,8 @@
*/
HsCollectionState::~HsCollectionState()
{
- makeDisconnect();
- mMenuView.inactivate();
- mMenuView.setModel(NULL);
- mMenuView.view()->setNavigationAction(NULL);
- delete mCollectionModel;
+ mMenuView->inactivate();
+ mMenuView->view()->setNavigationAction(NULL);
}
@@ -192,101 +141,114 @@
/*!
Slot invoked when a state is entered.
*/
-
-
void HsCollectionState::stateEntered()
{
HSMENUTEST_FUNC_ENTRY("HsCollectionState::stateEntered");
-
- mMainWindow.setCurrentView(mMenuView);
- mMenuView.activate();
-
- if (!mCollectionModel) {
- mCollectionModel =
+ HsBaseViewState::stateEntered();
+ makeConnect();
+ if (!mModel) {
+ mModel =
HsMenuService::getCollectionModel(
mCollectionId, mSortAttribute, mCollectionType);
}
-
+
EntryFlags flags =
- mCollectionModel->root().data(CaItemModel::FlagsRole).value<
+ mModel->root().data(CaItemModel::FlagsRole).value<
EntryFlags> ();
- if (mCollectionModel->rowCount() == 0){
+ if (mModel->rowCount() == 0){
if (flags & RemovableEntryFlag){
- mMenuView.setContext(HsCollectionContext,HsButtonContext);
+ mMenuView->setContext(HsCollectionContext,HsButtonContext);
} else {
- mMenuView.setContext(HsCollectionContext,HsEmptyLabelContext);
+ mMenuView->setContext(HsCollectionContext,HsEmptyLabelContext);
}
- mMenuView.disableSearch(true);
+ mMenuView->disableSearch(true);
} else {
- mMenuView.setContext(HsCollectionContext,HsItemViewContext);
- mMenuView.disableSearch(false);
+ mMenuView->setContext(HsCollectionContext,HsItemViewContext);
+ mMenuView->disableSearch(false);
}
- connect(mCollectionModel, SIGNAL(modelReset()), SLOT(updateLabel()));
- connect(mCollectionModel, SIGNAL(empty(bool)),this,
+ connect(mModel, SIGNAL(modelReset()), SLOT(updateLabel()));
+ connect(mModel, SIGNAL(empty(bool)),this,
SLOT(handleEmptyChange(bool)));
- connect(mCollectionModel, SIGNAL(empty(bool)),this,
+ connect(mModel, SIGNAL(empty(bool)),this,
SLOT(lockSearchButton(bool)));
- mMenuView.setModel(mCollectionModel);
+ mMenuView->setModel(mModel);
+
+ mMenuView->listView()->scrollTo(
+ mModel->index(0), HbAbstractItemView::PositionAtTop);
- mMenuView.listView()->scrollTo(
- mCollectionModel->index(0), HbAbstractItemView::PositionAtTop);
+ mMenuView->viewLabel()->setHeading(
+ mModel->root().data(Qt::DisplayRole).toString());
+ setMenuOptions();
+
+ HSMENUTEST_FUNC_EXIT("HsCollectionState::stateEntered");
+}
- mMenuView.viewLabel()->setHeading(
- mCollectionModel->root().data(Qt::DisplayRole).toString());
+/*!
+ Creates and installs menu options for the view
+ */
+void HsCollectionState::setMenuOptions()
+{
+ HSMENUTEST_FUNC_ENTRY("HsAllCollectionsState::setMenuOptions");
- if (!mOptions) {
- mOptions = new HbMenu();
- mOptions->addAction(hbTrId("txt_applib_opt_task_switcher"),
- this,
+ EntryFlags flags =
+ mModel->root().data(CaItemModel::FlagsRole).value<EntryFlags> ();
+
+ QScopedPointer<HbMenu> viewOptions(new HbMenu);
+
+ viewOptions->addAction(hbTrId("txt_applib_opt_task_switcher"),
+ static_cast<HsBaseViewState*>(this),
SLOT(openTaskSwitcher()));
- if (flags & RemovableEntryFlag) {
- mOptions->addAction(hbTrId("txt_applib_opt_add_content"), this,
- SLOT(addAppsAction()));
- }
-
- mOptions->addAction(hbTrId("txt_applib_opt_add_to_home_screen"),
- this, SLOT(addCollectionShortcutToHomeScreenAction()));
+ if (flags & RemovableEntryFlag) {
+ viewOptions->addAction(hbTrId("txt_applib_opt_add_content"), this,
+ SLOT(addAppsAction()));
+ }
- if (flags & RemovableEntryFlag) {
- mOptions->addAction(
- hbTrId("txt_common_opt_rename_item"),
+ viewOptions->addAction(hbTrId("txt_applib_opt_add_to_home_screen"),
+ this, SLOT(addCollectionShortcutToHomeScreenAction()));
+
+ if (flags & RemovableEntryFlag) {
+ if (mModel->rowCount() > 0) {
+ viewOptions->addAction(
+ hbTrId("txt_applib_opt_arrange"),
this,
- SLOT(renameAction()));
- mOptions->addAction(
- hbTrId("txt_common_opt_delete"),
- this,
- SLOT(deleteAction()));
+ SLOT(createArrangeCollection()));
}
- if (mCollectionType == collectionDownloadedTypeName()) {
- HbMenu *sortMenu = mOptions->addMenu(
- hbTrId("txt_applib_opt_sort_by"));
- //Grouped options are exclusive by default.
- QActionGroup *sortGroup = new QActionGroup(mOptions);
- sortGroup->addAction(
- sortMenu->addAction(
- hbTrId("txt_applib_opt_sort_by_sub_latest_on_top"),
- this,
- SLOT(latestOnTopMenuAction())));
- sortGroup->addAction(
- sortMenu->addAction(
- hbTrId("txt_applib_opt_sort_by_sub_oldest_on_top"),
- this,
- SLOT(oldestOnTopMenuAction())));
- foreach(QAction *action, sortMenu->actions()) {
- action->setCheckable(true);
- }
- static const int defaultSortingPosition = 0;
- sortGroup->actions().at(defaultSortingPosition)->setChecked(true);
+ viewOptions->addAction(
+ hbTrId("txt_common_opt_rename_item"),
+ this,
+ SLOT(renameAction()));
+ viewOptions->addAction(
+ hbTrId("txt_common_opt_delete"),
+ this,
+ SLOT(deleteAction()));
+ }
+ if (mCollectionType == collectionDownloadedTypeName()) {
+ HbMenu *sortMenu = viewOptions->addMenu(
+ hbTrId("txt_applib_opt_sort_by"));
+ //Grouped options are exclusive by default.
+ QActionGroup *sortGroup = new QActionGroup(viewOptions.data());
+ sortGroup->addAction(
+ sortMenu->addAction(
+ hbTrId("txt_applib_opt_sort_by_sub_latest_on_top"),
+ this,
+ SLOT(latestOnTopMenuAction())));
+ sortGroup->addAction(
+ sortMenu->addAction(
+ hbTrId("txt_applib_opt_sort_by_sub_oldest_on_top"),
+ this,
+ SLOT(oldestOnTopMenuAction())));
+ foreach(QAction *action, sortMenu->actions()) {
+ action->setCheckable(true);
}
-
- mOptions->setParent(this);
- mMenuView.view()->setMenu(mOptions);
+ static const int defaultSortingPosition = 0;
+ sortGroup->actions().at(defaultSortingPosition)->setChecked(true);
}
- HSMENUTEST_FUNC_EXIT("HsCollectionState::stateEntered");
+ mMenuView->view()->setMenu(viewOptions.take());
+ HSMENUTEST_FUNC_EXIT("HsAllCollectionsState::setMenuOptions");
}
/*!
@@ -295,29 +257,22 @@
void HsCollectionState::stateExited()
{
HSMENUTEST_FUNC_ENTRY("HsCollectionState::stateExited");
-
- mMenuView.inactivate();
- mMenuView.setSearchPanelVisible(false);
- mMenuView.disableSearch(false);
- disconnect(mCollectionModel, SIGNAL(empty(bool)),this,
+ makeDisconnect();
+ mMenuView->disableSearch(false);
+ disconnect(mModel, SIGNAL(empty(bool)),this,
SLOT(handleEmptyChange(bool)));
- disconnect(mCollectionModel, SIGNAL(empty(bool)),this,
+ disconnect(mModel, SIGNAL(empty(bool)),this,
SLOT(lockSearchButton(bool)));
- disconnect(mCollectionModel, SIGNAL(modelReset()),
+ disconnect(mModel, SIGNAL(modelReset()),
this, SLOT(updateLabel()));
- delete mCollectionModel;
- mCollectionModel = NULL;
- mOptions->close();
- delete mOptions;
- mOptions = NULL;
- if (mContextMenu)
- mContextMenu->close();
+ delete mModel;
+ mModel = NULL;
this->mSortAttribute = NoHsSortAttribute;
-
+
HsBaseViewState::stateExited();
-
+
HSMENUTEST_FUNC_EXIT("HsCollectionState::stateExited");
qDebug("CollectionState::stateExited()");
}
@@ -327,15 +282,21 @@
*/
void HsCollectionState::makeConnect()
{
- connect(mSecondarySoftkeyAction, SIGNAL(triggered()),
- SLOT(backSteppingAction()));
- connect(&mMenuView,
+ connect(mBackKeyAction, SIGNAL(triggered()),
+ static_cast<HsBaseViewState*>(this), SLOT(openAppLibrary()));
+ connect(mMenuView.data(),
+ SIGNAL(activated(QModelIndex)),
+ static_cast<HsBaseViewState*>(this),
+ SLOT(launchItem(QModelIndex)));
+ connect(mMenuView.data(),
SIGNAL(activated(QModelIndex)),
- SLOT(listItemActivated(QModelIndex)));
- connect(&mMenuView,
+ mMenuView.data(),
+ SLOT(hideSearchPanel()));
+ connect(mMenuView.data(),
SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
- SLOT(listItemLongPressed(HbAbstractViewItem *, QPointF)));
- connect(mMenuView.collectionButton(),
+ static_cast<HsBaseViewState*>(this),
+ SLOT(showContextMenu(HbAbstractViewItem *, QPointF)));
+ connect(mMenuView->collectionButton(),
SIGNAL(toggled(bool)), this, SLOT(addAppsAction(bool)));
}
@@ -344,130 +305,24 @@
*/
void HsCollectionState::makeDisconnect()
{
- disconnect(mMenuView.collectionButton(),
+ disconnect(mMenuView->collectionButton(),
SIGNAL(toggled(bool)), this, SLOT(addAppsAction(bool)));
- disconnect(mSecondarySoftkeyAction, SIGNAL(triggered()),
- this, SLOT(backSteppingAction()));
-
- disconnect(&mMenuView,
- SIGNAL(activated(QModelIndex)),
- this, SLOT(listItemActivated(QModelIndex)));
-
- disconnect(&mMenuView,
- SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
- this, SLOT(listItemLongPressed(HbAbstractViewItem *, QPointF)));
-}
-
-/*!
- Open task switcher.
- \retval true if operation is successful.
- */
-bool HsCollectionState::openTaskSwitcher()
-{
- return HsMenuService::launchTaskSwitcher();
-}
-
-/*!
- Slot connected to List widget.
- \param index Model index of the activated item.
- */
-void HsCollectionState::listItemActivated(const QModelIndex &index)
-{
- HSMENUTEST_FUNC_ENTRY("HsCollectionState::listItemActivated");
-
- QSharedPointer<const CaEntry> entry = mCollectionModel->entry(index);
-
- if (entry->entryTypeName() == widgetTypeName()) {
- EntryFlags flags = index.data(CaItemModel::FlagsRole).value<
- EntryFlags> ();
- if (!(flags & UninstallEntryFlag)) {
- machine()->postEvent(
- HsMenuEventFactory::createPreviewHSWidgetEvent(
- entry->id(), entry->entryTypeName(), entry->attribute(
- widgetUriAttributeName()), entry->attribute(
- widgetLibraryAttributeName())));
-
- const int itemId = index.data(CaItemModel::IdRole).toInt();
- HsMenuService::touch(itemId);
- }
- } else {
- QVariant data = mCollectionModel->data(index, CaItemModel::IdRole);
- int errCode = HsMenuService::executeAction(data.toInt());
- if (errCode != 0) {
- createApplicationLaunchFailMessage(errCode,index.data(CaItemModel::IdRole).toInt());
- }
- }
-
- mMenuView.setSearchPanelVisible(false);
- HSMENUTEST_FUNC_EXIT("HsCollectionState::listItemActivated");
-}
+ disconnect(mBackKeyAction, SIGNAL(triggered()),
+ static_cast<HsBaseViewState*>(this), SLOT(openAppLibrary()));
-/*!
- Handles long-item-pressed event in all apps view by showing context menu
- \param item the event pertains to
- \param coords press point coordinates.
- \retval void
- */
-void HsCollectionState::listItemLongPressed(HbAbstractViewItem *item,
- const QPointF &coords)
-{
- HSMENUTEST_FUNC_ENTRY("HsCollectionState::listItemLongPressed");
-
- EntryFlags flags = item->modelIndex().data(CaItemModel::FlagsRole).value<
- EntryFlags> ();
-
- if (!(flags & UninstallEntryFlag)) {
- // create context menu
- mContextMenu = new HbMenu();
-
- HbAction *addShortcutAction = mContextMenu->addAction(hbTrId(
- "txt_applib_menu_add_to_home_screen"));
- addShortcutAction->setData(AddToHomeScreenContextAction);
- HbAction *addToCollection = mContextMenu->addAction(hbTrId(
- "txt_applib_menu_add_to_collection"));
- addToCollection->setData(AddToCollectionContextAction);
- HbAction *removeAction(NULL);
- HbAction *uninstallAction(NULL);
- HbAction *appSettingsAction(NULL);
- HbAction *appDetailsAction(NULL);
- // we do not add remove option in locked collection
- // check conditions and hide irrelevant menu items
- EntryFlags rootFlags =
- mCollectionModel->root().data(CaItemModel::FlagsRole).value<
- EntryFlags> ();
-
- if (rootFlags & RemovableEntryFlag) {
- removeAction = mContextMenu->addAction(
- hbTrId("txt_applib_menu_remove_from_collection"));
- removeAction->setData(RemoveFromCollectionContextAction);
- }
-
- if ((flags & RemovableEntryFlag)) {
- uninstallAction = mContextMenu->addAction(hbTrId("txt_common_menu_delete"));
- uninstallAction->setData(UninstallContextAction);
- }
- QSharedPointer<const CaEntry> entry = mCollectionModel->entry(item->modelIndex());
-
- if (!(entry->attribute(appSettingsPlugin()).isEmpty())) {
- appSettingsAction = mContextMenu->addAction(hbTrId(
- "txt_common_menu_settings"));
- appSettingsAction->setData(AppSettingContextAction);
- }
-
- if (!(entry->attribute(componentIdAttributeName()).isEmpty()) &&
- (flags & RemovableEntryFlag) ) {
- appDetailsAction = mContextMenu->addAction(hbTrId(
- "txt_common_menu_details"));
- appDetailsAction->setData(AppDetailsContextAction);
- }
- mContextModelIndex = item->modelIndex();
- mContextMenu->setPreferredPos(coords);
- mContextMenu->setAttribute(Qt::WA_DeleteOnClose);
- mContextMenu->open(this, SLOT(contextMenuAction(HbAction*)));
- }
-
- HSMENUTEST_FUNC_EXIT("HsCollectionState::listItemLongPressed");
+ disconnect(mMenuView.data(),
+ SIGNAL(activated(QModelIndex)),
+ static_cast<HsBaseViewState*>(this),
+ SLOT(launchItem(QModelIndex)));
+ disconnect(mMenuView.data(),
+ SIGNAL(activated(QModelIndex)),
+ mMenuView.data(),
+ SLOT(hideSearchPanel()));
+ disconnect(mMenuView.data(),
+ SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
+ static_cast<HsBaseViewState*>(this),
+ SLOT(showContextMenu(HbAbstractViewItem *, QPointF)));
}
/*!
@@ -475,7 +330,7 @@
*/
void HsCollectionState::contextMenuAction(HbAction *action)
{
- HsContextAction command =
+ HsContextAction command =
static_cast<HsContextAction>(action->data().toInt());
const int itemId = mContextModelIndex.data(CaItemModel::IdRole).toInt();
@@ -486,8 +341,8 @@
break;
case AddToCollectionContextAction:
machine()->postEvent(
- HsMenuEventFactory::createAddAppsFromCallectionViewEvent(
- mCollectionId, itemId, mCollectionsSortAttribute));
+ HsMenuEventFactory::createAddAppsFromCollectionViewEvent(
+ mCollectionId, itemId));
break;
case UninstallContextAction:
machine()->postEvent(
@@ -499,66 +354,68 @@
HsMenuEventFactory::createRemoveAppFromCollectionEvent(
itemId, mCollectionId));
break;
- case AppSettingContextAction:
+ case AppSettingContextAction:
machine()->postEvent(
HsMenuEventFactory::createAppSettingsViewEvent(itemId));
break;
- case AppDetailsContextAction:
+ case AppDetailsContextAction:
machine()->postEvent(
HsMenuEventFactory::createAppDetailsViewEvent(itemId));
- break;
+ break;
default:
break;
}
-
- mMenuView.setSearchPanelVisible(false);
+
+ mMenuView->setSearchPanelVisible(false);
}
/*!
Handles button visibility
- \param empty if true set empty text label or button to add entries to collection
+ \param empty if true set empty text label or button to add entries to collection.
*/
void HsCollectionState::handleEmptyChange(bool empty)
{
EntryFlags flags =
- mCollectionModel->root().data(CaItemModel::FlagsRole).value<
+ mModel->root().data(CaItemModel::FlagsRole).value<
EntryFlags> ();
if (empty){
if (flags & RemovableEntryFlag){
- mMenuView.setContext(HsCollectionContext,HsButtonContext);
+ mMenuView->setContext(HsCollectionContext,HsButtonContext);
} else {
- mMenuView.setContext(HsCollectionContext,HsEmptyLabelContext);
+ mMenuView->setContext(HsCollectionContext,HsEmptyLabelContext);
}
} else {
- mMenuView.setContext(HsCollectionContext,HsItemViewContext);
+ mMenuView->setContext(HsCollectionContext,HsItemViewContext);
}
+ setMenuOptions();
}
/*!
- Handles lock serch button
- \param lock if true lock search button
+ Handles lock search button
+ \param lock if true lock search button.
*/
void HsCollectionState::lockSearchButton(bool lock)
{
- mMenuView.disableSearch(lock);
+ mMenuView->disableSearch(lock);
}
/*!
Menu add applications action slot
- \param addApps if true create event for add enties to collection. Parametr use by toggled from HbPushButton
+ \param addApps if true create event for add enties to collection.
+ Parametr use by toggled from HbPushButton
*/
void HsCollectionState::addAppsAction(bool addApps)
{
// Add applications
if (addApps) {
- mMenuView.collectionButton()->setChecked(false);
+ mMenuView->collectionButton()->setChecked(false);
machine()->postEvent(
- HsMenuEventFactory::createAddAppsFromCallectionViewEvent(
+ HsMenuEventFactory::createAddAppsFromCollectionViewEvent(
mCollectionId));
- }
+ }
}
/*!
@@ -567,8 +424,8 @@
void HsCollectionState::addCollectionShortcutToHomeScreenAction()
{
machine()->postEvent(HsMenuEventFactory::createAddToHomeScreenEvent(
- mCollectionId, mMenuMode.getHsMenuMode(),
- mMenuMode.getHsToken()));
+ mCollectionId, mMenuMode->getHsMenuMode(),
+ mMenuMode->getHsToken()));
}
/*!
@@ -590,40 +447,79 @@
}
/*!
- Menu softkey back action slot
- */
-void HsCollectionState::backSteppingAction()
-{
- machine()->postEvent(HsMenuEventFactory::createOpenAppLibraryEvent());
-}
-
-/*!
Updates label
*/
void HsCollectionState::updateLabel()
{
HSMENUTEST_FUNC_ENTRY("HsCollectionState::updateLabel");
- if (mCollectionModel) {
- mMenuView.viewLabel()->setHeading(
- mCollectionModel->root().data(Qt::DisplayRole).toString());
+ if (mModel) {
+ mMenuView->viewLabel()->setHeading(
+ mModel->root().data(Qt::DisplayRole).toString());
}
HSMENUTEST_FUNC_EXIT("HsCollectionState::updateLabel");
}
/*!
Triggers event so that a state adding to Home Screen is reached
- \param index of an item to be added to homescreen
+ \param index of an item to be added to homescreen.
\retval void
*/
void HsCollectionState::addElementToHomeScreen(const QModelIndex &index)
{
- QSharedPointer<const CaEntry> entry = mCollectionModel->entry(index);
+ QSharedPointer<const CaEntry> entry = mModel->entry(index);
QMap<QString, QString> attributes = entry->attributes();
machine()->postEvent(
HsMenuEventFactory::createAddToHomeScreenEvent(
- entry->id(), mMenuMode.getHsMenuMode(), mMenuMode.getHsToken()));
+ entry->id(), mMenuMode->getHsMenuMode(), mMenuMode->getHsToken()));
+}
+
+/*!
+ Method seting context menu options.
+ */
+void HsCollectionState::setContextMenuOptions(HbAbstractViewItem *item, EntryFlags flags)
+{
+ HbAction *addShortcutAction = mContextMenu->addAction(hbTrId(
+ "txt_applib_menu_add_to_home_screen"));
+ addShortcutAction->setData(AddToHomeScreenContextAction);
+ HbAction *addToCollection = mContextMenu->addAction(hbTrId(
+ "txt_applib_menu_add_to_collection"));
+ addToCollection->setData(AddToCollectionContextAction);
+ HbAction *removeAction(NULL);
+ HbAction *uninstallAction(NULL);
+ HbAction *appSettingsAction(NULL);
+ HbAction *appDetailsAction(NULL);
+ // we do not add remove option in locked collection
+ // check conditions and hide irrelevant menu items
+ EntryFlags rootFlags =
+ mModel->root().data(CaItemModel::FlagsRole).value<
+ EntryFlags> ();
+
+ if (rootFlags & RemovableEntryFlag) {
+ removeAction = mContextMenu->addAction(
+ hbTrId("txt_applib_menu_remove_from_collection"));
+ removeAction->setData(RemoveFromCollectionContextAction);
+ }
+
+ if ((flags & RemovableEntryFlag)) {
+ uninstallAction = mContextMenu->addAction(hbTrId("txt_common_menu_delete"));
+ uninstallAction->setData(UninstallContextAction);
+ }
+ QSharedPointer<const CaEntry> entry = mModel->entry(item->modelIndex());
+
+ if (!(entry->attribute(appSettingsPlugin()).isEmpty())) {
+ appSettingsAction = mContextMenu->addAction(hbTrId(
+ "txt_common_menu_settings"));
+ appSettingsAction->setData(AppSettingContextAction);
+ }
+
+ if (!(entry->attribute(componentIdAttributeName()).isEmpty()) &&
+ (flags & RemovableEntryFlag) ) {
+ appDetailsAction = mContextMenu->addAction(hbTrId(
+ "txt_common_menu_details"));
+ appDetailsAction->setData(AppDetailsContextAction);
+ }
}
/*!
@@ -633,7 +529,7 @@
void HsCollectionState::latestOnTopMenuAction()
{
mSortAttribute = LatestOnTopHsSortAttribute;
- mCollectionModel->setSort(mSortAttribute);
+ mModel->setSort(mSortAttribute);
emit sortOrderChanged(mSortAttribute);
}
@@ -644,16 +540,29 @@
void HsCollectionState::oldestOnTopMenuAction()
{
mSortAttribute = OldestOnTopHsSortAttribute;
- mCollectionModel->setSort(mSortAttribute);
+ mModel->setSort(mSortAttribute);
emit sortOrderChanged(mSortAttribute);
}
/*!
- Slot for setting all collections sort order
- \param sortOrder all collections sort order
+ A Slot called when an arrange operation
+ is invoked for a static collection.
*/
-void HsCollectionState::collectionsSortOrder(
- HsSortAttribute sortOrder)
+void HsCollectionState::createArrangeCollection()
{
- mCollectionsSortAttribute = sortOrder;
+ // Arrange collection via the Arrange view
+ int topItemId(0);
+
+ const QList<HbAbstractViewItem *> array =
+ mMenuView->listView()->visibleItems();
+
+ if (array.count() >= 1) {
+ QModelIndex idx = array[0]->modelIndex();
+ topItemId = idx.data(CaItemModel::IdRole).toInt();
+ }
+
+ machine()->postEvent(
+ HsMenuEventFactory::createArrangeCollectionEvent(
+ topItemId,
+ mCollectionId));
}
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsinstalledappsstate.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsinstalledappsstate.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -15,26 +15,23 @@
*
*/
-#include <qstatemachine.h>
+#include <QStateMachine>
+#include <HbView>
#include <HbGroupBox>
-#include <hbview.h>
-#include <hblistview.h>
-#include <hbaction.h>
-#include <hbmenu.h>
-#include <hbabstractviewitem.h>
-#include <hsmenueventfactory.h>
-#include <hbinstance.h>
+#include <HbListView>
+#include <HbAction>
+#include <HbMenu>
+#include <HbAbstractViewItem>
+
+#include <cadefs.h>
#include <caentry.h>
-#include <hbsearchpanel.h>
+#include "hsapp_defs.h"
+#include "hsmenueventfactory.h"
#include "hsmenuitemmodel.h"
-#include "hsmenuviewbuilder.h"
-#include "cadefs.h"
#include "hsinstalledappsstate.h"
#include "hsaddappstocollectionstate.h"
-#include "hsapp_defs.h"
#include "hsmenumodetransition.h"
-#include "hsmainwindow.h"
/*!
\class HsInstalledAppsState
@@ -46,45 +43,17 @@
*/
/*!
- \var HsInstalledAppsState::mMenuView
- The View widget.
- Own.
- */
-
-/*!
- \var HsInstalledAppsState::mInstalledAppsModel
- Item Model for the List.
- Own.
- */
-
-/*!
- \var HsInstalledAppsState::mSecondarySoftkeyAction
- Secondary Softkey action.
- Backstepping functionality.
- Own.
- */
-
-/*!
- \var HsInstalledAppsState::mOldNavigationAction
- Old navigation icon.
- Not own.
- */
-
-/*!
Constructor.
\param menuViewBuilder Menu view builder.
+ \param mainWindow main window wrapper.
\param parent Owner.
*/
HsInstalledAppsState::HsInstalledAppsState(HsMenuViewBuilder &menuViewBuilder,
HsMainWindow &mainWindow,
QState *parent):
- HsBaseViewState(parent),
- mMenuView(menuViewBuilder, HsInstalledAppsContext),
- mInstalledAppsModel(0),
- mSecondarySoftkeyAction(new HbAction(Hb::BackNaviAction, this)),
- mMainWindow(mainWindow),
- mContextModelIndex(),mContextMenu(0)
+ HsBaseViewState(mainWindow, parent)
{
+ initialize(menuViewBuilder, HsInstalledAppsContext);
construct();
}
@@ -98,16 +67,8 @@
const QString parentName =
parent() != 0 ? parent()->objectName() : QString("");
setObjectName(parentName + "/installedappsstate");
- connect(this, SIGNAL(entered()),SLOT(stateEntered()));
- connect(this, SIGNAL(exited()),SLOT(stateExited()));
- connect(mSecondarySoftkeyAction, SIGNAL(triggered()),
- SLOT(backAction()));
- mMenuView.view()->
- setNavigationAction(mSecondarySoftkeyAction);
-
-
- setMenuOptions();
+ connect(mBackKeyAction, SIGNAL(triggered()), SLOT(openAppLibrary()));
HSMENUTEST_FUNC_EXIT("HsInstalledAppsState::construct");
}
@@ -123,21 +84,43 @@
mOptions->addAction(hbTrId("txt_applib_opt_task_switcher"),
this, SLOT(openTaskSwitcher()));
+ mOptions->addAction(hbTrId("txt_applib_opt_installation_log"),
+ this, SLOT(openInstallationLog()));
- mMenuView.view()->setMenu(mOptions);
+ mMenuView->view()->setMenu(mOptions);
HSMENUTEST_FUNC_EXIT("HsInstalledAppsState::setMenuOptions");
}
/*!
+ Method seting context menu options.
+ \param item the context menu is built for.
+ \param flags of the \item.
+ */
+void HsInstalledAppsState::setContextMenuOptions(HbAbstractViewItem *item, EntryFlags flags)
+{
+ HbAction *uninstallAction = mContextMenu->addAction(
+ hbTrId("txt_common_menu_delete"));
+ HbAction *appDetailsAction(NULL);
+ uninstallAction->setData(UninstallContextAction);
+
+ QSharedPointer<const CaEntry> entry = mModel->entry(item->modelIndex());
+
+ if (!(entry->attribute(componentIdAttributeName()).isEmpty()) &&
+ (flags & RemovableEntryFlag) ) {
+ appDetailsAction = mContextMenu->addAction(hbTrId(
+ "txt_common_menu_details"));
+ appDetailsAction->setData(AppDetailsContextAction);
+ }
+}
+
+
+/*!
Destructor.
*/
HsInstalledAppsState::~HsInstalledAppsState()
{
- mMenuView.inactivate();
- mMenuView.setModel(NULL);
- mMenuView.view()->setNavigationAction(NULL);
-
- delete mInstalledAppsModel;
+ mMenuView->inactivate();
+ mMenuView->view()->setNavigationAction(NULL);
}
/*!
@@ -149,30 +132,26 @@
qDebug("AllAppsState::stateEntered()");
HSMENUTEST_FUNC_ENTRY("HsInstalledAppsState::stateEntered");
- mMainWindow.setCurrentView(mMenuView);
- mMenuView.activate();
-
- if (!mInstalledAppsModel) {
- mInstalledAppsModel
+ HsBaseViewState::stateEntered();
+ setMenuOptions();
+ if (!mModel) {
+ mModel
= HsMenuService::getInstalledModel(AscendingNameHsSortAttribute);
- mMenuView.setModel(mInstalledAppsModel);
+ mMenuView->setModel(mModel);
}
- if (mInstalledAppsModel->rowCount() == 0){
- mMenuView.setContext(HsInstalledAppsContext,HsEmptyLabelContext);
+ if (mModel->rowCount() == 0){
+ mMenuView->setContext(HsInstalledAppsContext,HsEmptyLabelContext);
}
- mMenuView.listView()->scrollTo(
- mInstalledAppsModel->index(0));
+ mMenuView->listView()->scrollTo(
+ mModel->index(0));
- connect(&mMenuView,
- SIGNAL(activated(QModelIndex)),
- SLOT(listItemActivated(QModelIndex)));
- connect(&mMenuView,
+ connect(mMenuView.data(),
SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
- SLOT(listItemLongPressed(HbAbstractViewItem *, QPointF)));
+ SLOT(showContextMenu(HbAbstractViewItem *, QPointF)));
- connect(mInstalledAppsModel, SIGNAL(empty(bool)),this,
+ connect(mModel, SIGNAL(empty(bool)),this,
SLOT(setEmptyLabelVisibility(bool)));
HSMENUTEST_FUNC_EXIT("HsInstalledAppsState::stateEntered");
@@ -185,23 +164,13 @@
{
HSMENUTEST_FUNC_ENTRY("HsInstalledAppsState::stateExited");
- disconnect(mInstalledAppsModel, SIGNAL(empty(bool)),this,
+ disconnect(mModel, SIGNAL(empty(bool)),this,
SLOT(setEmptyLabelVisibility(bool)));
- mMenuView.setSearchPanelVisible(false);
-
- disconnect(&mMenuView,
- SIGNAL(activated(QModelIndex)), this,
- SLOT(listItemActivated(QModelIndex)));
- disconnect(&mMenuView,
+ disconnect(mMenuView.data(),
SIGNAL(longPressed(HbAbstractViewItem *, QPointF)), this,
- SLOT(listItemLongPressed(HbAbstractViewItem *, QPointF)));
-
- mMenuView.inactivate();
+ SLOT(showContextMenu(HbAbstractViewItem *, QPointF)));
- if (mContextMenu)
- mContextMenu->close();
-
HsBaseViewState::stateExited();
HSMENUTEST_FUNC_EXIT("HsInstalledAppsState::stateExited");
@@ -209,89 +178,30 @@
}
/*!
- Handles button visibility
+ Handles button visibility.
+ \param visibility indicates whether show or not to show 'empty' label.
*/
void HsInstalledAppsState::setEmptyLabelVisibility(bool visibility)
{
if(visibility){
- mMenuView.setContext(HsInstalledAppsContext,HsEmptyLabelContext);
+ mMenuView->setContext(HsInstalledAppsContext,HsEmptyLabelContext);
} else {
- mMenuView.setContext(HsInstalledAppsContext,HsItemViewContext);
+ mMenuView->setContext(HsInstalledAppsContext,HsItemViewContext);
}
}
/*!
- Open task switcher.
- \retval true if operation is successful.
+ Open installation log.
*/
-bool HsInstalledAppsState::openTaskSwitcher()
+void HsInstalledAppsState::openInstallationLog()
{
- return HsMenuService::launchTaskSwitcher();
+ machine()->postEvent(
+ HsMenuEventFactory::createInstallationLogEvent());
}
/*!
- Method invoked when a list item is activated.
- \param index indec of activated item.
- */
-#ifdef COVERAGE_MEASUREMENT
-#pragma CTC SKIP
-#endif //COVERAGE_MEASUREMENT
-void HsInstalledAppsState::listItemActivated(const QModelIndex &/*index*/)
-{
- //no implementation yet
-}
-#ifdef COVERAGE_MEASUREMENT
-#pragma CTC ENDSKIP
-#endif //COVERAGE_MEASUREMENT
-
-/*!
- Handles long-item-pressed event in all apps view by showing context menu
- \param item the event pertains to
- \param coords press point coordinates.
- */
-#ifdef COVERAGE_MEASUREMENT
-#pragma CTC SKIP
-#endif //COVERAGE_MEASUREMENT
-void HsInstalledAppsState::listItemLongPressed(HbAbstractViewItem *item,
- const QPointF &coords)
-{
- HSMENUTEST_FUNC_ENTRY("HsInstalledAppsState::listItemLongPressed");
-
- EntryFlags flags = item->modelIndex().data(
- CaItemModel::FlagsRole).value<EntryFlags> ();
- if (!(flags & UninstallEntryFlag)) {
- // create context menu
- mContextMenu = new HbMenu();
-
- HbAction *uninstallAction = mContextMenu->addAction(
- hbTrId("txt_common_menu_delete"));
- HbAction *appDetailsAction(NULL);
- uninstallAction->setData(UninstallContextAction);
-
- QSharedPointer<const CaEntry> entry = mInstalledAppsModel->entry(item->modelIndex());
-
- if (!(entry->attribute(componentIdAttributeName()).isEmpty()) &&
- (flags & RemovableEntryFlag) ) {
- appDetailsAction = mContextMenu->addAction(hbTrId(
- "txt_common_menu_details"));
- appDetailsAction->setData(AppDetailsContextAction);
- }
-
- mContextModelIndex = item->modelIndex();
- mContextMenu->setPreferredPos(coords);
- mContextMenu->setAttribute(Qt::WA_DeleteOnClose);
- mContextMenu->open(this, SLOT(contextMenuAction(HbAction*)));
- }
-
-
- HSMENUTEST_FUNC_EXIT("HsInstalledAppsState::listItemLongPressed");
-}
-#ifdef COVERAGE_MEASUREMENT
-#pragma CTC ENDSKIP
-#endif //COVERAGE_MEASUREMENT
-
-/*!
- Handles context menu actions
+ Handles context menu actions.
+ \param action to handle.
*/
void HsInstalledAppsState::contextMenuAction(HbAction *action)
{
@@ -313,19 +223,5 @@
default:
break;
}
- mMenuView.setSearchPanelVisible(false);
+ mMenuView->setSearchPanelVisible(false);
}
-
-/*!
- Slot invoked when a back action is triggered.
- */
-#ifdef COVERAGE_MEASUREMENT
-#pragma CTC SKIP
-#endif //COVERAGE_MEASUREMENT
-void HsInstalledAppsState::backAction()
-{
- machine()->postEvent(HsMenuEventFactory::createOpenAppLibraryEvent());
-}
-#ifdef COVERAGE_MEASUREMENT
-#pragma CTC ENDSKIP
-#endif //COVERAGE_MEASUREMENT
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hslistviewitem.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hslistviewitem.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -62,17 +62,23 @@
if (!progress) {
progress = new HbProgressBar(this);
progress->setRange(0, 100);
+ HbEffect::disable(progress);
repolish();
}
int progresVal = modelIndex().data(
CaItemModel::UninstalRole).toInt();
progress->setProgressValue(progresVal);
HbStyle::setItemName(progress, "progress");
+ if (!progress->isVisible()) {
+ progress->setVisible(!progress->isVisible());
+ repolish();
+ }
} else if (progress) {
HbStyle::setItemName(progress, "");
- delete progress;
- progress = 0;
- repolish();
+ if (progress->isVisible()) {
+ progress->setVisible(!progress->isVisible());
+ repolish();
+ }
}
// hide text-2 if we have to
foreach (QGraphicsItem * item, this->childItems()) {
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsmainwindow.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsmainwindow.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -21,11 +21,11 @@
#include "hsmainwindow.h"
#include "hsmenuview.h"
-#include <qservicemanager.h>
+
/*!
Constructor
*/
-QTM_USE_NAMESPACE
+
/*
@@ -36,7 +36,7 @@
*/
-HsMainWindow::HsMainWindow() : mActivityClient(NULL)
+HsMainWindow::HsMainWindow()
{
}
@@ -55,9 +55,6 @@
{
HbMainWindow *const hbW(
HbInstance::instance()->allMainWindows().value(0));
-
- connect( hbW, SIGNAL(viewReady()), SIGNAL(viewIsReady()),
- Qt::UniqueConnection );
HbView *const view = menuView.view();
@@ -66,53 +63,3 @@
}
hbW->setCurrentView(view);
}
-
-
-/*!
- Grabs screenshot from actual main window
- \retval QPixmap& containing screenshot
-*/
-QPixmap HsMainWindow::grabScreenshot()
- {
- HbMainWindow *const hbW(
- HbInstance::instance()->allMainWindows().value(0));
- return QPixmap::grabWidget(hbW, hbW->rect());
- }
-
-/*!
- Saves applib activity with current view screenshot
-*/
-void HsMainWindow::saveActivity()
-{
-#ifdef Q_OS_SYMBIAN
-
- if (!mActivityClient) {
- QServiceManager serviceManager;
- mActivityClient = serviceManager.loadInterface("com.nokia.qt.activities.ActivityClient");
- if (!mActivityClient) {
- qWarning("Cannot initialize critical com.nokia.qt.activities.ActivityClient service.");
- }
- }
-
- if (mActivityClient) {
- bool retok;
- bool ok = QMetaObject::invokeMethod(mActivityClient, "removeActivity",
- Q_RETURN_ARG(bool, retok), Q_ARG(QString, appLibActivity()));
- if (!ok) {
- qWarning("remove appLibActivity failed");
- }
-
- QVariant variant;
- QVariantHash metadata;
- metadata.insert("screenshot", grabScreenshot());
-
- ok = QMetaObject::invokeMethod(mActivityClient, "addActivity", Q_RETURN_ARG(bool, retok),
- Q_ARG(QString, appLibActivity() ), Q_ARG(QVariant, QVariant(variant)),
- Q_ARG(QVariantHash, metadata));
- if (!ok) {
- qWarning("add appLibActivity failed");
- }
- }
-#endif//Q_OS_SYMBIAN
-}
-
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsmenuview.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsmenuview.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -28,7 +28,7 @@
#include <HbToolBar>
#include <HbView>
#include <HbToolBarExtension>
-#include <HbStaticVkbHost>
+#include <HbShrinkingVkbHost>
#include "hsallappsstate.h"
#include "hsallcollectionsstate.h"
@@ -65,7 +65,7 @@
mListView(NULL),
mViewLabel(NULL),
mSearchListView(NULL),
- mSearchPanel(NULL),
+ mSearchPanel(NULL),
mVkbHost(NULL)
{
mBuilder.setOperationalContext(HsItemViewContext);
@@ -83,9 +83,7 @@
mProxyModel->setFilterKeyColumn(1);
mProxyModel->setSortRole(CaItemModel::TextRole);
- mVkbHost = new HbStaticVkbHost(mView);
- connect(mVkbHost, SIGNAL(keypadOpened()), this, SLOT(vkbOpened()));
- connect(mVkbHost, SIGNAL(keypadClosed()), this, SLOT(vkbClosed()));
+ mVkbHost.reset(new HbShrinkingVkbHost(mView));
connect(mListView,
SIGNAL(activated(QModelIndex)),
@@ -367,27 +365,17 @@
*/
void HsMenuView::findItem(QString criteriaStr)
{
- qDebug
- () << QString("hsmenuview::findItem: %1").arg(criteriaStr);
+ qDebug() << QString("hsmenuview::findItem: %1").arg(criteriaStr);
HSMENUTEST_FUNC_ENTRY("hsmenuview::findItem");
- if ("" != criteriaStr) {
- mProxyModel->invalidate();
- mProxyModel->setSourceModel(mListView->model());
- mProxyModel->setFilterRegExp(QRegExp(
- QString("(^|\\b)%1").arg(criteriaStr), Qt::CaseInsensitive));
- mSearchListView->scrollTo(mProxyModel->index(0,0),
- HbAbstractItemView::PositionAtTop);
- } else {
- mProxyModel->setFilterRegExp(QRegExp(QString(".*"),
- Qt::CaseInsensitive, QRegExp::RegExp));
+ mProxyModel->invalidate();
+ mProxyModel->setSourceModel(mListView->model());
+ mProxyModel->setFilterRegExp(QRegExp(
+ QString("(^|\\b)%1").arg(criteriaStr), Qt::CaseInsensitive));
- // scroll to first item in model
- mSearchListView->scrollTo(
- mProxyModel->index(0, 0),
-
- HbAbstractItemView::PositionAtTop);
- }
+ mSearchListView->scrollTo(mProxyModel->index(0,0),
+ HbAbstractItemView::PositionAtTop);
+
HSMENUTEST_FUNC_EXIT("hsmenuview::findItem");
}
@@ -440,7 +428,6 @@
mSearchListView = NULL;
mSearchPanel = NULL;
- vkbClosed();
HSMENUTEST_FUNC_EXIT("hsmenuview::searchFinished");
}
@@ -493,21 +480,3 @@
disconnect(mBuilder.searchAction(), SIGNAL(triggered()),
this, SLOT(showSearchPanel()));
}
-
-
-/*!
- change size of view when VKB is opened
- */
-void HsMenuView::vkbOpened()
-{
- mView->setMaximumHeight(mVkbHost->applicationArea().height());
-}
-
-/*!
- change size of view when VKB is closed
- */
-void HsMenuView::vkbClosed()
-{
- mView->setMaximumHeight(-1);
-}
-
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsmenuviewbuilder.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsmenuviewbuilder.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -63,6 +63,8 @@
lineEdit->setText("");
lineEdit->setFocus();
+ lineEdit->setInputMethodHints(Qt::ImhNoPredictiveText |
+ Qt::ImhNoAutoUppercase);
}
}
--- a/homescreenapp/stateplugins/hshomescreenstateplugin/inc/hsidlestate.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hshomescreenstateplugin/inc/hsidlestate.h Fri Jul 09 14:36:01 2010 +0300
@@ -44,6 +44,9 @@
#endif
class HsWidgetHost;
+class HsPage;
+class HsMessageBoxWrapper;
+class HsPropertyAnimationWrapper;
class HsIdleState : public QState
{
@@ -60,6 +63,7 @@
void event_moveScene();
void event_selectWallpaper();
void event_addPage();
+ void event_preRemovePage();
void event_removePage();
void event_toggleConnection();
@@ -78,8 +82,6 @@
void addPageToScene(int pageIndex);
void updateZoneAnimation();
void showTrashBin();
- void removeActivePage();
- void deleteZoneAnimation();
QList<QRectF> createInactiveWidgetRects();
void updatePagePresentationToWidgetSnap();
void resetSnapPosition();
@@ -117,6 +119,8 @@
void action_moveScene_moveToNearestPage();
void action_moveScene_disconnectGestureHandlers();
void action_addPage_addPage();
+ void action_preRemovePage_showQuery();
+ void action_removePage_startRemovePageAnimation();
void action_removePage_removePage();
void action_toggleConnection_toggleConnection();
void action_idle_setupTitle();
@@ -136,18 +140,17 @@
bool openTaskSwitcher();
void zoneAnimationFinished();
void pageChangeAnimationFinished();
- void onRemovePageConfirmationOk();
void onVerticalSnapLineTimerTimeout();
void onHorizontalSnapLineTimerTimeout();
void onActivePageChanged();
-
+
private:
HbAction *mNavigationAction;
HsIdleWidget *mUiWidget;
HsTitleResolver *mTitleResolver;
QPropertyAnimation *mZoneAnimation;
bool mAllowZoneAnimation;
- QPropertyAnimation *mPageChangeAnimation;
+ HsPropertyAnimationWrapper *mPageChangeAnimation;
HbContinuousFeedback *mContinuousFeedback;
bool mTrashBinFeedbackAlreadyPlayed;
QPointF mPageHotSpot;
@@ -157,12 +160,13 @@
QPointer<HbMenu> mSceneMenu;
HsWidgetPositioningOnWidgetMove::Result mSnapResult;
HsWidgetPositioningOnWidgetMove::Result mPreviousSnapResult;
- qreal mSnapBorderGap;
QTimer mVerticalSnapLineTimer;
- QTimer mHorizontalSnapLineTimer;
+ QTimer mHorizontalSnapLineTimer;
#ifdef Q_OS_SYMBIAN
XQSettingsManager *mSettingsMgr;
#endif
+ HsMessageBoxWrapper *mMessageBoxWrapper;
+
HOMESCREEN_TEST_FRIEND_CLASS(HomeScreenStatePluginTest)
};
--- a/homescreenapp/stateplugins/hshomescreenstateplugin/src/hsidlestate.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hshomescreenstateplugin/src/hsidlestate.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -53,6 +53,8 @@
#include "hsmenuservice.h"
#include "hsgui.h"
#include "hsconfiguration.h"
+#include "hsmessageboxwrapper.h"
+#include "hspropertyanimationwrapper.h"
// Helper macros for connecting state entry and exit actions.
#define ENTRY_ACTION(state, action) \
@@ -92,10 +94,10 @@
const char hsLocTextId_Confirmation_RemovePage[] = "txt_homescreen_info_page_and_content_will_be_remov";
//Button in confirmation dialog while removing page with content
- const char hsLocTextId_ConfirmationButton_Ok[] = "txt_homescreen_button_ok";
+ //const char hsLocTextId_ConfirmationButton_Ok[] = "txt_homescreen_button_ok";
//Button in confirmation dialog while removing page with content
- const char hsLocTextId_ConfirmationButton_Cancel[] = "txt_homescreen_button_cancel";
+ //const char hsLocTextId_ConfirmationButton_Cancel[] = "txt_homescreen_button_cancel";
}
/*!
@@ -114,7 +116,8 @@
*/
HsIdleState::HsIdleState(QState *parent)
: QState(parent),
- mNavigationAction(0), mUiWidget(0),
+ mNavigationAction(0),
+ mUiWidget(0),
mTitleResolver(0),
mZoneAnimation(0),
mAllowZoneAnimation(false),
@@ -122,15 +125,16 @@
mContinuousFeedback(0),
mTrashBinFeedbackAlreadyPlayed(false),
mDeltaX(0),
- mSceneMenu(0),
- mSnapBorderGap(0.0)
+ mSceneMenu(0)
#ifdef Q_OS_SYMBIAN
,mSettingsMgr(0)
#endif
+ ,mMessageBoxWrapper(0)
+
{
setupStates();
mTitleResolver = new HsTitleResolver(this);
-
+
// TODO: Uncomment when updated API available
//mContinuousFeedback = new HbContinuousFeedback;
//mContinuousFeedback->setContinuousEffect(HbFeedback::ContinuousSmooth);
@@ -145,7 +149,15 @@
*/
HsIdleState::~HsIdleState()
{
- delete mZoneAnimation;
+ if (mZoneAnimation) {
+ mZoneAnimation->stop();
+ delete mZoneAnimation;
+ }
+ if (mPageChangeAnimation) {
+ mPageChangeAnimation->stop();
+ delete mPageChangeAnimation;
+ }
+
// TODO: Uncomment when updated API available
//delete mContinuousFeedback;
}
@@ -231,6 +243,7 @@
HsWallpaperSelectionState *state_wallpaperSelectionState =
new HsWallpaperSelectionState(this);
QState *state_addPage = new QState(this);
+ QState *state_preRemovePage = new QState(this);
QState *state_removePage = new QState(this);
QState *state_toggleConnection = new QState(this);
@@ -239,7 +252,7 @@
state_waitInput->addTransition(
this, SIGNAL(event_addPage()), state_addPage);
state_waitInput->addTransition(
- this, SIGNAL(event_removePage()), state_removePage);
+ this, SIGNAL(event_preRemovePage()), state_preRemovePage);
state_waitInput->addTransition(
this, SIGNAL(event_toggleConnection()), state_toggleConnection);
state_waitInput->addTransition(
@@ -259,8 +272,15 @@
state_wallpaperSelectionState, SIGNAL(event_waitInput()), state_waitInput);
state_addPage->addTransition(state_waitInput);
+
+ state_preRemovePage->addTransition(
+ this,SIGNAL(event_removePage()),state_removePage);
+
+ state_preRemovePage->addTransition(
+ this,SIGNAL(event_waitInput()),state_waitInput);
- state_removePage->addTransition(state_waitInput);
+ state_removePage->addTransition(
+ this,SIGNAL(event_waitInput()),state_waitInput);
state_toggleConnection->addTransition(state_waitInput);
@@ -299,8 +319,11 @@
EXIT_ACTION(state_moveScene, action_moveScene_disconnectGestureHandlers)
ENTRY_ACTION(state_addPage, action_addPage_addPage)
+
+ ENTRY_ACTION(state_preRemovePage, action_preRemovePage_showQuery)
- ENTRY_ACTION(state_removePage, action_removePage_removePage)
+ ENTRY_ACTION(state_removePage, action_removePage_startRemovePageAnimation)
+ EXIT_ACTION(state_removePage, action_removePage_removePage)
ENTRY_ACTION(state_toggleConnection, action_toggleConnection_toggleConnection)
}
@@ -319,13 +342,10 @@
*/
void HsIdleState::startPageChangeAnimation(int targetPageIndex, int duration)
{
- if (!mPageChangeAnimation) {
- mPageChangeAnimation = new QPropertyAnimation(mUiWidget, "sceneX");
- }
- else if (mPageChangeAnimation->state() != QAbstractAnimation::Stopped) {
+ if (mPageChangeAnimation->isRunning()) {
mPageChangeAnimation->stop();
}
-
+ mPageChangeAnimation->disconnect(this);
mPageChangeAnimation->setEndValue(pageLayerXPos(targetPageIndex));
mPageChangeAnimation->setDuration(duration);
connect(mPageChangeAnimation,
@@ -358,10 +378,6 @@
return;
}
- if (!mZoneAnimation) {
- mZoneAnimation = new QPropertyAnimation(mUiWidget, "sceneX");
- }
-
int bounceEffect = HSCONFIGURATION_GET(bounceEffect);
if (isInLeftPageChangeZone()) {
@@ -374,7 +390,8 @@
connect(mZoneAnimation,
SIGNAL(finished()),
- SLOT(zoneAnimationFinished()));
+ SLOT(zoneAnimationFinished()),
+ Qt::UniqueConnection);
mZoneAnimation->start();
}
@@ -426,26 +443,22 @@
*/
void HsIdleState::updateZoneAnimation()
{
- if (isInPageChangeZone() && mAllowZoneAnimation) {
- if (!mZoneAnimation && (!mPageChangeAnimation
- || mPageChangeAnimation->state() == QAbstractAnimation::Stopped )) {
+ if (!mAllowZoneAnimation) {
+ mZoneAnimation->stop();
+ } else if (isInPageChangeZone()) {
+ // should we start it
+ if (mZoneAnimation->state() == QAbstractAnimation::Stopped &&
+ !mPageChangeAnimation->isRunning()) {
startPageChangeZoneAnimation(HSCONFIGURATION_GET(pageChangeZoneAnimationDuration));
- }
- } else if (mZoneAnimation && !isInPageChangeZone()) {
- if (mZoneAnimation->state() == QAbstractAnimation::Running) {
- if (mZoneAnimation->direction() == QAbstractAnimation::Forward) {
- mZoneAnimation->setDuration(HSCONFIGURATION_GET(pageChangeZoneReverseAnimationDuration));
- mZoneAnimation->setDirection(QAbstractAnimation::Backward);
- }
- } else {
- // Out of the page change zone. Delete animation.
- deleteZoneAnimation();
- }
- } else if (!isInPageChangeZone()) {
- if (mZoneAnimation) {
- mZoneAnimation->stop();
- }
- }
+ }
+ } else if (mZoneAnimation->state() == QAbstractAnimation::Running) {
+ // Not in zone, but still running
+ if (mZoneAnimation->direction() == QAbstractAnimation::Forward){
+ // reverse
+ mZoneAnimation->setDuration(HSCONFIGURATION_GET(pageChangeZoneReverseAnimationDuration));
+ mZoneAnimation->setDirection(QAbstractAnimation::Backward);
+ }
+ }
}
/*!
@@ -470,43 +483,6 @@
}
/*!
- Removes currently active page.
-*/
-void HsIdleState::removeActivePage()
-{
- HsScene *scene = HsScene::instance();
- HsPage *page = scene->activePage();
-
- int pageIndex = scene->activePageIndex();
-
- mUiWidget->removePage(pageIndex);
- scene->removePage(page);
-
- if (page->wallpaper()) {
- page->wallpaper()->remove();
- }
- delete page;
-
- pageIndex = pageIndex == 0 ? 0 : pageIndex - 1;
- scene->setActivePageIndex(pageIndex);
-
- startPageChangeAnimation(pageIndex, HSCONFIGURATION_GET(pageRemovedAnimationDuration));
-
- mUiWidget->pageIndicator()->removeItem(pageIndex);
- mUiWidget->setActivePage(pageIndex);
- mUiWidget->showPageIndicator();
-}
-
-/*!
- Deletes page change zone animation.
-*/
-void HsIdleState::deleteZoneAnimation()
-{
- delete mZoneAnimation;
- mZoneAnimation = NULL;
-}
-
-/*!
If called for the first time, setups the idle view.
Updates the soft key action and sets the idle view
as the current view to the main window.
@@ -526,11 +502,16 @@
idleView->setNavigationAction(mNavigationAction);
HsGui::setIdleView(idleView);
-
- if (mPageChangeAnimation) {
- delete mPageChangeAnimation;
- mPageChangeAnimation = NULL;
- }
+
+ delete mPageChangeAnimation;
+ mPageChangeAnimation = NULL;
+ mPageChangeAnimation = new HsPropertyAnimationWrapper;
+ mPageChangeAnimation->setTargetObject(mUiWidget);
+ mPageChangeAnimation->setPropertyName("sceneX");
+ delete mZoneAnimation;
+ mZoneAnimation = NULL;
+ mZoneAnimation = new QPropertyAnimation(mUiWidget, "sceneX");
+
}
HsScene::mainWindow()->setCurrentView(idleView);
@@ -587,9 +568,6 @@
mTitleResolver->disconnect(this);
}
-#ifdef COVERAGE_MEASUREMENT
-#pragma CTC SKIP
-#endif //COVERAGE_MEASUREMENT
/*!
*/
@@ -617,9 +595,6 @@
mSceneMenu->setPreferredPos(mPageHotSpot);
mSceneMenu->open();
}
-#ifdef COVERAGE_MEASUREMENT
-#pragma CTC ENDSKIP
-#endif //COVERAGE_MEASUREMENT
void HsIdleState::onPagePanStarted(QGestureEvent *event)
{
@@ -673,28 +648,29 @@
void HsIdleState::onWidgetMoveUpdated(const QPointF &scenePos, HsWidgetHost *widget)
{
- HsScene *scene = HsScene::instance();
QRectF widgetRect = widget->geometry();
- // Move widget to new position.
+ // Move widget to updated position.
mWidgetHotSpot = scenePos;
-
widgetRect.moveTopLeft(mWidgetHotSpot - mWidgetHotSpotOffset);
- // Widget can be moved over the pages left border.
+ // When moving widget can go over the pages left border.
qreal lowerBoundX = -widgetRect.width();
- HsPage *page = scene->activePage();
+
+ // When moving widget can go over the pages right border.
QRectF pageRect = HsGui::idleView()->rect();
- // Widget can be moved over the pages right border.
qreal upperBoundX = pageRect.width();
+ // When moving widget can go under the chrome at the pages upper border.
// Notice that chrome height is 64 pixels.
qreal lowerBoundY = qreal(64) - widgetRect.height();
- // Widget can be moved over the pages down border.
+
+ // When moving widget can go over the pages down border.
qreal upperBoundY = pageRect.height();
qreal widgetX = qBound(lowerBoundX, widgetRect.x(), upperBoundX);
qreal widgetY = qBound(lowerBoundY, widgetRect.y(), upperBoundY);
+
// If using ItemClipsChildrenToShape-flag in widgethost then
// setPos does not update position here, however setGeometry does it, QT bug?
widget->setGeometry(widgetX, widgetY, widgetRect.width(), widgetRect.height());
@@ -720,11 +696,12 @@
mPreviousSnapResult = mSnapResult;
}
-
- int bounceFeedbackEffectDistance = HSCONFIGURATION_GET(bounceFeedbackEffectDistance);
// Handle effects:
// User is indicated by a tactile feedback if he/she is trying to move
// widget over the first or the last page.
+ HsScene *scene = HsScene::instance();
+ HsPage *page = scene->activePage();
+ int bounceFeedbackEffectDistance = HSCONFIGURATION_GET(bounceFeedbackEffectDistance);
if( (page == scene->pages().first() && mWidgetHotSpot.x() < bounceFeedbackEffectDistance ) ||
(page == scene->pages().last() && scene->pages().count() == HSCONFIGURATION_GET(maximumPageCount)
&& mWidgetHotSpot.x() > pageRect.width() - bounceFeedbackEffectDistance)) {
@@ -733,8 +710,7 @@
//if (!mContinuousFeedback->isPlaying()) {
// mContinuousFeedback->play();
//}
- }
- else /*if (mContinuousFeedback->isPlaying())*/ {
+ } else /*if (mContinuousFeedback->isPlaying())*/ {
//mContinuousFeedback->stop();
}
@@ -876,41 +852,36 @@
HbMenu *menu = new HbMenu();
menu->setObjectName("hs_menu");
// Task switcher
- HbAction *action = menu->addAction(hbTrId(hsLocTextId_OptionsMenu_TaskSwitcher),
+ menu->addAction(hbTrId(hsLocTextId_OptionsMenu_TaskSwitcher),
this, SLOT(openTaskSwitcher()));
- action->setObjectName("action_open_task_switcher");
+
// Add content
- action = menu->addAction(hbTrId(hsLocTextId_ContextMenu_AddContent),
+ menu->addAction(hbTrId(hsLocTextId_ContextMenu_AddContent),
this, SLOT(onAddContentFromOptionsMenuActionTriggered()));
- action->setObjectName("action_add_content");
// Add page
if (scene->pages().count() < HSCONFIGURATION_GET(maximumPageCount)) {
- action = menu->addAction(hbTrId(hsLocTextId_OptionsMenu_AddPage),
+ menu->addAction(hbTrId(hsLocTextId_OptionsMenu_AddPage),
this, SIGNAL(event_addPage()));
- action->setObjectName("action_add_page");
-
+
}
// Change wallpaper
- action = menu->addAction(hbTrId(hsLocTextId_ContextMenu_ChangeWallpaper),
+ menu->addAction(hbTrId(hsLocTextId_ContextMenu_ChangeWallpaper),
this, SIGNAL(event_selectWallpaper()));
- action->setObjectName("action_change_wallpaper");
+
// Remove page
if (scene->activePage()->isRemovable()) {
- action = menu->addAction(hbTrId(hsLocTextId_OptionsMenu_RemovePage),
- this, SIGNAL(event_removePage()));
- action->setObjectName("action_remove_page");
+ menu->addAction(hbTrId(hsLocTextId_OptionsMenu_RemovePage),
+ this, SIGNAL(event_preRemovePage()));
}
// Online / Offline
if (scene->isOnline()) {
- action = menu->addAction(hbTrId(hsLocTextId_OptionsMenu_HsToOffline),
+ menu->addAction(hbTrId(hsLocTextId_OptionsMenu_HsToOffline),
this, SIGNAL(event_toggleConnection()));
- action->setObjectName("action_to_offline");
} else {
- action = menu->addAction(hbTrId(hsLocTextId_OptionsMenu_HsToOnline),
+ menu->addAction(hbTrId(hsLocTextId_OptionsMenu_HsToOnline),
this, SIGNAL(event_toggleConnection()));
- action->setObjectName("action_to_online");
}
HsGui::idleView()->setMenu(menu);
@@ -1001,16 +972,13 @@
void HsIdleState::action_moveWidget_setWidgetSnap()
{
if (HSCONFIGURATION_GET(isSnapEnabled)) {
- mSnapBorderGap = HSCONFIGURATION_GET(snapBorderGap);
QVariantHash snapConfiguration;
snapConfiguration[SNAPENABLED] = QString::number(HSCONFIGURATION_GET(isSnapEnabled));
snapConfiguration[SNAPFORCE] = QString::number(HSCONFIGURATION_GET(snapForce));
snapConfiguration[SNAPGAP] = QString::number(HSCONFIGURATION_GET(snapGap));
- snapConfiguration[SNAPBORDERGAP] = mSnapBorderGap;
HsWidgetPositioningOnWidgetMove::instance()->setConfiguration(snapConfiguration);
-
updatePagePresentationToWidgetSnap();
connect(HsScene::instance(), SIGNAL(activePageChanged()),
@@ -1083,10 +1051,8 @@
}
}
+ //Set the snap position of the widget and save the position
QRectF widgetRect = widget->geometry();
- QRectF pageRect = page->rect();
-
- //Set the snap position of the widget and save the position
if (mSnapResult.hasHorizontalSnap) {
widgetRect.moveLeft(mSnapResult.horizontalSnapPosition);
}
@@ -1094,15 +1060,8 @@
widgetRect.moveTop(mSnapResult.verticalSnapPosition);
}
- //if snapBorderGap is defined, the widget is bounded in the rectangle which is smaller by snapBorderGap on all sides
- qreal widgetX = qBound(qreal(0) + mSnapBorderGap, widgetRect.x(), (pageRect.width() - mSnapBorderGap) - widgetRect.width());
- qreal widgetY = qBound(qreal(64) + mSnapBorderGap, widgetRect.y(), (pageRect.height() - mSnapBorderGap) - widgetRect.height());
-
- // play feedback effect if user drops widget between pages and it needs to be repositioned back to original page
- if( widgetX != widgetRect.x() || widgetY != widgetRect.y()) {
- HbInstantFeedback::play(HSCONFIGURATION_GET(widgetRepositionFeedbackEffect));
- }
- widget->setPos(widgetX, widgetY);
+ QPointF adjustedWidgetPosition = page->adjustedWidgetPosition(widgetRect);
+ widget->setPos(adjustedWidgetPosition);
widget->savePresentation();
page->updateZValues();
@@ -1216,36 +1175,83 @@
mUiWidget->showPageIndicator();
}
-/*!
- Removes an existing page from the scene.
-*/
-void HsIdleState::action_removePage_removePage()
+void HsIdleState::action_preRemovePage_showQuery()
{
HsScene *scene = HsScene::instance();
HsPage *page = scene->activePage();
if (!page->widgets().isEmpty()) {
-#ifndef HOMESCREEN_TEST //We don't want to test message box.
- //Confirm removal of page having content
- HbMessageBox *box = new HbMessageBox(HbMessageBox::MessageTypeQuestion);
- box->setAttribute(Qt::WA_DeleteOnClose);
- box->setHeadingWidget(new HbLabel
- (hbTrId(hsLocTextId_Title_RemovePage)));
- box->setText(hbTrId(hsLocTextId_Confirmation_RemovePage));
-
- QAction *buttonOk = box->actions().at(0);
- //We are keen only from OK button. Cancel is not connected to any slot.
- connect(buttonOk, SIGNAL(triggered()), SLOT(onRemovePageConfirmationOk()));
-
- box->open();
-#endif // HOMESCREEN_TEST
+ if (!mMessageBoxWrapper) {
+ mMessageBoxWrapper = new HsMessageBoxWrapper(this);
+ mMessageBoxWrapper->setHeader(hbTrId(hsLocTextId_Title_RemovePage));
+ mMessageBoxWrapper->setQueryText(hbTrId(hsLocTextId_Confirmation_RemovePage));
+ connect(mMessageBoxWrapper,SIGNAL(accepted()),SIGNAL(event_removePage()));
+ connect(mMessageBoxWrapper,SIGNAL(rejected()),SIGNAL(event_waitInput()));
+ }
+ mMessageBoxWrapper->show();
} else {
// Empty page can be removed without confirmation
- removeActivePage();
+ emit event_removePage();
}
}
/*!
+ Start remove page animation.
+*/
+void HsIdleState::action_removePage_startRemovePageAnimation()
+{
+ HsScene *scene = HsScene::instance();
+
+ int pageToRemoveIndex = scene->activePageIndex();
+ bool isLastPage(scene->activePage() == scene->pages().last());
+
+ int nextPageIndex(pageToRemoveIndex);
+ nextPageIndex++;
+ if (isLastPage) {
+ nextPageIndex--;
+ }
+
+ if (mPageChangeAnimation->isRunning()) {
+ mPageChangeAnimation->stop();
+ }
+ mPageChangeAnimation->disconnect(this);
+ connect(mPageChangeAnimation,
+ SIGNAL(finished()),
+ SIGNAL(event_waitInput()),
+ Qt::UniqueConnection);
+ mPageChangeAnimation->setEndValue(pageLayerXPos(nextPageIndex));
+ mPageChangeAnimation->setDuration(HSCONFIGURATION_GET(pageRemovedAnimationDuration));
+
+ mPageChangeAnimation->start();
+
+ HbInstantFeedback::play(HSCONFIGURATION_GET(pageChangeFeedbackEffect));
+
+}
+
+/*!
+ Removes an existing page from the scene.
+*/
+void HsIdleState::action_removePage_removePage()
+{
+ if (mPageChangeAnimation->isRunning()) {
+ mPageChangeAnimation->stop();
+ }
+ HsScene *scene = HsScene::instance();
+ HsPage *pageToRemove = scene->activePage();
+
+ // remove from ui
+ mUiWidget->removePage(pageToRemove->pageIndex());
+ mUiWidget->showPageIndicator();
+ // update data model
+ HsScene::instance()->removePage(pageToRemove);
+ // Take new active page (previous was removed) and move scene to right position
+ qreal x = pageLayerXPos(scene->activePageIndex());
+ mUiWidget->setSceneX(x);
+ // delete it
+ pageToRemove->deleteLater();
+
+}
+/*!
Toggles the homescreen online/offline state.
*/
void HsIdleState::action_toggleConnection_toggleConnection()
@@ -1299,8 +1305,6 @@
scene->setActivePageIndex(pageIndex);
mUiWidget->setActivePage(pageIndex);
}
-
- deleteZoneAnimation();
}
/*!
@@ -1311,21 +1315,13 @@
updateZoneAnimation();
}
-/*!
- Handles the close of remove page confirmation dialog for page having content.
-*/
-void HsIdleState::onRemovePageConfirmationOk()
-{
- removeActivePage();
-}
/*!
Provides the page presentation to the Widget Snap algorithm
*/
void HsIdleState::updatePagePresentationToWidgetSnap()
{
- QRectF containerRect = HsScene::instance()->activePage()->rect();
- containerRect.setTop(qreal(64));
+ QRectF containerRect = HsScene::instance()->activePage()->contentGeometry();
HsWidgetHost *activeWidget = HsScene::instance()->activeWidget();
HsWidgetPositioningOnWidgetMove::instance()->setPagePresentation(containerRect, createInactiveWidgetRects(), activeWidget->geometry());
}
@@ -1419,3 +1415,5 @@
updatePagePresentationToWidgetSnap();
resetSnapPosition();
}
+
+
--- a/homescreenapp/stateplugins/hshomescreenstateplugin/src/hsidlewidget.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hshomescreenstateplugin/src/hsidlewidget.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -216,6 +216,7 @@
mPageWallpaperLayer->resize(
layout->count() * size().width(), size().height());
}
+ mPageIndicator->removeItem(index);
}
/*!
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/hsmenuworkerstateplugin.qrc Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/hsmenuworkerstateplugin.qrc Fri Jul 09 14:36:01 2010 +0300
@@ -5,5 +5,6 @@
<file alias="hsarrangedialog.docml">resource/hsarrangedialog.docml</file>
<file alias="hsdetailsdialog.docml">resource/hsdetailsdialog.docml</file>
<file alias="hsuninstalldialog.docml">resource/hsuninstalldialog.docml</file>
+ <file alias="hsinstallationlogdialog.docml">resource/hsinstallationlogdialog.docml</file>
</qresource>
</RCC>
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsaddappstocollectionstate.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsaddappstocollectionstate.h Fri Jul 09 14:36:01 2010 +0300
@@ -128,8 +128,6 @@
HsSortAttribute mApplicationsSortAttribute;
- HsSortAttribute mCollectionsSortAttribute;
-
HsAppsCheckList *mAppsCheckList;
HsCollectionNameDialog *mEditorDialog;
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsaddtohomescreenstate.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsaddtohomescreenstate.h Fri Jul 09 14:36:01 2010 +0300
@@ -27,6 +27,7 @@
HS_STATES_TEST_CLASS(MenuStatesTest)
+class QAction;
class HbAction;
class HbMessageBox;
class CaEntry;
@@ -82,7 +83,7 @@
HbMessageBox *mCorruptedMessage;
- HbAction *mConfirmAction;
+ QAction *mConfirmAction;
HsMenuMode mMenuMode;
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsarrangestate.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsarrangestate.h Fri Jul 09 14:36:01 2010 +0300
@@ -15,8 +15,8 @@
*
*/
-#ifndef ARRANGE_H
-#define ARRANGE_H
+#ifndef HSARRANGESTATE_H
+#define HSARRANGESTATE_H
#include <QState>
#include <QVariant>
@@ -76,15 +76,17 @@
HsMenuItemModel *mItemModel;
int mTopItemId;
+
+ int mCollectionId;
QModelIndex mTopModelIndex;
- QList<int> mCollIdList;
+ QList<int> mCollItemIdList;
- QList<int> mArrangedCollIdList;
+ QList<int> mArrangedCollItemIdList;
QObjectList mObjectList;
};
-#endif /* ARRANGE_H_ */
+#endif /* HSARRANGESTATE_H */
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hscollectionslistdialog.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hscollectionslistdialog.h Fri Jul 09 14:36:01 2010 +0300
@@ -33,8 +33,7 @@
public:
- HsCollectionsListDialog(HsSortAttribute sortOrder,
- int collectionId = 0);
+ HsCollectionsListDialog(int collectionId = 0);
virtual ~HsCollectionsListDialog();
@@ -51,8 +50,7 @@
void makeDisconnect();
- QStandardItemModel *standartItemModel(HsSortAttribute sortOrder,
- int collectionId);
+ QStandardItemModel *standardItemModel(int collectionId);
void insertNewCollectionItem(QStandardItemModel *model);
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsdeletecollectionitemstate.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsdeletecollectionitemstate.h Fri Jul 09 14:36:01 2010 +0300
@@ -23,6 +23,7 @@
#include "hsmenustates_global.h"
HS_STATES_TEST_CLASS(MenuStatesTest)
+class QAction;
class HbAction;
class HbMessageBox;
class HsShortcutService;
@@ -66,7 +67,7 @@
HbMessageBox *mDeleteMessage; // deletes itself automatically on close
- HbAction *mConfirmAction; // child for mDeleteMessage
+ QAction *mConfirmAction; // child for mDeleteMessage
};
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsdeletecollectionstate.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsdeletecollectionstate.h Fri Jul 09 14:36:01 2010 +0300
@@ -23,6 +23,7 @@
#include "hsmenustates_global.h"
HS_STATES_TEST_CLASS(MenuStatesTest)
+class QAction;
class HbAction;
class HbMessageBox;
class HsMenuService;
@@ -60,7 +61,7 @@
private:
int mItemId;
HbMessageBox *mDeleteMessage; // deletes itself automatically on close
- HbAction *mConfirmAction; // child for mDeleteMessage
+ QAction *mConfirmAction; // child for mDeleteMessage
};
#endif //HSDELETECOLLECTIONSTATE_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsinstallationlogstate.h Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 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:
+ *
+ */
+
+#ifndef HSINSTALLATIONLOGSTATE_H
+#define HSINSTALLATIONLOGSTATE_H
+
+#include <QState>
+
+#include "hsmenustates_global.h"
+HS_STATES_TEST_CLASS(MenuStatesTest)
+
+class HbDialog;
+
+class HsInstallationLogState: public QState
+{
+ Q_OBJECT
+
+ HS_STATES_TEST_FRIEND_CLASS(MenuStatesTest)
+
+public:
+
+ HsInstallationLogState(QState *parent = 0);
+
+ virtual ~HsInstallationLogState();
+
+protected:
+
+ void onEntry(QEvent *event);
+ void onExit(QEvent *event);
+
+private slots:
+
+ void stateExited();
+ void cleanUp();
+
+signals:
+
+ void exit();
+
+private:
+
+ void construct();
+ void createInstallationLogDialog();
+
+private:
+
+ HbDialog* mInstalationLogDialog;
+
+};
+
+#endif //HSINSTALLATIONLOGSTATE_H
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsmenustates_global.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsmenustates_global.h Fri Jul 09 14:36:01 2010 +0300
@@ -60,6 +60,10 @@
static const char *const HS_UNINSTALL_DIALOG_CONFIRMATION_ACTION ="qtl_dialog_softkey_2_left";
static const char *const HS_UNINSTALL_DIALOG_CONFIRMATION_DIALOG_ICON ="icon";
+static const char *const HS_INSTALLATION_LOG_DIALOG_LAYOUT =":/xml/hsinstallationlogdialog.docml";
+static const char *const HS_INSTALLATION_LOG_DIALOG_NAME="installation_log_dialog";
+static const char *const HS_INSTALLATION_LOG_DIALOG_LOG_LABEL="log_label";
+
/*!
To enable logging of function entry and exit use the following flag for qmake:
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hspreviewhswidgetstate.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hspreviewhswidgetstate.h Fri Jul 09 14:36:01 2010 +0300
@@ -20,18 +20,21 @@
#define HSPREVIEWHSWIDGETSTATE_H
#include <QState>
+#include <QVariant>
#include "hsmenustates_global.h"
HS_STATES_TEST_CLASS(MenuStatesTest)
+class QAction;
+class HbAction;
class CaEntry;
class HbDialog;
class HsWidgetHost;
class CaNotifier;
-class HbAction;
class HbScrollArea;
class HbMessageBox;
+
class HsPreviewHSWidgetState : public QState
{
Q_OBJECT
@@ -71,11 +74,15 @@
CaNotifier *mNotifier;
- QScopedPointer<HsWidgetHost> mWidget;
-
int mEntryId;
HbMessageBox *mCorruptedMessage;
+
+ QAction *mConfirmAction;
+
+ QVariant mToken;
+
+ QString mUri;
};
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsuninstallitemstate.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsuninstallitemstate.h Fri Jul 09 14:36:01 2010 +0300
@@ -23,6 +23,7 @@
#include "hsmenustates_global.h"
HS_STATES_TEST_CLASS(MenuStatesTest)
+class QAction;
class HbAction;
class HbMessageBox;
class HsShortcutService;
@@ -82,10 +83,9 @@
HbMessageBox *mUninstallMessage; // deletes itself automatically on close
HbDialog *mUninstallJavaMessage;
- QObjectList mObjectList;
UninstallDialogType mDialogType;
- HbAction *mConfirmAction; // child for mConfirmMessage
+ QAction *mConfirmAction; // child for mConfirmMessage
};
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsviewappdetailsstate.h Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/inc/hsviewappdetailsstate.h Fri Jul 09 14:36:01 2010 +0300
@@ -22,12 +22,15 @@
#include <QVariant>
#include "hsmenustates_global.h"
+#include "casoftwareregistry.h"
HS_STATES_TEST_CLASS(MenuStatesTest)
class HbListWidget;
class HsMenuItemModel;
class HbDialog;
class CaNotifier;
+class HbDocumentLoader;
+
class HsViewAppDetailsState: public QState
{
@@ -57,13 +60,14 @@
void construct();
void subscribeForMemoryCardRemove(int entryId);
+ void setFieldPresentation(QString key,
+ CaSoftwareRegistry::DetailMap &detailMap,
+ HbDocumentLoader &loader);
private:
HbDialog *mDialog;
- QObjectList mObjectList;
-
CaNotifier *mNotifier;
};
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/resource/hsarrangedialog.docml Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/resource/hsarrangedialog.docml Fri Jul 09 14:36:01 2010 +0300
@@ -3,9 +3,9 @@
<widget name="arrange_dialog" type="HbDialog">
<enums name="dismissPolicy" value="HbPopup::NoDismiss"/>
<object name="qtl_dialog_softkey_left" type="HbAction">
- <string name="role" value="HbDialog:primaryAction"/>
- <string locid="txt_common_button_ok" name="text"/>
- </object>
+ <string name="role" value="HbDialog:primaryAction"/>
+ <string locid="txt_common_button_ok" name="text"/>
+ </object>
<widget name="qtl_dialog_pri_heading" role="HbDialog:headingWidget" type="HbLabel">
<enums name="alignment" value="AlignLeft|AlignLeading"/>
<contentsmargins bottom="var(hb-param-margin-gene-popup)" left="var(hb-param-margin-gene-popup)" right="var(hb-param-margin-gene-popup)" top="var(hb-param-margin-gene-popup)"/>
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/resource/hsdetailsdialog.docml Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/resource/hsdetailsdialog.docml Fri Jul 09 14:36:01 2010 +0300
@@ -6,7 +6,6 @@
</object>
<widget name="details_dialog" type="HbDialog">
<enums name="dismissPolicy" value="HbPopup::NoDismiss"/>
-
<contentsmargins bottom="var(hb-param-margin-view-bottom)" left="var(hb-param-margin-view-left)" right="var(hb-param-margin-view-right)" top="var(hb-param-margin-view-top)"/>
<widget name="qtl_dialog_pri_heading" role="HbDialog:headingWidget" type="HbLabel">
<enums name="alignment" value="AlignLeft|AlignLeading"/>
@@ -91,6 +90,116 @@
</widget>
<ref object="qtl_dialog_softkey_left" role="HbWidget:addAction"/>
</widget>
+ <section name="detailsDialogForJavaApplication">
+ <widget name="details_dialog" type="HbDialog">
+ <enums name="dismissPolicy" value="HbPopup::NoDismiss"/>
+ <contentsmargins bottom="var(hb-param-margin-view-bottom)" left="var(hb-param-margin-view-left)" right="var(hb-param-margin-view-right)" top="var(hb-param-margin-view-top)"/>
+ <widget name="qtl_dialog_pri_heading" role="HbDialog:headingWidget" type="HbLabel">
+ <enums name="alignment" value="AlignLeft|AlignLeading"/>
+ <contentsmargins bottom="var(hb-param-margin-gene-popup)" left="var(hb-param-margin-gene-popup)" right="var(hb-param-margin-gene-popup)" top="var(hb-param-margin-gene-popup)"/>
+ <string locid="txt_applib_title_details" name="plainText" value="Details"/>
+ <fontspec name="fontSpec" role="Primary" textheight="var(hb-param-text-height-primary)"/>
+ </widget>
+ <widget name="scrollArea" role="HbDialog:contentWidget" type="HbScrollArea">
+ <widget name="scrollAreaContents" role="HbScrollArea:contents" type="HbWidget">
+ <widget name="_name" type="HbLabel">
+ <sizehint height="expr(var(hb-param-text-height-secondary))" type="PREFERRED"/>
+ <string locid="txt_applib_dialog_name" name="plainText" value="Name:"/>
+ <fontspec name="fontSpec" role="Secondary" textheight="var(hb-param-text-height-secondary)"/>
+ </widget>
+ <widget name="name" type="HbLabel">
+ <sizehint height="expr(var(hb-param-text-height-secondary))" type="PREFERRED"/>
+ <fontspec name="fontSpec" role="Secondary" textheight="var(hb-param-text-height-secondary)"/>
+ </widget>
+ <widget name="_version" type="HbLabel">
+ <sizehint height="expr(var(hb-param-text-height-secondary))" type="PREFERRED"/>
+ <string locid="txt_applib_dialog_version" name="plainText" value="Version:"/>
+ <fontspec name="fontSpec" role="Secondary" textheight="var(hb-param-text-height-secondary)"/>
+ </widget>
+ <widget name="version" type="HbLabel">
+ <sizehint height="expr(var(hb-param-text-height-secondary))" type="PREFERRED"/>
+ <fontspec name="fontSpec" role="Secondary" textheight="var(hb-param-text-height-secondary)"/>
+ </widget>
+ <widget name="_vendor" type="HbLabel">
+ <sizehint height="expr(var(hb-param-text-height-secondary))" type="PREFERRED"/>
+ <string locid="txt_applib_dialog_supplier" name="plainText" value="Supplier:"/>
+ <fontspec name="fontSpec" role="Secondary" textheight="var(hb-param-text-height-secondary)"/>
+ </widget>
+ <widget name="vendor" type="HbLabel">
+ <sizehint height="expr(var(hb-param-text-height-secondary))" type="PREFERRED"/>
+ <fontspec name="fontSpec" role="Secondary" textheight="var(hb-param-text-height-secondary)"/>
+ </widget>
+ <widget name="_driveInfo" type="HbLabel">
+ <sizehint height="expr(var(hb-param-text-height-secondary))" type="PREFERRED"/>
+ <string locid="txt_applib_dialog_memory_in_use" name="plainText" value="Memory in use:"/>
+ <fontspec name="fontSpec" role="Secondary" textheight="var(hb-param-text-height-secondary)"/>
+ </widget>
+ <widget name="driveInfo" type="HbLabel">
+ <sizehint height="expr(var(hb-param-text-height-secondary))" type="PREFERRED"/>
+ <fontspec name="fontSpec" role="Secondary" textheight="var(hb-param-text-height-secondary)"/>
+ <string locid="txt_applib_dialog_1_device_memory" name="plainText" value="%1 Device memory"/>
+ </widget>
+ <widget name="_protectiondomain" type="HbLabel">
+ <sizehint height="expr(var(hb-param-text-height-secondary))" type="PREFERRED"/>
+ <string locid="txt_applib_dialog_protection_domain" name="plainText" value="Protection domain:"/>
+ <fontspec name="fontSpec" role="Secondary" textheight="var(hb-param-text-height-secondary)"/>
+ </widget>
+ <widget name="protectiondomain" type="HbLabel">
+ <sizehint height="expr(var(hb-param-text-height-secondary))" type="PREFERRED"/>
+ <fontspec name="fontSpec" role="Secondary" textheight="var(hb-param-text-height-secondary)"/>
+ </widget>
+ <widget name="_size" type="HbLabel">
+ <sizehint height="expr(var(hb-param-text-height-secondary))" type="PREFERRED"/>
+ <string locid="txt_applib_dialog_size" name="plainText" value="Size:"/>
+ <fontspec name="fontSpec" role="Secondary" textheight="var(hb-param-text-height-secondary)"/>
+ </widget>
+ <widget name="size" type="HbLabel">
+ <sizehint height="expr(var(hb-param-text-height-secondary))" type="PREFERRED"/>
+ <fontspec name="fontSpec" role="Secondary" textheight="var(hb-param-text-height-secondary)"/>
+ <string locid="txt_applib_dialog_l1_kb" name="plainText" value="%L1 KB"/>
+ </widget>
+ <widget name="_type" type="HbLabel">
+ <sizehint height="expr(var(hb-param-text-height-secondary))" type="PREFERRED"/>
+ <string locid="txt_applib_dialog_format" name="plainText" value="Format:"/>
+ <fontspec name="fontSpec" role="Secondary" textheight="var(hb-param-text-height-secondary)"/>
+ </widget>
+ <widget name="type" type="HbLabel">
+ <sizehint height="expr(var(hb-param-text-height-secondary))" type="PREFERRED"/>
+ <fontspec name="fontSpec" role="Secondary" textheight="var(hb-param-text-height-secondary)"/>
+ </widget>
+ <widget name="_description" type="HbLabel">
+ <sizehint height="expr(var(hb-param-text-height-secondary))" type="PREFERRED"/>
+ <string locid="txt_applib_dialog_description" name="plainText" value="Description:"/>
+ <fontspec name="fontSpec" role="Secondary" textheight="var(hb-param-text-height-secondary)"/>
+ </widget>
+ <widget name="description" type="HbLabel">
+ <sizehint height="expr(var(hb-param-text-height-secondary))" type="PREFERRED"/>
+ <fontspec name="fontSpec" role="Secondary" textheight="var(hb-param-text-height-secondary)"/>
+ </widget>
+ <sizehint type="PREFERRED" width="expr(var(hb-param-screen-width) )"/>
+ <layout orientation="Vertical" spacing="2px" type="linear">
+ <linearitem itemname="_name"/>
+ <linearitem itemname="name"/>
+ <linearitem itemname="_version"/>
+ <linearitem itemname="version"/>
+ <linearitem itemname="_vendor"/>
+ <linearitem itemname="vendor"/>
+ <linearitem itemname="_driveInfo"/>
+ <linearitem itemname="driveInfo"/>
+ <linearitem itemname="_protectiondomain"/>
+ <linearitem itemname="protectiondomain"/>
+ <linearitem itemname="_size"/>
+ <linearitem itemname="size"/>
+ <linearitem itemname="_type"/>
+ <linearitem itemname="type"/>
+ <linearitem itemname="_description"/>
+ <linearitem itemname="description"/>
+ </layout>
+ </widget>
+ </widget>
+ <ref object="qtl_dialog_softkey_left" role="HbWidget:addAction"/>
+ </widget>
+ </section>
<metadata activeUIState="Common ui state" display="NHD-3.2-inch_portrait" unit="un">
<uistate name="Common ui state" sections="#common"/>
</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/resource/hsinstallationlogdialog.docml Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<hbdocument version="1.1">
+ <object name="qtl_dialog_softkey_left" type="HbAction">
+ <string name="role" value="HbDialog:primaryAction"/>
+ <string locid="txt_common_button_close" name="text"/>
+ </object>
+ <widget name="installation_log_dialog" type="HbDialog">
+ <contentsmargins bottom="var(hb-param-margin-view-bottom)" left="var(hb-param-margin-view-left)" right="var(hb-param-margin-view-right)" top="var(hb-param-margin-view-top)"/>
+ <enums name="dismissPolicy" value="NoDismiss"/>
+ <widget name="qtl_dialog_pri_heading" role="HbDialog:headingWidget" type="HbLabel">
+ <enums name="alignment" value="AlignLeft|AlignLeading"/>
+ <contentsmargins bottom="var(hb-param-margin-gene-popup)" left="var(hb-param-margin-gene-popup)" right="var(hb-param-margin-gene-popup)" top="var(hb-param-margin-gene-popup)"/>
+ <string locid="txt_applib_title_installation_logs" name="plainText"/>
+ <fontspec name="fontSpec" role="Primary" textheight="var(hb-param-text-height-primary)"/>
+ </widget>
+ <widget name="scrollArea" role="HbDialog:contentWidget" type="HbScrollArea">
+ <widget name="scrollAreaContents" role="HbScrollArea:contents" type="HbWidget">
+ <widget name="log_label" type="HbLabel">
+ <enums name="textWrapping" value="TextWordWrap"/>
+ <enums name="alignment" value="AlignLeft|AlignTop|AlignLeading"/>
+ <sizehint type="PREFERRED" width="expr(var(hb-param-screen-width) )"/>
+ <string name="plainText" value=""/>
+ <fontspec name="fontSpec" role="Secondary" textheight="var(hb-param-text-height-secondary)"/>
+ </widget>
+ <sizepolicy horizontalPolicy="Preferred" horizontalStretch="0" verticalPolicy="Expanding" verticalStretch="0"/>
+ <sizehint type="PREFERRED" width="expr(var(hb-param-screen-width) )"/>
+ <layout orientation="Vertical" spacing="var(hb-param-margin-gene-popup)" type="linear">
+ <contentsmargins bottom="var(hb-param-margin-gene-popup)" left="var(hb-param-margin-gene-popup)" right="var(hb-param-margin-gene-popup)" top="var(hb-param-margin-gene-popup)"/>
+ <linearitem itemname="log_label"/>
+ </layout>
+ </widget>
+ </widget>
+ <ref object="qtl_dialog_softkey_left" role="HbWidget:addAction"/>
+ </widget>
+ <metadata activeUIState="Common ui state" display="NHD-3.2-inch_portrait" unit="un">
+ <uistate name="Common ui state" sections="#common"/>
+ </metadata>
+</hbdocument>
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/resource/hswidgetpreviewdialog.docml Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/resource/hswidgetpreviewdialog.docml Fri Jul 09 14:36:01 2010 +0300
@@ -11,21 +11,20 @@
<widget name="label" role="HbDialog:headingWidget" type="HbLabel"/>
<widget name="container" role="HbDialog:contentWidget" type="HbWidget">
<widget name="icon_box" type="HbLabel">
- <enums name="alignment" value="AlignHCenter|AlignTop"/>
+ <enums name="alignment" value="AlignAbsolute|AlignVCenter|AlignHCenter"/>
<enums name="aspectRatioMode" value="KeepAspectRatio"/>
- <sizepolicy horizontalPolicy="Fixed" horizontalStretch="0" verticalPolicy="Minimum" verticalStretch="0"/>
- <sizehint height="32un" type="PREFERRED"/>
- <sizehint height="var(hb-param-text-height-secondary)" type="MINIMUM" width="32un"/>
- <contentsmargins bottom="0un" left="0un" right="0un" top="expr(var(hb-param-margin-gene-popup) )"/>
- <sizehint type="MAXIMUM" width="32un"/>
+ <sizehint height="var(hb-param-text-height-secondary)" type="MINIMUM"/>
+ <contentsmargins bottom="0un" left="0un" right="0un" top="0un"/>
<string locid="txt_applib_info_no_preview_available" name="plainText"/>
<fontspec name="fontSpec" role="Secondary" textheight="var(hb-param-text-height-secondary)"/>
</widget>
+
<real name="z" value="0"/>
- <layout orientation="Horizontal" type="linear">
- <stretchitem stretchfactor="1"/>
- <linearitem itemname="icon_box"/>
- <stretchitem stretchfactor="1"/>
+ <layout type="anchor">
+ <anchoritem dst="icon_box" dstEdge="LEFT" spacing="var(hb-param-margin-gene-popup)" src="" srcEdge="LEFT"/>
+ <anchoritem dst="icon_box" dstEdge="TOP" spacing="var(hb-param-margin-gene-popup)" src="" srcEdge="TOP"/>
+ <anchoritem dst="icon_box" dstEdge="RIGHT" spacing="-var(hb-param-margin-gene-popup)" src="" srcEdge="RIGHT"/>
+ <anchoritem dst="icon_box" dstEdge="BOTTOM" spacing="-var(hb-param-margin-gene-popup)" src="" srcEdge="BOTTOM"/>
</layout>
</widget>
<ref object="add_to_homescreen" role="HbWidget:addAction"/>
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsaddappstocollectionstate.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsaddappstocollectionstate.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -179,8 +179,7 @@
mShowConfirmation(0), mInitialState(0), mSelectCollectionState(0),
mNewCollectionState(0), mAppsCheckListState(0), mActionType(
NoActionType), mApplicationsSortAttribute(NoHsSortAttribute),
- mCollectionsSortAttribute(NoHsSortAttribute), mAppsCheckList(0),
- mEditorDialog(0), mListDialog(0)
+ mAppsCheckList(0), mEditorDialog(0), mListDialog(0)
{
construct();
}
@@ -330,27 +329,19 @@
mApplicationsSortAttribute = static_cast<HsSortAttribute>(data.value(
appSortOrderKey()).toInt());
- mCollectionsSortAttribute = static_cast<HsSortAttribute>(data.value(
- collectionSortOrderKey()).toInt());
const int itemId = data.value(itemIdKey()).toInt();
mCollectionId = data.value(collectionIdKey()).toInt();
- if (itemId && (mCollectionsSortAttribute != NoHsSortAttribute
- || mCollectionId)) {
- //add selected app item form allAppView or collectionView
+ if (itemId) {
+ //add selected app item from allAppView or collectionView
mAppList.append(itemId);
-
mInitialState->addTransition(mSelectCollectionState);
-
mShowConfirmation = true;
- } else if (mApplicationsSortAttribute != NoHsSortAttribute
- && mCollectionsSortAttribute != NoHsSortAttribute) {
+ } else if (mApplicationsSortAttribute != NoHsSortAttribute) {
//add apps from allAppView options menu
mActionType = ViaAllViewOptionMenuType;
-
mInitialState->addTransition(mSelectCollectionState);
-
mShowConfirmation = true;
} else if (mCollectionId) {
//add apps from collectionView options menu
@@ -437,8 +428,7 @@
{
qDebug("HsAddAppsToCollectionState::selectCollection()");
HSMENUTEST_FUNC_ENTRY("HsAddAppsToCollectionState::selectCollection");
- mListDialog = new HsCollectionsListDialog(mCollectionsSortAttribute,
- mCollectionId);
+ mListDialog = new HsCollectionsListDialog(mCollectionId);
mListDialog->open(this, SLOT(listDialogFinished(HbAction*)));
HSMENUTEST_FUNC_EXIT("HsAddAppsToCollectionState::selectCollection");
}
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsaddtohomescreenstate.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsaddtohomescreenstate.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -17,14 +17,13 @@
#include <qstatemachine.h>
#include <hblabel.h>
-#include <hsiwidgetprovider.h>
#include <hsshortcutservice.h>
#include <hscontentservice.h>
#include <hbmessagebox.h>
#include <hbaction.h>
#include <hbnotificationdialog.h>
#include <hsmenueventfactory.h>
-
+#include "hsmenudialogfactory.h"
#include "hsaddtohomescreenstate.h"
#include "hsmenuevent.h"
#include "canotifier.h"
@@ -163,21 +162,9 @@
{
HSMENUTEST_FUNC_ENTRY("HsCollectionState::showMessageWidgetCorrupted");
- mCorruptedMessage = new HbMessageBox(HbMessageBox::MessageTypeQuestion);
- mCorruptedMessage->setAttribute(Qt::WA_DeleteOnClose);
-
- QString message(hbTrId("txt_applib_dialog_file_corrupted_unable_to_use_wi"));
- mCorruptedMessage->setText(message);
-
- mCorruptedMessage->clearActions();
- mConfirmAction = new HbAction(hbTrId("txt_common_button_ok"),
- mCorruptedMessage);
- mCorruptedMessage->addAction(mConfirmAction);
-
- HbAction *secondaryAction = new HbAction(
- hbTrId("txt_common_button_cancel"), mCorruptedMessage);
- mCorruptedMessage->addAction(secondaryAction);
-
+ mCorruptedMessage = HsMenuDialogFactory().create(
+ hbTrId("txt_applib_dialog_file_corrupted_unable_to_use_wi"));
+ mConfirmAction = mCorruptedMessage->actions().value(0);
mCorruptedMessage->open(this, SLOT(messageWidgetCorruptedFinished(HbAction*)));
HSMENUTEST_FUNC_EXIT("HsCollectionState::showMessageWidgetCorrupted");
@@ -190,7 +177,7 @@
void HsAddToHomeScreenState::messageWidgetCorruptedFinished
(HbAction* finishedAction)
{
- if (finishedAction == mConfirmAction) {
+ if (static_cast<QAction*>(finishedAction) == mConfirmAction) {
HsMenuService::executeAction(mEntryId, removeActionIdentifier());
}
emit exit();
@@ -198,6 +185,7 @@
machine()->postEvent(
HsMenuEventFactory::createOpenHomeScreenEvent());
}
+ mConfirmAction = NULL;
}
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsarrangestate.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsarrangestate.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -78,7 +78,7 @@
*/
HsArrangeState::HsArrangeState(QState *parent) :
QState(parent), mDialog(0), mEntriesList(0),
- mItemModel(0)
+ mItemModel(0),mCollectionId(0)
{
construct();
}
@@ -119,9 +119,10 @@
HSMENUTEST_FUNC_ENTRY("HsArrangeState::save");
getArrangedEntriesIds(listWidget);
- if (mArrangedCollIdList != mCollIdList) {
+ if (mArrangedCollItemIdList != mCollItemIdList) {
HsMenuService::organizeCollection(
- HsMenuService::allCollectionsId(), mArrangedCollIdList);
+ mCollectionId,
+ mArrangedCollItemIdList);
}
HSMENUTEST_FUNC_EXIT("HsArrangeState::save");
@@ -156,9 +157,22 @@
mDialog = qobject_cast<HbDialog*>(
loader.findWidget(HS_ARRANGE_DIALOG_NAME));
- if (mEntriesList != NULL && mDialog != NULL) {
+ if (mEntriesList && mDialog) {
+ switch (menuEvent->operation()) {
+ case HsMenuEvent::ArrangeCollection:
+ mCollectionId = data.value(collectionIdKey()).toInt();
+ mItemModel = HsMenuService::getCollectionModel(
+ mCollectionId,
+ NoHsSortAttribute);
+ break;
+ case HsMenuEvent::ArrangeAllCollections:
+ mCollectionId = HsMenuService::allCollectionsId();
+ mItemModel = HsMenuService::getAllCollectionsModel();
+ break;
+ default:
+ break;
+ }
- mItemModel = HsMenuService::getAllCollectionsModel();
// as we copy the model contents to the list widget
// we do not need the model to auto update
mItemModel->setAutoUpdate(false);
@@ -171,7 +185,7 @@
mEntriesList->setArrangeMode(true);
mDialog->setTimeout(HbPopup::NoTimeout);
- mDialog->setAttribute(Qt::WA_DeleteOnClose, true);
+ mDialog->setAttribute(Qt::WA_DeleteOnClose);
mDialog->setPreferredSize(
HbInstance::instance()->allMainWindows().at(0)->size());
@@ -201,7 +215,8 @@
{
HSMENUTEST_FUNC_ENTRY("HsArrangeState::stateExited");
if (mDialog) {
- disconnect(mDialog, SIGNAL(finished(HbAction*)), this, SLOT(arrangeDialogFinished(HbAction*)));
+ disconnect(mDialog, SIGNAL(finished(HbAction*)),
+ this, SLOT(arrangeDialogFinished(HbAction*)));
mDialog->close();
mDialog = NULL;
}
@@ -212,8 +227,8 @@
delete mItemModel;
mItemModel = NULL;
- mArrangedCollIdList.clear();
- mCollIdList.clear();
+ mArrangedCollItemIdList.clear();
+ mCollItemIdList.clear();
HSMENUTEST_FUNC_EXIT("HsArrangeState::stateExited");
qDebug("HsArrangeState::stateExited()");
@@ -235,7 +250,7 @@
int itemId = mItemModel->data(idx, CaItemModel::IdRole).toInt();
widgetItem->setData(mItemModel->data(idx, CaItemModel::IdRole),
CaItemModel::IdRole);
- mCollIdList.append(itemId);
+ mCollItemIdList.append(itemId);
widgetItem->setData(mItemModel->data(idx, Qt::DisplayRole),
Qt::DisplayRole);
widgetItem->setData(mItemModel->data(idx, Qt::DecorationRole),
@@ -259,6 +274,6 @@
for (int i(0); i < listWidget.count(); ++i) {
HbListWidgetItem *widgetItem = listWidget.item(i);
QVariant entryId = widgetItem->data(CaItemModel::IdRole);
- mArrangedCollIdList.append(entryId.toInt());
+ mArrangedCollItemIdList.append(entryId.toInt());
}
}
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hscollectionslistdialog.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hscollectionslistdialog.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -58,19 +58,19 @@
to remove from list.
\retval void
*/
-HsCollectionsListDialog::HsCollectionsListDialog(HsSortAttribute sortOrder,
- int collectionId) :
+HsCollectionsListDialog::HsCollectionsListDialog(int collectionId) :
HbSelectionDialog(), mItemId(0)
{
clearActions();
- HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_cancel"), this);
+ HbAction *cancelAction = new HbAction(
+ hbTrId("txt_common_button_cancel"), this);
addAction(cancelAction);
setHeadingWidget(new HbLabel(hbTrId("txt_applib_title_add_to")));
// it must be single selection, although it shows checkboxes -
// it is Orbit defect and will be fixed in next release
setSelectionMode(HbAbstractItemView::SingleSelection);
- mModel = standartItemModel(sortOrder, collectionId);
+ mModel = standardItemModel(collectionId);
setModel(mModel);
}
@@ -96,7 +96,7 @@
\reimp
Disconnects signals and calls base class impl. which emits finished(HbAction*)
*/
-void HsCollectionsListDialog::closeEvent ( QCloseEvent * event )
+void HsCollectionsListDialog::closeEvent (QCloseEvent * event)
{
qDebug("HsCollectionsListDialog::closeEvent");
HbAction *closingAction = qobject_cast<HbAction *>(sender());
@@ -118,12 +118,12 @@
\param collectionId id of collection to remove from model.
\return QStandardItemModel - caller takes ownership.
*/
-QStandardItemModel *HsCollectionsListDialog::standartItemModel(
- HsSortAttribute sortOrder, int collectionId)
+QStandardItemModel *HsCollectionsListDialog::standardItemModel(
+ int collectionId)
{
HSMENUTEST_FUNC_ENTRY("HsListDialog::standartItemModel");
QScopedPointer<HsMenuItemModel> caModel(
- HsMenuService::getAllCollectionsModel(sortOrder));
+ HsMenuService::getAllCollectionsModel());
caModel->setSecondLineVisibility(false);
QStandardItemModel *model = new QStandardItemModel(this);
QList<QStandardItem *> items;
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsdeletecollectionitemstate.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsdeletecollectionitemstate.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -15,12 +15,13 @@
*
*/
-#include <hbmessagebox.h>
+#include <HbMessageBox>
#include <hbaction.h>
#include <HbParameterLengthLimiter>
#include <hsmenuservice.h>
#include <hsmenueventfactory.h>
+#include "hsmenudialogfactory.h"
#include "hsdeletecollectionitemstate.h"
#include "hsmenuevent.h"
@@ -86,18 +87,8 @@
HsMenuService::getName(mItemId)));
// create and show message box
- mDeleteMessage = new HbMessageBox(HbMessageBox::MessageTypeQuestion);
- mDeleteMessage->setAttribute(Qt::WA_DeleteOnClose);
-
- mDeleteMessage->setText(message);
-
- mDeleteMessage->clearActions();
- mConfirmAction = new HbAction(hbTrId("txt_common_button_ok"), mDeleteMessage);
- mDeleteMessage->addAction(mConfirmAction);
-
- HbAction *secondaryAction = new HbAction(hbTrId("txt_common_button_cancel"), mDeleteMessage);
- mDeleteMessage->addAction(secondaryAction);
-
+ mDeleteMessage = HsMenuDialogFactory().create(message);
+ mConfirmAction = mDeleteMessage->actions().value(0);
mDeleteMessage->open(this, SLOT(deleteMessageFinished(HbAction*)));
HSMENUTEST_FUNC_EXIT("HsDeleteCollectionItemState::onEntry");
@@ -110,10 +101,11 @@
*/
void HsDeleteCollectionItemState::deleteMessageFinished(HbAction* finishedAction)
{
- if (finishedAction == mConfirmAction) {
+ if (static_cast<QAction*>(finishedAction) == mConfirmAction) {
HsMenuService::removeApplicationFromCollection(mItemId, mCollectionId);
}
emit exit();
+ mConfirmAction = NULL;
}
/*!
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsdeletecollectionstate.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsdeletecollectionstate.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -16,7 +16,7 @@
*/
#include <QStateMachine>
-#include <hbmessagebox.h>
+#include <HbMessageBox>
#include <hbaction.h>
#include <hsmenuservice.h>
#include <HbParameterLengthLimiter>
@@ -24,6 +24,7 @@
#include <hsmenueventfactory.h>
#include "hsdeletecollectionstate.h"
+#include "hsmenudialogfactory.h"
#include "hsmenuevent.h"
/*!
@@ -91,19 +92,10 @@
}
// create and show message box
- mDeleteMessage = new HbMessageBox(HbMessageBox::MessageTypeQuestion);
- mDeleteMessage->setAttribute(Qt::WA_DeleteOnClose);
-
- mDeleteMessage->setText(message);
+ mDeleteMessage = HsMenuDialogFactory().create(message);
+ mConfirmAction = mDeleteMessage->actions().value(0);
+ mDeleteMessage->open(this, SLOT(deleteMessageFinished(HbAction*)));
- mDeleteMessage->clearActions();
- mConfirmAction = new HbAction(hbTrId("txt_common_button_ok"), mDeleteMessage);
- mDeleteMessage->addAction(mConfirmAction);
-
- HbAction *secondaryAction = new HbAction(hbTrId("txt_common_button_cancel"), mDeleteMessage);
- mDeleteMessage->addAction(secondaryAction);
-
- mDeleteMessage->open(this, SLOT(deleteMessageFinished(HbAction*)));
HSMENUTEST_FUNC_EXIT("HsDeleteCollectionState::onEntry");
}
@@ -113,12 +105,13 @@
//
void HsDeleteCollectionState::deleteMessageFinished(HbAction* finishedAction)
{
- if (finishedAction == mConfirmAction) {
+ if (static_cast<QAction*>(finishedAction) == mConfirmAction) {
HsMenuService::removeCollection(mItemId);
machine()->postEvent(
HsMenuEventFactory::createCollectionDeletedEvent());
}
emit exit();
+ mConfirmAction = NULL;
}
/*!
@@ -129,7 +122,6 @@
{
// Close messagebox if App key was pressed
if (mDeleteMessage) {
- disconnect(mDeleteMessage, SIGNAL(finished(HbAction*)), this, SLOT(deleteMessageFinished(HbAction*)));
mDeleteMessage->close();
mDeleteMessage = NULL;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsinstallationlogstate.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 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: Menu delete collection item state
+ *
+ */
+
+#include <HbDocumentLoader>
+#include <HbLabel>
+#include <HbMessageBox>
+#include <QAction>
+#include <hsmenuservice.h>
+#include <casoftwareregistry.h>
+
+#include "hsinstallationlogstate.h"
+
+/*!
+ \class HsInstallationLogState
+ \ingroup group_hsworkerstateplugin
+ \brief Uninstall Item State.
+ Deletes app from collection.
+ */
+
+/*!
+ Constructor.
+ \param parent Parent state.
+ */
+HsInstallationLogState::HsInstallationLogState(QState *parent) :
+ QState(parent),
+ mInstalationLogDialog(NULL)
+{
+ construct();
+}
+
+/*!
+ Destructor.
+ */
+HsInstallationLogState::~HsInstallationLogState()
+{
+ cleanUp(); // in case of throw
+}
+
+/*!
+ Constructs contained objects.
+ */
+void HsInstallationLogState::construct()
+{
+ setObjectName("/InstallationLogState");
+ if (this->parent()) {
+ setObjectName(this->parent()->objectName() + objectName());
+ }
+ connect(this, SIGNAL(exited()), SLOT(cleanUp()));
+}
+
+/*!
+ Sets entry event.
+ \param event entry event.
+ */
+void HsInstallationLogState::onEntry(QEvent *event)
+{
+ HSMENUTEST_FUNC_ENTRY("HsInstallationLogState::onEntry");
+ QState::onEntry(event);
+ qDebug("HsInstallationLogState::onEntry()");
+
+ createInstallationLogDialog();
+
+ HSMENUTEST_FUNC_EXIT("HsInstallationLogState::onEntry");
+}
+
+/*!
+ Invoked on exiting state
+ */
+void HsInstallationLogState::onExit(QEvent *event)
+{
+ QState::onExit(event);
+}
+
+/*!
+ Create installation log dialog.
+ \retval void
+ */
+void HsInstallationLogState::createInstallationLogDialog()
+{
+ QList<CaSoftwareRegistry::DetailMap> detailsList =
+ CaSoftwareRegistry::create()->retrieveLogEntries();
+
+ HbDocumentLoader loader;
+ bool loadStatusOk = false;
+ loader.load(HS_INSTALLATION_LOG_DIALOG_LAYOUT, &loadStatusOk);
+ Q_ASSERT_X(loadStatusOk, HS_INSTALLATION_LOG_DIALOG_LAYOUT,
+ "Error while loading docml file.");
+
+ mInstalationLogDialog = qobject_cast<HbDialog*>(
+ loader.findWidget(HS_INSTALLATION_LOG_DIALOG_NAME));
+
+ if (mInstalationLogDialog != NULL) {
+ mInstalationLogDialog->actions()[0]->setParent(mInstalationLogDialog);
+ mInstalationLogDialog->setTimeout(HbPopup::NoTimeout);
+ mInstalationLogDialog->setAttribute(Qt::WA_DeleteOnClose, true);
+
+ HbLabel* logList;
+ QString applicationsList;
+ QString listElement("%1 (%2)\n%3 - ");
+ QString applicationName;
+ QString version;
+ QString date;
+ QString type;
+ QString installed(hbTrId("txt_applib_dialog_installed"));
+ QString removed(hbTrId("txt_applib_dialog_removed"));
+ QString newLine("\n");
+
+ logList = qobject_cast<HbLabel*>(
+ loader.findWidget(HS_INSTALLATION_LOG_DIALOG_LOG_LABEL));
+
+ for (int i=0; i<detailsList.count(); i++) {
+ applicationName = detailsList[i].value(CaSoftwareRegistry::componentNameKey());
+ version = detailsList[i].value(CaSoftwareRegistry::componentVersionKey());
+ date = detailsList[i].value(CaSoftwareRegistry::componentTimeKey());
+ QString localListElement(listElement);
+ localListElement = localListElement.arg(applicationName).arg(version).arg(date);
+ type = detailsList[i].value(CaSoftwareRegistry::componentOperationTypeKey());
+ if ((type.compare(CaSoftwareRegistry::componentInstallValue()) == 0) ||
+ (type.compare(CaSoftwareRegistry::componentUpgradeValue()) == 0)) {
+ localListElement = localListElement + installed;
+ applicationsList = applicationsList + localListElement +
+ newLine + newLine;
+ } else if (type.compare(CaSoftwareRegistry::componentUninstallValue()) == 0) {
+ localListElement = localListElement + removed;
+ applicationsList = applicationsList + localListElement +
+ newLine + newLine;
+ }
+ }
+ logList->setPlainText(applicationsList);
+
+ mInstalationLogDialog->open(this, SLOT(stateExited()));
+ }
+}
+
+void HsInstallationLogState::stateExited()
+{
+ mInstalationLogDialog = NULL;
+ emit exit();
+}
+
+/*!
+ Slot launched after state has exited and in destructor.
+ \retval void
+ */
+void HsInstallationLogState::cleanUp()
+{
+ // Close popups if App key was pressed
+ if (mInstalationLogDialog) {
+ mInstalationLogDialog->close();
+ mInstalationLogDialog = NULL;
+ }
+}
+
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsmenuworkerstate.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsmenuworkerstate.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -28,6 +28,7 @@
#include "hspreviewhswidgetstate.h"
#include "hsviewappsettingsstate.h"
#include "hsviewappdetailsstate.h"
+#include "hsinstallationlogstate.h"
/*!
\class HsMenuWorkerState
@@ -79,7 +80,9 @@
createChildState<HsUninstallItemState> (
HsMenuEvent::UninstallApplication);
createChildState<HsArrangeState> (HsMenuEvent::ArrangeCollection);
+ createChildState<HsArrangeState> (HsMenuEvent::ArrangeAllCollections);
+
// create a new child state based on the template
HsCollectionNameState *newChildState = new HsCollectionNameState(this);
// create a transition to the new child state which will be triggered by
@@ -95,7 +98,8 @@
mInitialState->addTransition(createCollectionTransition);
// set a transition to the initial state after child processing finished
newChildState->addTransition(newChildState, SIGNAL(exit()), mInitialState);
-
+ connect(this, SIGNAL(reset()), newChildState, SIGNAL(exit()));
+
HsAddAppsToCollectionState *addAppsToCollectionState =
new HsAddAppsToCollectionState(this);
// create a transition to the new child state which will be triggered by
@@ -108,9 +112,12 @@
addAppsToCollectionState->addTransition(addAppsToCollectionState,
SIGNAL(finished()), mInitialState);
connect(this, SIGNAL(reset()), addAppsToCollectionState, SIGNAL(finished()));
+
+
createChildState<HsPreviewHSWidgetState> (HsMenuEvent::PreviewHSWidget);
createChildState<HsViewAppSettingsState> (HsMenuEvent::ShowAppSettings);
createChildState<HsViewAppDetailsState> (HsMenuEvent::ShowAppDetails);
+ createChildState<HsInstallationLogState> (HsMenuEvent::ShowInstallationLog);
HSMENUTEST_FUNC_EXIT("HsMenuWorkerState::construct");
}
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hspreviewhswidgetstate.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hspreviewhswidgetstate.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -35,6 +35,7 @@
#include "hswidgethost.h"
#include "hspreviewhswidgetstate.h"
#include "hsmenuevent.h"
+#include "hsmenudialogfactory.h"
#include "hsapp_defs.h"
#include "hsscene.h"
#include "hspage.h"
@@ -64,9 +65,10 @@
QState(parent),
mPreviewDialog(0),
mNotifier(0),
- mWidget(0),
mEntryId(0),
- mCorruptedMessage(0)
+ mCorruptedMessage(0),
+ mToken(),
+ mUri()
{
setObjectName("/HsPreviewHSWidgetState");
if (this->parent()) {
@@ -100,32 +102,21 @@
HSMENUTEST_FUNC_ENTRY("HsPreviewHSWidgetState::onEntry");
QState::onEntry(event);
HsMenuEvent *menuEvent = static_cast<HsMenuEvent *>(event);
+
QVariantMap data = menuEvent->data();
-
mEntryId = data.value(itemIdKey()).toInt();
-
- QVariantHash widgetData;
- widgetData.insert(LIBRARY, data.value(widgetLibraryAttributeName()).toString());
- widgetData.insert(URI, data.value(widgetUriAttributeName()).toString());
-
- mWidget.reset(
- HsContentService::instance()->createWidgetForPreview(widgetData));
-
- if (!mWidget.isNull()) {
+ mToken = data.value(HOMESCREENDATA);
+
- QSharedPointer<CaEntry> entry =
- CaService::instance()->getEntry(mEntryId);
-
- mPreviewDialog = buildPreviewDialog(*entry);
-
- if (mPreviewDialog != NULL) {
- subscribeForMemoryCardRemove();
- // Launch popup asyncronously
- mPreviewDialog->open(this, SLOT(previewDialogFinished(HbAction*)));
- }
- } else {
+ QSharedPointer<CaEntry> entry =
+ CaService::instance()->getEntry(mEntryId);
+ mUri = entry->attribute(widgetUriAttributeName());
+ mPreviewDialog = buildPreviewDialog(*entry);
+
+ if (mPreviewDialog != NULL) {
subscribeForMemoryCardRemove();
- showMessageWidgetCorrupted();
+ // Launch popup asyncronously
+ mPreviewDialog->open(this, SLOT(previewDialogFinished(HbAction*)));
}
HSMENUTEST_FUNC_EXIT("HsPreviewHSWidgetState::onEntry");
@@ -152,7 +143,7 @@
mCorruptedMessage = NULL;
}
- mWidget.reset();
+ mToken = NULL;
disconnect(mNotifier,
SIGNAL(entryChanged(CaEntry,ChangeType)),
@@ -168,21 +159,28 @@
*/
void HsPreviewHSWidgetState::previewDialogFinished(HbAction* finishedAction)
{
- if (finishedAction == mPreviewDialog->actions().value(0)) {
+ if (static_cast<QAction*>(finishedAction) == mPreviewDialog->actions().value(0)) {
- HsScene::instance()->activePage()->addNewWidget(
- mWidget.take()); // ownership transferred
- HbNotificationDialog *notificationDialog = new HbNotificationDialog();
- notificationDialog->setAttribute(Qt::WA_DeleteOnClose);
- notificationDialog->setTitle(hbTrId(
- "txt_applib_dpophead_added_to_homescreen") );
- notificationDialog->show();
+ QVariantHash widgetData;
+ widgetData[URI] = mUri;
+ widgetData[HOMESCREENDATA] = mToken;
+
+ bool success = HsContentService::instance()->createWidget(widgetData);
+
+ if (success) {
+ HbNotificationDialog *notificationDialog = new HbNotificationDialog();
+ notificationDialog->setAttribute(Qt::WA_DeleteOnClose);
+ notificationDialog->setTitle(hbTrId("txt_applib_dpophead_added_to_homescreen"));
+ notificationDialog->show();
+ emit exit();
+ }
+ else {
+ mPreviewDialog = NULL;
+ showMessageWidgetCorrupted();
+ }
} else {
- mWidget->remove();
- mWidget.take();
- mWidget.reset();
+ emit exit();
}
- emit exit();
}
/*!
@@ -210,20 +208,11 @@
{
HSMENUTEST_FUNC_ENTRY("HsCollectionState::showMessageWidgetCorrupted");
- mCorruptedMessage = new HbMessageBox(HbMessageBox::MessageTypeQuestion);
- mCorruptedMessage->setAttribute(Qt::WA_DeleteOnClose);
-
- QString message(hbTrId("txt_applib_dialog_file_corrupted_unable_to_use_wi"));
- mCorruptedMessage->setText(message);
-
- mCorruptedMessage->clearActions();
- HbAction *primaryAction = new HbAction(hbTrId("txt_common_button_ok"), mCorruptedMessage);
- mCorruptedMessage->addAction(primaryAction);
-
- HbAction *secondaryAction = new HbAction(hbTrId("txt_common_button_cancel"), mCorruptedMessage);
- mCorruptedMessage->addAction(secondaryAction);
+ mCorruptedMessage = HsMenuDialogFactory().create(
+ hbTrId("txt_applib_dialog_file_corrupted_unable_to_use_wi"));
mCorruptedMessage->open(this, SLOT(messageWidgetCorruptedFinished(HbAction*)));
+
HSMENUTEST_FUNC_EXIT("HsCollectionState::showMessageWidgetCorrupted");
}
@@ -233,7 +222,7 @@
*/
void HsPreviewHSWidgetState::messageWidgetCorruptedFinished(HbAction* finishedAction)
{
- if (finishedAction == mCorruptedMessage->actions().value(0)) {
+ if (static_cast<QAction*>(finishedAction) == mCorruptedMessage->actions().value(0)) {
HsMenuService::executeAction(mEntryId, removeActionIdentifier());
}
emit exit();
@@ -283,6 +272,8 @@
if (!previewImageName.isEmpty()) {
const HbIcon previewImage(previewImageName);
if (previewImage.size().isValid()) {
+ iconBox->setMinimumHeight(previewImage.height());
+ iconBox->setMaximumHeight(previewImage.height());
iconBox->setIcon(previewImage);
}
}
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsuninstallitemstate.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsuninstallitemstate.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -33,6 +33,7 @@
#include "hsuninstallitemstate.h"
#include "hsmenuevent.h"
+#include "hsmenudialogfactory.h"
/*!
\class HsUninstallItemState
@@ -111,9 +112,10 @@
*/
void HsUninstallItemState::uninstallMessageFinished(HbAction* finishedAction)
{
- if (finishedAction == mConfirmAction) {
+ if (static_cast<QAction*>(finishedAction) == mConfirmAction) {
HsMenuService::executeAction(mItemId, removeActionIdentifier());
}
+ mConfirmAction = NULL;
emit exit();
}
@@ -226,20 +228,8 @@
}
// create and show message box
- mUninstallMessage = new HbMessageBox(HbMessageBox::MessageTypeQuestion);
- mUninstallMessage->setAttribute(Qt::WA_DeleteOnClose);
-
- mUninstallMessage->setText(message);
-
- mUninstallMessage->clearActions();
- mConfirmAction = new HbAction(hbTrId("txt_common_button_ok"),
- mUninstallMessage);
- mUninstallMessage->addAction(mConfirmAction);
-
- HbAction *secondaryAction = new HbAction(hbTrId("txt_common_button_cancel"),
- mUninstallMessage);
- mUninstallMessage->addAction(secondaryAction);
-
+ mUninstallMessage = HsMenuDialogFactory().create(message);
+ mConfirmAction = mUninstallMessage->actions().value(0);
mUninstallMessage->open(this, SLOT(uninstallMessageFinished(HbAction*)));
}
@@ -251,7 +241,7 @@
{
HbDocumentLoader loader;
bool loadStatusOk = false;
- mObjectList = loader.load(HS_UNINSTALL_DIALOG_LAYOUT, &loadStatusOk);
+ loader.load(HS_UNINSTALL_DIALOG_LAYOUT, &loadStatusOk);
Q_ASSERT_X(loadStatusOk,
HS_UNINSTALL_DIALOG_LAYOUT,
@@ -266,67 +256,71 @@
if (applicationsNames.isEmpty() && detailsMessage.isEmpty()) {
mDialogType = UninstallDialogDefinition01;
section = QString("uninstallDialogDefinition01");
- mObjectList = loader.load(
+ loader.load(
HS_UNINSTALL_DIALOG_LAYOUT, section, &loadStatusOk);
} else if ( (!applicationsNames.isEmpty()) && (!detailsMessage.isEmpty())) {
mDialogType = UninstallDialogDefinition02;
section = QString("uninstallDialogDefinition02");
- mObjectList = loader.load(
+ loader.load(
HS_UNINSTALL_DIALOG_LAYOUT, section, &loadStatusOk);
} else if ( (!applicationsNames.isEmpty() && detailsMessage.isEmpty())) {
mDialogType = UninstallDialogDefinition03;
section = QString("uninstallDialogDefinition03");
- mObjectList = loader.load(
+ loader.load(
HS_UNINSTALL_DIALOG_LAYOUT, section, &loadStatusOk);
} else if (applicationsNames.isEmpty() && (!detailsMessage.isEmpty())) {
mDialogType = UninstallDialogDefinition04;
section = QString("uninstallDialogDefinition04");
- mObjectList = loader.load(
+ loader.load(
HS_UNINSTALL_DIALOG_LAYOUT, section, &loadStatusOk);
}
mUninstallJavaMessage =
qobject_cast<HbDialog*>(
loader.findWidget(HS_UNINSTALL_DIALOG_NAME));
+ if (mUninstallJavaMessage != NULL) {
+ mUninstallJavaMessage->setAttribute(Qt::WA_DeleteOnClose);
+ mUninstallJavaMessage->setTimeout(HbPopup::NoTimeout);
+ mUninstallJavaMessage->actions()[0]->setParent(mUninstallJavaMessage);
+ mUninstallJavaMessage->actions()[1]->setParent(mUninstallJavaMessage);
- HbLabel* iconLabel =
- qobject_cast<HbLabel*>(
- loader.findWidget(HS_UNINSTALL_DIALOG_CONFIRMATION_DIALOG_ICON));
- QSharedPointer<CaEntry> entry2 = CaService::instance()->getEntry(mItemId);
- HbIcon icon = entry2->makeIcon();
- iconLabel->setIcon(icon);
+ HbLabel* iconLabel =
+ qobject_cast<HbLabel*>(
+ loader.findWidget(HS_UNINSTALL_DIALOG_CONFIRMATION_DIALOG_ICON));
+ QSharedPointer<CaEntry> entry2 = CaService::instance()->getEntry(mItemId);
+ HbIcon icon = entry2->makeIcon();
+ iconLabel->setIcon(icon);
- HbLabel* textLabel =
- qobject_cast<HbLabel*>(
- loader.findWidget(HS_UNINSTALL_DIALOG_CONFIRMATION_DIALOG_LABEL));
- textLabel->setPlainText(textLabel->plainText().arg(componentName));
+ HbLabel* textLabel =
+ qobject_cast<HbLabel*>(
+ loader.findWidget(HS_UNINSTALL_DIALOG_CONFIRMATION_DIALOG_LABEL));
+ textLabel->setPlainText(textLabel->plainText().arg(componentName));
- HbLabel* detailsUninstalLabel;
- if ((mDialogType == UninstallDialogDefinition02) ||
- (mDialogType == UninstallDialogDefinition04)) {
- detailsUninstalLabel= qobject_cast<HbLabel*>(
- loader.findWidget(HS_UNINSTALL_DIALOG_DELETE_LABEL));
- detailsUninstalLabel->setPlainText(detailsMessage);
- }
+ HbLabel* detailsUninstalLabel;
+ if ((mDialogType == UninstallDialogDefinition02) ||
+ (mDialogType == UninstallDialogDefinition04)) {
+ detailsUninstalLabel= qobject_cast<HbLabel*>(
+ loader.findWidget(HS_UNINSTALL_DIALOG_DELETE_LABEL));
+ detailsUninstalLabel->setPlainText(detailsMessage);
+ }
- HbLabel* listView;
- QString applicationsList;
- QString newLine("\n");
- if ((mDialogType == UninstallDialogDefinition02) ||
- (mDialogType == UninstallDialogDefinition03)) {
- listView = qobject_cast<HbLabel*>(
- loader.findWidget(HS_UNINSTALL_DIALOG_LIST_VIEW_LABEL));
+ HbLabel* listView;
+ QString applicationsList;
+ QString newLine("\n");
+ if ((mDialogType == UninstallDialogDefinition02) ||
+ (mDialogType == UninstallDialogDefinition03)) {
+ listView = qobject_cast<HbLabel*>(
+ loader.findWidget(HS_UNINSTALL_DIALOG_LIST_VIEW_LABEL));
- for (int i=0; i<applicationsNames.count(); i++) {
- applicationsList = applicationsList + applicationsNames[i] + newLine;
+ for (int i=0; i<applicationsNames.count(); i++) {
+ applicationsList = applicationsList + applicationsNames[i] + newLine;
+ }
+ listView->setPlainText(applicationsList);
}
- listView->setPlainText(applicationsList);
+
+ mConfirmAction = qobject_cast<HbAction*>(loader.findObject(
+ HS_UNINSTALL_DIALOG_CONFIRMATION_ACTION));
+
+ mUninstallJavaMessage->open(this, SLOT(uninstallMessageFinished(HbAction*)));
}
-
- mUninstallJavaMessage->setAttribute(Qt::WA_DeleteOnClose);
- mUninstallJavaMessage->setTimeout(HbPopup::NoTimeout);
- mConfirmAction = qobject_cast<HbAction*>(loader.findObject(
- HS_UNINSTALL_DIALOG_CONFIRMATION_ACTION));
-
- mUninstallJavaMessage->open(this, SLOT(uninstallMessageFinished(HbAction*)));
}
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsviewappdetailsstate.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsviewappdetailsstate.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -31,10 +31,12 @@
#include "hsmenuevent.h"
#include "hsmenuitemmodel.h"
+static const char *const HS_VIEWAPPDETAILS_JAVA_DIALOG_SECTION_NAME=
+ "detailsDialogForJavaApplication";
/*!
Constructor.
- @param parent Parent state.
+ /param parent Parent state.
*/
HsViewAppDetailsState::HsViewAppDetailsState(QState *parent) :
QState(parent), mDialog(0), mNotifier(0)
@@ -58,7 +60,7 @@
void HsViewAppDetailsState::construct()
{
HSMENUTEST_FUNC_ENTRY("HsViewAppDetailsState::construct");
-
+
setObjectName("/ViewAppDetailsState");
if (this->parent()) {
setObjectName(this->parent()->objectName() + objectName());
@@ -75,61 +77,95 @@
QState::onEntry(event);
HsMenuEvent *menuEvent = static_cast<HsMenuEvent *>(event);
QVariantMap data = menuEvent->data();
-
+
const int entryId = data.value(itemIdKey()).toInt();
- QSharedPointer<const CaEntry> entry
+ QSharedPointer<const CaEntry> entry
= CaService::instance()->getEntry(entryId);
const int componentId = entry->attribute(
componentIdAttributeName()).toInt();
QSharedPointer<CaSoftwareRegistry> scr = CaSoftwareRegistry::create();
CaSoftwareRegistry::DetailMap detailMap = scr->entryDetails(componentId);
+
+ QString appType = entry->attribute(swTypeKey());
+
+
+ //TODO: Should we display something In that case?
+ if (detailMap.size() < 1){
+ return;
+ }
HbDocumentLoader loader;
bool loadStatusOk = false;
- mObjectList = loader.load(HS_DETAILS_DIALOG_LAYOUT, &loadStatusOk);
+ loader.load(HS_DETAILS_DIALOG_LAYOUT, &loadStatusOk);
Q_ASSERT_X(loadStatusOk, HS_DETAILS_DIALOG_LAYOUT,
"Error while loading docml file.");
+ if (!appType.compare(javaSwType())) {
+ QString section = QString(HS_VIEWAPPDETAILS_JAVA_DIALOG_SECTION_NAME);
+ loader.load(HS_DETAILS_DIALOG_LAYOUT,
+ section, &loadStatusOk);
+ }
+
mDialog = qobject_cast<HbDialog*>(
loader.findWidget(HS_DETAILS_DIALOG_NAME));
- mDialog->actions()[0]->setParent(mDialog);
-
- subscribeForMemoryCardRemove(entryId);
-
- HbLabel* nameLabel = qobject_cast<HbLabel*>(
- loader.findWidget(CaSoftwareRegistry::componentNameKey()));
- HbLabel* versionLabel = qobject_cast<HbLabel*>(
- loader.findWidget(CaSoftwareRegistry::componentVersionKey()));
- HbLabel* supplierLabel = qobject_cast<HbLabel*>(
- loader.findWidget(CaSoftwareRegistry::componentVendorKey()));
- HbLabel* memoryLabel = qobject_cast<HbLabel*>(
- loader.findWidget(CaSoftwareRegistry::componentDriveInfoKey()));
- HbLabel* sizeLabel = qobject_cast<HbLabel*>(
- loader.findWidget(CaSoftwareRegistry::componentSizeKey()));
- HbLabel* typeLabel = qobject_cast<HbLabel*>(
- loader.findWidget(CaSoftwareRegistry::componentTypeKey()));
-
- nameLabel->setPlainText(
- detailMap[CaSoftwareRegistry::componentNameKey()]);
- versionLabel->setPlainText(
- detailMap[CaSoftwareRegistry::componentVersionKey()]);
- supplierLabel->setPlainText(
- detailMap[CaSoftwareRegistry::componentVendorKey()]);
- memoryLabel->setPlainText(
- detailMap[CaSoftwareRegistry::componentDriveInfoKey()]);
- sizeLabel->setPlainText(
- detailMap[CaSoftwareRegistry::componentSizeKey()]);
- typeLabel->setPlainText(
- detailMap[CaSoftwareRegistry::componentTypeKey()]);
-
if (mDialog != NULL) {
mDialog->setTimeout(HbPopup::NoTimeout);
mDialog->setAttribute(Qt::WA_DeleteOnClose, true);
+ mDialog->actions()[0]->setParent(mDialog);
+
+ subscribeForMemoryCardRemove(entryId);
+
+ setFieldPresentation(CaSoftwareRegistry::componentNameKey(),
+ detailMap, loader);
+ setFieldPresentation(CaSoftwareRegistry::componentVersionKey(),
+ detailMap, loader);
+ setFieldPresentation(CaSoftwareRegistry::componentVendorKey(),
+ detailMap, loader);
+ setFieldPresentation(CaSoftwareRegistry::componentDriveInfoKey(),
+ detailMap, loader);
+ setFieldPresentation(CaSoftwareRegistry::componentSizeKey(),
+ detailMap, loader);
+ setFieldPresentation(CaSoftwareRegistry::componentTypeKey(),
+ detailMap, loader);
+
+ if (!appType.compare(javaSwType())) {
+ setFieldPresentation(CaSoftwareRegistry::componentDescriptionKey(),
+ detailMap, loader);
+ setFieldPresentation(CaSoftwareRegistry::componentProtectionDomainKey(),
+ detailMap, loader);
+ }
mDialog->open(this, SLOT(stateExited()));
}
- HSMENUTEST_FUNC_EXIT("HsViewAppDetailsState::onEntry");
+ HSMENUTEST_FUNC_EXIT("HsViewAppDetailsState::onEntry");
+}
+
+/*!
+ Extracting label from loader and set content of data field.
+ Hide label if the is no data to display.
+ \param key detail key.
+ \param detailMap detail map.
+ \param loader session to document loader
+ \retval void
+ */
+void HsViewAppDetailsState::setFieldPresentation(QString key,
+ CaSoftwareRegistry::DetailMap &detailMap,
+ HbDocumentLoader &loader)
+{
+ HbLabel* dataLabel = qobject_cast<HbLabel*>(
+ loader.findWidget(key));
+ QString data = detailMap[key];
+ if (data.isEmpty()) {
+ dataLabel->setVisible(false);
+ dataLabel->setMaximumHeight(0);
+ HbLabel* titleLabel = qobject_cast<HbLabel*>(
+ loader.findWidget(QString("_") + key));
+ titleLabel->setVisible(false);
+ titleLabel->setMaximumHeight(0);
+ } else {
+ dataLabel->setPlainText(data);
+ }
}
/*!
--- a/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsviewappsettingsstate.cpp Fri Jun 25 19:19:22 2010 +0300
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsviewappsettingsstate.cpp Fri Jul 09 14:36:01 2010 +0300
@@ -116,8 +116,7 @@
mActionConfirm = new HbAction(Hb::ConfirmNaviAction, mView);
connect(mActionConfirm, SIGNAL(triggered()),SLOT(settingsDone()));
- if(mView)
- {
+ if (mView) {
subscribeForMemoryCardRemove(entryId);
QObject::connect(this, SIGNAL(initialize(QString)), mView, SLOT(initialize(QString)));
mView->setParent(this);
@@ -132,7 +131,7 @@
mPreviousView = hbMainWindow->currentView();
hbMainWindow->setCurrentView(mView);
hbMainWindow->show();
- }
+ }
HSMENUTEST_FUNC_EXIT("HsViewAppSettingsState::onEntry");