diff -r a0afa279b8fe -r eb79a7c355bf app/src/mpglobalpopuphandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/src/mpglobalpopuphandler.cpp Fri Jun 11 19:36:32 2010 -0500 @@ -0,0 +1,374 @@ +/* +* 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: Music Player global popup handler. +* +*/ + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include + +#include "mpglobalpopuphandler.h" +#include "mpsettingsmanager.h" +#include "mpenginefactory.h" +#include "mpsongscanner.h" +#include "mpmtpinfolink.h" +#include "mptrace.h" + +/*! + \class MpGlobalPopupHandler + \brief Music Player global popup handler. + + This class controls the asynchronous operation of all global dialogs. +*/ + +// Popups launched by this class +const QString KScanProgressDialog = QString( "ScanProgressDialog" ); +const QString KDiskFullDialog = QString( "DiskFullDialog" ); +const QString KScanFinished = QString( "ScanFinishedDialog" ); +const QString KUnableToContinueDueUSB = QString( "UnableToContinueDueUSB" ); +const QString KUsbBlockingNote = QString( "UsbBlockingNote" ); +const QString KPromptRefresh = QString( "PromptRefresh" ); +const QString KMTPInfoDialog = QString( "MTPInfoDialog" ); + +// Popups Actions +const QString KYes = QString( "yes" ); +const QString KNo = QString( "no" ); + +/*! + Constructs the collection popup handler. + */ +MpGlobalPopupHandler::MpGlobalPopupHandler( QObject *parent ) + : QObject( parent ), + mOutstandingPopup( 0 ), + mMpEngine( 0 ), + mMpSongScanner( 0 ) +{ + TX_ENTRY + mMpEngine = MpEngineFactory::sharedEngine(); + connect( mMpEngine, SIGNAL( libraryAboutToUpdate() ), this, SLOT( handleLibraryAboutToUpdate() ) ); + connect( mMpEngine, SIGNAL( unableToCotinueDueUSB() ), this, SLOT( launchUnableToCotinueDueUsb() ) ); + connect( mMpEngine, SIGNAL( usbSynchronizationStarted() ), this, SLOT( launchUsbBlockingNote() ) ); + connect( mMpEngine, SIGNAL( usbSynchronizationFinished() ), this, SLOT( closeUsbBlockingNote() ) ); + connect( mMpEngine, SIGNAL( libraryRefreshNeeded() ), this, SLOT( launchRefreshLibraryRequest() ) ); + TX_EXIT +} + +/*! + Destructs the collection popup handler. + */ +MpGlobalPopupHandler::~MpGlobalPopupHandler() +{ + TX_ENTRY + delete mOutstandingPopup; + TX_EXIT +} + +/*! + Closes any active popup + */ +void MpGlobalPopupHandler::cancelOngoingPopup() +{ + TX_ENTRY + if ( mOutstandingPopup ) { + mOutstandingPopup->close(); + } + TX_EXIT +} + +/*! + Slot called upon MpEngine signal libraryAboutToUpdate(). Used to connect with SongScanner. + */ +void MpGlobalPopupHandler::handleLibraryAboutToUpdate() +{ + TX_ENTRY + if ( !mMpSongScanner && mMpEngine->songScanner() ) { + mMpSongScanner = mMpEngine->songScanner(); + connect( mMpSongScanner, SIGNAL( scanStarted() ), this, SLOT( launchScanDialog() ) ); + connect( mMpSongScanner, SIGNAL( scanCountChanged( int ) ), this, SLOT( scanCountChanged( int ) ) ); + connect( mMpSongScanner, SIGNAL( scanFinished( int, int ) ), + this, SLOT( handleScanFinished( int, int ) ) ); + } + TX_EXIT +} + +/*! + Slot called upon notification from MpSongScanner indicating start of + scanning process. + */ +void MpGlobalPopupHandler::launchScanDialog() +{ + TX_ENTRY + HbProgressDialog* scanProgressDialog = new HbProgressDialog( HbProgressDialog::WaitDialog ); + connect( scanProgressDialog, SIGNAL( cancelled() ), mMpSongScanner, SLOT( cancelScan() ) ); + scanProgressDialog->setModal( true ); + HbLabel *title = new HbLabel( hbTrId( "txt_mus_title_refreshing" ) ); + title->setFontSpec(HbFontSpec(HbFontSpec::Primary)); + + scanProgressDialog->setHeadingWidget( title ); + scanProgressDialog->setText( QString("") ); + scanProgressDialog->setAttribute( Qt::WA_DeleteOnClose ); + scanProgressDialog->setObjectName( KScanProgressDialog ); + setOutstandingPopup( scanProgressDialog ); + scanProgressDialog->show(); + TX_EXIT +} + +/*! + Slot called upon notification from MpSongScanner indicating the number of + songs scanned so far. + */ +void MpGlobalPopupHandler::scanCountChanged(int count) +{ + TX_ENTRY_ARGS("count " << count ) + if ( mOutstandingPopup && ( mOutstandingPopup->objectName() == KScanProgressDialog ) ) { + HbProgressDialog *dialog = qobject_cast( mOutstandingPopup ); + QString added; + added = hbTrId( "txt_mus_info_ln_songs_added" , count ); + dialog->setText( added ); + } + TX_EXIT +} + +/*! + Slot called upon notification from MpSongScanner. Used to close current scan progress note, + and display scan results. + + */ +void MpGlobalPopupHandler::handleScanFinished( int error, int itemsAdded ) +{ + TX_ENTRY_ARGS("error: " << error << " Items added: " << itemsAdded ) + if ( mOutstandingPopup && ( mOutstandingPopup->objectName() == KScanProgressDialog ) ) { + HbProgressDialog *dialog = qobject_cast( mOutstandingPopup ); + disconnect( dialog, SIGNAL( aboutToClose() ), this, SLOT( outstandingPopupClosing() ) ); + mOutstandingPopup = 0; + dialog->close(); + } + + switch( error ) { + case MpSongScanner::ScanErrorNone : + launchScanFinishedDialog( true, itemsAdded ); + break; + case MpSongScanner::ScanGeneralError : + launchScanFinishedDialog( false, itemsAdded ); + break; + case MpSongScanner::ScanErrorDiskFull : + launchDiskFullDialog(); + break; + case MpSongScanner::ScanInterrupted : + default: + //When scan interrupted (DiskEvent) just dimsiss the scanning progress note. + break; + } + TX_EXIT +} + +/*! + Slot called when MpEngine emits unableToCotinueDueUSB() signal + */ +void MpGlobalPopupHandler::launchUnableToCotinueDueUsb() +{ + HbMessageBox *dialog = new HbMessageBox( HbMessageBox::MessageTypeInformation ); + dialog->setText( hbTrId( "txt_mus_info_usb_conn_in_progress" ) ); + dialog->setModal( true ); + dialog->setAttribute( Qt::WA_DeleteOnClose ); + dialog->setObjectName( KUnableToContinueDueUSB ); + setOutstandingPopup( dialog ); + dialog->show(); +} + +/*! + Slot called when MpEngine emits usbSynchronizationStarted() signal + */ +void MpGlobalPopupHandler::launchUsbBlockingNote() +{ + HbProgressDialog *usbBlockingNote = new HbProgressDialog( HbProgressDialog::WaitDialog ); + usbBlockingNote->setModal( true ); + if ( usbBlockingNote->actions().count() ) { + //Hide cancel action. + usbBlockingNote->actions().at( 0 )->setVisible( false ); + } + usbBlockingNote->setDismissPolicy( HbPopup::NoDismiss ); + usbBlockingNote->setText( hbTrId( "txt_mus_info_usb_conn_in_progress" ) ); + usbBlockingNote->setAttribute( Qt::WA_DeleteOnClose ); + usbBlockingNote->setObjectName( KUsbBlockingNote ); + setOutstandingPopup( usbBlockingNote ); + usbBlockingNote->show(); +} + +/*! + Slot called when MpEngine emits usbSynchronizationFinished() signal + */ +void MpGlobalPopupHandler::closeUsbBlockingNote() +{ + if ( mOutstandingPopup && ( mOutstandingPopup->objectName() == KUsbBlockingNote ) ) { + HbProgressDialog *dialog = qobject_cast( mOutstandingPopup ); + dialog->cancel(); + } +} + +/*! + Slot called when MpEngine emits libraryRefreshNeeded() signal + */ +void MpGlobalPopupHandler::launchRefreshLibraryRequest() +{ + HbAction *action; + HbMessageBox *promptRefresh = new HbMessageBox( HbMessageBox::MessageTypeQuestion ); + promptRefresh->setText( hbTrId( "txt_mus_info_music_may_need_to_be_refreshed" ) ); + promptRefresh->setTimeout( HbPopup::NoTimeout ); + promptRefresh->setModal( true ); + promptRefresh->clearActions(); + action = new HbAction( hbTrId( "txt_common_button_yes" ) ); + action->setObjectName( KYes ); + connect( action, SIGNAL( triggered() ), mMpEngine, SLOT( refreshLibrary() ) ); + promptRefresh->addAction( action ); + action = new HbAction( hbTrId( "txt_common_button_no" ) ); + action->setObjectName( KNo ); + promptRefresh->addAction( action ); + promptRefresh->setAttribute( Qt::WA_DeleteOnClose ); + promptRefresh->setObjectName( KPromptRefresh ); + setOutstandingPopup( promptRefresh ); + promptRefresh->show(); +} + +/*! + Slot to launch the MTP educating info dialog + */ +void MpGlobalPopupHandler::launchMTPInfoDialog() +{ + TX_ENTRY + HbDialog *dialog = new HbDialog(); + dialog->setContentWidget( new MpMtpInfoLink() ); + dialog->setModal( true ); + dialog->setDismissPolicy( HbPopup::NoDismiss); + dialog->setTimeout( HbPopup::NoTimeout ); + HbAction *action; + action = new HbAction( hbTrId( "txt_common_button_yes" ) ); + action->setObjectName( KYes ); + dialog->addAction( action ); + action = new HbAction( hbTrId( "txt_common_button_no" ) ); + action->setObjectName( KNo ); + dialog->addAction( action ); + dialog->setAttribute( Qt::WA_DeleteOnClose ); + dialog->setObjectName( KMTPInfoDialog ); + setOutstandingPopup( dialog ); + dialog->open( this, SLOT( hanldeMTPInfoDialogFinished( HbAction* ) ) ); + TX_EXIT +} + +/*! + Slot to be called when MtpInfoDialog has finished. + */ +void MpGlobalPopupHandler::hanldeMTPInfoDialogFinished( HbAction *selectedAction ) +{ + TX_ENTRY + if ( selectedAction && selectedAction->objectName() == KNo ) { + MpSettingsManager::instance()->stopShowingMtpInfo(); + } + TX_EXIT +} + +/*! + Slot to be called when a popup is getting closed. Usefull when a dialog is closed before it finishes + (dialog not closed by a direct user action). + */ +void MpGlobalPopupHandler::outstandingPopupClosing() +{ + TX_ENTRY + HbPopup *popup = qobject_cast( sender() ); + if ( popup ) { + Q_ASSERT( popup == mOutstandingPopup ); + mOutstandingPopup = 0; + } + TX_EXIT +} + +/*! + \internal + Launches Scan Finished Notification. + */ +void MpGlobalPopupHandler::launchScanFinishedDialog( bool ok, int itemsAdded ) +{ + QString added; + HbNotificationDialog *finishedDialog = new HbNotificationDialog(); + finishedDialog->setModal(true); + added = hbTrId( "txt_mus_dpopinfo_ln_songs_added", itemsAdded ); + finishedDialog->setText( added ); + finishedDialog->setAttribute( Qt::WA_DeleteOnClose ); + finishedDialog->setObjectName( KScanFinished ); + // Connect aboutToClose with outstandingPopupClosing() first, and then with launchMTPInfoDialog + // in order to get finishDialog cleared before MtpInfoDialog is launched. + setOutstandingPopup( finishedDialog ); + + if( ok ) { + finishedDialog->setIcon( HbIcon( QString("qtg_large_ok") ) ); + finishedDialog->setTitle( hbTrId( "txt_mus_dpophead_refresh_complete" ) ); + if ( MpSettingsManager::showMtpInfo() && !mMpSongScanner->isAutomaticScan() ) { + connect( finishedDialog, SIGNAL( aboutToClose() ), this, SLOT( launchMTPInfoDialog() ) ); + } + } + else { + finishedDialog->setIcon( HbIcon( QString("qtg_small_fail") ) ); + finishedDialog->setTitle( hbTrId( "txt_mus_dpophead_refresh_cancelled" ) ); + } + + finishedDialog->show(); +} + +/*! + \internal + Launches DiskFull Notification + */ +void MpGlobalPopupHandler::launchDiskFullDialog() +{ + TX_ENTRY + QString diskfull; + diskfull = hbTrId( "txt_mus_title_refresh_cancelled" ); + diskfull.append(" "); + diskfull.append( hbTrId( "txt_mus_info_out_of_disk_space" ) ); + HbMessageBox *diskFullDialog = new HbMessageBox(); + diskFullDialog->setIcon( HbIcon( QString("qtg_small_fail") ) ); + diskFullDialog->setText( diskfull ); + diskFullDialog->setTimeout( HbPopup::NoTimeout); + diskFullDialog->setAttribute( Qt::WA_DeleteOnClose ); + diskFullDialog->setObjectName( KDiskFullDialog ); + setOutstandingPopup( diskFullDialog ); + diskFullDialog->show(); + TX_EXIT +} + +/*! + \internal + sets \a popup as the current outstanding popup and cancels any other previous popup. + */ +void MpGlobalPopupHandler::setOutstandingPopup( HbPopup *popup ) +{ + TX_ENTRY + if ( mOutstandingPopup ) { + TX_LOG_ARGS( "Warning: Multiple popups attempted to be displayed" ); + if ( mOutstandingPopup->objectName() == KScanFinished ) { + disconnect( mOutstandingPopup, SIGNAL( aboutToClose() ), this, SLOT( launchMTPInfoDialog() ) ); + } + mOutstandingPopup->close(); + } + + connect( popup, SIGNAL( aboutToClose() ), this, SLOT( outstandingPopupClosing() ) ); + mOutstandingPopup = popup; + TX_EXIT +} +