activityfw/testapplications/hbmeasuretest/hbmeasuretest.cpp
author Jaakko Haukipuro (Nokia-MS/Oulu) <Jaakko.Haukipuro@nokia.com>
Thu, 16 Sep 2010 12:11:40 +0100
changeset 117 c63ee96dbe5f
permissions -rw-r--r--
Missing activityfw and taskswitcher components - fix for Bug 3670

/*
* 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 "hbmeasuretest.h"

#include <QGridLayout>
#include <HbLabel>
#include <HbPushButton>
#include <QCoreApplication>
#include <QSignalMapper>
#include <QVariant>
#include <QList>
#include <QVariantHash>
#include <HbComboBox>
#include <QBrush>
#include <QPalette>
#include <QGraphicsGridLayout>
#include <QTimer>
#include <QFile>
#include <QTextStream>
#include <e32std.h>
#include <HbInstance>
#include <qservicemanager.h>
#include <HbScrollArea>

const char ActivityApplicationKeyword [] = ":ApplicationId";
const char ActivityActivityKeyword [] = ":ActivityName";
const char ActivityScreenshotKeyword [] = "screenshot";

QTM_USE_NAMESPACE

MeasureTest::MeasureTest(QGraphicsItem *parent) : HbView(parent), mActivityClient(NULL), mByteArray(NULL)

{
    mFile = new QFile("c:\\measuretest.txt");    
    mFile->open(QIODevice::Append | QIODevice::Text);
    mStream = new QTextStream(mFile);
    
    mThumbwait = 0;
    mThumbnull = 0;
    mThumbcurrent = 0;
    QServiceManager serviceManager;
    serviceManager.addService(":/activityserviceplugin.xml");
    mActivityClient = serviceManager.loadInterface("com.nokia.qt.activities.ActivityClient");
    if (!mActivityClient) {
        qFatal("Cannot initialize critical com.nokia.qt.activities.ActivityClient service.");
    }

    mActivityManager = serviceManager.loadInterface("com.nokia.qt.activities.ActivityManager");
    if (!mActivityManager) {
        qFatal("Cannot initialize critical com.nokia.qt.activities.ActivityManager service.");
    }
    
    HbWidget* widget = new HbWidget;
    HbScrollArea* scrollArea = new HbScrollArea; 
    
    mResultLabel = new HbLabel();
    mItemLabel = new HbLabel();
    mTimesLabel = new HbLabel("Times");
    mBytesLabel = new HbLabel("Bytes");
    mPixmapLabel = new HbLabel("Pixmap");  	  
    mSizeLabel = new HbLabel("Size(WxH)");

    mPixmap = new QPixmap(":/images/wolf.bmp");
    mEmptyPixmap = new QPixmap();


    mTimesCombo = new HbComboBox();
    mLengthCombo = new HbComboBox();
    mPixmapCombo = new HbComboBox();
    mWidthCombo = new HbComboBox();
    mHeightCombo = new HbComboBox();

    mTimesCombo->addItem("1");
    mTimesCombo->addItem("2");	
    mTimesCombo->addItem("4");
    mTimesCombo->addItem("5");
    mTimesCombo->addItem("10");
    mTimesCombo->addItem("20");
    mTimesCombo->addItem("40");
    mTimesCombo->addItem("60");

    QVariant variant;
    variant = 10;
    mLengthCombo->addItem("10 B", variant);
    variant = 100;
    mLengthCombo->addItem("100 B", variant);
    variant = 1024;
    mLengthCombo->addItem("1 KB", variant);
    variant = 10240;
    mLengthCombo->addItem("10 KB", variant);
    variant = 102400;
    mLengthCombo->addItem("100 KB", variant);
    variant = 1024*1024;
    mLengthCombo->addItem("1 MB", variant);
    
    mWidthCombo->addItem("360");
    mWidthCombo->addItem("180");
    mWidthCombo->addItem("128");
    mWidthCombo->addItem("90");
    
    mHeightCombo->addItem("640");
    mHeightCombo->addItem("320");
    mHeightCombo->addItem("160");
    mHeightCombo->addItem("128");
    

    mPixmapCombo->addItem("no");
    mPixmapCombo->addItem("yes");
    mPixmapCombo->addItem("grab");

    mSaveButton = new HbPushButton("Add activities");
    mGetButton = new HbPushButton("Get activities");
    mDelButton = new HbPushButton("Delete activities");
    mGetDataButton = new HbPushButton("Get activities data");
    mUpdateButton = new HbPushButton("Update activities");
    mThumbButton = new HbPushButton("Get act with thumb");
    mGetDataTimesButton = new HbPushButton("Get data times");
    mSaveTimesButton = new HbPushButton("Add act times");
    mSave10TimesButton = new HbPushButton("Add 10 act times");;

    mLayout  = new QGraphicsGridLayout();
    mLayout->addItem(mResultLabel, 0, 0, 1, 6);
    mLayout->addItem(mItemLabel, 1, 0, 1, 6);
    mLayout->addItem(mSizeLabel, 2, 0, 1, 2);
    mLayout->addItem(mWidthCombo, 2, 2, 1, 2);
    mLayout->addItem(mHeightCombo, 2, 4, 1, 2);
    mLayout->addItem(mTimesLabel, 3, 0, 1, 2);
    mLayout->addItem(mBytesLabel, 3, 2, 1, 2);
    mLayout->addItem(mPixmapLabel, 3, 4, 1, 2);
    mLayout->addItem(mTimesCombo, 4, 0, 1, 2);
    mLayout->addItem(mLengthCombo, 4, 2, 1, 2);
    mLayout->addItem(mPixmapCombo, 4, 4, 1, 2);
    mLayout->addItem(mSaveButton, 5, 0, 1, 6);
    mLayout->addItem(mGetButton, 6, 0, 1, 6);
    mLayout->addItem(mDelButton, 7, 0, 1, 6);
    mLayout->addItem(mGetDataButton, 8, 0, 1, 6);
    mLayout->addItem(mUpdateButton, 9, 0, 1, 6);
    mLayout->addItem(mThumbButton, 10, 0, 1, 6);    
    mLayout->addItem(mSaveTimesButton, 11, 0, 1, 6);
    mLayout->addItem(mSave10TimesButton, 12, 0, 1, 6);
    mLayout->addItem(mGetDataTimesButton, 13, 0, 1, 6);
    widget->setLayout(mLayout);
    
    scrollArea->setContentWidget(widget);
    scrollArea->setScrollDirections(Qt::Vertical);
    scrollArea->setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAlwaysOff);
    
    connect(mSaveButton, SIGNAL(released()), this, SLOT(saveActivity()));
    connect(mGetButton, SIGNAL(released()), this, SLOT(getActivity()));
    connect(mDelButton, SIGNAL(released()), this, SLOT(deleteActivity()));
    connect(mGetDataButton, SIGNAL(released()), this, SLOT(getActivityData()));
    connect(mUpdateButton, SIGNAL(released()), this, SLOT(updateActivity()));
    connect(mThumbButton, SIGNAL(released()), this, SLOT(getActivityThumb()));
    connect(mGetDataTimesButton, SIGNAL(released()), this, SLOT(getTimesActivityData()));
    connect(mSaveTimesButton, SIGNAL(released()), this, SLOT(saveTimes()));
    connect(mSave10TimesButton, SIGNAL(released()), this, SLOT(save10actTimes()));

    QGraphicsGridLayout* mainLayout = new QGraphicsGridLayout;
    mainLayout->addItem(scrollArea, 0, 0, 1, 6);    
    setLayout(mainLayout);

}

MeasureTest::~MeasureTest()
{
    delete mFile;
    delete mEmptyPixmap;
    delete mPixmap;
    delete mActivityClient;
    delete mActivityManager;
}


void MeasureTest::Before()
{
    TTime time;
    time.HomeTime();
    iBefore = time.Int64();
}

void MeasureTest::After()
{
    TTime time;
    time.HomeTime();
    iAfter = time.Int64();
}

void MeasureTest::Result()
{
    TInt64 res(0);
    res = iAfter-iBefore;
    res = res/1000;
    iResult = res;
}

void  MeasureTest::deleteActivity()
{
    QList<QVariantHash> activities;
    bool ok  = QMetaObject::invokeMethod(mActivityClient, "activities", Q_RETURN_ARG(QList<QVariantHash>, activities));
    bool retok = false;

    if (ok) {
        QString name;
        Before();
        for (int i=0; i<activities.count(); i++) {
            name = activities.at(i).value(":ActivityName").toString();
            ok = QMetaObject::invokeMethod(mActivityClient, "removeActivity", Q_RETURN_ARG(bool, retok), Q_ARG(QString, name));
            if (!ok || !retok) {
                break;
            }
        }
        After();
        Result();
    }
    mItemMessage.clear();
    mResultMessage.clear();

    if (!ok || !retok) {
        mItemMessage = (tr("invoke error"));
        mResultMessage = (tr("invoke error"));
    } else {
        mItemMessage = (tr("items: %1")).arg(activities.count());
        mResultMessage = (tr("time: %1 ms")).arg(iResult);
    }
    mItemLabel->setPlainText(mItemMessage);
    mResultLabel->setPlainText(mResultMessage);
}

void  MeasureTest::getActivity()
{
    bool ok = false;
    QList<QVariantHash> activities;
    Before();
    ok = QMetaObject::invokeMethod(mActivityClient, "activities", Q_RETURN_ARG(QList<QVariantHash>, activities));
    After();
    Result();
    int count = activities.count();
    mItemMessage.clear();
    mResultMessage.clear();
    if (!ok) {
        mItemMessage = (tr("invoke error"));
        mResultMessage = (tr("invoke error"));
    } else {
        mItemMessage = (tr("items: %1")).arg(count);
        mResultMessage = (tr("time: %1 ms")).arg(iResult);
    }
    mItemLabel->setPlainText(mItemMessage);
    mResultLabel->setPlainText(mResultMessage);
}

void  MeasureTest::getActivityThumb()
{
    disconnect( mActivityManager, SIGNAL(thumbnailReady(QPixmap, void *)), this, SLOT(thumbnailReady(QPixmap, void *)) );
    connect( mActivityManager, SIGNAL(thumbnailReady(QPixmap, void *)), this, SLOT(thumbnailReady(QPixmap, void *)) );
    mThumbwait = 0;
    mThumbnull = 0;
    mThumbcurrent = 0;
    bool ok = false;
    QList<QVariantHash> activities;
    Before();
    ok = QMetaObject::invokeMethod(mActivityClient, "activities", Q_RETURN_ARG(QList<QVariantHash>, activities));
    mThumbwait = activities.count();
        int width = mWidthCombo->currentText().toInt();
        int height = mHeightCombo->currentText().toInt();
        QSize pixSize(width, height);
    for ( int i=0; i<activities.count(); i++)
        {
        //QString app = activities.at(i).value(ActivityApplicationKeyword);
        //QString act = activities.at(i).value(ActivityActivityKeyword);
        QString pixfile = activities.at(i).value(ActivityScreenshotKeyword).toString();
        ok = QMetaObject::invokeMethod(mActivityManager, "getThumbnail", Q_ARG(QSize, pixSize), Q_ARG(QString, pixfile), Q_ARG(void*, NULL));        
        if ( !ok )
            {
            break;
            }        
        }

    int count = activities.count();
    mItemMessage.clear();
    mResultMessage.clear();
    if (!ok) {
        mItemMessage = (tr("invoke error"));
        mResultMessage = (tr("invoke error"));
        mItemLabel->setPlainText(mItemMessage);
        mResultLabel->setPlainText(mResultMessage);
    } else {
        //connect( mActivityManager, SIGNAL(thumbnailReady(QPixmap, void *)), this, SLOT(thumbnailReady(QPixmap, void *)) );
    }

    
}

void MeasureTest::saveActivity()
{
    int bytes = mLengthCombo->itemData(mLengthCombo->currentIndex()).toInt();
    delete mByteArray;
    mByteArray = NULL;
    mByteArray = new QByteArray(bytes, 'a');
    QVariant variant;
    variant = *mByteArray;
    QPixmap *pixmap = NULL;
    QPixmap screenshot;
    if (mPixmapCombo->currentText() == "yes") {
        pixmap = mPixmap;
    }
    else if ( mPixmapCombo->currentText() == "grab" )
    {
        HbMainWindow *mainWindow = hbInstance->allMainWindows().first();
        screenshot = QPixmap::grabWidget(mainWindow, mainWindow->rect());
        pixmap = &screenshot;
    }
    else
    {
        pixmap = mEmptyPixmap;
    }
    QVariantHash metadata;
    metadata.insert("screenshot", *pixmap);
    int times = 0;
    times = mTimesCombo->currentText().toInt();
    bool ok = false;
    bool retok = false;
    Before();
    for (int i=0; i<times; i++) {
        QString name;
        name.setNum(i);
        ok = QMetaObject::invokeMethod(mActivityClient, "addActivity", Q_RETURN_ARG(bool, retok), Q_ARG(QString, name), Q_ARG(QVariant, variant), Q_ARG(QVariantHash, metadata));
        if (!ok || !retok) {
            break;
        }
    }
    After();
    Result();
    mItemMessage.clear();
    mResultMessage.clear();
    if (!ok || !retok) {
        mItemMessage = (tr("invoke error"));
        mResultMessage = (tr("invoke error"));
    } else {
        mResultMessage = (tr("time: %1 ms")).arg(iResult);
    }
    mItemLabel->setPlainText(mItemMessage);
    mResultLabel->setPlainText(mResultMessage);
}

void MeasureTest::updateActivity()
{
    int bytes = mLengthCombo->itemData(mLengthCombo->currentIndex()).toInt();
    delete mByteArray;
    mByteArray = NULL;
    mByteArray = new QByteArray(bytes, 'a');
    QVariant variant;
    variant = *mByteArray;
    QPixmap *pixmap = NULL;
    QPixmap screenshot;
    if (mPixmapCombo->currentText() == "yes") {
        pixmap = mPixmap;
    }
    else if ( mPixmapCombo->currentText() == "grab" )
    {
        HbMainWindow *mainWindow = hbInstance->allMainWindows().first();
        screenshot = QPixmap::grabWidget(mainWindow, mainWindow->rect());
        pixmap = &screenshot;
    }
    else
    {
        pixmap = mEmptyPixmap;
    }
    QVariantHash metadata;
    metadata.insert("screenshot", *pixmap);
    int times = 0;
    times = mTimesCombo->currentText().toInt();
    bool ok = false;
    bool retok = false;
    Before();
    for (int i=0; i<times; i++) {
        QString name;
        name.setNum(i);
        ok = QMetaObject::invokeMethod(mActivityClient, "updateActivity", Q_RETURN_ARG(bool, retok), Q_ARG(QString, name), Q_ARG(QVariant, variant), Q_ARG(QVariantHash, metadata));
        if (!ok || !retok) {
            break;
        }
    }
    After();
    Result();
    mItemMessage.clear();
    mResultMessage.clear();
    if (!ok || !retok) {
        mItemMessage = (tr("invoke error"));
        mResultMessage = (tr("invoke error"));
    } else {
        mResultMessage = (tr("time: %1 ms")).arg(iResult);
    }
    mItemLabel->setPlainText(mItemMessage);
    mResultLabel->setPlainText(mResultMessage);
}

void MeasureTest::getActivityData()
{
    QList<QVariantHash> activities;
    bool ok  = QMetaObject::invokeMethod(mActivityClient, "activities", Q_RETURN_ARG(QList<QVariantHash>, activities));

    if (ok) {
        QString name;
        QVariant data;
        Before();
        for (int i=0; i<activities.count(); i++) {
            name = activities.at(i).value(":ActivityName").toString();
            ok = QMetaObject::invokeMethod(mActivityClient, "activityData", Q_RETURN_ARG(QVariant, data), Q_ARG(QString, name));
            if (!ok) {
                break;
            }
        }
        After();
        Result();
    }
    mItemMessage.clear();
    mResultMessage.clear();

    if (!ok) {
        mItemMessage = (tr("invoke error"));
        mResultMessage = (tr("invoke error"));
    } else {
        mItemMessage = (tr("items: %1")).arg(activities.count());
        mResultMessage = (tr("time: %1 ms")).arg(iResult);
    }
    mItemLabel->setPlainText(mItemMessage);
    mResultLabel->setPlainText(mResultMessage);
}

void MeasureTest::thumbnailReady(QPixmap pix, void * ptr)
    {
    if ( pix.isNull() )
        {
        mThumbnull++;
        }    
    mThumbcurrent++;
    mItemMessage = (tr("items: %1 from %2, but null %3")).arg(mThumbcurrent).arg(mThumbwait).arg(mThumbnull);
    mItemLabel->setPlainText(mItemMessage);
    mResultMessage = "";
    mResultLabel->setPlainText(mResultMessage);
    if (mThumbcurrent == mThumbwait)
        {
        After();
        Result();
        disconnect( mActivityManager, SIGNAL(thumbnailReady(QPixmap, void *)), this, SLOT(thumbnailReady(QPixmap, void *)) );
        mResultMessage = (tr("time: %1 ms")).arg(iResult);
        mResultLabel->setPlainText(mResultMessage);
        }
    }

void MeasureTest::saveTimes()
{
    *mStream<<"save Times\n";
    QList<int> trymeasure;
    int bytes = mLengthCombo->itemData(mLengthCombo->currentIndex()).toInt();
    delete mByteArray;
    mByteArray = NULL;
    mByteArray = new QByteArray(bytes, 'a');
    QVariant variant;
    variant = *mByteArray;
    QPixmap *pixmap = NULL;
    QPixmap screenshot;
    if (mPixmapCombo->currentText() == "yes") {
        pixmap = mPixmap;
    }
    else if ( mPixmapCombo->currentText() == "grab" )
    {
        HbMainWindow *mainWindow = hbInstance->allMainWindows().first();
        screenshot = QPixmap::grabWidget(mainWindow, mainWindow->rect());
        pixmap = &screenshot;
    }
    else
    {
        pixmap = mEmptyPixmap;
    }
    QVariantHash metadata;
    metadata.insert("screenshot", *pixmap);
    int times = 0;
    times = mTimesCombo->currentText().toInt();
    bool ok = false;
    bool retok = false;
    QString name("0");
    User::After(2000000); //2s
    for (int i=0; i<times; i++) {
        Before();
        ok = QMetaObject::invokeMethod(mActivityClient, "addActivity", Q_RETURN_ARG(bool, retok), Q_ARG(QString, name), Q_ARG(QVariant, variant), Q_ARG(QVariantHash, metadata));
        After();
        Result();
        if (!ok || !retok) {
              break;
          }
        trymeasure.append(iResult);
        ok = QMetaObject::invokeMethod(mActivityClient, "removeActivity", Q_RETURN_ARG(bool, retok), Q_ARG(QString, name));        
        if (!ok || !retok) {
            break;
        }
        User::After(2000000); //2s
    }

    mItemMessage.clear();
    mResultMessage.clear();
    if (!ok || !retok) {
        mItemMessage = (tr("invoke error"));
        mResultMessage = (tr("invoke error"));
        *mStream<<"error\n";
    } else {
        int averageint = average(trymeasure);
        mResultMessage = (tr("time: %1 ms")).arg(averageint);
        writeResults(trymeasure, averageint);
    }
    mStream->flush();
    mItemLabel->setPlainText(mItemMessage);
    mResultLabel->setPlainText(mResultMessage);    
}

void MeasureTest::save10actTimes()
{
    *mStream<<"save 10 act Times\n";
    QList<int> trymeasure;
    int bytes = mLengthCombo->itemData(mLengthCombo->currentIndex()).toInt();
    delete mByteArray;
    mByteArray = NULL;
    mByteArray = new QByteArray(bytes, 'a');
    QVariant variant;
    variant = *mByteArray;
    QPixmap *pixmap = NULL;
    QPixmap screenshot;
    if (mPixmapCombo->currentText() == "yes") {
        pixmap = mPixmap;
    }
    else if ( mPixmapCombo->currentText() == "grab" )
    {
        HbMainWindow *mainWindow = hbInstance->allMainWindows().first();
        screenshot = QPixmap::grabWidget(mainWindow, mainWindow->rect());
        pixmap = &screenshot;
    }
    else
    {
        pixmap = mEmptyPixmap;
    }
    QVariantHash metadata;
    metadata.insert("screenshot", *pixmap);
    int times = 0;
    times = mTimesCombo->currentText().toInt();
    bool ok = false;
    bool retok = false;
    QString name;
    User::After(2000000); //2s
    for(int i=0; i<times; i++) {
        Before();
        for (int i=0; i<10; i++) {
            
            name.setNum(i);
            ok = QMetaObject::invokeMethod(mActivityClient, "addActivity", Q_RETURN_ARG(bool, retok), Q_ARG(QString, name), Q_ARG(QVariant, variant), Q_ARG(QVariantHash, metadata));
            if (!ok || !retok) {
                break;
            }            
        }
        After();
        Result();
        trymeasure.append(iResult);
        
        QList<QVariantHash> activities;
        ok  = QMetaObject::invokeMethod(mActivityClient, "activities", Q_RETURN_ARG(QList<QVariantHash>, activities));    
    
        if (ok) {
            QString name;
            for (int i=0; i<activities.count(); i++) {
                name = activities.at(i).value(":ActivityName").toString();
                ok = QMetaObject::invokeMethod(mActivityClient, "removeActivity", Q_RETURN_ARG(bool, retok), Q_ARG(QString, name));
                if (!ok || !retok) {
                    break;
                }
            }
        }
        User::After(2000000); //2s        

    }        
    mItemMessage.clear();
    mResultMessage.clear();
    if (!ok || !retok) {
        mItemMessage = (tr("invoke error"));
        mResultMessage = (tr("invoke error"));
        *mStream<<"error\n";
    } else {
        int averageint = average(trymeasure);
        mResultMessage = (tr("time: %1 ms")).arg(averageint);
        writeResults(trymeasure, averageint);
    }
    mStream->flush();
    mItemLabel->setPlainText(mItemMessage);
    mResultLabel->setPlainText(mResultMessage);    
    
}

void MeasureTest::getTimesActivityData()
{
    int times = 0;
    times = mTimesCombo->currentText().toInt();
    *mStream<<"get data Times\n";
    QList<int> trymeasure;
    
    QList<QVariantHash> activities;
    bool ok  = QMetaObject::invokeMethod(mActivityClient, "activities", Q_RETURN_ARG(QList<QVariantHash>, activities));
    User::After(2000000); //2s
    if (ok) {
        QString name;
        QVariant data;        
        for(int i=0; i<times; i++) {
            Before();
            for (int i=0; i<activities.count(); i++) {
                name = activities.at(i).value(":ActivityName").toString();
                ok = QMetaObject::invokeMethod(mActivityClient, "activityData", Q_RETURN_ARG(QVariant, data), Q_ARG(QString, name));
                if (!ok) {
                    break;
                }
            }
            After();
            Result();
            trymeasure.append(iResult);
            User::After(2000000); //2s
        }
    }
    mItemMessage.clear();
    mResultMessage.clear();

    if (!ok) {
        mItemMessage = (tr("invoke error"));
        mResultMessage = (tr("invoke error"));
        *mStream<<"error\n";
    } else {
        int averageint = average(trymeasure);
        mResultMessage = (tr("time: %1 ms")).arg(averageint);
        writeResults(trymeasure, averageint);
    }
    mStream->flush();
    mItemLabel->setPlainText(mItemMessage);
    mResultLabel->setPlainText(mResultMessage);

}

int MeasureTest::average(const QList<int>& list)
{
    int count = list.count();
    int sum=0;
    for(int i=0; i<count; i++) {
        sum += list.at(i);
    }
    sum = (sum+0.5)/count;
    return sum;
}

int MeasureTest::writeResults(const QList<int>& list, int average)
{
    for(int i=0; i<list.count(); i++){
        *mStream<<"|  ";
        *mStream<<list.at(i);
        *mStream<<"  |\n";
    }
    *mStream<<"|  ";
    *mStream<<average;
    *mStream<<"  |\n";
}