37
|
1 |
/*
|
|
2 |
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
|
3 |
* All rights reserved.
|
|
4 |
* This component and the accompanying materials are made available
|
|
5 |
* under the terms of "Eclipse Public License v1.0"
|
|
6 |
* which accompanies this distribution, and is available
|
|
7 |
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
|
|
8 |
*
|
|
9 |
* Initial Contributors:
|
|
10 |
* Nokia Corporation - initial contribution.
|
|
11 |
*
|
|
12 |
* Contributors:
|
|
13 |
*
|
|
14 |
* Description: Music Player global popup handler.
|
|
15 |
*
|
|
16 |
*/
|
|
17 |
|
|
18 |
// INCLUDE FILES
|
|
19 |
#include <hblabel.h>
|
|
20 |
#include <hbaction.h>
|
|
21 |
#include <hbfontspec.h>
|
|
22 |
#include <hbmessagebox.h>
|
|
23 |
#include <hbprogressdialog.h>
|
|
24 |
#include <hbnotificationdialog.h>
|
|
25 |
|
|
26 |
#include "mpglobalpopuphandler.h"
|
|
27 |
#include "mpsettingsmanager.h"
|
|
28 |
#include "mpenginefactory.h"
|
|
29 |
#include "mpsongscanner.h"
|
|
30 |
#include "mpmtpinfolink.h"
|
|
31 |
#include "mptrace.h"
|
|
32 |
|
|
33 |
/*!
|
|
34 |
\class MpGlobalPopupHandler
|
|
35 |
\brief Music Player global popup handler.
|
|
36 |
|
|
37 |
This class controls the asynchronous operation of all global dialogs.
|
|
38 |
*/
|
|
39 |
|
|
40 |
// Popups launched by this class
|
|
41 |
const QString KScanProgressDialog = QString( "ScanProgressDialog" );
|
|
42 |
const QString KDiskFullDialog = QString( "DiskFullDialog" );
|
|
43 |
const QString KScanFinished = QString( "ScanFinishedDialog" );
|
|
44 |
const QString KUnableToContinueDueUSB = QString( "UnableToContinueDueUSB" );
|
|
45 |
const QString KUsbBlockingNote = QString( "UsbBlockingNote" );
|
|
46 |
const QString KMTPInfoDialog = QString( "MTPInfoDialog" );
|
|
47 |
|
|
48 |
// Popups Actions
|
|
49 |
const QString KYes = QString( "yes" );
|
|
50 |
const QString KNo = QString( "no" );
|
|
51 |
|
|
52 |
/*!
|
|
53 |
Constructs the collection popup handler.
|
|
54 |
*/
|
|
55 |
MpGlobalPopupHandler::MpGlobalPopupHandler( QObject *parent )
|
|
56 |
: QObject( parent ),
|
|
57 |
mOutstandingPopup( 0 ),
|
|
58 |
mMpEngine( 0 ),
|
|
59 |
mMpSongScanner( 0 )
|
|
60 |
{
|
|
61 |
TX_ENTRY
|
|
62 |
mMpEngine = MpEngineFactory::sharedEngine();
|
|
63 |
connect( mMpEngine, SIGNAL( libraryAboutToUpdate() ), this, SLOT( handleLibraryAboutToUpdate() ) );
|
|
64 |
connect( mMpEngine, SIGNAL( unableToCotinueDueUSB() ), this, SLOT( launchUnableToCotinueDueUsb() ) );
|
|
65 |
connect( mMpEngine, SIGNAL( usbSynchronizationStarted() ), this, SLOT( launchUsbBlockingNote() ) );
|
|
66 |
connect( mMpEngine, SIGNAL( usbSynchronizationFinished() ), this, SLOT( closeUsbBlockingNote() ) );
|
|
67 |
TX_EXIT
|
|
68 |
}
|
|
69 |
|
|
70 |
/*!
|
|
71 |
Destructs the collection popup handler.
|
|
72 |
*/
|
|
73 |
MpGlobalPopupHandler::~MpGlobalPopupHandler()
|
|
74 |
{
|
|
75 |
TX_ENTRY
|
|
76 |
delete mOutstandingPopup;
|
|
77 |
TX_EXIT
|
|
78 |
}
|
|
79 |
|
|
80 |
/*!
|
|
81 |
Closes any active popup
|
|
82 |
*/
|
|
83 |
void MpGlobalPopupHandler::cancelOngoingPopup()
|
|
84 |
{
|
|
85 |
TX_ENTRY
|
|
86 |
if ( mOutstandingPopup ) {
|
|
87 |
mOutstandingPopup->close();
|
|
88 |
}
|
|
89 |
TX_EXIT
|
|
90 |
}
|
|
91 |
|
|
92 |
/*!
|
|
93 |
Slot called upon MpEngine signal libraryAboutToUpdate(). Used to connect with SongScanner.
|
|
94 |
*/
|
|
95 |
void MpGlobalPopupHandler::handleLibraryAboutToUpdate()
|
|
96 |
{
|
|
97 |
TX_ENTRY
|
|
98 |
if ( !mMpSongScanner && mMpEngine->songScanner() ) {
|
|
99 |
mMpSongScanner = mMpEngine->songScanner();
|
|
100 |
connect( mMpSongScanner, SIGNAL( scanStarted() ), this, SLOT( launchScanDialog() ) );
|
|
101 |
connect( mMpSongScanner, SIGNAL( scanCountChanged( int ) ), this, SLOT( scanCountChanged( int ) ) );
|
|
102 |
connect( mMpSongScanner, SIGNAL( scanFinished( int, int ) ),
|
|
103 |
this, SLOT( handleScanFinished( int, int ) ) );
|
|
104 |
}
|
|
105 |
TX_EXIT
|
|
106 |
}
|
|
107 |
|
|
108 |
/*!
|
|
109 |
Slot called upon notification from MpSongScanner indicating start of
|
|
110 |
scanning process.
|
|
111 |
*/
|
|
112 |
void MpGlobalPopupHandler::launchScanDialog()
|
|
113 |
{
|
|
114 |
TX_ENTRY
|
|
115 |
HbProgressDialog* scanProgressDialog = new HbProgressDialog( HbProgressDialog::WaitDialog );
|
|
116 |
connect( scanProgressDialog, SIGNAL( cancelled() ), mMpSongScanner, SLOT( cancelScan() ) );
|
|
117 |
scanProgressDialog->setModal( true );
|
47
|
118 |
HbLabel *title = new HbLabel( hbTrId( "txt_mus_title_refreshing" ) );
|
37
|
119 |
title->setFontSpec(HbFontSpec(HbFontSpec::Primary));
|
|
120 |
|
|
121 |
scanProgressDialog->setHeadingWidget( title );
|
|
122 |
scanProgressDialog->setText( QString("") );
|
|
123 |
scanProgressDialog->setAttribute( Qt::WA_DeleteOnClose );
|
|
124 |
scanProgressDialog->setObjectName( KScanProgressDialog );
|
|
125 |
setOutstandingPopup( scanProgressDialog );
|
|
126 |
scanProgressDialog->show();
|
|
127 |
TX_EXIT
|
|
128 |
}
|
|
129 |
|
|
130 |
/*!
|
|
131 |
Slot called upon notification from MpSongScanner indicating the number of
|
|
132 |
songs scanned so far.
|
|
133 |
*/
|
|
134 |
void MpGlobalPopupHandler::scanCountChanged(int count)
|
|
135 |
{
|
|
136 |
TX_ENTRY_ARGS("count " << count )
|
|
137 |
if ( mOutstandingPopup && ( mOutstandingPopup->objectName() == KScanProgressDialog ) ) {
|
|
138 |
HbProgressDialog *dialog = qobject_cast<HbProgressDialog *>( mOutstandingPopup );
|
|
139 |
QString added;
|
43
|
140 |
added = hbTrId( "txt_mus_info_ln_songs_found" , count );
|
37
|
141 |
dialog->setText( added );
|
|
142 |
}
|
|
143 |
TX_EXIT
|
|
144 |
}
|
|
145 |
|
|
146 |
/*!
|
|
147 |
Slot called upon notification from MpSongScanner. Used to close current scan progress note,
|
|
148 |
and display scan results.
|
|
149 |
|
|
150 |
*/
|
|
151 |
void MpGlobalPopupHandler::handleScanFinished( int error, int itemsAdded )
|
|
152 |
{
|
|
153 |
TX_ENTRY_ARGS("error: " << error << " Items added: " << itemsAdded )
|
45
|
154 |
|
37
|
155 |
if ( mOutstandingPopup && ( mOutstandingPopup->objectName() == KScanProgressDialog ) ) {
|
|
156 |
HbProgressDialog *dialog = qobject_cast<HbProgressDialog *>( mOutstandingPopup );
|
|
157 |
disconnect( dialog, SIGNAL( aboutToClose() ), this, SLOT( outstandingPopupClosing() ) );
|
|
158 |
mOutstandingPopup = 0;
|
|
159 |
dialog->close();
|
|
160 |
}
|
|
161 |
|
|
162 |
switch( error ) {
|
|
163 |
case MpSongScanner::ScanErrorNone :
|
45
|
164 |
launchScanFinishedDialog( true , itemsAdded );
|
37
|
165 |
break;
|
|
166 |
case MpSongScanner::ScanGeneralError :
|
45
|
167 |
launchScanFinishedDialog( false, itemsAdded );
|
37
|
168 |
break;
|
|
169 |
case MpSongScanner::ScanErrorDiskFull :
|
|
170 |
launchDiskFullDialog();
|
|
171 |
break;
|
|
172 |
case MpSongScanner::ScanInterrupted :
|
|
173 |
default:
|
|
174 |
//When scan interrupted (DiskEvent) just dimsiss the scanning progress note.
|
|
175 |
break;
|
|
176 |
}
|
|
177 |
TX_EXIT
|
|
178 |
}
|
|
179 |
|
|
180 |
/*!
|
|
181 |
Slot called when MpEngine emits unableToCotinueDueUSB() signal
|
|
182 |
*/
|
|
183 |
void MpGlobalPopupHandler::launchUnableToCotinueDueUsb()
|
|
184 |
{
|
|
185 |
HbMessageBox *dialog = new HbMessageBox( HbMessageBox::MessageTypeInformation );
|
|
186 |
dialog->setText( hbTrId( "txt_mus_info_usb_conn_in_progress" ) );
|
|
187 |
dialog->setModal( true );
|
|
188 |
dialog->setAttribute( Qt::WA_DeleteOnClose );
|
|
189 |
dialog->setObjectName( KUnableToContinueDueUSB );
|
|
190 |
setOutstandingPopup( dialog );
|
|
191 |
dialog->show();
|
|
192 |
}
|
|
193 |
|
|
194 |
/*!
|
|
195 |
Slot called when MpEngine emits usbSynchronizationStarted() signal
|
|
196 |
*/
|
|
197 |
void MpGlobalPopupHandler::launchUsbBlockingNote()
|
|
198 |
{
|
|
199 |
HbProgressDialog *usbBlockingNote = new HbProgressDialog( HbProgressDialog::WaitDialog );
|
|
200 |
usbBlockingNote->setModal( true );
|
|
201 |
if ( usbBlockingNote->actions().count() ) {
|
|
202 |
//Hide cancel action.
|
|
203 |
usbBlockingNote->actions().at( 0 )->setVisible( false );
|
|
204 |
}
|
|
205 |
usbBlockingNote->setDismissPolicy( HbPopup::NoDismiss );
|
|
206 |
usbBlockingNote->setText( hbTrId( "txt_mus_info_usb_conn_in_progress" ) );
|
|
207 |
usbBlockingNote->setAttribute( Qt::WA_DeleteOnClose );
|
|
208 |
usbBlockingNote->setObjectName( KUsbBlockingNote );
|
|
209 |
setOutstandingPopup( usbBlockingNote );
|
|
210 |
usbBlockingNote->show();
|
|
211 |
}
|
|
212 |
|
|
213 |
/*!
|
|
214 |
Slot called when MpEngine emits usbSynchronizationFinished() signal
|
|
215 |
*/
|
|
216 |
void MpGlobalPopupHandler::closeUsbBlockingNote()
|
|
217 |
{
|
|
218 |
if ( mOutstandingPopup && ( mOutstandingPopup->objectName() == KUsbBlockingNote ) ) {
|
|
219 |
HbProgressDialog *dialog = qobject_cast<HbProgressDialog *>( mOutstandingPopup );
|
|
220 |
dialog->cancel();
|
|
221 |
}
|
|
222 |
}
|
|
223 |
|
|
224 |
/*!
|
|
225 |
Slot to launch the MTP educating info dialog
|
43
|
226 |
This dialog would be displayed after any manual refresh (from options menu),
|
|
227 |
or after a refreshing originated by USBMassStorage disconnection.
|
37
|
228 |
*/
|
|
229 |
void MpGlobalPopupHandler::launchMTPInfoDialog()
|
|
230 |
{
|
|
231 |
TX_ENTRY
|
|
232 |
HbDialog *dialog = new HbDialog();
|
|
233 |
dialog->setContentWidget( new MpMtpInfoLink() );
|
|
234 |
dialog->setModal( true );
|
|
235 |
dialog->setDismissPolicy( HbPopup::NoDismiss);
|
|
236 |
dialog->setTimeout( HbPopup::NoTimeout );
|
|
237 |
HbAction *action;
|
|
238 |
action = new HbAction( hbTrId( "txt_common_button_yes" ) );
|
|
239 |
action->setObjectName( KYes );
|
|
240 |
dialog->addAction( action );
|
|
241 |
action = new HbAction( hbTrId( "txt_common_button_no" ) );
|
|
242 |
action->setObjectName( KNo );
|
|
243 |
dialog->addAction( action );
|
|
244 |
dialog->setAttribute( Qt::WA_DeleteOnClose );
|
|
245 |
dialog->setObjectName( KMTPInfoDialog );
|
|
246 |
setOutstandingPopup( dialog );
|
|
247 |
dialog->open( this, SLOT( hanldeMTPInfoDialogFinished( HbAction* ) ) );
|
|
248 |
TX_EXIT
|
|
249 |
}
|
|
250 |
|
|
251 |
/*!
|
|
252 |
Slot to be called when MtpInfoDialog has finished.
|
|
253 |
*/
|
|
254 |
void MpGlobalPopupHandler::hanldeMTPInfoDialogFinished( HbAction *selectedAction )
|
|
255 |
{
|
|
256 |
TX_ENTRY
|
|
257 |
if ( selectedAction && selectedAction->objectName() == KNo ) {
|
|
258 |
MpSettingsManager::instance()->stopShowingMtpInfo();
|
|
259 |
}
|
|
260 |
TX_EXIT
|
|
261 |
}
|
|
262 |
|
|
263 |
/*!
|
|
264 |
Slot to be called when a popup is getting closed. Usefull when a dialog is closed before it finishes
|
|
265 |
(dialog not closed by a direct user action).
|
|
266 |
*/
|
|
267 |
void MpGlobalPopupHandler::outstandingPopupClosing()
|
|
268 |
{
|
|
269 |
TX_ENTRY
|
|
270 |
HbPopup *popup = qobject_cast<HbPopup *>( sender() );
|
|
271 |
if ( popup ) {
|
|
272 |
Q_ASSERT( popup == mOutstandingPopup );
|
|
273 |
mOutstandingPopup = 0;
|
|
274 |
}
|
|
275 |
TX_EXIT
|
|
276 |
}
|
|
277 |
|
|
278 |
/*!
|
|
279 |
\internal
|
|
280 |
Launches Scan Finished Notification.
|
|
281 |
*/
|
45
|
282 |
void MpGlobalPopupHandler::launchScanFinishedDialog( bool ok , int itemsAdded )
|
37
|
283 |
{
|
|
284 |
HbNotificationDialog *finishedDialog = new HbNotificationDialog();
|
|
285 |
finishedDialog->setModal(true);
|
|
286 |
finishedDialog->setAttribute( Qt::WA_DeleteOnClose );
|
|
287 |
finishedDialog->setObjectName( KScanFinished );
|
|
288 |
// Connect aboutToClose with outstandingPopupClosing() first, and then with launchMTPInfoDialog
|
|
289 |
// in order to get finishDialog cleared before MtpInfoDialog is launched.
|
|
290 |
setOutstandingPopup( finishedDialog );
|
|
291 |
|
45
|
292 |
// Educating user (of MTP information) dialog is displayed
|
|
293 |
// only when the following conditions are met:
|
|
294 |
// 1. A "manual" refresh operation completes successfully
|
|
295 |
// 2. Refresh operation finds at least one new item
|
|
296 |
|
37
|
297 |
if( ok ) {
|
|
298 |
finishedDialog->setIcon( HbIcon( QString("qtg_large_ok") ) );
|
|
299 |
finishedDialog->setTitle( hbTrId( "txt_mus_dpophead_refresh_complete" ) );
|
45
|
300 |
if ( MpSettingsManager::showMtpInfo() && !mMpSongScanner->isAutomaticScan() && itemsAdded ) {
|
37
|
301 |
connect( finishedDialog, SIGNAL( aboutToClose() ), this, SLOT( launchMTPInfoDialog() ) );
|
|
302 |
}
|
|
303 |
}
|
|
304 |
else {
|
|
305 |
finishedDialog->setIcon( HbIcon( QString("qtg_small_fail") ) );
|
|
306 |
finishedDialog->setTitle( hbTrId( "txt_mus_dpophead_refresh_cancelled" ) );
|
|
307 |
}
|
|
308 |
|
|
309 |
finishedDialog->show();
|
|
310 |
}
|
|
311 |
|
|
312 |
/*!
|
|
313 |
\internal
|
|
314 |
Launches DiskFull Notification
|
|
315 |
*/
|
|
316 |
void MpGlobalPopupHandler::launchDiskFullDialog()
|
|
317 |
{
|
|
318 |
TX_ENTRY
|
|
319 |
HbMessageBox *diskFullDialog = new HbMessageBox();
|
|
320 |
diskFullDialog->setIcon( HbIcon( QString("qtg_small_fail") ) );
|
51
|
321 |
diskFullDialog->setText( hbTrId( "txt_mus_info_out_of_disk_space" ) );
|
37
|
322 |
diskFullDialog->setTimeout( HbPopup::NoTimeout);
|
|
323 |
diskFullDialog->setAttribute( Qt::WA_DeleteOnClose );
|
|
324 |
diskFullDialog->setObjectName( KDiskFullDialog );
|
|
325 |
setOutstandingPopup( diskFullDialog );
|
|
326 |
diskFullDialog->show();
|
|
327 |
TX_EXIT
|
|
328 |
}
|
|
329 |
|
|
330 |
/*!
|
|
331 |
\internal
|
|
332 |
sets \a popup as the current outstanding popup and cancels any other previous popup.
|
|
333 |
*/
|
|
334 |
void MpGlobalPopupHandler::setOutstandingPopup( HbPopup *popup )
|
|
335 |
{
|
|
336 |
TX_ENTRY
|
|
337 |
if ( mOutstandingPopup ) {
|
|
338 |
TX_LOG_ARGS( "Warning: Multiple popups attempted to be displayed" );
|
|
339 |
if ( mOutstandingPopup->objectName() == KScanFinished ) {
|
|
340 |
disconnect( mOutstandingPopup, SIGNAL( aboutToClose() ), this, SLOT( launchMTPInfoDialog() ) );
|
|
341 |
}
|
|
342 |
mOutstandingPopup->close();
|
|
343 |
}
|
|
344 |
|
|
345 |
connect( popup, SIGNAL( aboutToClose() ), this, SLOT( outstandingPopupClosing() ) );
|
|
346 |
mOutstandingPopup = popup;
|
|
347 |
TX_EXIT
|
|
348 |
}
|
|
349 |
|