/*
 * 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:  Manages differnt messaging views.
 *
 */

#include "msgserviceviewmanager.h"

#include <QFileInfo>
#include <QDir>
#include <QFile>
#include <QPixmap>
#include <HbMainWindow>
#include <HbAction>
#include <HbApplication>
#include <HbMessageBox>
#include <HbDeviceMessageBox>
#include <HbSplashScreen>

#include <xqserviceutil.h>
#include <xqappmgr.h>

#include "msgunieditorview.h"
#include "unifiedviewer.h"
#include "msgstorehandler.h"
#include "msgsettingsview.h"
#include "convergedmessageid.h"
#include "ringbc.h"
#include "unidatamodelloader.h"
#include "unidatamodelplugininterface.h"
#include "msgcontacthandler.h"

// CONSTANTS
static const char SEND_EFFECT[] = "sendeffect";
static const char SEND_EFFECT_FILE[] = ":/effects/sendeffect.fxml";

// LOCALIZATION
#define LOC_DELETE_MESSAGE hbTrId("txt_messaging_dialog_delete_message")
// TODO: LOC
#define LOC_DELETED_MESSAGE "Message is deleted"
#define LOC_CANNOT_OPEN_MESSAGE "Message in outbox. Cannot be opened"
#define LOC_UNKNOWN_MSG_TYPE "Unknown Message Type"

//----------------------------------------------------------------------------
// MsgViewInterface::MsgViewInterface
// @see header
//----------------------------------------------------------------------------
MsgServiceViewManager::MsgServiceViewManager(MsgStoreHandler* storeHandler,
        HbMainWindow* mainWindow, QObject* parent) :
        QObject(parent), mMainWindow(mainWindow), mUniEditor(NULL),
        mUniViewer(NULL), mSettingsView(NULL), mBackAction(NULL),
        mStoreHandler(storeHandler)
    {
    //creating back action.
    mBackAction = new HbAction(Hb::BackNaviAction, this);
    connect(mBackAction, SIGNAL(triggered()), this, SLOT(onBackAction()));
    
    // create a temp view : which is required for lazy loading of other views
    HbView* tempView = new HbView();
    mMainWindow->addView(tempView);
    mMainWindow->setCurrentView(tempView);
    }

//----------------------------------------------------------------------------
// MsgServiceViewManager::~MsgServiceViewManager
// @see header
//----------------------------------------------------------------------------
MsgServiceViewManager::~MsgServiceViewManager()
    {
  
    }

//----------------------------------------------------------------------------
// MsgServiceViewManager::onBackAction
// @see header
//----------------------------------------------------------------------------
void MsgServiceViewManager::onBackAction()
    {
    switch(mCurrentView)
        {
        case MsgBaseView::UNIEDITOR:
            {
            mUniEditor->saveContentToDrafts();
            HbApplication::quit();
            break;
            }
        case MsgBaseView::MSGSETTINGS:
            {
            //delete the settings instance
            if (mSettingsView)
            {
                mMainWindow->removeView(mSettingsView);
                delete mSettingsView;
                mSettingsView = NULL;
            }
            if(mUniEditor)
                {
                mMainWindow->setCurrentView(mUniEditor);
                mCurrentView = MsgBaseView::UNIEDITOR;
                }
            else 
                {
                ConvergedMessage message;
                QVariantList param;
                QByteArray dataArray;
                QDataStream messageStream(&dataArray, 
                        QIODevice::WriteOnly | QIODevice::Append);
                message.serialize(messageStream);
                param << dataArray;

                // switch to editor
                switchToUniEditor(param);
                }
            break;
            }
        case MsgBaseView::UNIVIEWER: 
        default:
            {
            HbApplication::quit();
            break;
            }
            
        }
    }

//----------------------------------------------------------------------------
// MsgServiceViewManager::switchView
// @see header
//----------------------------------------------------------------------------
void MsgServiceViewManager::switchView(const QVariantList& data)
    {
    int viewId = data.at(0).toInt();
    switch (viewId)
        {
        case MsgBaseView::UNIEDITOR:
            {
            // except first 2 parameters pass other parameters
            QVariantList editorData;
            for(int a = 2; a < data.length(); ++a)
                {
                editorData << data.at(a);
                }
            switchToUniEditor(editorData);
            break;
            }
        case MsgBaseView::MSGSETTINGS:
            {
            switchToMsgSettings(data);
            break;
            }
        default: 
            {
            // if send from editor is successful, then run effects
            int previousView = data.at(1).toInt();
            if(previousView == MsgBaseView::UNIEDITOR)
                {
                startAnimation(SEND_EFFECT);
                }
            else
                {
                HbApplication::quit();
                }
            }
        }
    }

//----------------------------------------------------------------------------
// MsgServiceViewManager::send
// @see header
//----------------------------------------------------------------------------
void MsgServiceViewManager::send(const QString phoneNumber, 
        const qint32 contactId, 
        const QString displayName)
    {
    Q_UNUSED(contactId);
    mMainWindow->show();
    ConvergedMessage message;
    ConvergedMessageAddress address;
    address.setAddress(phoneNumber);
    address.setAlias(displayName);
    message.addToRecipient(address);

    QVariantList param;
    QByteArray dataArray;
    QDataStream messageStream(&dataArray, 
            QIODevice::WriteOnly | QIODevice::Append);
    message.serialize(messageStream);
    param << dataArray;
    
    // switch to editor
    switchToUniEditor(param);
    
    XQServiceUtil::toBackground(false);
    }

//----------------------------------------------------------------------------
// MsgServiceViewManager::send
// @see header
//----------------------------------------------------------------------------
void MsgServiceViewManager::send(const QString phoneNumber, 
        const QString alias, 
        const QString bodyText)
    {
    mMainWindow->show();
    ConvergedMessage message;
    ConvergedMessageAddress address;
    address.setAddress(phoneNumber);
    address.setAlias(alias);
    message.addToRecipient(address);
    message.setBodyText(bodyText);

    QVariantList param;
    QByteArray dataArray;
    QDataStream messageStream(&dataArray, 
            QIODevice::WriteOnly | QIODevice::Append);
    message.serialize(messageStream);
    param << dataArray;

    // switch to editor
    switchToUniEditor(param);
    
    XQServiceUtil::toBackground(false);
    }

//----------------------------------------------------------------------------
// MsgServiceViewManager::send
// @see header
//----------------------------------------------------------------------------
void MsgServiceViewManager::send(const QVariantMap addressList, 
              const QString bodyText)
    {
    mMainWindow->show();
    QStringList phoneNumList = addressList.keys(); 
    ConvergedMessageAddressList addrList;
    int count = phoneNumList.count();
    for( int i = 0; i < count; ++ i )
        {
        QString phNum = phoneNumList[i];
        ConvergedMessageAddress* address = new ConvergedMessageAddress(phNum,
                addressList.value(phNum).toString());	
        addrList.append(address);
        }
    
    ConvergedMessage message;
    message.addToRecipients(addrList);
    message.setBodyText(bodyText);
    
    QVariantList param;
    QByteArray dataArray;
    QDataStream messageStream(&dataArray, 
            QIODevice::WriteOnly | QIODevice::Append);
    message.serialize(messageStream);
    param << dataArray;

    // switch to editor
    switchToUniEditor(param);

    XQServiceUtil::toBackground(false);
    }

//----------------------------------------------------------------------------
// MsgServiceViewManager::send
// @see header
//----------------------------------------------------------------------------
void MsgServiceViewManager::send(QVariant data)
    {
    mMainWindow->show();
    ConvergedMessage message;
    ConvergedMessageAttachmentList attachmentList;
    // handle multiple files from sendUI
    // e.g. contacts can send multiple vcards
    QStringList receivedFiles = data.toStringList();
    int recFileCount = receivedFiles.count();
    for (int i = 0; i < recFileCount; i++) {
    ConvergedMessageAttachment *attachment =
    new ConvergedMessageAttachment(receivedFiles.at(i));
    attachmentList.append(attachment);
    }
    message.addAttachments(attachmentList);

    QVariantList param;
    QByteArray dataArray;
    QDataStream messageStream(&dataArray, 
            QIODevice::WriteOnly | QIODevice::Append);
    message.serialize(messageStream);
    param << dataArray;

    // switch to editor
    switchToUniEditor(param);
    
    XQServiceUtil::toBackground(false);
    }

//----------------------------------------------------------------------------
// MsgServiceViewManager::switchToUniEditor
// @see header
//----------------------------------------------------------------------------
void MsgServiceViewManager::switchToUniEditor(const QVariantList& editorData)
{
    // construct
    if (!mUniEditor)
    {
        mUniEditor = new MsgUnifiedEditorView();
        mMainWindow->addView(mUniEditor);
        mUniEditor->setNavigationAction(mBackAction);
        connect(mUniEditor, SIGNAL(switchView(const QVariantList&)), this,
                SLOT(switchView(const QVariantList&)));
    }
    
    // populate
    mUniEditor->populateContent(editorData);
    
    // set current view as editor
    mMainWindow->setCurrentView(mUniEditor);
    mCurrentView = MsgBaseView::UNIEDITOR;
}

//----------------------------------------------------------------------------
// MsgServiceViewManager::switchToMsgSettings
// @see header
//----------------------------------------------------------------------------
void MsgServiceViewManager::switchToMsgSettings(const QVariantList& data)
{
    MsgSettingsView::SettingsView view = MsgSettingsView::DefaultView;
    
    if (mCurrentView == MsgBaseView::UNIEDITOR)
    {
        view = (MsgSettingsView::SettingsView)data.at(2).toInt();
    }

    mCurrentView = MsgBaseView::MSGSETTINGS;

    if (!mSettingsView)
    {        
        mSettingsView = new MsgSettingsView(view);
        mSettingsView->setNavigationAction(mBackAction);
        mMainWindow->addView(mSettingsView);
    }
    mMainWindow->setCurrentView(mSettingsView);
}

//----------------------------------------------------------------------------
// MsgServiceViewManager::showPopup
// @see header
//----------------------------------------------------------------------------
void MsgServiceViewManager::showPopup(const QString& dispText)
{
    HbDeviceMessageBox msgbox;
    msgbox.setMessageBoxType(HbMessageBox::MessageTypeInformation);
    msgbox.setText(dispText);
    msgbox.setAction(NULL, HbDeviceMessageBox::AcceptButtonRole);
    msgbox.exec();
    msgbox.close();
}

//----------------------------------------------------------------------------
// MsgServiceViewManager::view
// @see header
//----------------------------------------------------------------------------
void MsgServiceViewManager::view(int msgId)
{
    // Check if the message is present in store
    if(!mStoreHandler->exists(msgId))
    {
        showPopup(LOC_DELETED_MESSAGE);
        HbApplication::quit();
        return;
    }

    // Check if the given message is locked for viewing
    if(mStoreHandler->locked(msgId))
    {
        // if locked, then show info-note and exit
        showPopup(LOC_CANNOT_OPEN_MESSAGE);
        HbApplication::quit();
        return;
    }

    // Mark as read and get message type
    int msgType;
    int msgSubType;   
    mStoreHandler->markAsRead(msgId);
    mStoreHandler->getMsgTypeInfo(msgId,msgType,msgSubType);

    // Open draft message in editor
    if(mStoreHandler->isDraftMessage(msgId))
    {
        handleDraftMsg(msgId,msgType);
        return;
    }

    switch (msgType) 
    {
        case ConvergedMessage::Sms:
        case ConvergedMessage::Mms:
        {
            if (msgSubType == ConvergedMessage::VCard)
            {
                handleVCardMsg(msgId);
            }
            else
            {
                handleSmsMmsMsg(msgId);    
            }
            break;
        }
        case ConvergedMessage::MmsNotification:
        {
            handleMmsNotification(msgId);
            break;
        }
        case ConvergedMessage::BioMsg:
        {
            if (msgSubType == ConvergedMessage::RingingTone)
            {
                handleRingtoneMsg(msgId);
            }
            else if (msgSubType == ConvergedMessage::Provisioning)
            {
                handleProvisoningMsg(msgId);
            }
            else if (msgSubType == ConvergedMessage::VCard)
            {
                handleVCardMsg(msgId);
            }
            break;
        }
        case ConvergedMessage::BT:
        {
            handleBTMessage(msgId);
            break;
        }
        default:
        {
            // For all remaining unsupported messages, show delete option
            showPopup(LOC_UNKNOWN_MSG_TYPE);
            HbApplication::quit();
        }
    }
}

// ----------------------------------------------------------------------------
// MsgServiceViewManager::handleKeyEvent
// @see header
// ----------------------------------------------------------------------------
bool MsgServiceViewManager::handleKeyEvent(int key)
{
    MsgBaseView *baseView = static_cast<MsgBaseView *>(mMainWindow->currentView());
    bool eventHandled = false;
    if (baseView) {
        eventHandled = baseView->handleKeyEvent(key);
    }
    return eventHandled;
}

// ----------------------------------------------------------------------------
// MsgServiceViewManager::handleDraftMsg
// @see header
// ----------------------------------------------------------------------------
void MsgServiceViewManager::handleDraftMsg(int msgId, int msgType)
{
    // show the splash-screen
    // TODO: This causes cancellation of view switching effects
//    HbSplashScreen::start();
    connect(mMainWindow, SIGNAL(viewReady()), this, SLOT(showOnViewReady()));
    mCurrentView = MsgBaseView::UNIEDITOR;

    // construct editor instance (keep it minimal)
    if (!mUniEditor)
    {
        mUniEditor = new MsgUnifiedEditorView();
        mMainWindow->addView(mUniEditor);
        mUniEditor->setNavigationAction(mBackAction);
        connect(mUniEditor, SIGNAL(switchView(const QVariantList&)), this,
                SLOT(switchView(const QVariantList&)));
    }

    // prepare data for unieditor
    ConvergedMessage message;
    ConvergedMessageId convergedMsgId = ConvergedMessageId(msgId);
    message.setMessageType((ConvergedMessage::MessageType) msgType);
    message.setMessageId(convergedMsgId);
    QByteArray dataArray;
    QDataStream messageStream(&dataArray, QIODevice::WriteOnly | QIODevice::Append);
    message.serialize(messageStream);
    QVariantList editorData;
    editorData << dataArray;

    mMainWindow->show();
    // populate data into editor
    mUniEditor->openDraftsMessage(editorData);
}

// ----------------------------------------------------------------------------
// MsgServiceViewManager::handleVCardMsg
// @see header
// ----------------------------------------------------------------------------
void MsgServiceViewManager::handleVCardMsg(int msgId)
{
    // Extract vCard filepath
    QString filepath;
    UniDataModelLoader* pluginLoader = new UniDataModelLoader();
    UniDataModelPluginInterface* pluginInterface = 
                    pluginLoader->getDataModelPlugin(ConvergedMessage::BioMsg);
    pluginInterface->setMessageId(msgId);

    // Get attachment list
    UniMessageInfoList attachments = pluginInterface->attachmentList();
    if(attachments.count() > 0)
    {
        filepath = attachments.at(0)->path();    
    }

    // Cleanup
    foreach(UniMessageInfo* attachmentInfo,attachments)
    {
        delete attachmentInfo;
    }
    delete pluginLoader;

    // Get vCard display name
    QString displayName = MsgContactHandler::getVCardDisplayName(filepath);
    // TODO: use displayname to create a localized string to show in dialog
    QString loc_str = QString("Save to contacts: ").append(displayName);
    bool viewVCard = HbDeviceMessageBox::question(loc_str,
                         HbMessageBox::Ok|HbMessageBox::Cancel);
    if(!viewVCard)
    {
        HbApplication::quit();
        return;
    }

    // copy private-vCard file to public location for contacts access
    QDir tempDir;
    QString sharedFilePath(QDir::toNativeSeparators(tempDir.tempPath()));
    sharedFilePath.append(QDir::separator());
    QFileInfo fInfo(filepath);
    sharedFilePath.append(fInfo.fileName());
    QFile::copy(filepath, sharedFilePath);

    // Launch vCard viewer service
    QString service("phonebookservices");
    QString interface("com.nokia.symbian.IContactsEdit");
    QString operation("editCreateNewFromVCard(QString)");
    XQApplicationManager appManager;
    // embedded launch
    XQAiwRequest* request = 
            appManager.create(service, interface, operation, true);
    if(request)
    {
        QList<QVariant> args;
        args << sharedFilePath;
        request->setArguments(args);
        QVariant retValue;
        bool res = request->send(retValue);
        delete request;
    }

    // Delete shared file now
    QFile::remove(sharedFilePath);
    HbApplication::quit();
}

// ----------------------------------------------------------------------------
// MsgServiceViewManager::handleSmsMmsMsg
// @see header
// ----------------------------------------------------------------------------
void MsgServiceViewManager::handleSmsMmsMsg(int msgId)
{
    // show the splash-screen
    // TODO: This causes cancellation of view switching effects
//    HbSplashScreen::start();
    connect(mMainWindow, SIGNAL(viewReady()), this, SLOT(showOnViewReady()));
    mCurrentView = MsgBaseView::UNIVIEWER;

    // construct viewer instance (keep it minimal)
    if(!mUniViewer)
    {
        mUniViewer = new UnifiedViewer(msgId);
        mMainWindow->addView(mUniViewer);
        mUniViewer->setNavigationAction(mBackAction);
        connect(mUniViewer, SIGNAL(switchView(const QVariantList&)),
                        this, SLOT(switchView(const QVariantList&)));
    }

    // populate the viewer
    mUniViewer->populateContent(msgId, true, 1);
    mMainWindow->show();
}

// ----------------------------------------------------------------------------
// MsgServiceViewManager::handleMmsNotification
// @see header
// ----------------------------------------------------------------------------
void MsgServiceViewManager::handleMmsNotification(int msgId)
{
    // set context to current entry
    if( KErrNone != mStoreHandler->setNotificationMessageId(msgId))
    {
        return;
    }

    // notification state e.g. waiting, retrieving etc
    QString statusStr;
    int status;
    mStoreHandler->notificationStatus(status, statusStr);

    QString displayTxt;
    displayTxt.append(mStoreHandler->notificationSubject());
    displayTxt.append(QChar::LineSeparator);
    displayTxt.append(mStoreHandler->notificationMsgSize());
    displayTxt.append(QChar::LineSeparator);
    displayTxt.append(mStoreHandler->notificationClass());
    displayTxt.append(QChar::LineSeparator);
    displayTxt.append(mStoreHandler->notificationExpiryDate());
    if(!statusStr.isEmpty())
    {
        displayTxt.append(QChar::LineSeparator);
        displayTxt.append(statusStr);
    }    
    HbDeviceMessageBox::information(displayTxt);
    HbApplication::quit();
}

// ----------------------------------------------------------------------------
// MsgServiceViewManager::showOnViewReady
// @see header
// ----------------------------------------------------------------------------
void MsgServiceViewManager::showOnViewReady()
{
    switch(mCurrentView)
    {
        case MsgBaseView::UNIVIEWER:
        {
            mMainWindow->setCurrentView(mUniViewer);
            break;
        }
        case MsgBaseView::UNIEDITOR:
        {
            mMainWindow->setCurrentView(mUniEditor);
            break;
        }
        default:
            break;
    }
    disconnect(mMainWindow, SIGNAL(viewReady()), this, SLOT(showOnViewReady()));
}

// ----------------------------------------------------------------------------
// MsgServiceViewManager::handleRingtoneMsg
// @see header
// ----------------------------------------------------------------------------
void MsgServiceViewManager::handleRingtoneMsg(int msgId)
{
    // Extract rintone filepath
    UniDataModelLoader* pluginLoader = new UniDataModelLoader();
    UniDataModelPluginInterface* pluginInterface = 
                        pluginLoader->getDataModelPlugin(ConvergedMessage::BioMsg);
    pluginInterface->setMessageId(msgId);

    // Get attachment list
    UniMessageInfoList attachments = pluginInterface->attachmentList();
    QString filepath;
    if(attachments.count() > 0)
    {
        filepath = attachments.at(0)->path();
    }

    // Cleanup
    foreach(UniMessageInfo* attachmentInfo,attachments)
    {
        delete attachmentInfo;
    }
    delete pluginLoader;

    RingBc* ringBc = new RingBc();
    QString filename = ringBc->toneTitle(filepath);
    // TODO: use filename to create a localized string to show in dialog
    QString loc_str = QString("Save ringtone? ").append(filename);
    bool save = HbDeviceMessageBox::question(loc_str,
                    HbMessageBox::Save | HbMessageBox::Cancel);
    if(save)
    {
        ringBc->saveTone(filepath);
    }
    delete ringBc;
    HbApplication::quit();
}

// ----------------------------------------------------------------------------
// MsgServiceViewManager::handleProvisoningMsg
// @see header
// ----------------------------------------------------------------------------
void MsgServiceViewManager::handleProvisoningMsg(int msgId)
    {
    QString messageId;
    messageId.setNum(msgId);

    XQApplicationManager* aiwMgr = new XQApplicationManager();

    XQAiwRequest* request = aiwMgr->create("com.nokia.services.MDM", 
            "Provisioning",
            "ProcessMessage(QString)", true); // embedded

    if (request) {
    QList<QVariant> args;
    args << QVariant(messageId);
    request->setArguments(args);

    // Send the request
    bool res = request->send();

    // Cleanup
    delete request;
    }

    delete aiwMgr;

    // close the application once its handled
    HbApplication::quit();
    }

//-----------------------------------------------------------------------------
//MsgServiceViewManager::handleBTMessage()
//@see header
//-----------------------------------------------------------------------------
void MsgServiceViewManager::handleBTMessage(int msgId)
    {
    XQApplicationManager* aiwMgr = new XQApplicationManager();
    XQAiwRequest* request = 
    aiwMgr->create("com.nokia.services.btmsgdispservices", "displaymsg",
            "displaymsg(int)", true); // embedded

    if (request) {
    QList<QVariant> args;
    args << QVariant(msgId);
    request->setArguments(args);

    // Send the request
    bool res = request->send();

    // Cleanup
    delete request;
    }

    delete aiwMgr;

    // close the application once its handled
    HbApplication::quit();
    }

//-----------------------------------------------------------------------------
//MsgServiceViewManager::startAnimation
//@see header
//-----------------------------------------------------------------------------
void MsgServiceViewManager::startAnimation(QString effectEvent)
    {
    // take screen shot
    QGraphicsPixmapItem *animationScreenShot = screenShot();
    if (animationScreenShot)
        {
        // but don't show it yet.
        animationScreenShot->hide();
        animationScreenShot->setPos(0,0);
        animationScreenShot->setZValue(0);

        // hide items, so that background app's items are visible immediately
        mMainWindow->currentView()->hideItems(Hb::AllItems);
        
        // reset background & set the base transparent
        mMainWindow->setBackgroundImageName(
                mMainWindow->orientation(), QString("dummy_blank"));
        QPalette p = mMainWindow->viewport()->palette();
        p.setColor(QPalette::Base, Qt::transparent);
        mMainWindow->viewport()->setPalette(p);

        // add animating item directly to the scene
        mMainWindow->scene()->addItem(animationScreenShot);
        
        // hide other views
        QList<HbView*> vws = mMainWindow->views();
        while (!vws.isEmpty())
            {
            HbView* view = vws.takeLast();
            view->hide();
            }
        
        // now show the animating item, and start animation on it
        animationScreenShot->show();
        QString effectFile = getAnimationFile(effectEvent);
        HbEffect::add(animationScreenShot, effectFile, effectEvent);
        HbEffect::start(animationScreenShot, effectEvent, this,
                "onAnimationComplete");
        }
    }

//-----------------------------------------------------------------------------
//MsgServiceViewManager::resetAnimation
//@see header
//-----------------------------------------------------------------------------
void MsgServiceViewManager::resetAnimation(
        QString effectEvent,
        QGraphicsItem* item)
    {
    if (item) 
        {
        QString effectFile = getAnimationFile(effectEvent);
        HbEffect::remove(item, effectFile, effectEvent);
        mMainWindow->scene()->removeItem(item);
        delete item;
        item = NULL;
        }
    }

//-----------------------------------------------------------------------------
//MsgServiceViewManager::onAnimationComplete
//@see header
//-----------------------------------------------------------------------------
void MsgServiceViewManager::onAnimationComplete(
        const HbEffect::EffectStatus &status)
    {
    QGraphicsItem* item = status.item;
    QString effectEvent = status.effectEvent;
    resetAnimation(effectEvent, item);
    HbApplication::quit();
    }

//-----------------------------------------------------------------------------
//MsgServiceViewManager::screenShot
//@see header
//-----------------------------------------------------------------------------
QGraphicsPixmapItem* MsgServiceViewManager::screenShot()
    {
    // set fullscreen and hide unwanted items
    mMainWindow->currentView()->hideItems(Hb::ToolBarItem | Hb::DockWidgetItem | Hb::StatusBarItem);
    mMainWindow->currentView()->setContentFullScreen(true);

    // grab whole view into pixmap image
    QPixmap screenCapture = QPixmap::grabWindow(mMainWindow->internalWinId());

    // create an QGraphicsItem to do animation
    QGraphicsPixmapItem *ret(NULL);

    // for landscape, the screenshot must be rotated
    if(mMainWindow->orientation() == Qt::Horizontal)
        {
        QMatrix mat;
        mat.rotate(-90); // rotate 90 degrees counter-clockwise
        ret = new QGraphicsPixmapItem(screenCapture.transformed(mat));
        }
    else
        {
        ret = new QGraphicsPixmapItem(screenCapture);
        }
    return ret;
    }

//-----------------------------------------------------------------------------
//MsgServiceViewManager::getAnimationFile
//@see header
//-----------------------------------------------------------------------------
QString MsgServiceViewManager::getAnimationFile(QString effectEvent)
    {
    QString animFile;
    if(effectEvent == SEND_EFFECT)
        {
        animFile.append(SEND_EFFECT_FILE);
        }

    return animFile;
    }

//-----------------------------------------------------------------------------
//MsgServiceViewManager::send
//@see header
//-----------------------------------------------------------------------------

void MsgServiceViewManager::send(ConvergedMessage message)
    {
    mMainWindow->show();    
    QVariantList param;
    QByteArray dataArray;
    QDataStream messageStream(&dataArray, QIODevice::WriteOnly | QIODevice::Append);
    message.serialize(messageStream);
    param << dataArray;

    // switch to editor
    switchToUniEditor(param);
    
    XQServiceUtil::toBackground(false);    
    }
	
	
	
