diff -r 5cc91383ab1e -r 7333d7932ef7 iaupdate/IAD/ui/src/iaupdatemainview.cpp --- a/iaupdate/IAD/ui/src/iaupdatemainview.cpp Thu Aug 19 10:02:49 2010 +0300 +++ b/iaupdate/IAD/ui/src/iaupdatemainview.cpp Tue Aug 31 15:21:33 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2009-2010 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" @@ -11,1021 +11,1183 @@ * * Contributors: * -* Description: This module contains the implementation of CIAUpdateMainView class -* member functions. +* Description: This module contains the implementation of IAUpdateMainView +* class member functions. * */ +#include +#include +#include +#include +#include - -#include -#include -#include -#include // CAknNavigationControlContainer -#include // CAknNavigationDecorator -#include -#include // CAknMessageQueryDialog -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include -#include "iaupdate.hrh" #include "iaupdatemainview.h" -#include "iaupdatemaincontainer.h" -#include "iaupdatenode.h" -#include "iaupdatefwnode.h" -#include "iaupdatebasenode.h" +#include "iaupdateengine.h" +#include "iaupdateagreement.h" +#include "iaupdatedeputils.h" #include "iaupdatedialogutil.h" -#include "iaupdatestatusdialog.h" -#include "iaupdateappui.h" -#include "iaupdateuicontroller.h" -#include "iaupdatedeputils.h" +#include "iaupdateversion.h" + #include "iaupdatedebug.h" -#include "iaupdatefwupdatehandler.h" - -//CONSTANTS -const TInt KKiloByte = 1024; -const TInt KMegaByte = 1024 * 1024; -const TInt KMaxShownInKiloBytes = 10 * KMegaByte; -const TInt KSelInfoArrayGranularity = 3; - -//MACROS -_LIT( KSpace, " " ); - -// ============================ MEMBER FUNCTIONS =============================== -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::NewL -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -CIAUpdateMainView* CIAUpdateMainView::NewL( const TRect& aRect ) - { - CIAUpdateMainView* self = CIAUpdateMainView::NewLC( aRect ); - CleanupStack::Pop(self); - return self; - } +const int KKiloByte = 1024; +const int KMegaByte = 1024 * 1024; +const int KMaxShownInKiloBytes = 10 * KMegaByte; +const QString KTranslationsPath = "/resource/qt/translations/"; +const QString KTranslationsFile = "swupdate"; + -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::NewLC -// -// ----------------------------------------------------------------------------- -// -CIAUpdateMainView* CIAUpdateMainView::NewLC( const TRect& aRect ) - { - CIAUpdateMainView* self = new (ELeave) CIAUpdateMainView(); - CleanupStack::PushL( self ); - self->ConstructL( aRect ); - return self; - } +IAUpdateMainView::IAUpdateMainView(IAUpdateEngine *engine): +mEngine(engine) +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::IAUpdateMainView() begin"); + mFwListView = NULL; + mApplicationUpdatesGroupBox = NULL;; + mFwNSUGroupBox = NULL; + mContentDataForm = NULL; + mDialogUtil = NULL; + mDialogState = NoDialog; + mPrimaryAction = NULL; + mNode = NULL; + mSelectionUpdate = false; + mSelectionConnect = false; + mTranslator = NULL; + + //mTranslator = new HbTranslator(KTranslationsPath, KTranslationsFile); + + HbDocumentLoader loader; + bool ok = false; + loader.load(":/xml/iaupdate_mainview.docml", &ok); + + // Exit if the file format is invalid + Q_ASSERT_X(ok, "Software update", "Invalid docml file"); + // Create the view from DocML + + HbView* loadedWidget = qobject_cast(loader.findWidget("view")); + Q_ASSERT_X(loadedWidget != 0, "Software update", "View not found"); + QString viewTitle(loadedWidget->title()); + // Set the IAUpdateMainView view to be the widget that was loaded from the xml + setWidget(loadedWidget); + setTitle(viewTitle); + + HbToolBar *toolBar = qobject_cast< HbToolBar*>( loader.findWidget("viewToolbar") ); + //setToolBar(toolBar); + + HbMenu *menu = qobject_cast< HbMenu*>( loader.findWidget("viewMenu") ); + setMenu(menu); + + //Get the Action objects from the docml file + HbAction *action = qobject_cast(loader.findObject("action")); + HbAction *action_1 = qobject_cast(loader.findObject("action_1")); + HbAction *action_2 = qobject_cast(loader.findObject("action_2")); + + connect(action, SIGNAL(triggered()), this, SLOT(handleStartUpdate())); + connect(action_1, SIGNAL(triggered()), this, SLOT(handleSettings())); + connect(action_2, SIGNAL(triggered()), this, SLOT(handleDisclaimer())); + + mContent = qobject_cast< HbWidget*>( loader.findWidget("content") ); + + mListView = qobject_cast( loader.findWidget("listWidget") ); + mListView->setSelectionMode( HbAbstractItemView::MultiSelection ); + + connect( mListView, SIGNAL( longPressed( HbAbstractViewItem *, const QPointF & ) ), + this, SLOT( handleDetails( HbAbstractViewItem *, const QPointF & ) ) ); + + HbListViewItem *prototype = mListView->listItemPrototype(); + + prototype->setGraphicsSize(HbListViewItem::LargeIcon); + + HbDockWidget *dock = new HbDockWidget(this); + HbWidget *dockContainer = new HbWidget(dock); + QGraphicsLinearLayout *dockLayout = new QGraphicsLinearLayout(dockContainer); + dockLayout->setOrientation(Qt::Vertical); + dockContainer->setLayout(dockLayout); + + mSelections = new HbGroupBox(dockContainer); + mSelections->setHeading("Selected 0/0 (0 kB)"); + //QString selectedString = QString(hbTrId("txt_software_subhead_selected_1l_2l_3l_kb")).arg(0).arg(0).arg(0); + //mSelections->setHeading(selectedString); + + dockLayout->addItem( mSelections); + + dockLayout->addItem(toolBar); + + dock->setWidget(dockContainer); + + setDockWidget(dock); + + + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::IAUpdateMainView() end"); +} + +IAUpdateMainView::~IAUpdateMainView() +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::~IAUpdateMainView() begin"); + //delete mTranslator; + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::~IAUpdateMainView() end"); +} // ----------------------------------------------------------------------------- -// CIAUpdateMainView::CIAUpdateMainView -// C++ default constructor can NOT contain any code, that -// might leave. -// ----------------------------------------------------------------------------- -// -CIAUpdateMainView::CIAUpdateMainView() - { - } - -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::~CIAUpdateMainView -// Destructor -// ----------------------------------------------------------------------------- -// -CIAUpdateMainView::~CIAUpdateMainView() - { - delete iDecorator; - iAllNodes.Close(); - if ( iContainer ) - { - AppUi()->RemoveFromStack( iContainer ); - delete iContainer; - } - delete iFwUpdateHandler; - } -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::ConstructL -// Symbian 2nd phase constructor can leave. -// ----------------------------------------------------------------------------- -// -void CIAUpdateMainView::ConstructL( const TRect& /*aRect*/ ) - { - BaseConstructL( R_IAUPDATE_MAIN_VIEW ); - Toolbar()->SetItemDimmed( EIAUpdateCmdStartUpdate, ETrue, ETrue ); - Toolbar()->SetItemDimmed( EIAUpdateCmdMarkedUpdateDetails, ETrue, ETrue ); - Toolbar()->SetItemDimmed( EIAUpdateCmdUpdateHistory, ETrue, ETrue ); - Toolbar()->SetToolbarObserver( this ); - iFwUpdateHandler = CIAUpdateFWUpdateHandler::NewL(); - } - -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::RefreshL +// IAUpdateMainView::refresh // Refreshes update list // ----------------------------------------------------------------------------- // -void CIAUpdateMainView::RefreshL( const RPointerArray& aNodes, - const RPointerArray& aFwNodes, - TInt aError ) - { - IAUPDATE_TRACE("[IAUPDATE] CIAUpdateMainView::RefreshL begin"); - iRefreshError = aError; - iAllNodes.Reset(); +void IAUpdateMainView::refresh(const RPointerArray &nodes, + const RPointerArray &fwNodes, + int error) +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refresh() begin"); + removeCurrentContentLayout(); - if ( aFwNodes.Count() > 0 ) + refreshFirmwareUpdates(fwNodes); + + refreshApplicationUpdates(nodes); + + if (nodes.Count() == 0 && fwNodes.Count() == 0 && + error != KErrCancel && error != KErrAbort) + { + if (!mContentDataForm) + { + mContentDataForm = new HbDataForm(mContent); + } + QGraphicsLinearLayout *linearLayout = (QGraphicsLinearLayout*) mContent->layout(); + linearLayout->addItem(mContentDataForm); + QString formText; + + if (error == KErrNone) + { + formText = QString("Applications are up to date"); + //formText = hbTrId("txt_software_formlabel_applications_are_up_to_date"); + } + else { - IAUPDATE_TRACE("[IAUPDATE] CIAUpdateMainView::RefreshL hard code importance"); - //hardcode the importance of firmware as Critical - for ( TInt i = 0; i < aFwNodes.Count(); i++ ) - { - aFwNodes[i]->Base().SetImportance( MIAUpdateBaseNode::ECritical ); - } - - //either NSU or FOTA available - if ( aFwNodes.Count() == 1 ) - { - IAUPDATE_TRACE("[IAUPDATE] CIAUpdateMainView::RefreshL either NSU or FOTA available"); - MIAUpdateAnyNode* node = aFwNodes[0]; - User::LeaveIfError( iAllNodes.Append( node ) ); - } - - //both NSU and FOTA available, show only FOTA node - if ( aFwNodes.Count() == 2 ) - { - IAUPDATE_TRACE("[IAUPDATE] CIAUpdateMainView::RefreshL both NSU and FOTA available"); - MIAUpdateAnyNode* node1 = aFwNodes[0]; - MIAUpdateFwNode* fwnode = static_cast( node1 ); - if ( fwnode->FwType() == MIAUpdateFwNode::EFotaDp2 ) - { - User::LeaveIfError( iAllNodes.Append( node1 ) ); - } - else - { - MIAUpdateAnyNode* node2 = aFwNodes[1]; - User::LeaveIfError( iAllNodes.Append( node2 ) ); - } + formText = QString("Refreshing failed. Try again later."); + } + mContentDataForm->setDescription(formText); + } + updateSelectionInfoInDock(); + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refresh() end"); +} + + + + +void IAUpdateMainView::handleStartUpdate() +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleStartUpdate() begin"); + mEngine->StartUpdate(fotaSelected()); + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleStartUpdate() end"); +} + + +void IAUpdateMainView::handleSettings() +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleSettings() begin"); + emit toSettingView(); + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleSettings() end"); +} + +void IAUpdateMainView::handleDisclaimer() +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleDisclaimer() begin"); + if (!mDialogUtil) + { + mDialogUtil = new IAUpdateDialogUtil(this); + } + if (mDialogUtil) + { + HbAction *primaryAction = new HbAction(hbTrId("txt_common_button_ok")); + mDialogUtil->showAgreement(primaryAction); + } + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleDisclaimer() end"); +} + +void IAUpdateMainView::handleDetails(HbAbstractViewItem * item, const QPointF &) +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleDetails() begin"); + int ind = item->modelIndex().row(); + if (getApplicationNode(ind) != NULL) + { + showDetails(*getApplicationNode(ind)); + } + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleDetails() end"); +} + +void IAUpdateMainView::handleFotaDetails(HbAbstractViewItem *, const QPointF &) +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleFotaDetails begin"); + //only one FOTA item in a list, just use it + for (int i = 0; i < mFwNodes.Count(); i++) + { + if (mFwNodes[i]->FwType() == MIAUpdateFwNode::EFotaDp2) + { + showDetails(*mFwNodes[i]); + } + } + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleFotaDetails end"); +} + + +void IAUpdateMainView::handleSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected) +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleSelectionChanged begin"); + if (!mSelectionUpdate) + { + bool changedItemFound = false; + QModelIndexList indexList = selected.indexes(); + for (int i = 0; !changedItemFound && i < indexList.count(); ++i) + { + changedItemFound = true; + markListItem(true, indexList.at(i).row()); + } + if (!changedItemFound) + { + indexList = deselected.indexes(); + for (int i = 0; !changedItemFound && i < indexList.count(); ++i) + { + changedItemFound = true; + markListItem(false, indexList.at(i).row()); } } - - - for( TInt i = 0; i < aNodes.Count(); ++i ) - { - MIAUpdateAnyNode* node = aNodes[i]; - User::LeaveIfError( iAllNodes.Append( node ) ); - } - - if( iContainer ) - { - iContainer->RefreshL( iAllNodes, iRefreshError ); - SetSelectedIndicesL(); - DynInitToolbarL( R_IAUPDATE_MAIN_TOOLBAR, Toolbar() ); - } - Toolbar()->SetItemDimmed( EIAUpdateCmdUpdateHistory, EFalse, ETrue ); - } - - -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::GetCurrentNode -// -// ----------------------------------------------------------------------------- -// -MIAUpdateAnyNode* CIAUpdateMainView::GetCurrentNode() - { - if ( iContainer ) - { - return iContainer->GetCurrentNode( iAllNodes ); - } - return NULL; - } - -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::GetSelectedNode -// -// ----------------------------------------------------------------------------- -// -MIAUpdateAnyNode* CIAUpdateMainView::GetSelectedNode() - { - MIAUpdateAnyNode* selectedNode = NULL; - for( TInt i = 0; i < iAllNodes.Count() && !selectedNode ; ++i ) - { - if ( iAllNodes[i]->Base().IsSelected() ) - { - selectedNode = iAllNodes[i]; - } - } - return selectedNode; - } - -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::Id -// Get Uid of this view -// ----------------------------------------------------------------------------- -// -TUid CIAUpdateMainView::Id() const - { - return TUid::Uid( EIAUpdateMainViewId ); } + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleSelectionChanged end"); +} -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::HandleCommandL -// -// ----------------------------------------------------------------------------- -// -void CIAUpdateMainView::HandleCommandL( TInt aCommand ) +void IAUpdateMainView::handleFwSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected) +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleFwSelectionChanged begin"); + if (!mSelectionUpdate) { - switch( aCommand ) - { - case EIAUpdateCmdStartUpdate: - { - RPointerArray selectedNodes; - CleanupClosePushL( selectedNodes ); - GetSelectedNodesL( selectedNodes ); - if ( selectedNodes[0]->NodeType() == MIAUpdateAnyNode::ENodeTypeFw ) - { - //the marking logic will make sure firmware won't be marked with normal sis updates - //at the same time. - iFwUpdateHandler->FirmWareUpdatewithFOTA(); - } - else - { - AppUi()->HandleCommandL( aCommand ); - } - CleanupStack::PopAndDestroy( &selectedNodes ); - break; - } - case EIAUpdateCmdUpdateWithPC: - { - iFwUpdateHandler->FirmWareUpdatewithNSU(); - break; - } - case EIAUpdateCmdSettings: - { - Toolbar()->SetToolbarVisibility( EFalse ); - AppUi()->HandleCommandL( aCommand ); - Toolbar()->SetToolbarVisibility( ETrue ); - break; - } - case EAknSoftkeyMark: - { - iContainer->HandleMarkCommandL( EAknCmdMark ); - break; - } - case EAknSoftkeyUnmark: - { - iContainer->HandleMarkCommandL( EAknCmdUnmark ); - break; - } - case EAknCmdMark: - case EAknCmdUnmark: - { - iContainer->HandleMarkCommandL( aCommand ); - break; - } - default: - { - AppUi()->HandleCommandL( aCommand ); - break; + bool changedItemFound = false; + QModelIndexList indexList = selected.indexes(); + for (int i = 0; !changedItemFound && i < indexList.count(); ++i) + { + changedItemFound = true; + markFotaItem(true); + } + if (!changedItemFound) + { + indexList = deselected.indexes(); + for (int i = 0; !changedItemFound && i < indexList.count(); ++i) + { + changedItemFound = true; + markFotaItem(false); } } } + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::handleFwSelectionChanged end"); +} -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::DynInitMenuPaneL -// Dim options which are not availble in empty list. -// Set Mark/Unmark option -// ----------------------------------------------------------------------------- -// -void CIAUpdateMainView::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane ) + +void IAUpdateMainView::dialogFinished(HbAction *action) +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::dialogFinished begin"); + DialogState dialogState = mDialogState; + mDialogState = NoDialog; + + switch ( dialogState ) { - if( aResourceId == R_IAUPDATE_MAIN_MENU ) - { - if ( !FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + case Dependencies: + if (action == mPrimaryAction) { - aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue ); + updateSelectionsToNodeArray(*mNode,mMark); } - RPointerArray selectedNodes; - CleanupClosePushL( selectedNodes ); - GetSelectedNodesL( selectedNodes ); - - if ( selectedNodes.Count() ) + updateSelectionsToList(); + updateSelectionInfoInDock(); + break; + case CannotOmit: + break; + case Details: + break; + default: + break; + } + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::dialogFinished end"); +} + +bool IAUpdateMainView::fotaSelected() const +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::fotaSelected() begin"); + bool selected = false; + for (int i = 0; i < mFwNodes.Count() && !selected; ++i) + { + if ( mFwNodes[i]->FwType() == MIAUpdateFwNode::EFotaDp2 && mFwNodes[i]->Base().IsSelected() ) + { + selected = true; + } + } + if (selected) + { + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::fotaSelected() Fota item is selected"); + } + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::fotaSelected() end"); + return selected; +} + + + +void IAUpdateMainView::markListItem(bool mark, int index) +{ + IAUPDATE_TRACE_2("[IAUPDATE] IAUpdateMainView::markListItem() begin mark: %d index %d", mark, index); + if (mark) + { + //It's Mark Command + if (fotaSelected()) + { + //FOTA item is selected, unmark FOTA item + //FOTA item and application update items can't be selected at the same time + markFotaItem(false); + } + } + + bool accepted = false; + + if(index > -1) + { + accepted = true; + MIAUpdateNode* node = mNodes[index]; + RPointerArray mands; + RPointerArray deps; + + if (mark) + { + TRAPD(err,IAUpdateDepUtils::GetDependenciesL(*node, mNodes, deps)); + if (err != KErrNone) { - if ( selectedNodes[0]->NodeType() == MIAUpdateAnyNode::ENodeTypeFw ) + deps.Close(); + updateSelectionsToList(); + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::markListItem() return end"); + return; + } + if (!getMandatoryNodes(mands)) { - //firmware is selected - MIAUpdateFwNode* node = static_cast( selectedNodes[0] ); - - if ( node->FwType() == MIAUpdateFwNode::EFotaDp2 ) - { - aMenuPane->SetItemDimmed( EIAUpdateCmdUpdateWithPC, ETrue ); - } - - if ( node->FwType() == MIAUpdateFwNode::EFotiNsu ) - { - aMenuPane->SetItemDimmed( EIAUpdateCmdStartUpdate, ETrue ); + // error when creating mandatory node list + mands.Close(); + updateSelectionsToList(); + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::markListItem() return end"); + return; + } + } + else + { + //mandatory item is not allowed to be unmarked + if (mNodes[index]->Base().Importance() == MIAUpdateBaseNode::EMandatory) + { + //show dialog + showUpdateCannotOmitDialog(); + updateSelectionsToList(); + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::markListItem() return end"); + return; + } + TRAPD(err,IAUpdateDepUtils::GetDependantsL(*node, mNodes, deps)); + if (err != KErrNone) + { + deps.Close(); + updateSelectionsToList(); + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::markListItem() return end"); + return; + } + // item is not allowed to be unmarked if its dependant is mandatory + bool mandatoryDependantFound = false; + for(int i = 0; i < deps.Count() && !mandatoryDependantFound; i++) + { + if (deps[i]->Base().Importance() == MIAUpdateBaseNode::EMandatory) + { + mandatoryDependantFound = true; + } + } + if (mandatoryDependantFound) + { + showUpdateCannotOmitDialog(); + deps.Close(); + updateSelectionsToList(); + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::markListItem() return end"); + return; + } + } + + int depCount = deps.Count(); + + if (depCount > 0) + { + QString text; + QString names; + MIAUpdateNode* depNode = NULL; + QString separator(","); + + for(int i = 0; i < depCount; i++) + { + depNode = deps[i]; + if (i > 0) + { + names.append(separator); + names.append(QString(" ")); + } + names.append(XQConversions::s60DescToQString(depNode->Base().Name())); + } + + if (mark) + { + if (depCount > 1) + { + text.append("This update needs also updates "); + text.append(names); + text.append(" for working"); + } + else + { + text.append("This update needs also \""); + text.append(names); + text.append("\" for working"); } } else + { + if (depCount > 1) { - //firmware is not selected, only sis - aMenuPane->SetItemDimmed( EIAUpdateCmdUpdateWithPC, ETrue ); - } + text.append("Updates "); + text.append(names); + text.append(" need this update for working"); + } + else + { + text.append("Update \""); + text.append(names); + text.append("\" needs this update for working"); + } } - else + + if (mark && mNodes[index]->Base().Importance() == MIAUpdateBaseNode::EMandatory) + { + // depencencies of mandatory update are also selected without showing dialog + accepted = true; + } + else { - aMenuPane->SetItemDimmed( EIAUpdateCmdStartUpdate, ETrue ); - aMenuPane->SetItemDimmed( EIAUpdateCmdUpdateWithPC, ETrue ); + mNode = node; + mMark = mark; + accepted = false; + showDependenciesFoundDialog(text); } - CleanupStack::PopAndDestroy( &selectedNodes ); + } + if (accepted) + { + updateSelectionsToNodeArray(*node, mark); } } - -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::DoActivateL -// Activate view -// ----------------------------------------------------------------------------- -// -void CIAUpdateMainView::DoActivateL( const TVwsViewId& /*aPrevViewId*/, - TUid /*aCustomMessageId*/, - const TDesC8& /*aCustomMessage*/ ) - { - UpdateStatusPaneL(); - Toolbar()->SetToolbarVisibility( ETrue ); - if( !iContainer ) - { - iContainer = CIAUpdateMainContainer::NewL( ClientRect(), *this ); - - if( iAllNodes.Count() > 0 ) - { - iContainer->RefreshL( iAllNodes, iRefreshError ); - } - - SetSelectedIndicesL(); - DynInitToolbarL( R_IAUPDATE_MAIN_TOOLBAR, Toolbar() ); - AppUi()->AddToStackL( iContainer ); - } - else - { - UpdateSelectionInfoInNaviPaneL(); - } + if (accepted) + { + updateSelectionsToList(); + updateSelectionInfoInDock(); } + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::markListItem() end"); +} + -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::DoDeactivate() -// Container is deleted in deactivation -// ----------------------------------------------------------------------------- -// -void CIAUpdateMainView::DoDeactivate() - { - RemoveSelectionInfoInNaviPane(); - Toolbar()->SetToolbarVisibility( EFalse ); - } - -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::DynInitToolbarL() -// -// ----------------------------------------------------------------------------- -// -void CIAUpdateMainView::DynInitToolbarL( TInt aResourceId, CAknToolbar* aToolbar ) +void IAUpdateMainView::markFotaItem(bool mark) +{ + IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateMainView::markFotaItem() begin mark: %d", mark); + if (mark) { - if ( aResourceId == R_IAUPDATE_MAIN_TOOLBAR ) + //It's Mark Command + + //if some of application update item(s) are selected, unmark them + //FOTA item and application update items can't be selected at the same time + bool deselected = false; + for (int i = 0; i < mNodes.Count(); ++i) { - if ( iContainer ) + if (mNodes[i]->Base().IsSelected()) { - if ( CountOfSelectedItems() > 0 ) - { - aToolbar->SetItemDimmed( EIAUpdateCmdStartUpdate, EFalse, ETrue ); - } + mNodes[i]->Base().SetSelected(false); + } + } + if (deselected) + { + // umnmarked items to be updated also to UI + updateSelectionsToList(); + } + } + for (int j = 0; j < mFwNodes.Count(); ++j) + { + if (mFwNodes[j]->FwType() == MIAUpdateFwNode::EFotaDp2) + { + mFwNodes[j]->Base().SetSelected(mark); + if (mark) + { + mFwListView->selectionModel()->select(mFwListView->model()->index(0,0),QItemSelectionModel::Select); + } else - { - aToolbar->SetItemDimmed( EIAUpdateCmdStartUpdate, ETrue, ETrue ); - } - if ( CountOfSelectedItems() == 1 ) - { - aToolbar->SetItemDimmed( EIAUpdateCmdMarkedUpdateDetails, EFalse, ETrue ); - } - else - { - aToolbar->SetItemDimmed( EIAUpdateCmdMarkedUpdateDetails, ETrue, ETrue ); - } + { + mFwListView->selectionModel()->select(mFwListView->model()->index(0,0),QItemSelectionModel::Deselect); } } } + updateSelectionInfoInDock(); + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::markFotaItem() end"); +} -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::OfferToolbarEventL() -// -// ----------------------------------------------------------------------------- -// -void CIAUpdateMainView::OfferToolbarEventL( TInt aCommand ) - { - if ( aCommand == EIAUpdateCmdStartUpdate ) - { - RPointerArray selectedNodes; - CleanupClosePushL( selectedNodes ); - GetSelectedNodesL( selectedNodes ); - - if ( selectedNodes.Count() ) - { - if ( selectedNodes[0]->NodeType() == MIAUpdateAnyNode::ENodeTypeFw ) - { - //firmware is selected - MIAUpdateFwNode* node = static_cast( selectedNodes[0] ); - - if ( node->FwType() == MIAUpdateFwNode::EFotaDp2 ) - { - aCommand = EIAUpdateCmdStartUpdate; - } - - if ( node->FwType() == MIAUpdateFwNode::EFotiNsu ) - { - aCommand = EIAUpdateCmdUpdateWithPC; - } - } - else - { - //firmware is not selected, only sis - aCommand = EIAUpdateCmdStartUpdate; - } - } - else - { - MIAUpdateAnyNode* currentNode = GetCurrentNode(); - if ( currentNode->NodeType() == MIAUpdateAnyNode::ENodeTypeFw ) - { - MIAUpdateFwNode* node = static_cast( currentNode ); - if ( node->FwType() == MIAUpdateFwNode::EFotiNsu ) - { - aCommand = EIAUpdateCmdUpdateWithPC; - } - } - } - CleanupStack::PopAndDestroy( &selectedNodes ); - } - HandleCommandL( aCommand ); - } -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::MarkListItemL -// Mark list item -// ----------------------------------------------------------------------------- -// -TBool CIAUpdateMainView::MarkListItemL( TBool aMark, TInt aIndex ) +void IAUpdateMainView::updateSelectionsToNodeArray(MIAUpdateNode &node, bool mark) +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::updateSelectionsToNodeArray() begin"); + RPointerArray deps; + TInt err = KErrNone; + if (mark) { - if ( aMark ) + TRAP(err,IAUpdateDepUtils::GetDependenciesL(node, mNodes, deps)); + } + else + { + TRAP(err,IAUpdateDepUtils::GetDependantsL(node, mNodes, deps)); + } + if (err == KErrNone ) + { + int depCount = deps.Count(); + for(int i = 0; i < depCount; i++) { - //It's Mark Command - RPointerArray selectedNodes; - CleanupClosePushL( selectedNodes ); - GetSelectedNodesL( selectedNodes ); - - //There are selected items already and type are different with the current one - if ( selectedNodes.Count() > 0 && (iAllNodes[aIndex]->NodeType() != selectedNodes[0]->NodeType() ) ) - { - /*HBufC* msgText = StringLoader::LoadLC(R_IAUPDATE_FIRMWARE_WITH_OTHERS); - - CAknQueryDialog* dlg = CAknQueryDialog::NewL(); - - dlg->ExecuteLD( R_IAUPDATE_INFORMATION_QUERY, *msgText ); - - CleanupStack::PopAndDestroy( msgText );*/ - - //clean all of the current selection(s) - iContainer->CleanAllSelection(); - - // firmware item and normal sis items can't be selected at the same time - // unmark the selected nodes. - for ( TInt i = 0; i < selectedNodes.Count(); i++ ) - { - TInt index = iAllNodes.Find( selectedNodes[i]); - iAllNodes[index]->Base().SetSelected( EFalse ); - } - } - - CleanupStack::PopAndDestroy( &selectedNodes ); + int depNodeInd = mNodes.Find(deps[i]); + mNodes[depNodeInd]->Base().SetSelected(mark); } + deps.Close(); + int nodeInd = mNodes.Find(&node); + mNodes[nodeInd]->Base().SetSelected(mark); + } - //there is no selected items or the type is the same with the current one - - if ( iAllNodes[aIndex]->NodeType() == MIAUpdateAnyNode::ENodeTypeFw ) + //mark all of the mandatory items + if ( mark ) + { + RPointerArray mands; + if (getMandatoryNodes(mands)) { - iAllNodes[aIndex]->Base().SetSelected( aMark ); - - if ( aMark ) - { - SetMiddleSKTextL( ETrue, ETrue ); - } - else + int mandCount = mands.Count(); + if (mandCount > 0) { - SetMiddleSKTextL( ETrue, EFalse ); - } - UpdateSelectionInfoInNaviPaneL(); - DynInitToolbarL( R_IAUPDATE_MAIN_TOOLBAR, Toolbar() ); - return ETrue; - } - - if ( iAllNodes[aIndex]->NodeType() == MIAUpdateAnyNode::ENodeTypeNormal ) - { - TBool accepted = EFalse; - - if( aIndex > -1 ) - { - accepted = ETrue; - - MIAUpdateNode* node = static_cast( iAllNodes[aIndex] ); - RPointerArray mands; - RPointerArray deps; - - if ( aMark ) + for(int i = 0; i < mandCount; i++) { - CleanupClosePushL( mands ); - CleanupClosePushL( deps ); - IAUpdateDepUtils::GetDependenciesL( *node, iAllNodes, deps ); - GetMandatoryNodesL( mands ); - } - else - { - //mandatory item is not allowed to be unmarked - if ( iAllNodes[aIndex]->Base().Importance() == MIAUpdateBaseNode::EMandatory ) + int mandNodeInd = mNodes.Find(mands[i]); + mNodes[mandNodeInd]->Base().SetSelected(mark); + if (mNodes[mandNodeInd]->NodeType() == MIAUpdateAnyNode::ENodeTypeNormal) { - //show dialog - ShowUpdateCannotOmitDialogL(); - return EFalse; - } - - CleanupClosePushL( deps ); - IAUpdateDepUtils::GetDependantsL( *node, iAllNodes, deps ); - // item is not allowed to be unmarked if its dependant is mandatory - TBool mandatoryDependantFound = EFalse; - for( TInt i = 0; i < deps.Count() && !mandatoryDependantFound; i++ ) - { - if ( deps[i]->Base().Importance() == MIAUpdateBaseNode::EMandatory ) - { - mandatoryDependantFound = ETrue; - } - } - if ( mandatoryDependantFound ) - { - ShowUpdateCannotOmitDialogL(); - CleanupStack::PopAndDestroy( &deps ); - return EFalse; + // mark also all dependencies of a mandatory item + MIAUpdateNode* dependencyNode = mNodes[mandNodeInd]; + RPointerArray dependencies; + TRAPD(err,IAUpdateDepUtils::GetDependenciesL(*dependencyNode, mNodes, dependencies)); + if (err) + { + dependencies.Close(); + mands.Close(); + return; + } + for(int j = 0; j < dependencies.Count(); j++) + { + int depNodeInd = mNodes.Find(dependencies[j]); + mNodes[depNodeInd]->Base().SetSelected(true); + } + dependencies.Close(); } } - - TInt depCount = deps.Count(); - - if ( depCount > 0 ) - { - HBufC* text = NULL; - HBufC* names = NULL; - MIAUpdateNode* depNode = NULL; - HBufC* separator = NULL; - - if ( depCount > 1 ) - { - separator = StringLoader::LoadLC( R_IAUPDATE_SEPARATOR ); - } - - names = HBufC::NewLC( 0 ); - - for( TInt i = 0; i < depCount; i++ ) - { - depNode = deps[i]; - HBufC* temp = NULL; - if ( separator ) - { - temp = names->ReAllocL( names->Length() + - depNode->Base().Name().Length() + - separator->Length() + - KSpace.iTypeLength ); - } - else - { - temp = names->ReAllocL( names->Length() + - depNode->Base().Name().Length() + - KSpace.iTypeLength ); - } - - CleanupStack::Pop( names ); - names = temp; - CleanupStack::PushL( names ); - - if ( i > 0 ) - { - names->Des() += *separator; - names->Des() += KSpace; - } - names->Des() += depNode->Base().Name(); - } - - TInt resourceId = 0; - if ( aMark ) - { - if ( depCount > 1 ) - { - resourceId = R_IAUPDATE_DEPENDENCY_MARK_MANY; - } - else - { - resourceId = R_IAUPDATE_DEPENDENCY_MARK_ONE; - } - } - else - { - if ( depCount > 1 ) - { - resourceId = R_IAUPDATE_DEPENDENCY_UNMARK_MANY; - } - else - { - resourceId = R_IAUPDATE_DEPENDENCY_UNMARK_ONE; - } - } - text = StringLoader::LoadLC( resourceId, *names ); - - if ( aMark && iAllNodes[aIndex]->Base().Importance() == MIAUpdateBaseNode::EMandatory ) - { - // depencencies of mandatory update are also selected without showing dialog - accepted = ETrue; - } - else - { - accepted = ShowDependenciesFoundDialogL( *text ); - } - CleanupStack::PopAndDestroy( text ); - CleanupStack::PopAndDestroy( names ); - - if ( separator ) - { - CleanupStack::PopAndDestroy( separator ); - } - } - - if ( accepted ) - { - for( TInt j = 0; j < depCount; j++ ) - { - TInt depNodeInd = iAllNodes.Find( deps[j] ); - iAllNodes[depNodeInd]->Base().SetSelected( aMark ); - } - CleanupStack::PopAndDestroy( &deps ); - - TInt nodeInd = iAllNodes.Find( node ); - iAllNodes[nodeInd]->Base().SetSelected( aMark ); - } - else - { - //user rejects the dependency dialog - CleanupStack::PopAndDestroy( &deps ); - if ( aMark ) - { - CleanupStack::PopAndDestroy( &mands ); - } - return EFalse; - } - - //mark all of the mandatory items - TInt mandCount = mands.Count(); - if ( mandCount > 0 && aMark ) - { - for( TInt j = 0; j < mandCount; j++ ) - { - TInt mandNodeInd = iAllNodes.Find( mands[j] ); - iAllNodes[mandNodeInd]->Base().SetSelected( aMark ); - if ( iAllNodes[mandNodeInd]->NodeType() == MIAUpdateAnyNode::ENodeTypeNormal ) - { - // mark also all dependencies of a mandatory item - MIAUpdateNode* dependencyNode = static_cast( iAllNodes[mandNodeInd] ); - RPointerArray dependencies; - CleanupClosePushL( dependencies ); - IAUpdateDepUtils::GetDependenciesL( *dependencyNode, iAllNodes, dependencies ); - for( TInt k = 0; k < dependencies.Count(); k++ ) - { - TInt depNodeInd = iAllNodes.Find( dependencies[k] ); - iAllNodes[depNodeInd]->Base().SetSelected( ETrue ); - } - CleanupStack::PopAndDestroy( &dependencies ); - } - } - } - if ( aMark ) - { - CleanupStack::PopAndDestroy( &mands ); - } - - if ( depCount > 0 || mandCount > 0 ) - { - SetSelectedIndicesL(); - } - else - { - UpdateSelectionInfoInNaviPaneL(); - } - - if ( aMark ) - { - SetMiddleSKTextL( ETrue, ETrue ); - } - else - { - SetMiddleSKTextL( ETrue, EFalse ); - } - } - DynInitToolbarL( R_IAUPDATE_MAIN_TOOLBAR, Toolbar() ); - return ETrue; + } } - return EFalse; + mands.Close(); } - - - - -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::SetMiddleSKTextL -// Middle soft key label to be set -// ----------------------------------------------------------------------------- -// -void CIAUpdateMainView::SetMiddleSKTextL( TBool aVisible, TBool aSelected ) + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::updateSelectionsToNodeArray() end"); +} + + +bool IAUpdateMainView::getMandatoryNodes(RPointerArray &mandNodes) const +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::getMandatoryNodes() begin"); + bool ret = true; + for(int i = 0; i < mNodes.Count(); ++i) { - CEikButtonGroupContainer* cbaGroup = Cba(); - if ( cbaGroup ) + if (mNodes[i]->Base().Importance() == MIAUpdateBaseNode::EMandatory) { - cbaGroup->RemoveCommandFromStack( CEikButtonGroupContainer::EMiddleSoftkeyPosition, iLastCommandId ); - if ( aVisible ) + if (mandNodes.Append(mNodes[i]) != KErrNone) { - HBufC* middleSKText = NULL; - if ( aSelected ) - { - middleSKText = StringLoader::LoadLC( R_IAUPDATE_MSK_UNMARK ); - TPtr mskPtr = middleSKText->Des(); - cbaGroup->AddCommandToStackL( - CEikButtonGroupContainer::EMiddleSoftkeyPosition, - EAknSoftkeyUnmark, - mskPtr ); - iLastCommandId = EAknSoftkeyUnmark; - } - else - { - middleSKText = StringLoader::LoadLC( R_IAUPDATE_MSK_MARK ); - TPtr mskPtr = middleSKText->Des(); - cbaGroup->AddCommandToStackL( - CEikButtonGroupContainer::EMiddleSoftkeyPosition, - EAknSoftkeyMark, - mskPtr ); - iLastCommandId = EAknSoftkeyMark; - } - CleanupStack::PopAndDestroy( middleSKText ); + ret = false; } } } + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::getMandatoryNodes() end"); + return ret; +} -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::GetSelectedNodesL -// Get selected (marked) nodes -// ----------------------------------------------------------------------------- -// -void CIAUpdateMainView::GetSelectedNodesL( RPointerArray& aSelectedNodes ) const +void IAUpdateMainView::showUpdateCannotOmitDialog() +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::showUpdateCannotOmitDialog() begin"); + HbMessageBox *messageBox = new HbMessageBox(HbMessageBox::MessageTypeInformation); + messageBox->setText(QString("This required update cannot be omitted")); + int actionCount = messageBox->actions().count(); + for (int i=actionCount-1; i >= 0; i--) + { + messageBox->removeAction(messageBox->actions().at(i)); + } + HbAction *okAction = NULL; + okAction = new HbAction("Ok"); + messageBox->addAction(okAction); + messageBox->setTimeout(HbPopup::StandardTimeout); + messageBox->setAttribute(Qt::WA_DeleteOnClose); + mDialogState = CannotOmit; + messageBox->open(this, SLOT(dialogFinished(HbAction*))); + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::showUpdateCannotOmitDialog() end"); +} + +void IAUpdateMainView::showDependenciesFoundDialog(QString &text) +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::showDependenciesFoundDialog() begin"); + HbMessageBox *messageBox = new HbMessageBox(HbMessageBox::MessageTypeQuestion); + HbLabel *label = new HbLabel(messageBox); + label->setHtml(QString("Depencencies")); + messageBox->setHeadingWidget(label); + //messageBox->setIconVisible(false); + + messageBox->setText(text); + int actionCount = messageBox->actions().count(); + for (int i=actionCount-1; i >= 0; i--) + { + messageBox->removeAction(messageBox->actions().at(i)); + } + mPrimaryAction = NULL; + mPrimaryAction = new HbAction("Continue"); + HbAction *secondaryAction = NULL; + secondaryAction = new HbAction("Cancel"); + messageBox->addAction(mPrimaryAction); + messageBox->addAction(secondaryAction); + messageBox->setTimeout(HbPopup::NoTimeout); + messageBox->setAttribute(Qt::WA_DeleteOnClose); + mDialogState = Dependencies; + messageBox->open(this, SLOT(dialogFinished(HbAction*))); + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::showDependenciesFoundDialog() end"); +} + +void IAUpdateMainView::updateSelectionsToList() +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::updateSelectionsToList() begin"); + mSelectionUpdate = true; + for(int i = 0; i < mNodes.Count(); ++i) { - for( TInt i = 0; i < iAllNodes.Count(); ++i ) - { - if ( iAllNodes[i]->Base().IsSelected() ) + if ( mNodes[i]->Base().IsSelected() != mListView->selectionModel()->isSelected(mListView->model()->index(i,0))) + { + QItemSelectionModel::SelectionFlag selectionFlag; + if ( mNodes[i]->Base().IsSelected()) { - User::LeaveIfError( aSelectedNodes.Append( iAllNodes[i] ) ); + selectionFlag = QItemSelectionModel::Select; } + else + { + selectionFlag = QItemSelectionModel::Deselect; + } + mListView->selectionModel()->select(mListView->model()->index(i,0),selectionFlag); } } - -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::GetMandatoryItemsL -// Get selected (marked) nodes -// ----------------------------------------------------------------------------- -// -void CIAUpdateMainView::GetMandatoryNodesL( RPointerArray& aMandNodes ) const - { - for( TInt i = 0; i < iAllNodes.Count(); ++i ) - { - if ( iAllNodes[i]->Base().Importance() == MIAUpdateBaseNode::EMandatory ) - { - User::LeaveIfError( aMandNodes.Append( iAllNodes[i] ) ); - } - } - } - + mSelectionUpdate = false; + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::updateSelectionsToList() end"); +} -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::SetSelectedIndicesL -// Indices of selected items are passed to container -// ----------------------------------------------------------------------------- -// -void CIAUpdateMainView::SetSelectedIndicesL() +MIAUpdateNode* IAUpdateMainView::getApplicationNode(int index) const +{ + IAUPDATE_TRACE_1("[IAUPDATE] IAUpdateMainView::getApplicationNode() begin index: %d", index); + MIAUpdateNode *currentNode = NULL; + + if (index >= 0 && index < mNodes.Count()) { - RArray indices; + currentNode = mNodes[index]; + } + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::getApplicationNode() end"); + return currentNode; +} + +void IAUpdateMainView::showDetails(MIAUpdateAnyNode& node) +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::showDetails() begin"); + HbMessageBox *messageBox = new HbMessageBox(HbMessageBox::MessageTypeInformation); + HbLabel *label = new HbLabel(messageBox); + label->setHtml(QString("Details")); + messageBox->setHeadingWidget(label); + + messageBox->setIconVisible(false); + + QString text; + constructDetailsText(node,text); + messageBox->setText(text); + messageBox->setTimeout(HbPopup::NoTimeout); + messageBox->setAttribute(Qt::WA_DeleteOnClose); + mDialogState = Details; + messageBox->open(this, SLOT(dialogFinished(HbAction*))); + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::showDetails() end"); +} - CleanupClosePushL( indices ); - for( TInt i = 0; i < iAllNodes.Count(); ++i ) - { - if ( iAllNodes[i]->Base().IsSelected() ) - { - User::LeaveIfError( indices.Append( i ) ); - } - } +void IAUpdateMainView::constructDetailsText(MIAUpdateAnyNode &node, QString &text) +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::constructDetailsText() begin"); + text.append(QString("Name:")); + text.append(QString("
")); + QString name = XQConversions::s60DescToQString(node.Base().Name()); + text.append(name); + if (node.NodeType() == MIAUpdateAnyNode::ENodeTypeFw) + { + name.append(QString(" Device software")); + } - iContainer->SetSelectedIndicesL( indices ); - UpdateSelectionInfoInNaviPaneL(); - - CleanupStack::PopAndDestroy( &indices ); + text.append(QString("
")); + text.append(QString("
")); + + text.append(QString("Description:")); + text.append(QString("
")); + QString description; + if (node.NodeType() == MIAUpdateAnyNode::ENodeTypeFw) + { + description = QString("This update improves your device performance and brings you latest features."); } + else + { + description = XQConversions::s60DescToQString(node.Base().Description()); + } + text.append(description); + text.append(QString("
")); + text.append(QString("
")); + + + if (node.NodeType() == MIAUpdateAnyNode::ENodeTypeNormal) + { + MIAUpdateNode *iaupdateNode = static_cast (&node); + if (iaupdateNode->Type()!= MIAUpdateNode::EPackageTypeServicePack) + { + text.append(QString("Version:")); + text.append(QString("
")); + QString textVersion; + versionText(node.Base().Version(), textVersion); + text.append(textVersion); + text.append(QString("
")); + text.append(QString("
")); + } + } + if (node.NodeType() == MIAUpdateAnyNode::ENodeTypeFw) + { + MIAUpdateFwNode *fwNode = static_cast (&node); + text.append(QString("Version:")); + text.append(QString("
")); + QString textVersion = XQConversions::s60DescToQString(fwNode->FwVersion1()); + text.append(textVersion); + text.append(QString("
")); + text.append(QString("
")); + } + + int contentSize = node.Base().ContentSizeL(); + if (contentSize > 0) + { + text.append(QString("Size:")); + text.append(QString("
")); + QString textFileSize; + fileSizeText(contentSize, textFileSize); + text.append(textFileSize); + } + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::constructDetailsText() end"); +} -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::NodeIndex -// Get index of node -// ----------------------------------------------------------------------------- -// -TInt CIAUpdateMainView::NodeIndex( const MIAUpdateAnyNode& aNode ) const - { - TInt result = -1; +void IAUpdateMainView::versionText(const TIAUpdateVersion &version, QString &versionText) +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::versionText() begin"); + QString stringMajor; + stringMajor.setNum(version.iMajor); + versionText.append(stringMajor); + versionText.append(QString(".")); + QString stringMinor; + stringMinor.setNum(version.iMinor); + versionText.append(stringMinor); + versionText.append(QString("(")); + QString stringBuild; + stringBuild.setNum(version.iBuild); + versionText.append(stringBuild); + versionText.append(QString(")")); + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::versionText() end"); +} + +void IAUpdateMainView::fileSizeText(int fileSize, QString &text) +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::fileSizeText() begin"); + int size = 0; + QString stringUnit; - for( TInt i = 0; i < iAllNodes.Count(); ++i ) + if (fileSize >= KMaxShownInKiloBytes ) { - if( &aNode == iAllNodes[i] ) + stringUnit.append(" MB"); + size = fileSize / KMegaByte; + if ( fileSize % KMegaByte != 0 ) { - result = i; - break; + size++; } } - return result; - } - -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::UpdateStatusPaneL -// Update title in status pane -// ----------------------------------------------------------------------------- -// - -void CIAUpdateMainView::UpdateStatusPaneL() - { - CAknTitlePane* titlePane = - static_cast< CAknTitlePane* >( StatusPane()->ControlL( - TUid::Uid( EEikStatusPaneUidTitle ) ) ); - HBufC* text = StringLoader::LoadLC( R_IAUPDATE_TEXT_TITLE_MAIN_VIEW ); - titlePane->SetTextL( *text ); - CleanupStack::PopAndDestroy( text ); - } - + else + { + stringUnit.append(" kB"); + size = fileSize / KKiloByte; + if ( fileSize % KKiloByte != 0 ) + { + size++; + } + } + text.setNum(size); + text.append(stringUnit); + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::fileSizeText() end"); +} -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::UpdateSelectionInfoInNaviPaneL -// Update selection information in status pane -// ----------------------------------------------------------------------------- -// -// -void CIAUpdateMainView::UpdateSelectionInfoInNaviPaneL() +void IAUpdateMainView::setImportance(MIAUpdateAnyNode *node, QString &importanceDescription) +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::setImportance() begin"); + int sizeInBytes = node->Base().ContentSizeL(); + int size = 0; + bool shownInMegabytes = false; + if (sizeInBytes >= KMaxShownInKiloBytes) + { + shownInMegabytes = true; + size = sizeInBytes / KMegaByte; + if (sizeInBytes % KMegaByte != 0) + { + size++; + } + } + else { - RemoveSelectionInfoInNaviPane(); - - if ( iAllNodes.Count() > 0 ) + size = sizeInBytes / KKiloByte; + if (sizeInBytes % KKiloByte != 0) + { + size++; + } + } + QString sizeString; + sizeString.setNum(size); + switch(node->Base().Importance()) + { + case MIAUpdateBaseNode::EMandatory: { - //show empty navi pane when firmware is selected but no size info or it is NSU - if ( (iAllNodes[0]->NodeType() == MIAUpdateAnyNode::ENodeTypeFw) && iAllNodes[0]->Base().IsSelected() ) + importanceDescription = "Required "; + importanceDescription.append(sizeString); + if (shownInMegabytes) + { + importanceDescription.append(" MB" ); + } + else { - MIAUpdateFwNode* fwnode = static_cast( iAllNodes[0] ); - if ( (iAllNodes[0]->Base().ContentSizeL() == 0) || (fwnode->FwType() == MIAUpdateFwNode::EFotiNsu) ) + importanceDescription.append(" kB" ); + } + break; + } + + case MIAUpdateBaseNode::ECritical: + { + bool isNSU = false; + if(node->NodeType() == MIAUpdateAnyNode::ENodeTypeFw) + { + MIAUpdateFwNode *fwnode = static_cast(node); + if (fwnode->FwType() == MIAUpdateFwNode::EFotiNsu) { - return; + isNSU = true; } } - - if ( !iNaviPane ) + importanceDescription = "Important "; + if (!size || isNSU) { - iNaviPane = static_cast - ( StatusPane()->ControlL( TUid::Uid(EEikStatusPaneUidNavi ) ) ); + //for firmware when size info is not provided by server } - TInt selectedSizeInBytes = 0; - for( TInt i = 0; i < iAllNodes.Count(); ++i ) + else { - if ( iAllNodes[i]->Base().IsSelected() ) + importanceDescription.append(sizeString); + if (shownInMegabytes) { - selectedSizeInBytes += iAllNodes[i]->Base().ContentSizeL(); + importanceDescription.append(" MB" ); } - } - - - TInt resourceId = 0; - TInt selectedSize; - if ( selectedSizeInBytes >= KMaxShownInKiloBytes ) - { - resourceId = R_IAUPDATE_NAVIPANE_MEGABYTE; - selectedSize = selectedSizeInBytes / KMegaByte; - if ( selectedSizeInBytes % KMegaByte != 0 ) - { - selectedSize++; - } + else + { + importanceDescription.append(" kB" ); + } } - else + break; + } + + case MIAUpdateBaseNode::ERecommended: + { + importanceDescription = "Recommended "; + importanceDescription.append(sizeString); + if (shownInMegabytes) { - resourceId = R_IAUPDATE_NAVIPANE_KILOBYTE; - selectedSize = selectedSizeInBytes / KKiloByte; - if ( selectedSizeInBytes % KKiloByte != 0 ) - { - selectedSize++; - } + importanceDescription.append(" MB" ); } - - CArrayFix* numberArray = - new ( ELeave ) CArrayFixFlat( KSelInfoArrayGranularity ); - CleanupStack::PushL( numberArray ); - numberArray->AppendL( CountOfSelectedItems() ); - numberArray->AppendL( iAllNodes.Count() ); - numberArray->AppendL( selectedSize ); - - HBufC* selectionInfo = StringLoader::LoadLC( resourceId, - *numberArray ); - TPtr ptr = selectionInfo->Des(); - AknTextUtils::DisplayTextLanguageSpecificNumberConversion( ptr ); + else + { + importanceDescription.append(" kB" ); + } + break; + } - iDecorator = iNaviPane->CreateNavigationLabelL( *selectionInfo ); + case MIAUpdateBaseNode::ENormal: + { + importanceDescription = "Optional "; + importanceDescription.append(sizeString); + if (shownInMegabytes) + { + importanceDescription.append(" MB" ); + } + else + { + importanceDescription.append(" kB" ); + } + break; + } - iNaviPane->PushL( *iDecorator ); - - CleanupStack::PopAndDestroy( selectionInfo ); - CleanupStack::PopAndDestroy( numberArray ); + default: + { + break; } } + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::setImportance() end"); +} -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::RemoveSelectionInfoInNaviPane -// Remove existing selection info (created by main view) from navi pane -// ----------------------------------------------------------------------------- -// +void IAUpdateMainView::removeCurrentContentLayout() +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::removeCurrentContentLayout() begin"); + int itemCount = mContent->layout()->count(); + for (int i = 0; i < itemCount; i++) + { + mContent->layout()->removeAt(i); + } + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::removeCurrentContentLayout() end"); +} + +void IAUpdateMainView::refreshFirmwareUpdates(const RPointerArray &fwNodes) +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refreshFirmwareUpdates() begin"); + mFwNodes.Reset(); + + for (int i = 0; i < fwNodes.Count(); i++) + { + MIAUpdateFwNode *fwnode = (fwNodes[i]); + mFwNodes.Append(fwnode); + fwnode->Base().SetImportance(MIAUpdateBaseNode::ECritical); + if (fwnode->FwType() == MIAUpdateFwNode::EFotaDp2) + { + refreshFotaUpdate(*fwnode ); + } + else if (fwNodes.Count() == 1 && fwnode->FwType() == MIAUpdateFwNode::EFotiNsu) + { + refreshNsuUpdate(); + } + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refreshFirmwareUpdates() end"); + } +} + +void IAUpdateMainView::refreshFotaUpdate(MIAUpdateFwNode& fwNode) +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refreshFotaUpdate() begin"); + if (!mFwListView) + { + mFwListView = new HbListWidget(mContent); + mFwListView->setSelectionMode( HbAbstractItemView::MultiSelection ); + connect( mFwListView, SIGNAL( longPressed( HbAbstractViewItem *, const QPointF & ) ), + this, SLOT( handleFotaDetails( HbAbstractViewItem *, const QPointF & ) ) ); + mFwListView->listItemPrototype()->setGraphicsSize(HbListViewItem::LargeIcon); + mFwListView->listItemPrototype()->setStretchingStyle(HbListViewItem::NoStretching); + connect(mFwListView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), + this, SLOT(handleFwSelectionChanged(QItemSelection,QItemSelection))); + } + QGraphicsLinearLayout *linearLayout = (QGraphicsLinearLayout*) mContent->layout(); + linearLayout->addItem(mFwListView); + mFwListView->clear(); + QItemSelectionModel *selectionModel = mFwListView->selectionModel(); + selectionModel->clear(); + HbListWidgetItem *fwItem = new HbListWidgetItem(); + QString name(XQConversions::s60DescToQString(fwNode.Base().Name())); + name.append(" DEVICE SOFTWARE"); + fwItem->setText(name); + QString importanceDescription; + setImportance(&fwNode, importanceDescription); + fwItem->setSecondaryText(importanceDescription); + HbIcon icon(QString(":/icons/qgn_menu_swupdate")); + fwItem->setIcon(icon); + if (fwNode.Base().IsSelected()) + { + QModelIndex modelIndex = mFwListView->model()->index(0,0); + selectionModel->select(modelIndex, QItemSelectionModel::Select); + } + mFwListView->addItem(fwItem); + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refreshFotaUpdate() end"); +} -void CIAUpdateMainView::RemoveSelectionInfoInNaviPane() +void IAUpdateMainView::refreshNsuUpdate() +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refreshNsuUpdate() begin"); + if (!mFwNSUGroupBox) { - if ( iNaviPane && iDecorator ) + mFwNSUGroupBox = new HbGroupBox(mContent); + mFwNSUGroupBox->setHeading("Device software available"); + HbDataForm *dataForm = new HbDataForm(mFwNSUGroupBox); + mFwNSUGroupBox->setContentWidget(dataForm); + dataForm->setDescription("Use your PC to update the device software ([version %L]) from address www.nokia.com/softwareupdate"); + } + QGraphicsLinearLayout *linearLayout = (QGraphicsLinearLayout*) mContent->layout(); + linearLayout->addItem(mFwNSUGroupBox); + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refreshNsuUpdate() end"); +} + +void IAUpdateMainView::refreshApplicationUpdates(const RPointerArray &nodes) +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refreshApplicationUpdates() begin"); + if (nodes.Count() > 0) + { + if (!mApplicationUpdatesGroupBox) { - iNaviPane->Pop( iDecorator ); - delete iDecorator; - iDecorator = NULL; + mApplicationUpdatesGroupBox = new HbGroupBox(mContent); + mApplicationUpdatesGroupBox->setHeading("Application updates"); + } + QGraphicsLinearLayout *linearLayout = (QGraphicsLinearLayout*) mContent->layout(); + linearLayout->addItem(mApplicationUpdatesGroupBox); + linearLayout->addItem(mListView); + } + mListView->clear(); + QItemSelectionModel *selectionModel = mListView->selectionModel(); + selectionModel->clear(); + HbIcon icon(QString(":/icons/qgn_menu_swupdate")); + mNodes.Reset(); + for(int i = 0; i < nodes.Count(); ++i) + { + MIAUpdateNode *node = nodes[i]; + mNodes.Append(node); + QString importanceDescription; + MIAUpdateNode::TUIUpdateState uiState = node->UiState(); + if (uiState == MIAUpdateNode::ENormal) + { + setImportance(node, importanceDescription); + } + else if (uiState == MIAUpdateNode::EUpdated) + { + importanceDescription = "Updated"; + } + else if (uiState == MIAUpdateNode::EFailed) + { + importanceDescription = "Failed"; + } + else if (uiState == MIAUpdateNode::EDownloaded) + { + importanceDescription = "Downloaded"; + } + HbListWidgetItem *item = new HbListWidgetItem(); + QString name; + if (uiState == MIAUpdateNode::EDownloading) + { + name = QString("Downloading "); + } + else if (uiState == MIAUpdateNode::EInstalling) + { + name = QString("Installing "); + } + name.append(XQConversions::s60DescToQString(node->Base().Name())); + item->setText(name); + item->setSecondaryText(importanceDescription); + item->setIcon(icon); + mListView->addItem(item); + + if (node->Base().IsSelected()) + { + int count = mListView->count(); + QModelIndex modelIndex = mListView->model()->index(count-1,0); + selectionModel->select(modelIndex, QItemSelectionModel::Select); } } - -// ----------------------------------------------------------------------------- -// CIAUpdateMainView::ShowDependenciesFoundDialogL -// -// ----------------------------------------------------------------------------- -// -TBool CIAUpdateMainView::ShowDependenciesFoundDialogL( TDesC& aText ) const + if (!mSelectionConnect) + { + mSelectionConnect = connect(selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), + this, SLOT(handleSelectionChanged(QItemSelection,QItemSelection))); + } + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::refreshApplicationUpdates() end"); +} + +void IAUpdateMainView::updateSelectionInfoInDock() +{ + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::updateSelectionInfoInDock() begin"); + int countOfSelectedItems = 0; + int countOfAllItems = 0; + int selectedSizeInBytes = 0; + for (int i = 0; i < mFwNodes.Count(); ++i) { - CAknMessageQueryDialog* dlg = CAknMessageQueryDialog::NewL( aText ); - dlg->PrepareLC( R_IAUPDATE_MESSAGE_QUERY ); - CAknPopupHeadingPane* headingPane = dlg->Heading(); - HBufC* title = StringLoader::LoadLC( R_IAUPDATE_DEPENDENCY_TITLE ); - headingPane->SetTextL( *title ); - CleanupStack::PopAndDestroy( title ); - - dlg->ButtonGroupContainer().SetCommandSetL( - R_IAUPDATE_SOFTKEYS_CONTINUE_CANCEL__CONTINUE ); - - return( dlg->RunLD() == EAknSoftkeyOk ); - } - -// --------------------------------------------------------------------------- -// CIAUpdateMainView::CountOfSelectedItems -// -// --------------------------------------------------------------------------- -// -TInt CIAUpdateMainView::CountOfSelectedItems() const - { - TInt countOfSelectedItems = 0; - for( TInt i = 0; i < iAllNodes.Count(); ++i ) + if (mFwNodes[i]->FwType() == MIAUpdateFwNode::EFotaDp2) { - if ( iAllNodes[i]->Base().IsSelected() ) + countOfAllItems++; + if (mFwNodes[i]->Base().IsSelected()) { - countOfSelectedItems++; + countOfSelectedItems++; + selectedSizeInBytes += mFwNodes[i]->Base().ContentSizeL(); } } - return countOfSelectedItems; + } + countOfAllItems += mNodes.Count(); + for (int j = 0; j < mNodes.Count(); ++j) + { + if (mNodes[j]->Base().IsSelected()) + { + countOfSelectedItems++; + selectedSizeInBytes += mNodes[j]->Base().ContentSizeL(); + } + } + + int selectedSize = 0; + QString unit; + if (selectedSizeInBytes >= KMaxShownInKiloBytes) + { + unit = "MB"; + selectedSize = selectedSizeInBytes / KMegaByte; + if (selectedSizeInBytes % KMegaByte != 0) + { + selectedSize++; + } } - -// --------------------------------------------------------------------------- -// CIAUpdateMainView::ShowUpdateCannotOmitDialogL -// -// --------------------------------------------------------------------------- -// -void CIAUpdateMainView::ShowUpdateCannotOmitDialogL() const + else { - HBufC* msgText = StringLoader::LoadLC( R_IAUPDATE_CANNOT_OMIT ); - CAknQueryDialog* dlg = CAknQueryDialog::NewL(); - dlg->ExecuteLD( R_IAUPDATE_INFORMATION_QUERY, *msgText ); - CleanupStack::PopAndDestroy( msgText ); + unit = "kB"; + selectedSize = selectedSizeInBytes / KKiloByte; + if (selectedSizeInBytes % KKiloByte != 0) + { + selectedSize++; + } } - -// End of File - + QString selectionString; + selectionString.append("Selected "); + QString numText; + numText.setNum(countOfSelectedItems); + selectionString.append(numText); + selectionString.append("/"); + numText.setNum(countOfAllItems); + selectionString.append(numText); + if (selectedSize > 0) + { + selectionString.append(" ("); + numText.setNum(selectedSize); + selectionString.append(numText); + selectionString.append(" "); + selectionString.append(unit); + selectionString.append(")"); + } + mSelections->setHeading(selectionString); + IAUPDATE_TRACE("[IAUPDATE] IAUpdateMainView::updateSelectionInfoInDock() end"); +}