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