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