mpviewplugins/mpdetailsviewplugin/src/mpdetailsview.cpp
branchRCL_3
changeset 25 14979e23cb5e
equal deleted inserted replaced
24:26a1709b9fec 25:14979e23cb5e
       
     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 details view.
       
    15 *
       
    16 */
       
    17 #include <QWebSettings>
       
    18 #include <QGraphicsWidget>
       
    19 #include <QGraphicsLayoutItem>
       
    20 #include <QUrl>
       
    21 #include <QDomElement>
       
    22 #include <QList>
       
    23 #include <QFile>
       
    24 #include <QGraphicsLinearLayout>
       
    25 #include <QSizeF>
       
    26 #include <QDesktopServices>
       
    27 
       
    28 
       
    29 #include <hbinstance.h>
       
    30 #include <hbmainwindow.h>
       
    31 #include <hbaction.h>
       
    32 #include <hblabel.h>
       
    33 #include <hbgroupbox.h>
       
    34 #include <hbdocumentloader.h>
       
    35 #include <hbwidget.h>
       
    36 #include <hbpushbutton.h>
       
    37 #include <hbpopup.h>
       
    38 #include <hbdialog.h>
       
    39 #include <hblistwidget.h>
       
    40 #include <hblistwidgetitem.h>
       
    41 #include <hblistviewitem.h>
       
    42 #include <hbprogressbar.h>
       
    43 
       
    44 #include "mpdetailsview.h"
       
    45 #include "mpenginefactory.h"
       
    46 #include "mpcommondefs.h"
       
    47 #include "mpsongdata.h"
       
    48 #include "mpsettingsmanager.h"
       
    49 #include "mpquerymanager.h"
       
    50 #include "mptrace.h"
       
    51 
       
    52 
       
    53 const int KOneKiloByteInBytes = 1024;
       
    54 const int KOneMegabyteInBytes = 1048576;        
       
    55 const int KOneGigaByteInBytes = 134217728;        
       
    56 
       
    57 /*!
       
    58  Constructor
       
    59  */
       
    60 MpDetailsView::MpDetailsView()
       
    61     : mMpEngine( 0 ),
       
    62       mSongData( 0 ),
       
    63       mActivated( false ),
       
    64       mSoftKeyBack( 0 ),
       
    65       mSongText( 0 ),
       
    66       mAlbumText( 0 ),
       
    67       mArtistText( 0 ),
       
    68       mAlbumArt( 0 ),
       
    69       mSongDetailsGroupBox(0),
       
    70       mInspireMeGroupBox(0),
       
    71       mDocumentLoader( 0 ),
       
    72       mDetailList(0),
       
    73       mInspireList(0),
       
    74       mInspireMeProgressBar(0),
       
    75       mMpQueryManager( 0 ),
       
    76       mInspireMeQueryOngoing( false ),
       
    77       mInspireMeQueryRendered( false )
       
    78 {
       
    79     TX_ENTRY
       
    80     bool widgetsOk = false;
       
    81     HbMainWindow *mainWindow = hbInstance->allMainWindows()[0];
       
    82     mDocumentLoader = new HbDocumentLoader();
       
    83 
       
    84     TX_LOG_ARGS("Document loader created")
       
    85     if(!mDocumentLoader) {
       
    86         TX_LOG_ARGS( "MpDetailsView() Error: HbDocumentLoader not constructed" );
       
    87         return;
       
    88     }
       
    89 
       
    90     TX_LOG_ARGS("Loading :/mpdetailsviewdocml/mpdetailsview.docml")
       
    91     mDocumentLoader->load( QString(":/mpdetailsviewdocml/mpdetailsview.docml"), &widgetsOk );
       
    92     if(!widgetsOk) {
       
    93         TX_LOG_ARGS( "MpDetailsView() Error: invalid mpdetailsview.docml" );
       
    94         return;
       
    95     }
       
    96 
       
    97     TX_LOG_ARGS("Loaded :/mpdetailsviewdocml/mpdetailsview.docml")
       
    98     QGraphicsWidget *widget = 0;
       
    99 
       
   100     widget = mDocumentLoader->findWidget( QString("content") );
       
   101     TX_LOG_ARGS( "MpDetailsView() mDocumentLoader->findWidget for <content>: " << (int)(widget) );
       
   102     setWidget(  qobject_cast<HbWidget *>(widget) );
       
   103 
       
   104     widget = mDocumentLoader->findWidget( QString("trackTitle") );
       
   105     mSongText = qobject_cast<HbLabel *>(widget);
       
   106     TX_LOG_ARGS("MpDetailsView() <trackTitle> widget found mSongText: " << (int)(mSongText) );
       
   107 
       
   108     widget = mDocumentLoader->findWidget( QString("artist") );
       
   109     mArtistText = qobject_cast<HbLabel *>(widget);
       
   110     TX_LOG_ARGS("MpDetailsView() <artist> widget found mArtistText: " << (int)(mArtistText) );
       
   111 
       
   112     widget = mDocumentLoader->findWidget( QString("albumName") );
       
   113     mAlbumText = qobject_cast<HbLabel *>(widget);
       
   114     TX_LOG_ARGS("MpDetailsView() <albumName> widget found mAlbumText: " << (int)(mAlbumText) );
       
   115 
       
   116     widget = mDocumentLoader->findWidget( QString("albumArt") );
       
   117     mAlbumArt = qobject_cast<HbLabel *>(widget);
       
   118     TX_LOG_ARGS("MpDetailsView() <albumArt> widget found mAlbumArt: " << (int)(mAlbumArt) );
       
   119 
       
   120     widget = mDocumentLoader->findWidget( QString("songDetails") );
       
   121     mSongDetailsGroupBox = qobject_cast<HbGroupBox *>(widget);
       
   122     TX_LOG_ARGS("MpDetailsView() <songDetails> widget found mSongDetailsGroupBox: " << (int)(mSongDetailsGroupBox) );
       
   123 
       
   124     widget = mDocumentLoader->findWidget( QString("songDetailsListWidget") );
       
   125     mDetailList = qobject_cast<HbListWidget *>(widget);
       
   126     TX_LOG_ARGS("MpDetailsView() <songDetailsListWidget> widget found mDetailList: " << (int)(mDetailList) );
       
   127 
       
   128     widget = mDocumentLoader->findWidget( QString("inspireMeGroupBox") );
       
   129     mInspireMeGroupBox = qobject_cast<HbGroupBox *>(widget);
       
   130     TX_LOG_ARGS("MpDetailsView() <inspireMeGroupBox> widget found mInspireMeGroupBox: " << (int)(mInspireMeGroupBox) );
       
   131 
       
   132     widget = mDocumentLoader->findWidget( QString("inspireListWidget") );
       
   133     mInspireList = qobject_cast<HbListWidget *>(widget);
       
   134     TX_LOG_ARGS("MpDetailsView() <inspireListWidget> widget found mInspireList: " << (int)(mInspireList) );
       
   135 
       
   136     widget = mDocumentLoader->findWidget( QString("inspireMeProgressBar") );
       
   137     mInspireMeProgressBar = qobject_cast<HbProgressBar *>(widget);
       
   138     TX_LOG_ARGS("MpDetailsView() <inspireMeProgressBar> widget found mInspireMeProgressBar: " << (int)(mInspireMeProgressBar) );
       
   139     
       
   140     // load section HideInspireMe if no ovi store suport
       
   141     bool loadingSectionOk = false;
       
   142     mDocumentLoader->load( QString(":/mpdetailsviewdocml/mpdetailsview.docml"), QString( "ShowInspireMe" ), &loadingSectionOk );    
       
   143     if( loadingSectionOk ) {
       
   144         TX_LOG_ARGS( "Loading ShowInspireMe section is successful." );
       
   145     }
       
   146     else {
       
   147         TX_LOG_ARGS( "Loading ShowInspireMe section fails." );
       
   148     }
       
   149 
       
   150     TX_EXIT
       
   151 }
       
   152 
       
   153 /*!
       
   154  Destructs the details view.
       
   155  */
       
   156 MpDetailsView::~MpDetailsView()
       
   157 {
       
   158     TX_ENTRY
       
   159     saveGroupBoxStates();
       
   160     delete mSoftKeyBack;
       
   161     delete mDocumentLoader;
       
   162     delete mMpQueryManager;
       
   163 
       
   164     TX_EXIT
       
   165 }
       
   166 
       
   167 
       
   168 /*!
       
   169  Initializes the details view. Allocates all resources needed by the view.
       
   170  */
       
   171 void MpDetailsView::initializeView()
       
   172 {
       
   173     TX_ENTRY
       
   174 
       
   175     mSoftKeyBack = new HbAction( Hb::BackNaviAction, this );
       
   176 
       
   177     mMpEngine = MpEngineFactory::sharedEngine();
       
   178     mSongData = mMpEngine->songData();
       
   179     mMpQueryManager = new MpQueryManager();
       
   180 
       
   181     connect( mSoftKeyBack, SIGNAL( triggered() ), this, SLOT( back() ) );
       
   182     connect( mSongData, SIGNAL( albumArtReady() ), this, SLOT( albumArtChanged() ) );
       
   183     connect( mSongData, SIGNAL( playbackInfoChanged() ), this, SLOT( handlePlaybackInfoChanged() ) );
       
   184     connect( mSongData, SIGNAL( songDetailInfoChanged() ), this, SLOT( songDetailInfoChanged() ) );
       
   185     connect( mDetailList, SIGNAL( pressed( HbListWidgetItem  * ) ), this, SLOT( handleListItemSelected( HbListWidgetItem  * ) ) );
       
   186     connect( mSongDetailsGroupBox, SIGNAL( toggled( bool ) ), this, SLOT( handleDetailsGroupBoxToggled( bool ) ) );
       
   187     connect( mInspireMeGroupBox, SIGNAL( toggled( bool ) ), this, SLOT( handleInspireMeGroupBoxToggled( bool ) ) );
       
   188     connect( mMpQueryManager, SIGNAL(inspireMeItemsMetadataRetrieved()), this, SLOT(renderInspireMeMetadata()));
       
   189     connect( mMpQueryManager, SIGNAL(inspireMeItemAlbumArtReady()), this, SLOT(renderInspireMeAlbumArts()));    
       
   190     connect( mMpQueryManager, SIGNAL(localMusicStoreRetrieved(bool)), this, SLOT(queryInspireMe(bool)), Qt::QueuedConnection);
       
   191 	connect( mMpQueryManager, SIGNAL(localMusicStoreRetrievalError()), this, SLOT(abortInspireMeProcess()));
       
   192     connect( mMpQueryManager, SIGNAL(inspireMeItemsRetrievalError()), this, SLOT(queryLocalMusicStore()), Qt::QueuedConnection);
       
   193 
       
   194     TX_EXIT
       
   195 }
       
   196 
       
   197 void MpDetailsView::queryLocalMusicStore()
       
   198 {
       
   199     TX_ENTRY
       
   200     mMpQueryManager->reset();
       
   201     mMpQueryManager->queryLocalMusicStore(); 
       
   202     TX_EXIT        
       
   203 }
       
   204 
       
   205 /*!
       
   206  Activates the details view.
       
   207  */
       
   208 void MpDetailsView::activateView()
       
   209 {
       
   210     TX_ENTRY
       
   211     setNavigationAction( mSoftKeyBack );
       
   212 
       
   213     mActivated = true;
       
   214     TX_LOG_ARGS( "InspireMeVal: " << MpSettingsManager::inspireMe() );
       
   215     TX_LOG_ARGS( "SongDetailsGbVal: " << MpSettingsManager::songDetailsGb() );
       
   216     mInspireMeGroupBox->setCollapsed(!MpSettingsManager::inspireMe());
       
   217     mSongDetailsGroupBox->setCollapsed(!MpSettingsManager::songDetailsGb());
       
   218     TX_EXIT
       
   219 }
       
   220 
       
   221 /*!
       
   222  Deactivates the details view.
       
   223  */
       
   224 void MpDetailsView::deactivateView()
       
   225 {
       
   226     TX_ENTRY
       
   227     saveGroupBoxStates();
       
   228     setNavigationAction( 0 );
       
   229     mActivated = false;
       
   230     TX_EXIT
       
   231 }
       
   232 
       
   233 void MpDetailsView::saveGroupBoxStates()
       
   234 {
       
   235     TX_ENTRY
       
   236     if (mInspireMeGroupBox->isCollapsed() ) {
       
   237         MpSettingsManager::setInspireMe(false);
       
   238     }
       
   239     else {
       
   240         MpSettingsManager::setInspireMe(true);
       
   241     }
       
   242 
       
   243     if (mSongDetailsGroupBox->isCollapsed() ) {
       
   244         MpSettingsManager::setSongDetailsGb(false);
       
   245     }
       
   246     else {
       
   247         MpSettingsManager::setSongDetailsGb(true);
       
   248     }
       
   249     TX_EXIT      
       
   250 }
       
   251  
       
   252 /*!
       
   253  Slot to handle back command from softkey.
       
   254  */
       
   255 void MpDetailsView::back()
       
   256 {
       
   257     TX_ENTRY
       
   258     emit command( MpCommon::ActivatePreviousView );
       
   259     TX_EXIT
       
   260 }
       
   261 
       
   262 /*!
       
   263  Slot to handle Album art changed.
       
   264  */
       
   265 void MpDetailsView::albumArtChanged( )
       
   266 {
       
   267     TX_ENTRY
       
   268     HbIcon icon;
       
   269     mSongData->albumArt( icon );
       
   270     mAlbumArt->setIcon( icon );
       
   271     TX_EXIT
       
   272 }
       
   273 
       
   274 /*!
       
   275  Slot to handle network error.
       
   276  */
       
   277 void MpDetailsView::abortInspireMeProcess( )
       
   278 {
       
   279     TX_ENTRY
       
   280     mInspireMeProgressBar->hide();    
       
   281     mInspireMeGroupBox->setCollapsed( true );    
       
   282     mInspireMeQueryOngoing = false;
       
   283     mInspireMeQueryRendered = false;
       
   284     // ensure that we dont get callbacks from previous queries. Especially true,
       
   285     // if details view is actived with a quick song change again
       
   286     mMpQueryManager->reset();
       
   287     mInspireList->clear();
       
   288     TX_EXIT
       
   289 }
       
   290 
       
   291 /*!
       
   292  Render inspireme groupbox after album arts downloaded
       
   293  */
       
   294 void MpDetailsView::renderInspireMeMetadata()
       
   295 {
       
   296     TX_ENTRY
       
   297     mInspireMeQueryOngoing = false;
       
   298     mInspireMeQueryRendered = true;
       
   299     mInspireMeProgressBar->hide();
       
   300     if( mMpQueryManager->recommendationsCount() ) {
       
   301         TX_LOG_ARGS( "There are recommendations." )
       
   302         // we have recommendations
       
   303         for ( int i = 0; i < mMpQueryManager->recommendationsCount(); ++i ) {
       
   304             // configure the layout properties
       
   305             if(!mInspireList->count()) {
       
   306                 // we havent configured the prototype before
       
   307                 HbListViewItem *prototype = mInspireList->listItemPrototype();
       
   308                 prototype->setGraphicsSize( HbListViewItem::LargeIcon );
       
   309             }
       
   310             // create the item
       
   311             HbListWidgetItem  *inspireMeItem = new HbListWidgetItem();
       
   312             inspireMeItem->setIcon( mMpQueryManager->recommendedAlbumArt( i ));
       
   313             inspireMeItem->setText( mMpQueryManager->recommendedSong( i ) );
       
   314             inspireMeItem->setSecondaryText( mMpQueryManager->recommendedArtist( i ) );
       
   315             mInspireList->addItem( inspireMeItem );
       
   316         }
       
   317     }
       
   318     else {
       
   319         TX_LOG_ARGS( "There are NO recommendations" )
       
   320         // we dont have recommendations
       
   321         // we havent configured the prototype before
       
   322         HbListViewItem *prototype = mInspireList->listItemPrototype();
       
   323         const int maxTextRowCount = 20;
       
   324         const int minTextRowCount = 1;
       
   325         prototype->setSecondaryTextRowCount(minTextRowCount,maxTextRowCount);
       
   326 
       
   327         HbListWidgetItem  *inspireMeItem = new HbListWidgetItem();
       
   328         inspireMeItem->setSecondaryText( hbTrId( "txt_mus_dblist_val_there_are_no_recommendations" ) );
       
   329         mInspireList->addItem( inspireMeItem );
       
   330     }
       
   331 
       
   332     TX_EXIT
       
   333 }
       
   334 
       
   335 void MpDetailsView::renderInspireMeAlbumArts()
       
   336 {
       
   337     TX_ENTRY    
       
   338     for( int i = 0; i < mInspireList->count(); ++i) {
       
   339         mInspireList->item(i)->setIcon( mMpQueryManager->recommendedAlbumArt( i ) );
       
   340     }
       
   341     TX_EXIT    
       
   342 }
       
   343    
       
   344 bool MpDetailsView::isMetadata() const
       
   345 {
       
   346     bool result = ( ( !mSongData->album().isEmpty() ) ||
       
   347                     ( !mSongData->artist().isEmpty() ) );
       
   348     TX_LOG_ARGS( "Inspire Me Query metadata available:" << result );
       
   349     return result;
       
   350 }
       
   351 
       
   352 /*!
       
   353  Slot to handle basic song information
       
   354  */
       
   355 void MpDetailsView::handlePlaybackInfoChanged()
       
   356 {
       
   357     TX_ENTRY
       
   358     // ensure that we dont get callbacks from previous queries. Especially true,
       
   359     // if details view is actived with a quick song change again
       
   360     mMpQueryManager->reset();
       
   361     mInspireList->clear();
       
   362     mInspireMeQueryRendered = false;
       
   363 
       
   364     // Clear the song data link until new query has been made.
       
   365     mSongData->setLink( "" );
       
   366 
       
   367     if ( !mSongData->title().isEmpty () ) {
       
   368         mSongText->setPlainText( mSongData->title() );
       
   369     }
       
   370     else {
       
   371         mSongText->setPlainText( mSongData->fileName() );
       
   372     }
       
   373 
       
   374     if ( !mSongData->album().isEmpty () ) {
       
   375         mAlbumText->setPlainText( mSongData->album() );
       
   376     }
       
   377     else {
       
   378         mAlbumText->setPlainText( hbTrId( "txt_mus_other_unknown7") );
       
   379     }
       
   380 
       
   381     if ( !mSongData->artist().isEmpty() ) {
       
   382         mArtistText->setPlainText( mSongData->artist() );
       
   383     }
       
   384     else {
       
   385         mArtistText->setPlainText( hbTrId( "txt_mus_other_unknown6") );
       
   386     }
       
   387 
       
   388     if(!mInspireMeGroupBox->isCollapsed()) {
       
   389         startInspireMe();
       
   390     }
       
   391     TX_EXIT
       
   392 }
       
   393 
       
   394 void MpDetailsView::startInspireMe()
       
   395 {
       
   396     TX_ENTRY    
       
   397     if(isMetadata()) {
       
   398         // show progress bar, start store query or inspire me query process
       
   399         mInspireMeProgressBar->show();
       
   400         mInspireMeQueryOngoing = true;
       
   401         if( mMpQueryManager->isLocalMusicStore() ) {
       
   402             mMpQueryManager->queryInspireMeItems(mSongData->artist(),mSongData->album(),mSongData->title());
       
   403         }
       
   404         else {
       
   405             // no local store information present
       
   406             mMpQueryManager->queryLocalMusicStore();
       
   407         }
       
   408     }
       
   409     else {
       
   410         // no metadata. show no recommendations
       
   411         renderInspireMeMetadata();
       
   412     }
       
   413     TX_EXIT    
       
   414 }
       
   415     
       
   416 /*!
       
   417  Slot to handle detail song information
       
   418  */
       
   419 void MpDetailsView::songDetailInfoChanged()
       
   420 {
       
   421     TX_ENTRY
       
   422     mDetailList->clear();
       
   423 
       
   424     if ( !mSongData->albumTrack().isNull() ) {
       
   425         HbListWidgetItem *item = new HbListWidgetItem();
       
   426         item->setText( hbTrId( "txt_mus_dblist_song_number" ) );
       
   427         item->setSecondaryText( mSongData->albumTrack() );
       
   428         item->setEnabled( false );
       
   429         mDetailList->addItem( item );
       
   430     }
       
   431 
       
   432     if ( !mSongData->year().isNull() ) {
       
   433         HbListWidgetItem *item = new HbListWidgetItem();
       
   434         item->setText( hbTrId( "txt_mus_dblist_year" ) );
       
   435         item->setSecondaryText( mSongData->year() );
       
   436         item->setEnabled( false );
       
   437         mDetailList->addItem( item );
       
   438     }
       
   439 
       
   440     if ( !mSongData->genre().isNull() ) {
       
   441         HbListWidgetItem *item = new HbListWidgetItem();
       
   442         item->setText( hbTrId( "txt_mus_dblist_genre" ) );
       
   443         item->setSecondaryText( mSongData->genre() );
       
   444         item->setEnabled( false );
       
   445         mDetailList->addItem( item );
       
   446     }
       
   447 
       
   448     if ( !mSongData->composer().isNull() ) {
       
   449         HbListWidgetItem *item = new HbListWidgetItem();
       
   450         item->setText( hbTrId( "txt_mus_dblist_composer" ) );
       
   451         item->setSecondaryText( mSongData->composer() );
       
   452         item->setEnabled( false );
       
   453         mDetailList->addItem( item );
       
   454     }
       
   455 
       
   456     if ( !mSongData->fileName().isNull() ) {
       
   457         HbListWidgetItem *item = new HbListWidgetItem();
       
   458         item->setText( hbTrId( "txt_mus_dblist_file_name" ) );
       
   459         item->setSecondaryText( mSongData->fileName() );
       
   460         item->setEnabled( false );
       
   461         mDetailList->addItem( item );
       
   462     }
       
   463 
       
   464     if ( !mSongData->mimeType().isNull() ) {
       
   465         HbListWidgetItem *item = new HbListWidgetItem();
       
   466         item->setText( hbTrId( "txt_mus_dblist_format" ) );
       
   467         item->setSecondaryText( mSongData->mimeType() );
       
   468         item->setEnabled( false );
       
   469         mDetailList->addItem( item );
       
   470     }
       
   471 
       
   472     if ( !mSongData->duration().isNull() ) {
       
   473         HbListWidgetItem *item = new HbListWidgetItem();
       
   474         item->setText( hbTrId( "txt_mus_dblist_duration" ) );
       
   475         item->setSecondaryText( mSongData->duration() );
       
   476         item->setEnabled( false );
       
   477         mDetailList->addItem( item );
       
   478     }
       
   479 
       
   480     if ( !mSongData->bitRate().isNull() ) {
       
   481         HbListWidgetItem *item = new HbListWidgetItem();
       
   482         item->setText( hbTrId( "txt_mus_dblist_bitrate" ) );
       
   483         bool ok = false;
       
   484         int bitRate = mSongData->bitRate().toInt(&ok);
       
   485         TX_LOG_ARGS("Warning: If zero, bitrate is not read correctly. It wont show up in details" << ok);
       
   486         if(ok) {
       
   487             item->setSecondaryText( hbTrId("txt_mus_dblist_bitrate_val_ln_kbps", bitRate) );
       
   488         }
       
   489         item->setEnabled( false );
       
   490         mDetailList->addItem( item );
       
   491     }
       
   492 
       
   493     if ( !mSongData->sampleRate().isNull() ) {
       
   494         HbListWidgetItem *item = new HbListWidgetItem();
       
   495         item->setText( hbTrId( "txt_mus_dblist_sampling_rate" ) );
       
   496         bool ok = false;
       
   497         int samplingRate = mSongData->sampleRate().toInt(&ok);
       
   498         TX_LOG_ARGS("Warning: If zero, sampling rate is not read correctly. It wont show up in details" << ok);
       
   499         if(ok) {
       
   500             item->setSecondaryText(	hbTrId("txt_mus_dblist_sampling_rate_val_ln_hz", samplingRate) );
       
   501         }
       
   502         item->setEnabled( false );
       
   503         mDetailList->addItem( item );
       
   504     }
       
   505 
       
   506     if ( !mSongData->size().isNull() ) {
       
   507         HbListWidgetItem *item = new HbListWidgetItem();
       
   508         item->setText( hbTrId( "txt_mus_dblist_size" ) );
       
   509         bool ok = false;
       
   510         long size = mSongData->size().toLong(&ok); // in bytes
       
   511         TX_LOG_ARGS("WARNING: If zero, Cant get song data size right. You wont see the size in details groupbox correctly" << ok );
       
   512         if( size < KOneKiloByteInBytes) {
       
   513             // under 1 KB
       
   514             item->setSecondaryText( hbTrId("txt_mus_dblist_size_val_ln_b", size) );
       
   515         }
       
   516         else if( size < KOneMegabyteInBytes ) {
       
   517             // under 1 MB
       
   518             size /= KOneKiloByteInBytes; // turn size into KB
       
   519             item->setSecondaryText( hbTrId("txt_mus_dblist_size_val_ln_kb", size) );
       
   520         }
       
   521         else if( size < KOneGigaByteInBytes ) {
       
   522             // under 1 GB
       
   523             size /= KOneMegabyteInBytes; // turn size to MB
       
   524             item->setSecondaryText( hbTrId("txt_mus_dblist_size_val_ln_mb", size) );
       
   525         }
       
   526         else {
       
   527             // 1 GB or higher
       
   528             size /= KOneGigaByteInBytes; // turn size to GB
       
   529             item->setSecondaryText( hbTrId("txt_mus_dblist_size_val_ln_gb", size) );            
       
   530         }
       
   531         item->setEnabled( false );
       
   532         mDetailList->addItem( item );
       
   533     }
       
   534 
       
   535     if ( !mSongData->modified().isNull() ) {
       
   536         HbListWidgetItem *item = new HbListWidgetItem();
       
   537         item->setText( hbTrId( "txt_mus_dblist_modified" ) );
       
   538         item->setSecondaryText( mSongData->modified() );
       
   539         item->setEnabled( false );
       
   540         mDetailList->addItem( item );
       
   541     }
       
   542 
       
   543     if ( !mSongData->copyright().isNull() ) {
       
   544         HbListWidgetItem *item = new HbListWidgetItem();
       
   545         item->setText( hbTrId( "txt_mus_dblist_copyright" ) );
       
   546         item->setSecondaryText( mSongData->copyright() );
       
   547         item->setEnabled( false );
       
   548         mDetailList->addItem( item );
       
   549     }
       
   550 
       
   551     if ( !mSongData->musicURL().isNull() ) {
       
   552         HbListWidgetItem *item = new HbListWidgetItem();
       
   553         item->setText( hbTrId( "txt_mus_dblist_web_site" ) );
       
   554         item->setSecondaryText( mSongData->musicURL() );
       
   555         item->setEnabled( true );
       
   556         mDetailList->addItem( item );
       
   557     }
       
   558 
       
   559     if ( mSongData->isDrmProtected() ) {
       
   560         HbListWidgetItem *item = new HbListWidgetItem();
       
   561         item->setText( hbTrId( "txt_mus_dblist_licences" ) );
       
   562         item->setSecondaryText( hbTrId( "txt_mus_dblist_licences_val_click_for_details" ) );
       
   563         item->setEnabled( true );
       
   564         mDetailList->addItem( item );
       
   565     }
       
   566 
       
   567     TX_EXIT
       
   568 }
       
   569 
       
   570 void MpDetailsView::handleDetailsGroupBoxToggled(bool /*state*/)
       
   571 {
       
   572     TX_ENTRY
       
   573     if ( !mSongDetailsGroupBox->isCollapsed() ) {
       
   574             mInspireMeGroupBox->setCollapsed( true );
       
   575     }
       
   576     TX_EXIT
       
   577 }
       
   578 
       
   579 void MpDetailsView::handleInspireMeGroupBoxToggled(bool /*state*/)
       
   580 {
       
   581     TX_ENTRY
       
   582     if ( !mInspireMeGroupBox->isCollapsed() ) {
       
   583         TX_LOG_ARGS( "InspireMe is expanded." )
       
   584         mSongDetailsGroupBox->setCollapsed( true );
       
   585         if ( mInspireMeQueryOngoing ) {
       
   586             TX_LOG_ARGS( "Query is ongoing " )
       
   587             mInspireMeProgressBar->show();
       
   588         }
       
   589         else {
       
   590             TX_LOG_ARGS( "Query is NOT ongoing " )
       
   591             if ( mInspireMeQueryRendered ) {
       
   592                 TX_LOG_ARGS( "InspireMe is rendered already. " )
       
   593                 mInspireMeProgressBar->hide();
       
   594             }
       
   595             else {
       
   596                 startInspireMe();
       
   597             }
       
   598         }
       
   599     }
       
   600     else {
       
   601         TX_LOG_ARGS( "InspireMe is collapsed." )
       
   602         mInspireMeProgressBar->hide();
       
   603     }
       
   604     TX_EXIT
       
   605 }
       
   606 
       
   607 /*!
       
   608  Slot to call when URL item in song details is pressed
       
   609 */
       
   610 void MpDetailsView::handleListItemSelected( HbListWidgetItem  *item)
       
   611 {
       
   612     TX_ENTRY_ARGS( "URL: " << item->secondaryText() );
       
   613     QDesktopServices::openUrl( item->secondaryText() );
       
   614     TX_EXIT
       
   615 }
       
   616 
       
   617 /*!
       
   618  Slot to call when MusicStore Info is Received
       
   619 */
       
   620 void MpDetailsView::queryInspireMe(bool storeUpdated)
       
   621 {
       
   622     TX_ENTRY
       
   623     // we asked query manager to update its local store information
       
   624     // if that store info didnt change (i.e. from empty string to "fi" or
       
   625     // from "bad old store" to "good new store") then we dont need to pursue a query    
       
   626     if( storeUpdated ) {
       
   627         mMpQueryManager->queryInspireMeItems(mSongData->artist(),mSongData->album(),mSongData->title());
       
   628         mInspireMeQueryOngoing = true;
       
   629     }
       
   630     else {
       
   631         mInspireMeQueryOngoing = false;
       
   632         mInspireMeProgressBar->hide();
       
   633     }
       
   634     TX_EXIT
       
   635 }
       
   636