homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsuninstallitemstate.cpp
branchRCL_3
changeset 82 5f0182e07bfb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsuninstallitemstate.cpp	Tue Aug 31 15:06:34 2010 +0300
@@ -0,0 +1,339 @@
+/*
+ * 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: Menu delete collection item state
+ *
+ */
+
+#include <hbmessagebox.h>
+#include <hbaction.h>
+#include <hsmenuservice.h>
+#include <hsshortcutservice.h>
+#include <HbDocumentLoader>
+#include <HbLabel>
+#include <HbListView>
+#include <HbParameterLengthLimiter>
+
+#include <QScopedPointer>
+#include <QStandardItemModel>
+#include <QStandardItem>
+#include <casoftwareregistry.h>
+#include <caquery.h>
+#include <canotifier.h>
+
+#include "hsuninstallitemstate.h"
+#include "hsmenuevent.h"
+#include "hsmenudialogfactory.h"
+#include "hsmenuentryremovedhandler.h"
+/*!
+ \class HsUninstallItemState
+ \ingroup group_hsworkerstateplugin
+ \brief Uninstall Item State.
+ Deletes app from collection.
+ */
+
+/*!
+ Constructor.
+ \param parent Parent state.
+ */
+HsUninstallItemState::HsUninstallItemState(QState *parent) :
+    QState(parent),
+    mItemId(0),
+    mUninstallMessage(NULL),
+    mUninstallJavaMessage(NULL),
+    mConfirmAction(NULL)
+{
+    construct();
+}
+
+/*!
+ Destructor.
+ */
+HsUninstallItemState::~HsUninstallItemState()
+{
+    cleanUp(); // in case of throw
+}
+
+/*!
+ Constructs contained objects.
+ */
+void HsUninstallItemState::construct()
+{
+    setObjectName("/UninstallItemState");
+    if (this->parent()) {
+        setObjectName(this->parent()->objectName() + objectName());
+    }
+    connect(this, SIGNAL(exited()), SLOT(cleanUp()));
+    
+}
+
+/*!
+ Sets entry event.
+ \param event entry event.
+ */
+void HsUninstallItemState::onEntry(QEvent *event)
+{
+    HSMENUTEST_FUNC_ENTRY("HsUninstallItemState::onEntry");
+    QState::onEntry(event);
+    qDebug("HsUninstallItemState::onEntry()");
+    HsMenuEvent *menuEvent = static_cast<HsMenuEvent *>(event);
+    QVariantMap data = menuEvent->data();
+
+    mItemId = data.value(Hs::itemIdKey).toInt();
+    QSharedPointer<CaEntry> entry = CaService::instance()->getEntry(mItemId);
+    QString appType = entry->attribute(Hs::swTypeKey);
+    if (!appType.compare(Hs::javaSwType)) {
+        // java
+        createUninstallJavaMessage();
+    } else {
+        // other
+        createSimpleUninstallMessage();
+    }
+        
+    HSMENUTEST_FUNC_EXIT("HsUninstallItemState::onEntry");
+}
+
+/*!
+ Action after closed confirmation dialog.
+ \param finishedAction chosen action.
+ \retval void
+ */
+void HsUninstallItemState::uninstallMessageFinished(HbAction* finishedAction)
+{
+    if (static_cast<QAction*>(finishedAction) == mConfirmAction) {
+        HsMenuService::executeAction(mItemId, Hs::removeActionIdentifier);
+    }
+    mConfirmAction = NULL;
+    mUninstallMessage = NULL;
+	mUninstallJavaMessage = NULL;
+    emit exit();
+}
+
+/*!
+ Return information about a component: component name, a list of names
+ of applications in this component and a delete message.
+ \param[out] componentName component name.
+ \param[out] applicationsNames a list of names of applications.
+ \param[out] confirmationMessage delete message.
+ \retval true if there is no error.
+ */
+bool HsUninstallItemState::getApplicationsNames(QString &componentName,
+    QStringList &applicationsNames,
+    QString &confirmationMessage)
+{
+    componentName.clear();
+    applicationsNames.clear();
+    confirmationMessage.clear();
+    
+    QSharedPointer<CaService> service = CaService::instance();
+    QSharedPointer<CaEntry> entry = service->getEntry(mItemId);
+    const int componentId =
+        entry->attribute(Hs::componentIdAttributeName).toInt();
+    
+    QSharedPointer<CaSoftwareRegistry> softwareRegistry =
+        CaSoftwareRegistry::create();
+    QStringList appUids;
+    bool retval = softwareRegistry->getUninstallDetails(componentId,
+        componentName,
+        appUids,
+        confirmationMessage);
+    if (retval) {
+        CaQuery query;
+        foreach (QString uid, appUids) {
+            query.setAttribute(Hs::applicationUidEntryKey, uid);
+            QList< QSharedPointer<CaEntry> > entries =
+                service->getEntries(query);
+            if (entries.length() > 0) {
+                applicationsNames << entries[0]->text();
+            }
+        }
+        if (applicationsNames.length()==1
+            && applicationsNames[0]==componentName) {
+            applicationsNames.clear();
+        }
+    }
+    return retval;
+}
+
+
+/*!
+ Slot launched after state has exited and in destructor.
+ \retval void
+ */
+void HsUninstallItemState::cleanUp()
+{
+    // Close messagebox if App key was pressed
+    if (mUninstallMessage != NULL) {
+        mUninstallMessage->close();
+        mUninstallMessage = NULL;
+    }
+    
+    if (mUninstallJavaMessage != NULL) {
+        mUninstallJavaMessage->close();
+        mUninstallJavaMessage = NULL;
+    }
+
+    mConfirmAction = NULL;
+    mItemId = 0;
+}
+
+/*!
+ Method create uninstall confirmation message.
+ \retval void
+ */
+void HsUninstallItemState::createSimpleUninstallMessage(bool isJava)
+{
+    CaQuery parentsQuery;
+    parentsQuery.setChildId(mItemId);
+    parentsQuery.setEntryTypeNames(QStringList(Hs::collectionTypeName));
+    QList<int> parentsIds = CaService::instance()->getEntryIds(
+            parentsQuery);
+    QString message;
+    if (HsShortcutService::instance()->isItemShortcutWidget(mItemId) || (parentsIds.count() > 0)) {
+        message.append(
+            HbParameterLengthLimiter("txt_applib_dialog_uninstalls_1_and_deletes_all_sh").arg(
+                HsMenuService::getName(mItemId)));
+    } else {
+        message.append(
+            HbParameterLengthLimiter("txt_applib_dialog_1_will_be_removed_from_phone_c").arg(
+                HsMenuService::getName(mItemId)));
+    }
+
+    // create and show message box
+    mUninstallMessage = HsMenuDialogFactory().create(message);
+    if( isJava ){
+        QSharedPointer<CaEntry> entry = CaService::instance()->getEntry(mItemId);
+        HbIcon icon = entry->makeIcon();
+        mUninstallMessage->setIcon(icon);
+    }
+    mConfirmAction = mUninstallMessage->actions().value(0);
+    
+    QScopedPointer<HsMenuEntryRemovedHandler> entryObserver(
+        new HsMenuEntryRemovedHandler(mItemId, this, SIGNAL(exit())));
+    entryObserver.take()->setParent(mUninstallMessage);
+    
+    mUninstallMessage->open(this, SLOT(uninstallMessageFinished(HbAction*)));
+}
+
+/*!
+ Method create uninstall confirmation dialog for java.
+ \retval void
+ */
+void HsUninstallItemState::createUninstallJavaMessage()
+{
+    HbDocumentLoader loader;
+    bool loadStatusOk = false;
+    loader.load(HS_UNINSTALL_DIALOG_LAYOUT, &loadStatusOk);
+    
+    Q_ASSERT_X(loadStatusOk,
+            HS_UNINSTALL_DIALOG_LAYOUT,
+           "Error while loading docml file.");
+
+    QString componentName;
+    QStringList applicationsNames;
+    QString detailsMessage;
+    getApplicationsNames(componentName, applicationsNames, detailsMessage);
+    
+    QString section;
+    if (applicationsNames.isEmpty() && detailsMessage.isEmpty()) {        
+        createSimpleUninstallMessage(true);
+    }
+    else {
+        if ( (!applicationsNames.isEmpty()) && (!detailsMessage.isEmpty())) {
+            mDialogType = UninstallDialogDefinition02;
+            section = QString("uninstallDialogDefinition02");
+            loader.load(
+                HS_UNINSTALL_DIALOG_LAYOUT, section, &loadStatusOk);
+        }
+        else if ( (!applicationsNames.isEmpty() && detailsMessage.isEmpty())) {
+            mDialogType = UninstallDialogDefinition03;
+            section = QString("uninstallDialogDefinition03");
+            loader.load(
+                HS_UNINSTALL_DIALOG_LAYOUT, section, &loadStatusOk);
+        }
+        else if (applicationsNames.isEmpty() && (!detailsMessage.isEmpty())) {
+            mDialogType = UninstallDialogDefinition04;
+            section = QString("uninstallDialogDefinition04");
+            loader.load(
+                HS_UNINSTALL_DIALOG_LAYOUT, section, &loadStatusOk);
+        }
+
+        mUninstallJavaMessage = qobject_cast<HbDialog*>(
+            loader.findWidget(HS_UNINSTALL_DIALOG_NAME));
+
+        if (mUninstallJavaMessage) {
+            mUninstallJavaMessage->setAttribute(Qt::WA_DeleteOnClose);
+            mUninstallJavaMessage->setTimeout(HbPopup::NoTimeout);
+            mUninstallJavaMessage->actions()[0]->setParent(mUninstallJavaMessage);
+            mUninstallJavaMessage->actions()[1]->setParent(mUninstallJavaMessage);
+
+            HbLabel* iconLabel =
+            qobject_cast<HbLabel*>(
+                loader.findWidget(HS_UNINSTALL_DIALOG_CONFIRMATION_DIALOG_ICON));
+            QSharedPointer<CaEntry> entry2 = CaService::instance()->getEntry(mItemId);
+            HbIcon icon = entry2->makeIcon();
+            iconLabel->setIcon(icon);
+
+            CaQuery parentsQuery;
+            parentsQuery.setChildId(mItemId);
+            parentsQuery.setEntryTypeNames(QStringList(Hs::collectionTypeName));
+            QList<int> parentsIds = CaService::instance()->getEntryIds(
+                    parentsQuery);
+            
+            HbLabel* textLabel =
+            qobject_cast<HbLabel*>(
+                loader.findWidget(HS_UNINSTALL_DIALOG_CONFIRMATION_DIALOG_LABEL));
+            if (HsShortcutService::instance()->isItemShortcutWidget(mItemId) ||
+                (parentsIds.count() > 0)) {
+                textLabel->setPlainText(HbParameterLengthLimiter(
+                    "txt_applib_info_delete_1_all_its_shortcuts_and").arg(
+                            componentName));
+            } else {
+                textLabel->setPlainText(HbParameterLengthLimiter(
+                    "txt_applib_info_delete_1_and_associated_data").arg(
+                            componentName));
+            }
+
+            HbLabel* detailsUninstalLabel;
+            if ((mDialogType == UninstallDialogDefinition02) ||
+                (mDialogType == UninstallDialogDefinition04)) {
+                detailsUninstalLabel= qobject_cast<HbLabel*>(
+                    loader.findWidget(HS_UNINSTALL_DIALOG_DELETE_LABEL));
+                detailsUninstalLabel->setPlainText(detailsMessage);
+            }
+
+            HbLabel* listView;
+            QString applicationsList;
+            QString newLine("\n");
+            if ((mDialogType == UninstallDialogDefinition02) ||
+                (mDialogType == UninstallDialogDefinition03)) {
+                listView = qobject_cast<HbLabel*>(
+                    loader.findWidget(HS_UNINSTALL_DIALOG_LIST_VIEW_LABEL));
+
+                for (int i=0; i<applicationsNames.count(); i++) {
+                    applicationsList = applicationsList + applicationsNames[i] + newLine;
+                }
+                listView->setPlainText(applicationsList);
+            }
+
+            mConfirmAction = qobject_cast<HbAction*>(loader.findObject(
+                    HS_UNINSTALL_DIALOG_CONFIRMATION_ACTION));
+        
+            QScopedPointer<HsMenuEntryRemovedHandler> entryObserver(
+                new HsMenuEntryRemovedHandler(mItemId, this, SIGNAL(exit())));
+            entryObserver.take()->setParent(mUninstallJavaMessage);
+            
+            mUninstallJavaMessage->open(this, SLOT(uninstallMessageFinished(HbAction*)));
+        }
+    }
+}