activityfw/testapplications/activitydebugger/activitydebuger.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 "activitydebuger.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 <e32std.h>
#include <HbInstance>

#include <qservicemanager.h>
#include "activitydebugerconsole.h"

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

QTM_USE_NAMESPACE

ActivityDebuger::ActivityDebuger(QGraphicsItem *parent) : HbView(parent), mActivityClient(NULL), mByteArray(NULL)
{
    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.");
    }
    mTimesLabel = new HbLabel("Times");
    mBytesLabel = new HbLabel("Bytes");
    mPixmapLabel = new HbLabel("Pixmap");    
    mSizeLabel = new HbLabel("Size(WxH)");

    mPixmap = new QPixmap(":/images/wolf.bmp");
    mPixmap2 = new QPixmap(":/images/bird.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");
    mGetButton = new HbPushButton("Activities");
    mDelButton = new HbPushButton("Delete");
    mGetDataButton = new HbPushButton("Get data");
    mUpdateButton = new HbPushButton("Update");
    mThumbButton = new HbPushButton("Get pixmaps");
    mClearButton = new HbPushButton("Clear");
    mDelMyButton = new HbPushButton("Reserved");

    mConsole = new ActivityDebugerConsole;
    
    mLayout  = new QGraphicsGridLayout();
    mLayout->addItem(mConsole, 0, 0, 3, 6);
    mLayout->addItem(mSizeLabel, 3, 0, 1, 2);
    mLayout->addItem(mWidthCombo, 3, 2, 1, 2);
    mLayout->addItem(mHeightCombo, 3, 4, 1, 2);
    mLayout->addItem(mTimesLabel, 4, 0, 1, 2);
    mLayout->addItem(mBytesLabel, 4, 2, 1, 2);
    mLayout->addItem(mPixmapLabel, 4, 4, 1, 2);
    mLayout->addItem(mTimesCombo, 5, 0, 1, 2);
    mLayout->addItem(mLengthCombo, 5, 2, 1, 2);
    mLayout->addItem(mPixmapCombo, 5, 4, 1, 2);
    mLayout->addItem(mClearButton, 6, 0, 1, 3);
    mLayout->addItem(mGetDataButton, 6, 3, 1, 3);
    mLayout->addItem(mSaveButton, 7, 0, 1, 3);
    mLayout->addItem(mUpdateButton, 7, 3, 1, 3);
    mLayout->addItem(mGetButton, 8, 0, 1, 2);
    mLayout->addItem(mThumbButton, 8, 2, 1, 4);
    mLayout->addItem(mDelButton, 9, 0, 1, 3);
    mLayout->addItem(mDelMyButton, 9, 3, 1, 3);
    
    
    
    setLayout(mLayout);

    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(mClearButton, SIGNAL(released()), mConsole, SLOT(clear()));



}

ActivityDebuger::~ActivityDebuger()
{
    delete mEmptyPixmap;
    delete mPixmap;
    delete mPixmap2;
    delete mActivityClient;
    delete mActivityManager;
}


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

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

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

void  ActivityDebuger::deleteActivity()
{
    mItemMeaage.clear();
    mItemMeaage += "***Remove all:\n";
    QList<QVariantHash> activities;
    bool ok  = QMetaObject::invokeMethod(mActivityClient, "activities", Q_RETURN_ARG(QList<QVariantHash>, activities));
    bool retok = false;
    int items = 0;
    if (ok) {
        QString actname;
        for (int i=0; i<activities.count(); i++) {
            actname = activities.at(i).value(ActivityActivityKeyword).toString();
            ok = QMetaObject::invokeMethod(mActivityClient, "removeActivity", Q_RETURN_ARG(bool, retok), Q_ARG(QString, actname));
            ok = ok*retok;

        mItemMeaage += "*";        
        mItemMeaage += actname;
        mItemMeaage += "; ";
        QString res;
        res.setNum(ok);
        mItemMeaage += res;
        
        mItemMeaage += "*\n";
        
        items++;
        }
    mItemMeaage += tr("*Items %1*\n").arg(items);    
    }
    else
        {
        mItemMeaage += "*Failed*\n";
        }
    
    UpdateConsole();

}

void  ActivityDebuger::getActivity()
{
    mItemMeaage.clear();
    mItemMeaage += "***Activities list:\n";
    bool ok = false;
    QList<QVariantHash> activities;
    ok = QMetaObject::invokeMethod(mActivityManager, "activitiesList", Q_RETURN_ARG(QList<QVariantHash>, activities));
    if ( ok )
        {
        int items = 0;
        for ( int i=0; i<activities.count(); i++)
            {
            QString actname = activities.at(i).value(ActivityActivityKeyword).toString();
            int appid = activities.at(i).value(ActivityApplicationKeyword).toInt(&ok);
            mItemMeaage += "*";
            QString aid;
            aid.setNum(appid);
            mItemMeaage += aid;
            mItemMeaage += "; ";
            mItemMeaage += actname;
            mItemMeaage += "; ";
            QString pixfile = activities.at(i).value(ActivityScreenshotKeyword).toString();
            mItemMeaage += pixfile;
            QVariantHash::const_iterator node(activities.at(i).find("visible"));
            QString visible;
            if ( activities.at(i).end() != node )
                {
                bool vis = node.value().toBool();                
                visible.setNum(vis);
                }
            else
                {
                visible = "none";
                }
            mItemMeaage += "; ";
            mItemMeaage += visible;
            QString res;
            res.setNum(ok);
            mItemMeaage += "; ";
            mItemMeaage += res;
            mItemMeaage += "*\n";
            
            items++;
            }
        mItemMeaage += tr("*Items %1*\n").arg(items);
        }
    else
        {
        mItemMeaage += "*Failed*\n";
        }
    UpdateConsole();
}

void  ActivityDebuger::getActivityThumb()
{
    mItemMeaage.clear();
    mItemMeaage += "***Activities pixmaps:\n";
    UpdateConsole();
    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;

    ok = QMetaObject::invokeMethod(mActivityManager, "activitiesList", Q_RETURN_ARG(QList<QVariantHash>, activities));
    if ( ok )
        {
        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 actname = activities.at(i).value(ActivityActivityKeyword).toString();
            int appid = activities.at(i).value(ActivityApplicationKeyword).toInt(&ok);
            QString pixfile;
            if ( ok )
                {
                pixfile = activities.at(i).value(ActivityScreenshotKeyword).toString();
                void* userdata = reinterpret_cast<void*>(i);                
                ok = QMetaObject::invokeMethod(mActivityManager, "getThumbnail", Q_ARG(QSize, pixSize), Q_ARG(QString, pixfile), Q_ARG(void*, userdata));
                }
            
            mItemMeaage = "*";
            QString aid;
            aid.setNum(appid);
            mItemMeaage += aid;
            mItemMeaage += "; ";
            mItemMeaage += actname;
            mItemMeaage += "; ";
            QString locid = tr("locid=%1").arg(i);
            mItemMeaage += locid;
            mItemMeaage += "; ";
            QString res;
            res.setNum(ok);
            mItemMeaage += res;
            mItemMeaage += "*\n";
            UpdateConsole();
            }        
        }
    else
        {
        mItemMeaage += "*Failed*\n";
        UpdateConsole();
        }

}

    

void ActivityDebuger::saveActivity()
{
    mItemMeaage.clear();
    mItemMeaage += "***Add:\n";
    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;
    int items = 0;
    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));
        mItemMeaage += "*";            
        mItemMeaage += name;
        mItemMeaage += "; ";
        QString res;
        res.setNum(ok*retok);
        mItemMeaage += res;
        mItemMeaage += "*\n";
        
        items++;
    }
    mItemMeaage += tr("*Items %1*\n").arg(items);
    UpdateConsole();    
}

void ActivityDebuger::updateActivity()
{
    mItemMeaage.clear();
    mItemMeaage += "***Update:\n";
    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 = mPixmap2;
    }
    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;
    int items = 0;
    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));

        mItemMeaage += "*";            
        mItemMeaage += name;
        mItemMeaage += "; ";
        QString res;
        res.setNum(ok*retok);
        mItemMeaage += res;
        mItemMeaage += "*\n";
        
        items++;
    }
    mItemMeaage += tr("*Items %1*\n").arg(items);
    UpdateConsole();    
}

void ActivityDebuger::getActivityData()
{
    mItemMeaage.clear();
    mItemMeaage += "***Activities data:\n";
    QList<QVariantHash> activities;
    bool ok  = QMetaObject::invokeMethod(mActivityClient, "activities", Q_RETURN_ARG(QList<QVariantHash>, activities));
    if (ok) {
        QString name;
        QVariant data;
        int items = 0;
        for (int i=0; i<activities.count(); i++) {
            name = activities.at(i).value(ActivityActivityKeyword).toString();
            ok = QMetaObject::invokeMethod(mActivityClient, "activityData", Q_RETURN_ARG(QVariant, data), Q_ARG(QString, name));
            const char* type = data.typeName();
            QString dtype(type);
            items++;
            
            mItemMeaage += "*";            
            mItemMeaage += name;
            mItemMeaage += "; ";
            mItemMeaage += dtype;
            mItemMeaage += "; ";
            QString res;
            res.setNum(ok);
            mItemMeaage += res;
            mItemMeaage += "*\n";    
        }
    mItemMeaage += tr("*Items %1*\n").arg(items);
    }
    else
        {
        mItemMeaage += "*Failed*\n";
        }
    UpdateConsole();
}

void ActivityDebuger::thumbnailReady(QPixmap pix, void * ptr)
    {
    mItemMeaage.clear();    
    QString pixsize;
    if ( pix.isNull() )
        {
        mThumbnull++;
        pixsize = "null";
        }    
    else
        {
        QSize size = pix.size();
        int w = size.width();
        int h = size.height();
        pixsize = tr("%1x%2").arg(w).arg(h);
        }
    int loc_id  = reinterpret_cast<int>(ptr);
    QString locid;
    locid = tr("locid=%1").arg(loc_id);
    mThumbcurrent++;
    
    mItemMeaage += "*";
    mItemMeaage += locid;
    mItemMeaage += "; ";
    mItemMeaage += pixsize;
    mItemMeaage += "*\n";
    
    if (mThumbcurrent == mThumbwait)
        {
        disconnect( mActivityManager, SIGNAL(thumbnailReady(QPixmap, void *)), this, SLOT(thumbnailReady(QPixmap, void *)) );
        QString screennum = tr("*screennum: %1*\n").arg(mThumbwait);
        mItemMeaage += screennum;
        }
    UpdateConsole();
    }

void ActivityDebuger::UpdateConsole()
    {
    mConsole->appendText(mItemMeaage);
    mConsole->scrollToBotton();
    }