activityfw/testapplications/newtestappset/acttestdebugger/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"

#include <afactivitystorage.h>
#include <afactivation.h>
#include "afstorageglobals.h"


QTM_USE_NAMESPACE

ActivityDebuger::ActivityDebuger(QGraphicsItem *parent) : HbView(parent), mByteArray(NULL)
{
    mThumbwait = 0;
    mThumbnull = 0;
    mThumbcurrent = 0;
    QServiceManager serviceManager;
    serviceManager.addService(":/activityserviceplugin.xml");

    mActivityManager = serviceManager.loadInterface("com.nokia.qt.activities.ActivityManager");
    if (!mActivityManager) {
        qFatal("Cannot initialize critical com.nokia.qt.activities.ActivityManager service.");
    }
    
    mActivityStorage = new AfActivityStorage;
    mActivation = new AfActivation;
    qRegisterMetaType<Af::ActivationReason>("Af::ActivationReason");
    connect(mActivation, SIGNAL(activated(Af::ActivationReason, QString, QVariantHash)), this, SLOT(loadActivityData(Af::ActivationReason, QString, QVariantHash)));
    
    
    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("Save");
    mGetButton = new HbPushButton("Activities");
    mDelButton = new HbPushButton("Delete");
    mGetDataButton = new HbPushButton("Get data");
    mGetMyButton = new HbPushButton("Get my");
    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(mGetMyButton, 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(mGetMyButton, SIGNAL(released()), this, SLOT(getMyActivity()));
    connect(mThumbButton, SIGNAL(released()), this, SLOT(getActivityThumb()));
    connect(mClearButton, SIGNAL(released()), mConsole, SLOT(clear()));



}

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


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";
    QStringList activities = mActivityStorage->allActivities();    
    
    int items = 0;
    bool ok = false;
    QString actname;
    for (int i=0; i<activities.count(); i++) {
        actname = activities.at(i);
        ok = mActivityStorage->removeActivity(actname);   

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

    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++)
            {
            getMetadata(activities.at(i));            
            
            items++;
            }
        mItemMeaage += tr("*Items %1*\n").arg(items);
        }
    else
        {
        mItemMeaage += "*Failed*\n";
        }
    UpdateConsole();
}

void ActivityDebuger::getMetadata(QVariantHash varianthash)
{
    QString actname = varianthash.value(ActivityActivityKeyword).toString();
    int appid = varianthash.value(ActivityApplicationKeyword).toInt();
    mItemMeaage += "*";
    QString aid;
    aid.setNum(appid);
    mItemMeaage += aid;
    mItemMeaage += "; ";
    mItemMeaage += actname;
    mItemMeaage += "; ";
    QString pixfile = varianthash.value(ActivityScreenshotKeyword).toString();
    mItemMeaage += pixfile;
    QVariantHash::const_iterator node(varianthash.find(ActivityVisibility));
    QString visible;
    if ( varianthash.end() != node )
        {
        bool vis = node.value().toBool();                
        visible.setNum(vis);
        }
    else
        {
        visible = "none";
        }
    
    QVariantHash::const_iterator node2(varianthash.find(ActivityPersistence));
    QString persistence;
    if ( varianthash.end() != node2 )
        {
        bool per = node2.value().toBool();                
        persistence.setNum(per);
        }
    else
        {
        persistence = "none";
        }


    QVariantHash::const_iterator node3(varianthash.find(ActivityApplicationName));
    QString display;
    if ( varianthash.end() != node3 )
        {
        display = node3.value().toString();                
        }
    else
        {
        persistence = "none";
        }
        
    mItemMeaage += "; ";
    mItemMeaage += visible;
    mItemMeaage += "; ";
    mItemMeaage += persistence;
    mItemMeaage += "; ";
    mItemMeaage += display;
}

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 += "***Save:\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(ActivityScreenshotKeyword, *pixmap);
    int times = 0;
    times = mTimesCombo->currentText().toInt();
    bool ok = false;
    int items = 0;
    for (int i=0; i<times; i++) {
        QString name;
        name.setNum(i);   
        metadata.insert(ActivityApplicationName, name);        
        ok = mActivityStorage->saveActivity(name, variant, metadata);
        mItemMeaage += "*";            
        mItemMeaage += name;
        mItemMeaage += "; ";
        QString res;
        res.setNum(ok);
        mItemMeaage += res;
        mItemMeaage += "*\n";
        
        items++;
    }
    mItemMeaage += tr("*Items %1*\n").arg(items);
    UpdateConsole();    
}

void ActivityDebuger::getMyActivity()
{
    mItemMeaage.clear();
    mItemMeaage += "***Get my activities:\n";
    QStringList activities = mActivityStorage->allActivities();  
    QString name;
    QVariantHash data;
    int items = 0;
    for (int i=0; i<activities.count(); i++) {
        name = activities.at(i);
        data = mActivityStorage->activityMetaData(activities.at(i));        
        getMetadata(data);            
        items++;       
    }
    mItemMeaage += tr("*Items %1*\n").arg(items);
    UpdateConsole();   
}

void ActivityDebuger::getActivityData()
{
    mItemMeaage.clear();
    mItemMeaage += "***Activities data:\n";
    QStringList activities = mActivityStorage->allActivities();   

    QString name;
    QVariant data;
    int items = 0;
    for (int i=0; i<activities.count(); i++) {
        name = activities.at(i);
        data = mActivityStorage->activityData(activities.at(i));
        const char* type = data.typeName();
        QString dtype(type);
        items++;
        
        mItemMeaage += "*";            
        mItemMeaage += name;
        mItemMeaage += "; ";
        mItemMeaage += dtype;
        mItemMeaage += "; ";        
        mItemMeaage += "*\n";    
    }
    mItemMeaage += tr("*Items %1*\n").arg(items);

    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();
    }

void ActivityDebuger::loadActivityData(Af::ActivationReason reason, const QString &name, QVariantHash parameter)
{
    mItemMeaage.clear();
    mItemMeaage += "***Activity requested:\n";
    int reasonint = static_cast<int>(reason);
    QString reasonstring;
    reasonstring.setNum(reasonint);
    int parametercount = parameter.count();
    QString parametercountstring;;
    parametercountstring.setNum(parametercount);
    
    
    mItemMeaage += "*";            
    mItemMeaage += name;
    mItemMeaage += "; ";
    mItemMeaage += reasonstring;
    mItemMeaage += "; ";        
    mItemMeaage += parametercountstring;
    mItemMeaage += "*\n"; 
    
    UpdateConsole();
}