[meego-commits] 15314: Changes to devel:qt-mtf/meegotouch-systemui

Miroslav Safr no_reply at build.meego.com
Mon Mar 28 08:29:35 UTC 2011


Hi,
I have made the following changes to meegotouch-systemui in project devel:qt-mtf. Please review and accept ASAP.

Thank You,
Miroslav Safr

[This message was auto-generated]

---

Request #15314:

  submit:   home:msafr/meegotouch-systemui(r3) -> devel:qt-mtf/meegotouch-systemui


Message:
    * Thu Mar 24 2011 Miroslav Safr <miroslav.safr at tieto.com.com> - 0.20.13
- BMC#8108 - [N900] Volume control does not work
- added dependency on QtOpenGL because we use QMeeGoLivePixmap
- BMC#8267 - There is only Settings icon displayed in drop down menu.
- BMC#9677 - [1.2: daily] No sound volume settings in device.

State:   new          2011-03-28T01:29:29 msafr
Comment: None



changes files:
--------------
--- meegotouch-systemui.changes
+++ meegotouch-systemui.changes
@@ -0,0 +1,6 @@
+* Thu Mar 24 2011 Miroslav Safr <miroslav.safr at tieto.com.com> - 0.20.13
+- BMC#8108 - [N900] Volume control does not work
+- added dependency on QtOpenGL because we use QMeeGoLivePixmap
+- BMC#8267 - There is only Settings icon displayed in drop down menu.
+- BMC#9677 - [1.2: daily] No sound volume settings in device.
+

old:
----
  meegotouch-systemui-0.20.12.tar.bz2

new:
----
  meegotouch-systemui-0.20.13.tar.bz2

spec files:
-----------
--- meegotouch-systemui.spec
+++ meegotouch-systemui.spec
@@ -7,7 +7,7 @@
 
 Name:       meegotouch-systemui
 Summary:    System UI daemon
-Version:    0.20.12
+Version:    0.20.13
 Release:    1
 Group:      System/Desktop
 License:    LGPLv2.1
@@ -18,6 +18,7 @@
 Source100:  meegotouch-systemui.yaml
 Requires:   %{name}-screenlock-padlock
 BuildRequires:  pkgconfig(QtGui)
+BuildRequires:  pkgconfig(QtOpenGL)
 BuildRequires:  pkgconfig(contextsubscriber-1.0)
 BuildRequires:  pkgconfig(dbus-1)
 BuildRequires:  pkgconfig(dbus-glib-1)

other changes:
--------------

++++++ meegotouch-systemui-0.20.12.tar.bz2 -> meegotouch-systemui-0.20.13.tar.bz2
--- debian/changelog
+++ debian/changelog
@@ -1,3 +1,12 @@
+system-ui (0.20.13-1) unstable; urgency=low
+
+  * Fixes: NB#229338 - Status menu doesn't load Bluetooth plugin
+  * Fixes: NB#231918 - Notification is shown even if no summary or body given.
+  * Fixes: NB#223556 - Impossible to detect cleared notification groups
+  * Fixes: NB#208457 - Pop-up notification for new message is not displayed on device
+
+ -- Jarkko Markkanen <ext-jarkko.3.markkanen at nokia.com>  Wed, 09 Mar 2011 09:00:00 +0200
+
 system-ui (0.20.12-1) unstable; urgency=low
 
   * Low power mode fixes
--- debian/control
+++ debian/control
@@ -6,7 +6,8 @@
                libqmsystem2-dev, libaegis-crypto-dev, libresourceqt-dev,
                libcontextsubscriber-dev, libngf-dev, libxcomposite-dev, libxext-dev,
                libdbus-1-dev, libdbus-glib-1-dev, libglib2.0-dev,
-               aegis-builder (>= 1.4), libduicontrolpanel-dev
+               aegis-builder (>= 1.4), libduicontrolpanel-dev,
+               libqt4-meegographicssystemhelper-dev
 Standards-Version: 3.8.0
 
 Package: system-ui
--- src/libnotificationsystem/notificationmanagerinterface.h
+++ src/libnotificationsystem/notificationmanagerinterface.h
@@ -146,6 +146,15 @@
     virtual QList<NotificationGroup> notificationGroupListWithIdentifiers(uint notificationUserId) = 0;
 
     /*!
+     * Returns amount of notifications in a given group
+     *
+     * \param notificationUserId the ID of the user of notifications
+     * \param groupId the group ID
+     * \return amount of notifications in given group
+     */
+    virtual uint notificationCountInGroup(uint notificationUserId, uint groupId) = 0;
+
+    /*!
      * Returns the qObject that implements the manager for signal connections.
      *
      * \return the qObject that implements the manager
--- src/systemui/notifications/dbusinterfacenotificationsource.cpp
+++ src/systemui/notifications/dbusinterfacenotificationsource.cpp
@@ -173,3 +173,8 @@
 
     return userGroups;
 }
+
+uint DBusInterfaceNotificationSource::notificationCountInGroup(uint notificationUserId, uint groupId)
+{
+    return manager.notificationCountInGroup(notificationUserId, groupId);
+}
--- src/systemui/notifications/dbusinterfacenotificationsource.h
+++ src/systemui/notifications/dbusinterfacenotificationsource.h
@@ -277,6 +277,15 @@
      * \return list of notification groups with associated identifiers that belong to notificationUserId
      */
     QList<MNotificationGroupWithIdentifierProxy> notificationGroupListWithIdentifiers(uint notificationUserId);
+
+    /*!
+     * Returns amount of notifications in a given group
+     *
+     * \param notificationUserId the ID of the user of notifications
+     * \param groupId the group ID
+     * \return amount of notifications in given group
+     */
+    uint notificationCountInGroup(uint notificationUserId, uint groupId);
 };
 
 #endif // DBUSINTERFACENOTIFICATIONSOURCE_H
--- src/systemui/notifications/mcompositornotificationsink.cpp
+++ src/systemui/notifications/mcompositornotificationsink.cpp
@@ -79,7 +79,7 @@
 
 void MCompositorNotificationSink::addNotification(const Notification &notification)
 {
-    if (!canAddNotification(notification)) {
+    if (!canAddNotification(notification) || !containsText(notification)) {
         return;
     }
 
--- src/systemui/notifications/notificationareasink.cpp
+++ src/systemui/notifications/notificationareasink.cpp
@@ -179,9 +179,8 @@
         if (infoBanner == NULL) {
             // Seems like the infoBanner is NULL. So it means that the group banner was removed, but group is alive. Recreate the banner.
             infoBanner = createGroupBanner(groupId, notificationGroupParameters.value(groupId));
-        } else {
-            infoBanner->setBannerTimeStamp(QDateTime::fromTime_t(notification.parameters().value("timestamp").toUInt()));
         }
+        infoBanner->setBannerTimeStamp(QDateTime::fromTime_t(notification.parameters().value("timestamp").toUInt()));
 
         if (infoBanner != NULL && infoBanner->parentItem() == NULL) {
             // Add the group to the notification area if this is the first notification to the group
--- src/systemui/notifications/notificationmanager.cpp
+++ src/systemui/notifications/notificationmanager.cpp
@@ -622,3 +622,14 @@
 {
     return this;
 }
+
+uint NotificationManager::notificationCountInGroup(uint notificationUserId, uint groupId)
+{
+    uint amount = 0;
+    foreach(const Notification & notification, notificationContainer.values()) {
+        if (notification.groupId() == groupId && notification.userId() == notificationUserId) {
+            amount++;
+        }
+    }
+    return amount;
+}
--- src/systemui/notifications/notificationmanager.h
+++ src/systemui/notifications/notificationmanager.h
@@ -96,6 +96,7 @@
     QList<Notification> notificationListWithIdentifiers(uint notificationUserId);
     QList<NotificationGroup> notificationGroupList(uint notificationUserId);
     QList<NotificationGroup> notificationGroupListWithIdentifiers(uint notificationUserId);
+    uint notificationCountInGroup(uint notificationUserId, uint groupId);
     //! \reimp_end
 
     /*!
--- src/systemui/notifications/notificationmanager.xml
+++ src/systemui/notifications/notificationmanager.xml
@@ -152,5 +152,10 @@
        <arg name="result" type="a(usssssus)" direction="out"/>
        <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="QList < MNotificationGroupWithIdentifierProxy > "/>
     </method>
+    <method name="notificationCountInGroup">
+       <arg name="notificationUserId" type="u" direction="in"/>
+       <arg name="groupId" type="u" direction="in"/>
+       <arg name="result" type="u" direction="out"/>
+    </method>
   </interface>
 </node>
--- src/systemui/notifications/widgetnotificationsink.cpp
+++ src/systemui/notifications/widgetnotificationsink.cpp
@@ -81,6 +81,11 @@
     return infoBanner;
 }
 
+bool WidgetNotificationSink::containsText(const Notification &notification)
+{
+    return !(infoBannerTitleText(notification.parameters()).isEmpty() && infoBannerGenericText(notification.parameters()).isEmpty());
+}
+
 void WidgetNotificationSink::updateTitles(MBanner *infoBanner)
 {
     if (privacySetting != NULL && privacySetting->value().toBool()) {
--- src/systemui/notifications/widgetnotificationsink.h
+++ src/systemui/notifications/widgetnotificationsink.h
@@ -113,6 +113,13 @@
     MBanner *createInfoBanner(Notification::NotificationType type, uint groupId, const NotificationParameters &parameters);
 
     /*!
+     * Check whether the notification contains text.
+     * \param notification The notification object to represent with the MBanner.
+     * \return \c true if the notification contains text, \c false otherwise
+     */
+    bool containsText(const Notification &notification);
+
+    /*!
      * Updates the titles in a banner based on the current privacy mode.
      *
      * \param infoBanner the MBanner to update
--- src/systemui/statusarea/statusarearenderer.cpp
+++ src/systemui/statusarea/statusarearenderer.cpp
@@ -30,12 +30,17 @@
 #include <QDebug>
 #include <QX11Info>
 #include "x11wrapper.h"
+#include <QMeeGoLivePixmap>
+#include <QMeeGoGraphicsSystemHelper>
+
+// Update the pixmap 5 times per second at most
+static const int ACCUMULATION_INTERVAL = 200;
 
 StatusAreaRenderer::StatusAreaRenderer(QObject *parent) :
     QObject(parent),
     scene(new QGraphicsScene),
     statusArea(new StatusArea),
-    statusAreaPixmap(NULL),
+    statusAreaLivePixmap(NULL),
 #ifdef HAVE_QMSYSTEM
     displayState(new MeeGo::QmDisplayState()),
 #endif
@@ -48,15 +53,17 @@
     connect(this, SIGNAL(statusIndicatorMenuVisibilityChanged(bool)), statusArea, SIGNAL(statusIndicatorMenuVisibilityChanged(bool)));
 
     // Get signaled when the scene changes
-    connect(scene, SIGNAL(changed(QList<QRectF>)), this, SLOT(sceneChanged(QList<QRectF>)));
+    connect(scene, SIGNAL(changed(QList<QRectF>)), this, SLOT(accumulateSceneChanges(QList<QRectF>)));
 #ifdef HAVE_QMSYSTEM
     connect(displayState, SIGNAL(displayStateChanged(MeeGo::QmDisplayState::DisplayState)), this, SLOT(setSceneRender(MeeGo::QmDisplayState::DisplayState)));
     setSceneRender(displayState->get());
 #endif
     setSizeFromStyle();
-    if(!createSharedPixmapHandle()) {
+    if(!createSharedPixmapHandle() || !createBackPixmap()) {
         qWarning() << "Shared Pixmap was not created. Status area will not render";
     }
+
+    connect(&accumulationTimer, SIGNAL(timeout()), this, SLOT(renderAccumulatedRegion()));
 }
 
 void StatusAreaRenderer::setSizeFromStyle()
@@ -75,11 +82,34 @@
 
     Pixmap pixmap = X11Wrapper::XCreatePixmap(QX11Info::display(), QX11Info::appRootWindow(),
                                               statusAreaWidth, 2*statusAreaHeight, QX11Info::appDepth());
-    QApplication::syncX();
-    statusAreaPixmap = new QPixmap();
-    *statusAreaPixmap = QPixmap::fromX11Pixmap(pixmap, QPixmap::ExplicitlyShared);
 
-    if (!statusAreaPixmap->isNull()) {
+    statusAreaPixmap = QPixmap::fromX11Pixmap(pixmap, QPixmap::ExplicitlyShared);
+
+    if (!statusAreaPixmap.isNull()) {
+        return true;
+    } else {
+        return false;
+    }
+}
+
+bool StatusAreaRenderer::createBackPixmap()
+{
+    if (statusAreaLivePixmap) {
+        delete statusAreaLivePixmap;
+        statusAreaLivePixmap = NULL;
+    }
+
+    if (QMeeGoGraphicsSystemHelper::isRunningMeeGo()) {
+        // FIXME: Round up to the nearest multiple of eight until NB#231246 is fixed
+        int livePixmapWidth = (statusAreaWidth / 8 + 1) * 8;
+
+        statusAreaLivePixmap = QMeeGoLivePixmap::livePixmapWithSize(livePixmapWidth, statusAreaHeight*2, QMeeGoLivePixmap::Format_ARGB32_Premultiplied);
+        backPixmap = QPixmap::fromX11Pixmap(statusAreaLivePixmap->handle(), QPixmap::ExplicitlyShared);
+    } else {
+        backPixmap = QPixmap(statusAreaWidth, statusAreaHeight*2);
+    }
+
+    if (!backPixmap.isNull()) {
         return true;
     } else {
         return false;
@@ -88,7 +118,7 @@
 
 uint StatusAreaRenderer::sharedPixmapHandle()
 {
-    return static_cast<quint32> (statusAreaPixmap->handle());
+    return static_cast<quint32> (statusAreaPixmap.handle());
 }
 
 StatusAreaRenderer::~StatusAreaRenderer()
@@ -96,9 +126,12 @@
     scene->removeItem(statusArea);
     delete statusArea;
 
-    if (statusAreaPixmap != NULL) {
-        Pixmap pixmap = statusAreaPixmap->handle();
-        delete statusAreaPixmap;
+    if (statusAreaLivePixmap != NULL) {
+        delete statusAreaLivePixmap;
+    }
+
+    if (!statusAreaPixmap.isNull()) {
+        Pixmap pixmap = statusAreaPixmap.handle();
         if (pixmap != 0) {
             X11Wrapper::XFreePixmap(QX11Info::display(), pixmap);
         }
@@ -109,25 +142,63 @@
 #endif
 }
 
-void StatusAreaRenderer::sceneChanged(const QList<QRectF> &region)
+void StatusAreaRenderer::accumulateSceneChanges(const QList<QRectF> &region)
+{
+    foreach(const QRectF & r, region) {
+        accumulatedRegion = accumulatedRegion.united(r);
+    }
+
+    if (renderScene && !accumulationTimer.isActive()) {
+        accumulationTimer.setSingleShot(true);
+        accumulationTimer.start(ACCUMULATION_INTERVAL);
+    }
+}
+
+void StatusAreaRenderer::renderAccumulatedRegion()
 {
-    if (!region.empty() && !statusAreaPixmap->isNull() && renderScene) {
-        QPainter painter(statusAreaPixmap);
-        QRectF changeRect(0,0,0,0);
-        foreach(const QRectF & r, region) {
-            changeRect = changeRect.united(r);
+    if (!accumulatedRegion.isEmpty() && !statusAreaPixmap.isNull() && !backPixmap.isNull()) {
+
+        if (statusAreaLivePixmap && !QMeeGoGraphicsSystemHelper::isRunningMeeGo()) {
+            QMeeGoGraphicsSystemHelper::switchToMeeGo();
         }
 
         // Don't draw areas that are outside the pixmap
-        if(changeRect.intersects(statusAreaPixmap->rect())) {
-            QRectF sourceRect = changeRect.intersected(statusAreaPixmap->rect());
-            if (painter.isActive()) {
+        if(accumulatedRegion.intersects(statusAreaPixmap.rect())) {
+            QPainter painter;
+            QRectF sourceRect = accumulatedRegion.intersected(statusAreaPixmap.rect());
+            QImage *image = NULL;
+
+            if (statusAreaLivePixmap) {
+                image = statusAreaLivePixmap->lock();
+
+                // FIXME: This shouldn't be needed after NB#231260 is fixed
+                if (image->isNull()) {
+                    createBackPixmap();
+                    image = statusAreaLivePixmap->lock();
+                }
+
+                painter.begin(image);
+            } else {
+                painter.begin(&backPixmap);
+            }
+
+            if(painter.isActive()) {
                 painter.fillRect(sourceRect, QColor(Qt::black));
                 scene->render(&painter, sourceRect, sourceRect);
-                QApplication::syncX();
             }
+            painter.end();
+
+            if (statusAreaLivePixmap) {
+                statusAreaLivePixmap->release(image);
+            }
+
+            painter.begin(&statusAreaPixmap);
+            painter.drawPixmap(sourceRect, backPixmap, sourceRect);
+            painter.end();
         }
     }
+
+    accumulatedRegion = QRectF(0.0f, 0.0f, 0.0f, 0.0f);
 }
 
 #ifdef HAVE_QMSYSTEM
--- src/systemui/statusarea/statusarearenderer.h
+++ src/systemui/statusarea/statusarearenderer.h
@@ -21,6 +21,7 @@
 #define STATUSAREARENDERER_H_
 
 #include <MNamespace>
+#include <QTimer>
 
 #ifdef HAVE_QMSYSTEM
 #include "qmdisplaystate.h"
@@ -28,6 +29,7 @@
 
 class QGraphicsScene;
 class StatusArea;
+class QMeeGoLivePixmap;
 
 /*!
  *  StatusAreaRenderer renders the contents of the scene to a shared pixmap which is then shown by libmeegotouch.
@@ -57,9 +59,14 @@
 
 private slots:
    /*!
-    * \brief A slot for notifying that the scene has changed and needs to be painted
+    * \brief Combine the given regions into one and start a timer to draw the region
     */
-    virtual void sceneChanged(const QList<QRectF> &region);
+    virtual void accumulateSceneChanges(const QList<QRectF> &region);
+
+   /*!
+    * \brief Render the changed region of the status area
+    */
+    void renderAccumulatedRegion();
 
 #ifdef HAVE_QMSYSTEM
     /*!
@@ -83,11 +90,18 @@
     StatusArea *statusArea;
 
     //! Shared Pixmap between libmeegotouch and systemui for the status area.
-    QPixmap* statusAreaPixmap;
+    QPixmap statusAreaPixmap;
+    //! Back buffer pixmap - the content is first rendered here and then copied to the shared pixmap
+    QPixmap backPixmap;
+    // Used for better performance if MeeGo graphics system is available, wrapped by backPixmap
+    QMeeGoLivePixmap* statusAreaLivePixmap;
 
     //! Creates a shared pixmap for status area
     bool createSharedPixmapHandle();
 
+    //! Creates the back buffer pixmap
+    bool createBackPixmap();
+
     //! set the status bar size with information from style
     void setSizeFromStyle();
 
@@ -103,6 +117,11 @@
     //! Keep track whether scene should render or not
     bool renderScene;
 
+    //! A single shot timer started when the scene changes
+    QTimer accumulationTimer;
+    //! Changes in the scene are combined to this rect
+    QRectF accumulatedRegion;
+
 #ifdef UNIT_TEST
     friend class Ut_StatusAreaRenderer;
 #endif
--- src/systemui/statusarea/statusareaview.cpp
+++ src/systemui/statusarea/statusareaview.cpp
@@ -178,8 +178,8 @@
     layout->addItem(landscapeProfileIndicator);
     layout->addItem(landscapeInputMethodIndicator);
     layout->addItem(landscapeCallIndicator);
-    layout->addItem(landscapeClock);
     layout->addItem(landscapeAlarmIndicator);
+    layout->addItem(landscapeClock);
 
     return layout;
 }
@@ -204,8 +204,8 @@
     layout->addItem(portraitPresenceIndicator);
     layout->addItem(portraitProfileIndicator);
     layout->addItem(portraitCallIndicator);
-    layout->addItem(portraitClock);
     layout->addItem(portraitAlarmIndicator);
+    layout->addItem(portraitClock);
 
     return layout;
 }
--- src/systemui/statusarea/statusindicator.cpp
+++ src/systemui/statusarea/statusindicator.cpp
@@ -215,6 +215,7 @@
 void PhoneNetworkTypeStatusIndicator::setNetworkType()
 {
     QString postFix = "";
+    QString postFixPacketData = "";
     QString dataTechnology = cellularDataTechnology->value().toString(); // gprs egprs umts hspa
     QString state = connectionState->value().toString(); // disconnected connecting connected
     QString connection = connectionType->value().toString(); // GPRS WLAN
@@ -229,27 +230,34 @@
 
     if (connection == "WLAN") {
         postFix = "WLAN";
-    } else if (dataTechnology == "gprs") {
-        postFix = "2G";
+    }
+    if (dataTechnology == "gprs") {
+        postFixPacketData = "2G";
     } else if (dataTechnology == "egprs") {
-        postFix = "25G";
+        postFixPacketData = "25G";
     } else if (dataTechnology == "umts") {
-        postFix = "3G";
+        postFixPacketData = "3G";
     } else if (dataTechnology == "hspa") {
-        postFix = "35G";
+        postFixPacketData = "35G";
     }
 
-    if (state == "connecting") {
-        postFix += "Connecting";
-        animateIfPossible = true;
-    } else if (data) { // TODO: when wlan transfer info available from context fw, add here
+    // if wlan connected and packet data active e.g. when sending mms
+    if (data) {
+        postFix += postFixPacketData;
         postFix += "Active";
-        animateIfPossible = false;
+        animateIfPossible = (connection == "WLAN");
     } else {
-        animateIfPossible = false;
+        if (postFix.isEmpty()) {
+            postFix = postFixPacketData;
+        }
+        if (state == "connecting") {
+            postFix += "Connecting";
+            animateIfPossible = true;
+        } else {
+            animateIfPossible = false;
+        }
     }
-    // TODO: add suspended state here when available from context fw  (postFix: Suspended)
-    // TODO: when wlan transfer info available swap with wlan and gprs if both active at the same time
+
     setStyleNameAndUpdate(metaObject()->className() + postFix);
 
     updateAnimationStatus();
--- src/systemui/statusarea/statusindicatoranimationview.cpp
+++ src/systemui/statusarea/statusindicatoranimationview.cpp
@@ -22,7 +22,6 @@
 #include <MTheme>
 #include <QGraphicsLinearLayout>
 #include <QTimeLine>
-#include <QDebug>
 
 StatusIndicatorAnimationView::StatusIndicatorAnimationView(StatusIndicator *controller) :
     MWidgetView(controller),
@@ -172,10 +171,6 @@
     if (animationFrame < images.count() && images[animationFrame] == NULL) {
         // Load the image if it has not been loaded yet
         images[animationFrame] = MTheme::pixmapCopy(imageList.at(animationFrame), style()->useIconSize() ? QSize(0, 0) : style()->preferredSize());
-
-        if (!(style()->preferredSize() == style()->minimumSize() && style()->preferredSize() == style()->maximumSize())) {
-            qWarning() << "Status indicators don't support cases where preferred size is not equal to minimum and maximum size!";
-        }
     }
 }
 
--- src/systemui/statusarea/statusindicatorlabelstyle.h
+++ src/systemui/statusarea/statusindicatorlabelstyle.h
@@ -27,6 +27,11 @@
 {
     Q_OBJECT
     M_STYLE(StatusIndicatorLabelStyle)
+
+    //! Text eliding
+    M_STYLE_ATTRIBUTE(bool, textElide, TextElide)
+    //! Word wrapping
+    M_STYLE_ATTRIBUTE(bool, wordWrap, WordWrap)
 };
 
 class StatusIndicatorLabelStyleContainer : public MWidgetStyleContainer
--- src/systemui/statusarea/statusindicatorlabelview.cpp
+++ src/systemui/statusarea/statusindicatorlabelview.cpp
@@ -67,4 +67,13 @@
     }
 }
 
+void StatusIndicatorLabelView::applyStyle()
+{
+    MWidgetView::applyStyle();
+
+    label->setTextElide(style()->textElide());
+    label->setWordWrap(style()->wordWrap());
+    label->setSizePolicy(QSizePolicy::Preferred, style()->wordWrap() ? QSizePolicy::MinimumExpanding : QSizePolicy::Preferred, QSizePolicy::Label);
+}
+
 M_REGISTER_VIEW_NEW(StatusIndicatorLabelView, StatusIndicator)
--- src/systemui/statusarea/statusindicatorlabelview.h
+++ src/systemui/statusarea/statusindicatorlabelview.h
@@ -57,6 +57,7 @@
 protected:
     //! \reimp
     virtual void setupModel();
+    virtual void applyStyle();
     //! \reimp_end
 
 private:
--- src/systemui/statusindicatormenu/statusindicatormenudropdownview.cpp
+++ src/systemui/statusindicatormenu/statusindicatormenudropdownview.cpp
@@ -119,9 +119,9 @@
     settingsPluginsExtensionArea = new MApplicationExtensionArea("com.meego.core.MStatusIndicatorMenuExtensionInterface/1.0");
     connect(settingsPluginsExtensionArea, SIGNAL(extensionInstantiated(MApplicationExtensionInterface*)), controller, SLOT(setStatusIndicatorMenuInterface(MApplicationExtensionInterface*)));
     settingsPluginsExtensionArea->setObjectName("StatusIndicatorMenuTopRowExtensionArea");
-    settingsPluginsExtensionArea->setInProcessFilter(QRegExp("/statusindicatormenu-(alarms|internetconnection|presence|profile).desktop$"));
+    settingsPluginsExtensionArea->setInProcessFilter(QRegExp("/statusindicatormenu-(volume|alarms|internetconnection|presence|profile).desktop$"));
     settingsPluginsExtensionArea->setOutOfProcessFilter(QRegExp("$^"));
-    settingsPluginsExtensionArea->setOrder((QStringList() << "statusindicatormenu-alarms.desktop" << "statusindicatormenu-internetconnection.desktop" << "statusindicatormenu-presence.desktop" << "statusindicatormenu-profile.desktop"));
+    settingsPluginsExtensionArea->setOrder((QStringList()  << "statusindicatormenu-volume.desktop" << "statusindicatormenu-alarms.desktop" << "statusindicatormenu-internetconnection.desktop" << "statusindicatormenu-presence.desktop" << "statusindicatormenu-profile.desktop"));
 
     // Create a button for accessing the full settings
     //% "Settings"
--- src/systemui/statusindicatormenu/statusindicatormenuverticalview.cpp
+++ src/systemui/statusindicatormenu/statusindicatormenuverticalview.cpp
@@ -38,9 +38,14 @@
     connect(extensionArea, SIGNAL(extensionInstantiated(MApplicationExtensionInterface*)), controller, SLOT(setStatusIndicatorMenuInterface(MApplicationExtensionInterface*)));
     connect(extensionArea, SIGNAL(extensionInstantiated(MApplicationExtensionInterface*)), this, SLOT(setExtensionLayoutPosition(MApplicationExtensionInterface*)));
     extensionArea->setObjectName("StatusIndicatorMenuExtensionArea");
-    extensionArea->setInProcessFilter(QRegExp("/statusindicatormenu-(call|transfer|profile|internetconnection|presence).desktop$"));
+    extensionArea->setInProcessFilter(QRegExp("/statusindicatormenu-(profile|call|internetconnection|bluetooth|presence|transfer).desktop$"));
     extensionArea->setOutOfProcessFilter(QRegExp("$^"));
-    extensionArea->setOrder((QStringList() << "statusindicatormenu-call.desktop" << "statusindicatormenu-transfer.desktop" << "statusindicatormenu-profile.desktop" << "statusindicatormenu-internetconnection.desktop" << "statusindicatormenu-presence.desktop"));
+    extensionArea->setOrder((QStringList() << "statusindicatormenu-profile.desktop"
+                             << "statusindicatormenu-call.desktop"
+                             << "statusindicatormenu-internetconnection.desktop"
+                             << "statusindicatormenu-bluetooth.desktop"
+                             << "statusindicatormenu-presence.desktop"
+                             << "statusindicatormenu-transfer.desktop"));
     extensionArea->init();
 
     // Put the extension area to a horizontal layout
--- src/systemui/statusindicatormenu/statusindicatormenuwindow.cpp
+++ src/systemui/statusindicatormenu/statusindicatormenuwindow.cpp
@@ -73,7 +73,13 @@
 
     connect(menuWidget, SIGNAL(showRequested()), this, SLOT(makeVisible()));
     connect(menuWidget, SIGNAL(hideRequested()), menuWidget, SLOT(disappear()));
-    connect(menuWidget, SIGNAL(disappeared()), this, SLOT(hide()));
+    connect(menuWidget, SIGNAL(disappeared()), this, SLOT(hideWindow()));
+}
+
+void StatusIndicatorMenuWindow::hideWindow()
+{
+    hide();
+    emit visibilityChanged(false);
 }
 
 void StatusIndicatorMenuWindow::displayActive()
@@ -84,8 +90,6 @@
 
 void StatusIndicatorMenuWindow::displayInActive()
 {
-    emit visibilityChanged(false);
-
     if (menuWidget && menuWidget->sceneWindowState() != MSceneWindow::Disappeared) {
         sceneManager()->disappearSceneWindowNow(menuWidget);
     }
@@ -94,7 +98,7 @@
     // Note: Dialogs and notifications won't close it anyways,
     // as they are not supposed to be full screen and don't completely
     // obstruct the status menu window fully.
-    hide();
+    hideWindow();
 }
 
 void StatusIndicatorMenuWindow::makeVisible()
--- src/systemui/statusindicatormenu/statusindicatormenuwindow.h
+++ src/systemui/statusindicatormenu/statusindicatormenuwindow.h
@@ -74,6 +74,9 @@
 
 private slots:
 
+    //! Hides window and sends visibilityChanged signal
+    void hideWindow();
+
     //! Slot when window becomes top window
     void displayActive();
 
--- src/systemui/systemui.pro
+++ src/systemui/systemui.pro
@@ -13,7 +13,7 @@
 CONFIG += meegotouch \
           link_pkgconfig
 
-QT += dbus gui
+QT += dbus gui meegographicssystemhelper
 
 INCLUDEPATH += ../libnotificationsystem
 QMAKE_LIBDIR += ../../lib
--- tests/stubs/notificationmanager_stub.h
+++ tests/stubs/notificationmanager_stub.h
@@ -66,6 +66,7 @@
   virtual QList<Notification> notifications();
   virtual QList<NotificationGroup> groups();
   virtual void doRemoveGroup(uint groupId);
+  virtual uint notificationCountInGroup(uint notificationUserId, uint groupId);
 };
 
 // 2. IMPLEMENT STUB
@@ -283,6 +284,15 @@
     stubMethodEntered("doRemoveGroup");
 }
 
+uint NotificationManagerStub::notificationCountInGroup(uint notificationUserId, uint groupId)
+{
+    QList<ParameterBase*> params;
+    params.append(new Parameter<uint>(notificationUserId));
+    params.append(new Parameter<uint>(groupId));
+    stubMethodEntered("notificationCountInGroup");
+    return stubReturnValue<uint>("notificationCountInGroup");
+}
+
 // 3. CREATE A STUB INSTANCE
 NotificationManagerStub gDefaultNotificationManagerStub;
 NotificationManagerStub* gNotificationManagerStub = &gDefaultNotificationManagerStub;
@@ -430,4 +440,9 @@
     gNotificationManagerStub->doRemoveGroup(groupId);
 }
 
+uint NotificationManager::notificationCountInGroup(uint notificationUserId, uint groupId)
+{
+    return gNotificationManagerStub->notificationCountInGroup(notificationUserId, groupId);
+}
+
 #endif
--- tests/stubs/statusarearenderer_stub.h
+++ tests/stubs/statusarearenderer_stub.h
@@ -11,7 +11,9 @@
   public:
   virtual void StatusAreaRendererConstructor(QObject *parent);
   virtual void StatusAreaRendererDestructor();
-  virtual void sceneChanged(const QList<QRectF> &region);
+  virtual void accumulateSceneChanges(const QList<QRectF> &region);
+  virtual void renderAccumulatedRegion();
+  virtual bool createBackPixmap();
 #ifdef HAVE_QMSYSTEM
   virtual void setSceneRender(MeeGo::QmDisplayState::DisplayState state);
 #endif
@@ -28,10 +30,10 @@
 void StatusAreaRendererStub::StatusAreaRendererDestructor() {
 
 }
-void StatusAreaRendererStub::sceneChanged(const QList<QRectF> &region) {
+void StatusAreaRendererStub::accumulateSceneChanges(const QList<QRectF> &region) {
   QList<ParameterBase*> params;
   params.append( new Parameter<const QList<QRectF> & >(region));
-  stubMethodEntered("sceneChanged",params);
+  stubMethodEntered("accumulateSceneChanges",params);
 }
 
 #ifdef HAVE_QMSYSTEM
@@ -52,10 +54,18 @@
   return stubReturnValue<bool>("createSharedPixmapHandle");
 }
 
+bool StatusAreaRendererStub::createBackPixmap() {
+  stubMethodEntered("createBackPixmap");
+  return stubReturnValue<bool>("createBackPixmap");
+}
+
 void StatusAreaRendererStub::setSizeFromStyle() {
   stubMethodEntered("setSizeFromStyle");
 }
 
+void StatusAreaRendererStub::renderAccumulatedRegion() {
+  stubMethodEntered("renderAccumulatedRegion");
+}
 
 
 // 3. CREATE A STUB INSTANCE
@@ -72,8 +82,8 @@
   gStatusAreaRendererStub->StatusAreaRendererDestructor();
 }
 
-void StatusAreaRenderer::sceneChanged(const QList<QRectF> &region) {
-  gStatusAreaRendererStub->sceneChanged(region);
+void StatusAreaRenderer::accumulateSceneChanges(const QList<QRectF> &region) {
+  gStatusAreaRendererStub->accumulateSceneChanges(region);
 }
 
 #ifdef HAVE_QMSYSTEM
@@ -91,9 +101,17 @@
   return gStatusAreaRendererStub->createSharedPixmapHandle();
 }
 
+bool StatusAreaRenderer::createBackPixmap() {
+  return gStatusAreaRendererStub->createBackPixmap();
+}
+
 void StatusAreaRenderer::setSizeFromStyle() {
   gStatusAreaRendererStub->setSizeFromStyle();
 }
 
+void StatusAreaRenderer::renderAccumulatedRegion() {
+  gStatusAreaRendererStub->renderAccumulatedRegion();
+}
+
 
 #endif
--- tests/stubs/statusindicatormenuwindow_stub.h
+++ tests/stubs/statusindicatormenuwindow_stub.h
@@ -21,6 +21,7 @@
   virtual void resetMenuWidget();
   virtual void mousePressEvent(QMouseEvent*);
   virtual void mouseReleaseEvent(QMouseEvent*);
+  virtual void hideWindow();
 #ifdef HAVE_QMSYSTEM
   virtual void setWindowStateAccordingToDeviceLockState(MeeGo::QmLocks::Lock what, MeeGo::QmLocks::State how);
 #endif
@@ -79,6 +80,10 @@
 }
 #endif
 
+void StatusIndicatorMenuWindowStub::hideWindow() {
+  stubMethodEntered("hideWindow");
+}
+
 // 3. CREATE A STUB INSTANCE
 StatusIndicatorMenuWindowStub gDefaultStatusIndicatorMenuWindowStub;
 StatusIndicatorMenuWindowStub* gStatusIndicatorMenuWindowStub = &gDefaultStatusIndicatorMenuWindowStub;
@@ -127,4 +132,8 @@
 }
 #endif
 
+void StatusIndicatorMenuWindow::hideWindow() {
+  gStatusIndicatorMenuWindowStub->hideWindow();
+}
+
 #endif
--- tests/tests.pro
+++ tests/tests.pro
@@ -1,6 +1,8 @@
 TEMPLATE = subdirs
 include(../shared.pri)
 
+QT += meegographicssystemhelper
+
 #
 # Please note that there are several ways to temprorarily disable one or more
 # tests. Using the new XML generator script it is possible to put a 'disabled'
--- tests/ut_dbusinterfacenotificationsource/ut_dbusinterfacenotificationsource.cpp
+++ tests/ut_dbusinterfacenotificationsource/ut_dbusinterfacenotificationsource.cpp
@@ -108,6 +108,11 @@
     return 1;
 }
 
+uint DBusInterfaceNotificationSourceAdaptor::notificationCountInGroup(uint, uint)
+{
+    return 1;
+}
+
 QList<uint> DBusInterfaceNotificationSourceAdaptor::notificationIdList(uint notificationUserId)
 {
     QList<uint> tmp;
@@ -458,4 +463,10 @@
     QCOMPARE(params.value(NotificationWidgetParameterFactory::actionKey()), QVariant(""));
 }
 
+void Ut_DBusInterfaceNotificationSource::testNotificationCountInGroup()
+{
+    source->notificationCountInGroup(1, 1);
+    QCOMPARE(gDefaultNotificationManagerStub.stubCallCount("notificationCountInGroup"), 1);
+}
+
 QTEST_APPLESS_MAIN(Ut_DBusInterfaceNotificationSource)
--- tests/ut_dbusinterfacenotificationsource/ut_dbusinterfacenotificationsource.h
+++ tests/ut_dbusinterfacenotificationsource/ut_dbusinterfacenotificationsource.h
@@ -70,6 +70,7 @@
     void testNotificationGroupListWithIdentifiers();
     //Test updating group with empty strings
     void testUpdateGroupWithEmptyStrings();
+    void testNotificationCountInGroup();
 
 private:
     // Notification manager interface used by the test subject
--- tests/ut_mcompositornotificationsink/ut_mcompositornotificationsink.cpp
+++ tests/ut_mcompositornotificationsink/ut_mcompositornotificationsink.cpp
@@ -167,6 +167,11 @@
     return tmp;
 }
 
+uint MockNotificationManager::notificationCountInGroup(uint, uint)
+{
+    return 0;
+}
+
 QObject* MockNotificationManager::qObject()
 {
     return NULL;
--- tests/ut_mcompositornotificationsink/ut_mcompositornotificationsink.h
+++ tests/ut_mcompositornotificationsink/ut_mcompositornotificationsink.h
@@ -62,6 +62,7 @@
 
     QList<Notification> notifications() const;
     QList<NotificationGroup> groups() const;
+    uint notificationCountInGroup(uint notificationUserId, uint groupId);
 
     uint nextAvailableNotificationID;
     QList<Notification> notificationContainer;
--- tests/ut_notificationareasink/ut_notificationareasink.cpp
+++ tests/ut_notificationareasink/ut_notificationareasink.cpp
@@ -370,7 +370,7 @@
 
     TestNotificationParameters groupParameters(GROUP_SUMMARY, GROUP_BODY, GROUP_ICON, GROUP_ACTION);
     emit addGroup(GROUP_ID, groupParameters);
-    TestNotificationParameters notificationParameters(NOTIFICATION_SUMMARY, NOTIFICATION_BODY, NOTIFICATION_ICON, NOTIFICATION_ACTION);
+    TestNotificationParameters notificationParameters(NOTIFICATION_SUMMARY, NOTIFICATION_BODY, NOTIFICATION_ICON, NOTIFICATION_ACTION, 12345);
     emit addNotification(Notification(NOTIFICATION_ID, GROUP_ID, 2, notificationParameters, Notification::ApplicationEvent, 1000));
 
     emit(removeNotification(NOTIFICATION_ID));
@@ -384,6 +384,8 @@
     MBanner *banner = bannerCatcher.banners.at(0);
     // The banner should have the notification group's data
     QCOMPARE(banner->title(), GROUP_BODY);
+    // The banner should have the timestamp of the previous notification
+    QCOMPARE(timestamps[0].toTime_t(), (uint)12345);
 }
 
 void Ut_NotificationAreaSink::testUpdateGroup()
--- tests/ut_notificationmanager/ut_notificationmanager.cpp
+++ tests/ut_notificationmanager/ut_notificationmanager.cpp
@@ -1553,4 +1553,19 @@
     QCOMPARE(notifications.at(1).notificationId(), id1);
 }
 
+void Ut_NotificationManager::testNotificationCountInGroup()
+{
+    uint groupId1 = manager->addGroup(0, NotificationParameters());
+    uint groupId2 = manager->addGroup(0, NotificationParameters());
+
+    // Add two notifications to 1st group
+    manager->addNotification(0, NotificationParameters(), groupId1);
+    manager->addNotification(0, NotificationParameters(), groupId1);
+
+    // Add a notification to 2nd group
+    manager->addNotification(0, NotificationParameters(), groupId2);
+
+    QCOMPARE(manager->notificationCountInGroup(0, groupId1), (uint)2);
+}
+
 QTEST_MAIN(Ut_NotificationManager)
--- tests/ut_notificationmanager/ut_notificationmanager.h
+++ tests/ut_notificationmanager/ut_notificationmanager.h
@@ -150,6 +150,8 @@
 
     void testNotificationIsUpdatedWhenEventTypeIsUpdated();
 
+    void testNotificationCountInGroup();
+
 };
 
 #endif // UT_NOTIFICATIONMANAGER_H
--- tests/ut_statusarearenderer/ut_statusarearenderer.cpp
+++ tests/ut_statusarearenderer/ut_statusarearenderer.cpp
@@ -20,8 +20,9 @@
 #include <MOnDisplayChangeEvent>
 #include "statusarearenderer.h"
 #include "statusarea_stub.h"
+#include "statusareastyle.h"
+#include <QMeeGoGraphicsSystemHelper>
 
-QPixmap *statusAreaPixmap = NULL;
 bool Ut_StatusAreaRenderer_Scene_Render_Called = false;
 bool Ut_StatusAreaRenderer_Scene_SendEvent_Called = false;
 QRectF rectReceived(0,0,0,0);
@@ -49,7 +50,11 @@
     Q_UNUSED(type);
     Q_UNUSED(orientation);
     Q_UNUSED(parent);
-    return NULL;
+    return new MStyle;
+}
+
+MStyle::MStyle()
+{
 }
 
 #ifdef HAVE_QMSYSTEM
@@ -78,7 +83,7 @@
 void QGraphicsScene::render(QPainter *painter, const QRectF &target, const QRectF &source, Qt::AspectRatioMode aspectRatioMode)
 {
     Ut_StatusAreaRenderer_Scene_Render_Called = true;
-    rectReceived= source;
+    rectReceived = source;
     Q_UNUSED(target);
     Q_UNUSED(painter);
     Q_UNUSED(aspectRatioMode);
@@ -95,11 +100,118 @@
     return true;
 }
 
+QSize gStatusAreaSize(30, 80);
+
+const QSize& MWidgetStyle::preferredSize() const
+{
+    return gStatusAreaSize;
+}
+
+bool gTimerStarted = false;
+bool gTimerEmitTimeoutImmediately = true;
+bool gTimerActive = false;
+int gTimerInterval;
+
+void QTimer::start(int interval)
+{
+    gTimerStarted = true;
+    gTimerInterval = interval;
+
+    if (gTimerEmitTimeoutImmediately) {
+        emit timeout();
+    } else {
+        // QTimer::isActive returns true if id != 0
+        id = 1;
+    }
+}
+
+bool gTimerStopped = false;
+void QTimer::stop()
+{
+    gTimerStopped = true;
+    id = 0;
+}
+
+QLatin1String gGraphicsSystemName("meego");
+
+QString QMeeGoGraphicsSystemHelper::runningGraphicsSystemName()
+{
+    return gGraphicsSystemName;
+}
+
+bool QMeeGoGraphicsSystemHelper::isRunningMeeGo()
+{
+    return (runningGraphicsSystemName() == QLatin1String("meego"));
+}
+
+void QMeeGoGraphicsSystemHelper::switchToMeeGo()
+{
+}
+
+void QMeeGoGraphicsSystemHelper::switchToRaster()
+{
+}
+
+static QImage* gLivePixmapLockedImage = (QImage*)(0xfeedbeef);
+
+bool QImage::isNull() const
+{
+    return false;
+}
+
+QImage* QMeeGoLivePixmap::lock(QMeeGoFenceSync*)
+{
+    return gLivePixmapLockedImage;
+}
+
+void QMeeGoLivePixmap::release(QImage*)
+{
+}
+
+QList<QPaintDevice*> gPainterPaintDevices;
+
+bool QPainter::begin(QPaintDevice *device)
+{
+    gPainterPaintDevices.append(device);
+
+    return true;
+}
+
+bool QPainter::end()
+{
+    return true;
+}
+
+bool QPainter::isActive() const
+{
+    return true;
+}
+
+void QPainter::fillRect(const QRectF &, const QColor &)
+{
+}
+
+const QPixmap* gPainterSourcePixmap;
+
+void QPainter::drawPixmap(const QRectF &, const QPixmap &pixmap, const QRectF &)
+{
+    gPainterSourcePixmap = &pixmap;
+}
+
+
 void Ut_StatusAreaRenderer::init()
 {
+    gTimerStopped = false;
+    gTimerStarted = false;
+    gTimerEmitTimeoutImmediately = true;
+    gTimerInterval = 0;
+
+    gPainterPaintDevices.clear();
+    gPainterSourcePixmap = NULL;
+
+    gGraphicsSystemName = QLatin1String("meego");
+
     statusAreaRenderer = new StatusAreaRenderer();
-    statusAreaPixmap = new QPixmap(30,80);
-    statusAreaRenderer->statusAreaPixmap = statusAreaPixmap;
 }
 
 void Ut_StatusAreaRenderer::cleanup()
@@ -129,10 +241,9 @@
     QList<QRectF> rectList;
     QRectF rect1(0,0,30,80);
     rectList.append(rect1);
-    connect(this, SIGNAL(changed(QList<QRectF>)), statusAreaRenderer, SLOT(sceneChanged(QList<QRectF>)));
+    connect(this, SIGNAL(changed(QList<QRectF>)), statusAreaRenderer, SLOT(accumulateSceneChanges(QList<QRectF>)));
     emit changed(rectList);
     QCOMPARE(Ut_StatusAreaRenderer_Scene_Render_Called, true);
-    QCOMPARE(Ut_StatusAreaRenderer_syncX_Called, true);
 
     // Test when rect has no intersection with pixmap
     Ut_StatusAreaRenderer_Scene_Render_Called = false;
@@ -142,7 +253,6 @@
     rectList.append(rect2);
     emit changed(rectList);
     QCOMPARE(Ut_StatusAreaRenderer_Scene_Render_Called, false);
-    QCOMPARE(Ut_StatusAreaRenderer_syncX_Called, false);
 
     // Test when two rects called then scene render called with complete intersection rect( final rect should be Rect1 U Rect2 Intersectin sharedPixmapRect)
     rectList.pop_front();
@@ -152,7 +262,6 @@
     rectList.append(rect4);
     emit changed(rectList);
     QCOMPARE(Ut_StatusAreaRenderer_Scene_Render_Called, true);
-    QCOMPARE(Ut_StatusAreaRenderer_syncX_Called, true);
     QRectF unitedRect = rect3.united(rect4) ;
     QRectF expectedRect = unitedRect.intersected(QRectF(0,0,30,80));
     QCOMPARE(rectReceived,expectedRect);
@@ -170,7 +279,7 @@
 QList<QRectF>* RenderTestsHelper::setupRenderTests(Ut_StatusAreaRenderer* testClass, StatusAreaRenderer* statusAreaRenderer)
 {
     setupRect();
-    QObject::connect(testClass, SIGNAL(changed(QList<QRectF>)), statusAreaRenderer, SLOT(sceneChanged(QList<QRectF>)));
+    QObject::connect(testClass, SIGNAL(changed(QList<QRectF>)), statusAreaRenderer, SLOT(accumulateSceneChanges(QList<QRectF>)));
 #ifdef HAVE_QMSYSTEM
     QObject::connect(testClass, SIGNAL(displayStateChanged(MeeGo::QmDisplayState::DisplayState)), statusAreaRenderer, SLOT(setSceneRender(MeeGo::QmDisplayState::DisplayState)));
 #endif
@@ -261,8 +370,61 @@
 
 void Ut_StatusAreaRenderer::testSharedPixmapHandle()
 {
-    uint handle = static_cast<quint32> (statusAreaRenderer->statusAreaPixmap->handle());
+    uint handle = static_cast<quint32> (statusAreaRenderer->statusAreaPixmap.handle());
     QCOMPARE(handle, statusAreaRenderer->sharedPixmapHandle());
 }
 
+void Ut_StatusAreaRenderer::testAccumulationTimer()
+{
+    gTimerEmitTimeoutImmediately = false;
+
+    RenderTestsHelper helper;
+    QList<QRectF>* rectList = helper.setupRenderTests(this, statusAreaRenderer);
+
+    gTimerStarted = false;
+    QCOMPARE(statusAreaRenderer->accumulationTimer.isActive(), false);
+
+    emit changed(*rectList);
+    QCOMPARE(gTimerStarted, true);
+    QCOMPARE(statusAreaRenderer->accumulationTimer.isActive(), true);
+
+    gTimerStarted = false;
+    emit changed(*rectList);
+    QCOMPARE(gTimerStarted, false);
+    QCOMPARE(statusAreaRenderer->accumulationTimer.isActive(), true);
+}
+
+void Ut_StatusAreaRenderer::testRenderingWithMeeGo()
+{
+    RenderTestsHelper helper;
+    QList<QRectF>* rectList = helper.setupRenderTests(this, statusAreaRenderer);
+    emit changed(*rectList);
+
+    QCOMPARE(statusAreaRenderer->backPixmap.handle(), statusAreaRenderer->statusAreaLivePixmap->handle());
+    QCOMPARE(statusAreaRenderer->backPixmap.size().height(), gStatusAreaSize.height() * 2);
+
+    QCOMPARE(gPainterPaintDevices.at(0), gLivePixmapLockedImage);
+    QCOMPARE(gPainterPaintDevices.at(1), &statusAreaRenderer->statusAreaPixmap);
+    QCOMPARE(gPainterSourcePixmap, &statusAreaRenderer->backPixmap);
+}
+
+void Ut_StatusAreaRenderer::testRenderingWithoutMeeGo()
+{
+    delete statusAreaRenderer;
+    gGraphicsSystemName = QLatin1String("not_meego");
+    statusAreaRenderer = new StatusAreaRenderer;
+
+    QCOMPARE(statusAreaRenderer->statusAreaLivePixmap, static_cast<QMeeGoLivePixmap*>(0) );
+    QCOMPARE(statusAreaRenderer->backPixmap.size().width(), gStatusAreaSize.width());
+    QCOMPARE(statusAreaRenderer->backPixmap.size().height(), gStatusAreaSize.height() * 2);
+
+    RenderTestsHelper helper;
+    QList<QRectF>* rectList = helper.setupRenderTests(this, statusAreaRenderer);
+    emit changed(*rectList);
+
+    QCOMPARE(gPainterPaintDevices.at(0), &statusAreaRenderer->backPixmap);
+    QCOMPARE(gPainterPaintDevices.at(1), &statusAreaRenderer->statusAreaPixmap);
+    QCOMPARE(gPainterSourcePixmap, &statusAreaRenderer->backPixmap);
+}
+
 QTEST_MAIN(Ut_StatusAreaRenderer)
--- tests/ut_statusarearenderer/ut_statusarearenderer.h
+++ tests/ut_statusarearenderer/ut_statusarearenderer.h
@@ -54,6 +54,12 @@
     void testSceneChanged();
     // Test shared pixmap handle
     void testSharedPixmapHandle();
+
+    void testAccumulationTimer();
+
+    void testRenderingWithMeeGo();
+    void testRenderingWithoutMeeGo();
+
 #ifdef HAVE_QMSYSTEM
     // Test rendering happens when display state is on
     void testSceneRenderControlDisplayStateOn();
--- tests/ut_statusarearenderer/ut_statusarearenderer.pro
+++ tests/ut_statusarearenderer/ut_statusarearenderer.pro
@@ -5,6 +5,8 @@
 PKGCONFIG += xcomposite 
 PKGCONFIG += glib-2.0
 
+QT += meegographicssystemhelper
+
 # unit test and unit classes
 SOURCES += \
     ut_statusarearenderer.cpp \
--- tests/ut_statusindicator/ut_statusindicator.cpp
+++ tests/ut_statusindicator/ut_statusindicator.cpp
@@ -268,7 +268,10 @@
     QTest::newRow("gprs connection type and 35g tech active") << true << QString("hspa") << QString("GPRS") << QString("connected") << QString("35GActive");
     QTest::newRow("wlan connection type and wlan tech not active") << false << QString("") << QString("WLAN") << QString("connected") << QString("WLAN");
     QTest::newRow("wlan connection type and wlan tech connecting") << false << QString("") << QString("WLAN") << QString("connecting") << QString("WLANConnecting");
-//    QTest::newRow("wlan connection type and wlan tech active") << true << QString("") << QStringU("WLAN") << QString("connected") << QStringU("WLANActive"); //wlan activity not supported yet
+    QTest::newRow("wlan connected and 2g packet data active") << true << QString("gprs") << QString("WLAN") << QString("connected") << QString("WLAN2GActive");
+    QTest::newRow("wlan connected and 25g packet data active") << true << QString("egprs") << QString("WLAN") << QString("connected") << QString("WLAN25GActive");
+    QTest::newRow("wlan connected and 3g packet data active") << true << QString("umts") << QString("WLAN") << QString("connected") << QString("WLAN3GActive");
+    QTest::newRow("wlan connected and 35g packet data active") << true << QString("hspa") << QString("WLAN") << QString("connected") << QString("WLAN35GActive");
 
 }
 
--- tests/ut_statusindicatormenudropdownview/ut_statusindicatormenudropdownview.cpp
+++ tests/ut_statusindicatormenudropdownview/ut_statusindicatormenudropdownview.cpp
@@ -369,10 +369,10 @@
 void Ut_StatusIndicatorMenuDropDownView::testTopRowInitialization()
 {
     foreach (const MApplicationExtensionAreaProperties &props, gMApplicationExtensionAreaProperties) {
-        if (props.mInProcessFilter == QRegExp("/statusindicatormenu-(alarms|internetconnection|presence|profile).desktop$")) {
+        if (props.mInProcessFilter == QRegExp("/statusindicatormenu-(volume|alarms|internetconnection|presence|profile).desktop$")) {
             QCOMPARE(props.mInterface, QString("com.meego.core.MStatusIndicatorMenuExtensionInterface/1.0"));
             QCOMPARE(props.mOutOfProcessFilter, QRegExp("$^"));
-            QCOMPARE(props.mOrder, ((QStringList() << "statusindicatormenu-alarms.desktop" << "statusindicatormenu-internetconnection.desktop" << "statusindicatormenu-presence.desktop" << "statusindicatormenu-profile.desktop")));
+            QCOMPARE(props.mOrder, ((QStringList() << "statusindicatormenu-volume.desktop" << "statusindicatormenu-alarms.desktop" << "statusindicatormenu-internetconnection.desktop" << "statusindicatormenu-presence.desktop" << "statusindicatormenu-profile.desktop")));
             return;
         }
     }
--- tests/ut_statusindicatormenuverticalview/ut_statusindicatormenuverticalview.cpp
+++ tests/ut_statusindicatormenuverticalview/ut_statusindicatormenuverticalview.cpp
@@ -196,9 +196,15 @@
 void Ut_StatusIndicatorMenuVerticalView::testExtensionAreaInitialization()
 {
     QCOMPARE(mApplicationExtensionAreaInterface, QString("com.meego.core.MStatusIndicatorMenuExtensionInterface/1.0"));
-    QCOMPARE(mApplicationExtensionAreaInProcessFilterDuringInit, QRegExp("/statusindicatormenu-(call|transfer|profile|internetconnection|presence).desktop$"));
+    QCOMPARE(mApplicationExtensionAreaInProcessFilterDuringInit,
+             QRegExp("/statusindicatormenu-(profile|call|internetconnection|bluetooth|presence|transfer).desktop$"));
     QCOMPARE(mApplicationExtensionAreaOutOfProcessFilterDuringInit, QRegExp("$^"));
-    QCOMPARE(mApplicationExtensionAreaOrderDuringInit, ((QStringList() << "statusindicatormenu-call.desktop" << "statusindicatormenu-transfer.desktop" << "statusindicatormenu-profile.desktop" << "statusindicatormenu-internetconnection.desktop" << "statusindicatormenu-presence.desktop")));
+    QCOMPARE(mApplicationExtensionAreaOrderDuringInit, (QStringList() << "statusindicatormenu-profile.desktop"
+                             << "statusindicatormenu-call.desktop"
+                             << "statusindicatormenu-internetconnection.desktop"
+                             << "statusindicatormenu-bluetooth.desktop"
+                             << "statusindicatormenu-presence.desktop"
+                             << "statusindicatormenu-transfer.desktop"));
 }
 
 void Ut_StatusIndicatorMenuVerticalView::testLayoutPositions()
--- tests/ut_statusindicatormenuwindow/ut_statusindicatormenuwindow.cpp
+++ tests/ut_statusindicatormenuwindow/ut_statusindicatormenuwindow.cpp
@@ -130,7 +130,7 @@
 
     QVERIFY(disconnect(statusIndicatorMenuWindow->menuWidget, SIGNAL(showRequested()), statusIndicatorMenuWindow, SLOT(makeVisible())));
     QVERIFY(disconnect(statusIndicatorMenuWindow->menuWidget, SIGNAL(hideRequested()), statusIndicatorMenuWindow->menuWidget, SLOT(disappear())));
-    QVERIFY(disconnect(statusIndicatorMenuWindow->menuWidget, SIGNAL(disappeared()), statusIndicatorMenuWindow, SLOT(hide())));
+    QVERIFY(disconnect(statusIndicatorMenuWindow->menuWidget, SIGNAL(disappeared()), statusIndicatorMenuWindow, SLOT(hideWindow())));
 }
 
 void Ut_StatusIndicatorMenuWindow::testMakeVisible_data()
@@ -254,6 +254,17 @@
     QCOMPARE(statusIndicatorMenuWindow->menuWidget->sceneWindowState(), MSceneWindow::Disappeared);
 }
 
+void Ut_StatusIndicatorMenuWindow::testWhenStatusIndicatorMenuIsDisappearedThenWindowIsHidden()
+{
+    QSignalSpy spy(statusIndicatorMenuWindow, SIGNAL(visibilityChanged(bool)));
+    QVERIFY(disconnect(statusIndicatorMenuWindow->menuWidget, SIGNAL(disappeared()), statusIndicatorMenuWindow, SLOT(hideWindow())));
+    statusIndicatorMenuWindow->hideWindow();
+
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(spy.at(0).at(0).toBool(), false);
+    QCOMPARE(statusIndicatorMenuWindow->isVisible(), false);
+}
+
 #ifdef HAVE_QMSYSTEM
 void Ut_StatusIndicatorMenuWindow::testQmLocksSignalConnectionWhenDeviceLocked()
 {
--- tests/ut_statusindicatormenuwindow/ut_statusindicatormenuwindow.h
+++ tests/ut_statusindicatormenuwindow/ut_statusindicatormenuwindow.h
@@ -58,6 +58,7 @@
     void testStatusIndicatorMenuAppearsAfterEnteringDisplay();
     void testStatusIndicatorMenuIsClosedWhenStatusBarIsTapped();
     void testWhenWindowAlreadyOnDisplayThenMenuWidgetAppearsWithoutDisplayEnterSignal();
+    void testWhenStatusIndicatorMenuIsDisappearedThenWindowIsHidden();
 
 #ifdef HAVE_QMSYSTEM
     void testQmLocksSignalConnectionWhenDeviceLocked();
--- tests/ut_widgetnotificationsink/ut_widgetnotificationsink.cpp
+++ tests/ut_widgetnotificationsink/ut_widgetnotificationsink.cpp
@@ -571,4 +571,14 @@
     QCOMPARE(ret, false);
 }
 
+void Ut_WidgetNotificationSink::testNotificationShownOnlyIfItContainsText()
+{
+    TestNotificationParameters parameters("", "", "");
+    bool ret1( m_subject->containsText(Notification(3, 1, 0, parameters, Notification::ApplicationEvent, 1020)) );
+    QCOMPARE(false, ret1);
+    TestNotificationParameters parameters2("title", "subtitle", "buttonicon1");
+    bool ret2( m_subject->containsText(Notification(3, 1, 0, parameters2, Notification::ApplicationEvent, 1020)) );
+    QCOMPARE(true, ret2);
+}
+
 QTEST_APPLESS_MAIN(Ut_WidgetNotificationSink)
--- tests/ut_widgetnotificationsink/ut_widgetnotificationsink.h
+++ tests/ut_widgetnotificationsink/ut_widgetnotificationsink.h
@@ -71,6 +71,7 @@
     void testPrivacySettingValueEmittedWhenHonoringChanges();
     void testPrivacySettingValueEmittedWhenPrivacySettingChanges();
     void testWhenNotificationsCreatedAreNotClickableWhenClickingThemDoesNotWork();
+    void testNotificationShownOnlyIfItContainsText();
 
 private:
     // Helper for the "test clicking when not user removable" cases
--- themes/style/statusarea.css
+++ themes/style/statusarea.css
@@ -56,8 +56,8 @@
 MLabelStyle#StatusAreaLandscapeClockLabel {
     font: $FONT_SMALL;
     color: #FFFFFF;
-    margin-left: 0;
-    margin-right: 0;
+    margin-left: 0.3mm;
+    margin-right: 0.1mm;
     margin-top: 0;
     margin-bottom: 0;
     padding-left: 0;
@@ -71,8 +71,8 @@
 MLabelStyle#StatusAreaPortraitClockLabel {
     font: $FONT_SMALL;
     color: #FFFFFF;
-    margin-left: 0;
-    margin-right: 0;
+    margin-left: 0.3mm;
+    margin-right: 0.1mm;
     margin-top: 0;
     margin-bottom: 0;
     padding-left: 0;
@@ -104,7 +104,7 @@
     maximum-size: 0 1.8mm;
     /* The number of milliseconds in which the images in imageList are animated */
     animation-duration: 3000;
-    use-icon-size: false;
+    use-icon-size: true;
 }
 
 StatusIndicatorAnimationStyle:icon {
@@ -136,6 +136,8 @@
     preferred-size: -1 3.6mm;
     minimum-size: 0 3.6mm;
     maximum-size: -1 3.6mm;
+    text-elide: true;
+    word-wrap: false;
 }
 
 MLabelStyle#StatusIndicatorLabel {
@@ -184,173 +186,145 @@
     padding-bottom: 0;
     preferred-size: -1 3.6mm;
     minimum-size: 0 3.6mm;
-    maximum-size: 17.0mm 3.6mm;
+    maximum-size: 30.0mm 3.6mm;
 }
 
 StatusIndicatorIconStyle#PhoneNetworkSignalStrengthStatusIndicator {
     /* The list of IDs of the images to be shown in the status indicator when signal strength is available, separated by spaces */
     image-list: "icon-s-status-network0 icon-s-status-network1 icon-s-status-network2 icon-s-status-network3 icon-s-status-network4 icon-s-status-network5";
-    preferred-size: 1.4mm 1.8mm;
-    minimum-size: 1.4mm 1.8mm;
-    maximum-size: 1.4mm 1.8mm;
+    preferred-size: -1 1.8mm;
+    minimum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#PhoneNetworkSignalStrengthStatusIndicatorNoSIM {
     image-list: "icon-s-status-no-simcard";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#PhoneNetworkSignalStrengthStatusIndicatorNoNetwork {
     image-list: "icon-s-status-no-gsm-connection";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#PhoneNetworkSignalStrengthStatusIndicatorOffline {
     image-list: "icon-s-status-offline";
-    preferred-size: 2.1mm 1.8mm;
-    minimum-size: 2.1mm 1.8mm;
-    maximum-size: 2.1mm 1.8mm;
+    preferred-size: -1 1.8mm;
+    minimum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator2G {
     image-list: "icon-s-status-gsm";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator25G {
     image-list: "icon-s-status-25g";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator3G {
     image-list: "icon-s-status-3g";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator35G {
     image-list: "icon-s-status-35g";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator2GActive {
     image-list: "icon-s-status-gsm-active";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator25GActive {
     image-list: "icon-s-status-25g-active";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator3GActive {
     image-list: "icon-s-status-3g-active";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator35GActive {
     image-list: "icon-s-status-35g-active";
-    preferred-size: 1.8mm 1.8mm;
-    minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
-}
-
-StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator2GSuspended {
-    image-list: "icon-s-status-gsm-suspended";
-    preferred-size: 1.8mm 1.8mm;
-    minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
-}
-
-StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator25GSuspended {
-    image-list: "icon-s-status-25g-suspended";
-    preferred-size: 1.8mm 1.8mm;
-    minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
-}
-
-StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator3GSuspended {
-    image-list: "icon-s-status-3g-suspended";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
-}
-
-StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator35GSuspended {
-    image-list: "icon-s-status-35g-suspended";
-    preferred-size: 1.8mm 1.8mm;
-    minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator2GConnecting {
     image-list: "icon-s-status-gsm icon-s-status-gsm-active";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator25GConnecting {
     image-list: "icon-s-status-25g icon-s-status-25g-active";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator3GConnecting {
     image-list: "icon-s-status-3g icon-s-status-3g-active";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator35GConnecting {
     image-list: "icon-s-status-35g icon-s-status-35g-active";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
-StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator2GWLAN {
-    image-list: "icon-s-status-gsm icon-s-status-wlan-active";
-    preferred-size: 1.8mm 1.8mm;
+StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicatorWLAN2GActive {
+    image-list: "icon-s-status-gsm-active icon-s-status-wlan";
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
-StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator25GWLAN {
-    image-list: "icon-s-status-25g icon-s-status-wlan-active";
-    preferred-size: 1.8mm 1.8mm;
+StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicatorWLAN25GActive {
+    image-list: "icon-s-status-25g-active icon-s-status-wlan";
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
-StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator3GWLAN {
-    image-list: "icon-s-status-3g icon-s-status-wlan-active";
-    preferred-size: 1.8mm 1.8mm;
+StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicatorWLAN3GActive {
+    image-list: "icon-s-status-3g-active icon-s-status-wlan";
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
-StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicator35GWLAN {
-    image-list: "icon-s-status-35g icon-s-status-wlan-active";
+StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicatorWLAN35GActive {
+    image-list: "icon-s-status-35g-active icon-s-status-wlan";
     preferred-size: 1.8mm 1.8mm;
     minimum-size: 1.8mm 1.8mm;
     maximum-size: 1.8mm 1.8mm;
@@ -359,58 +333,58 @@
 StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicatorWLAN {
     /* The list of IDs of the images to be shown in the status indicator separated by spaces */
     image-list: "icon-s-status-wlan";
-    preferred-size: 2.4mm 1.8mm;
-    minimum-size: 2.4mm 1.8mm;
-    maximum-size: 2.4mm 1.8mm;
+    preferred-size: -1 1.8mm;
+    minimum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicatorWLANActive {
     /* The list of IDs of the images to be shown in the status indicator separated by spaces */
     image-list: "icon-s-status-wlan-active";
-    preferred-size: 2.4mm 1.8mm;
-    minimum-size: 2.4mm 1.8mm;
-    maximum-size: 2.4mm 1.8mm;
+    preferred-size: -1 1.8mm;
+    minimum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#PhoneNetworkTypeStatusIndicatorWLANConnecting {
     /* The list of IDs of the images to be shown in the status indicator separated by spaces */
     image-list: "icon-s-status-wlan icon-s-status-wlan-active";
-    preferred-size: 2.4mm 1.8mm;
-    minimum-size: 2.4mm 1.8mm;
-    maximum-size: 2.4mm 1.8mm;
+    preferred-size: -1 1.8mm;
+    minimum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#BatteryStatusIndicatorLevel {
     /* The list of IDs of the images to be shown in the status indicator separated by spaces */
     image-list: "icon-s-status-battery-verylow icon-s-status-battery-low icon-s-status-battery1 icon-s-status-battery2 icon-s-status-battery3 icon-s-status-battery4 icon-s-status-battery5 icon-s-status-battery6 icon-s-status-battery7 icon-s-status-battery8";
-    preferred-size: 2.9mm 1.8mm;
-    minimum-size: 2.9mm 1.8mm;
-    maximum-size: 2.9mm 1.8mm;
+    preferred-size: -1 1.8mm;
+    minimum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#BatteryStatusIndicatorCharging {
     /* The list of IDs of the images to be shown in the status indicator separated by spaces */
     image-list: "icon-s-status-battery-verylow icon-s-status-battery-low icon-s-status-battery1 icon-s-status-battery2 icon-s-status-battery3 icon-s-status-battery4 icon-s-status-battery5 icon-s-status-battery6 icon-s-status-battery7 icon-s-status-battery8";
-    preferred-size: 2.9mm 1.8mm;
-    minimum-size: 2.9mm 1.8mm;
-    maximum-size: 2.9mm 1.8mm;
+    preferred-size: -1 1.8mm;
+    minimum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
     animation-duration: 10000;
 }
 
 StatusIndicatorIconStyle#BatteryStatusIndicatorPowerSave {
     /* The list of IDs of the images to be shown in the status indicator separated by spaces */
     image-list: "icon-s-status-powersave-verylow icon-s-status-powersave-low icon-s-status-powersave1 icon-s-status-powersave2 icon-s-status-powersave3 icon-s-status-powersave4 icon-s-status-powersave5 icon-s-status-powersave6 icon-s-status-powersave7 icon-s-status-powersave8";
-    preferred-size: 2.9mm 1.8mm;
-    minimum-size: 2.9mm 1.8mm;
-    maximum-size: 2.9mm 1.8mm;
+    preferred-size: -1 1.8mm;
+    minimum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#BatteryStatusIndicatorPowerSaveCharging {
     /* The list of IDs of the images to be shown in the status indicator separated by spaces */
     image-list: "icon-s-status-powersave-verylow icon-s-status-powersave-low icon-s-status-powersave1 icon-s-status-powersave2 icon-s-status-powersave3 icon-s-status-powersave4 icon-s-status-powersave5 icon-s-status-powersave6 icon-s-status-powersave7 icon-s-status-powersave8";
-    preferred-size: 2.9mm 1.8mm;
-    minimum-size: 2.9mm 1.8mm;
-    maximum-size: 2.9mm 1.8mm;
+    preferred-size: -1 1.8mm;
+    minimum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
     animation-duration: 10000;
 }
 
@@ -425,9 +399,9 @@
 StatusIndicatorIconStyle#AlarmStatusIndicatorSet {
     /* The list of IDs of the images to be shown in the status indicator separated by spaces */
     image-list: "icon-s-status-alarm";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
     padding-top: 0.1mm;
     padding-bottom: 0.1mm;
     margin-top: 0;
@@ -445,17 +419,17 @@
 StatusIndicatorIconStyle#BluetoothStatusIndicatorOn {
     /* The list of IDs of the images to be shown in the status indicator separated by spaces */
     image-list: "icon-s-status-bluetooth";
-    preferred-size: 1.4mm 1.8mm;
-    minimum-size: 1.4mm 1.8mm;
-    maximum-size: 1.4mm 1.8mm;
+    preferred-size: -1 1.8mm;
+    minimum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#BluetoothStatusIndicatorActive {
     /* The list of IDs of the images to be shown in the status indicator separated by spaces */
     image-list: "icon-s-status-bluetooth-active";
-    preferred-size: 1.4mm 1.8mm;
-    minimum-size: 1.4mm 1.8mm;
-    maximum-size: 1.4mm 1.8mm;
+    preferred-size: -1 1.8mm;
+    minimum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#CallStatusIndicator {
@@ -469,17 +443,17 @@
 StatusIndicatorIconStyle#CallStatusIndicatorRinging {
     /* The list of IDs of the images to be shown in the status indicator separated by spaces */
     image-list: "icon-s-status-call-initiating1 icon-s-status-call-initiating2";
-    preferred-size: 2.4mm 1.8mm;
-    minimum-size: 2.4mm 1.8mm;
-    maximum-size: 2.4mm 1.8mm;
+    preferred-size: -1 1.8mm;
+    minimum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#CallStatusIndicatorOngoing {
     /* The list of IDs of the images to be shown in the status indicator separated by spaces */
     image-list: "icon-s-status-cellular icon-s-status-ongoing-muted";
-    preferred-size: 2.4mm 1.8mm;
-    minimum-size: 2.4mm 1.8mm;
-    maximum-size: 2.4mm 1.8mm;
+    preferred-size: -1 1.8mm;
+    minimum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#ProfileStatusIndicator {
@@ -493,9 +467,9 @@
 StatusIndicatorIconStyle#ProfileStatusIndicatorSilent {
     /* The list of IDs of the images to be shown in the status indicator separated by spaces */
     image-list: "icon-s-status-silent";
-    preferred-size: 1.4mm 1.8mm;
-    minimum-size: 1.4mm 1.8mm;
-    maximum-size: 1.4mm 1.8mm;
+    preferred-size: -1 1.8mm;
+    minimum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 /* "Offline" presence, no indicator */
@@ -509,23 +483,23 @@
 
 StatusIndicatorIconStyle#PresenceStatusIndicatorAvailable {
     image-list: "icon-s-status-presence-online";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#PresenceStatusIndicatorBusy {
     image-list: "icon-s-status-presence-busy";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#PresenceStatusIndicatorAway {
     image-list: "icon-s-status-presence-away";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#GPSStatusIndicator {
@@ -539,24 +513,24 @@
 StatusIndicatorIconStyle#GPSStatusIndicatorOn  {
     /* The list of IDs of the images to be shown in the status indicator separated by spaces */
     image-list: "icon-s-status-gps-on";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#GPSStatusIndicatorSearch  {
     /* The list of IDs of the images to be shown in the status indicator separated by spaces */
     image-list: "icon-s-status-gps-searching icon-s-status-gps-on";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#NotificationStatusIndicatorOn {
     image-list: "icon-s-status-notifier";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#NotificationStatusIndicator {
@@ -575,23 +549,23 @@
 
 StatusIndicatorIconStyle#TransferStatusIndicatorLive {
     image-list: "icon-s-status-transfer-content";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#TransferStatusIndicatorFail {
     image-list: "icon-s-status-transfer-error";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#TransferStatusIndicatorPending {
     image-list: "icon-s-status-transfer-pending";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 
 StatusIndicatorIconStyle#CallForwardingStatusIndicator {
@@ -603,8 +577,8 @@
 
 StatusIndicatorIconStyle#CallForwardingStatusIndicatorSet {
     image-list: "icon-s-status-call-diverted";
-    preferred-size: 1.8mm 1.8mm;
+    preferred-size: -1 1.8mm;
     minimum-size: 1.8mm 1.8mm;
-    maximum-size: 1.8mm 1.8mm;
+    maximum-size: 5.0mm 1.8mm;
 }
 

++++++ meegotouch-systemui.yaml
--- meegotouch-systemui.yaml
+++ meegotouch-systemui.yaml
@@ -1,6 +1,6 @@
 Name: meegotouch-systemui
 Summary: System UI daemon
-Version: 0.20.12
+Version: 0.20.13
 Release: 1
 Group: System/Desktop
 License: LGPLv2.1
@@ -16,6 +16,7 @@
     - expat-devel
 PkgConfigBR:
     - QtGui
+    - QtOpenGL
     - contextsubscriber-1.0
     - dbus-1
     - dbus-glib-1




More information about the MeeGo-commits mailing list