qtinternetradio/ui/src/irapplication.cpp
changeset 12 608f67c22514
parent 11 f683e24efca3
child 14 896e9dbc5f19
--- a/qtinternetradio/ui/src/irapplication.cpp	Wed Jun 23 18:04:00 2010 +0300
+++ b/qtinternetradio/ui/src/irapplication.cpp	Tue Jul 06 14:07:20 2010 +0300
@@ -16,6 +16,7 @@
 */
 
 #include <hbaction.h>
+#include <hbapplication.h>
 #include <qcoreapplication.h>
 #include <hbdevicemessagebox.h>
 #include <hbprogressdialog.h>
@@ -24,11 +25,18 @@
 #include <QFile>
 #include <QTextStream>
 #include <QDir>
+#include <hbmessagebox.h>
 
 #include <xqserviceutil.h>
 #include <hbiconitem.h>
 #include <hbiconanimator.h>
 #include <hbiconanimationmanager.h>
+#ifdef HS_WIDGET_ENABLED
+#include <XQSettingsManager>
+#include <XQPublishAndSubscribeSettingsKey>
+#include <XQPublishAndSubscribeUtils>
+#include <QDateTime>
+#endif
 
 #ifdef LOCALIZATION 
 #include <QTranslator>
@@ -51,6 +59,13 @@
 #include "irqsystemeventhandler.h"
 #include "irabstractlistviewbase.h"
 #include "irfileviewservice.h"
+#ifdef HS_WIDGET_ENABLED
+#include "irmonitorservice.h"
+#include "ircontrolservice.h"
+#include "irservicedef.h"
+#include "irqisdsdatastructure.h"
+#include "irsearchchannelsview.h"
+#endif
 /*
  * Description : constructor, initialize all data members
  * Parameters  : aViewManager : pointer to the view manager object
@@ -78,9 +93,15 @@
                                      #ifdef LOCALIZATION
                                      iTranslator(NULL),
                                      #endif
-                                     iSystemEventHandler(aSystemEventHandler),
-                                     iLoadingAnimation(NULL),
-                                     iFileViewService(NULL)
+                                     iSystemEventHandler(aSystemEventHandler), 
+                                     iUseNetworkReason(EIR_UseNetwork_NoReason),									 
+                                     iAppFullyStarted(false),
+									 #ifdef HS_WIDGET_ENABLED
+                                     iControlService(NULL),
+                                     iMonitorService(NULL),
+									 #endif                                     
+                                     iFileViewService(NULL),
+                                     iMessageBox(NULL)
                                      
 {
     LOG_METHOD;
@@ -96,13 +117,19 @@
     // get advertisement setting
     iSettings->getGlobalAdvFlag(iEnableGlobalAdv);
     setupConnection();
-    setLaunchView();
+    
+    if (!XQServiceUtil::isService())
+    {
+        setLaunchView();
+    }
     
     QString name = XQServiceUtil::interfaceName();
     if (name == QString("com.nokia.symbian.IFileView"))
     {
         iFileViewService = new IRFileViewService(this);
     }
+    
+    iMessageBox = new HbMessageBox(hbTrId("No network connection!"),HbMessageBox::MessageTypeWarning,NULL);
 } 
 
 /*
@@ -114,6 +141,8 @@
 {
     LOG_METHOD;
     setExitingView();
+    iViewManager->saveActivity();
+    
     destroyComponents();
     
     if (iLocalServer)
@@ -127,6 +156,9 @@
     delete iLoadingNote;
     iLoadingNote = NULL;
     
+    delete iMessageBox;
+    iMessageBox = NULL;
+    
     delete iSystemEventHandler;
     
 #ifdef LOCALIZATION
@@ -140,6 +172,13 @@
     
     delete iFileViewService;
     iFileViewService = NULL;
+	
+#ifdef HS_WIDGET_ENABLED	
+    XQSettingsManager settingsManager;
+    XQPublishAndSubscribeUtils psUtils(settingsManager);
+    XQPublishAndSubscribeSettingsKey irStartupKey(KInternetRadioPSUid, KInternetRadioStartupKey);
+    psUtils.deleteProperty(irStartupKey);        
+#endif	
 }
 
  
@@ -151,10 +190,21 @@
  */
 void IRApplication::setLaunchView()
 {
-    if (!XQServiceUtil::isService())
+    //get starting view id according to activate reason
+    TIRViewId viewId = EIRView_CategoryView;
+    HbApplication *hbApp = qobject_cast<HbApplication*>(qApp);
+
+    if (hbApp->activateReason() == Hb::ActivationReasonActivity)
     {
-        //normal launch, launch starting view
-        TIRViewId viewId = EIRView_CategoryView;
+        QVariant data = hbApp->activateData();
+        QByteArray serializedModel = data.toByteArray();
+        QDataStream stream(&serializedModel, QIODevice::ReadOnly);
+        int id = 0;
+        stream>>id;
+        viewId = TIRViewId(id);
+    }
+    else
+    {
         iSettings->getStartingViewId(viewId);
         if (EIRView_PlayingView == viewId)
         {
@@ -164,9 +214,9 @@
                 viewId = EIRView_CategoryView;
             }
         }
-        
-        launchStartingView(viewId);
     }
+    
+    launchStartingView(viewId);
 }
 
 /*
@@ -183,31 +233,18 @@
     
     if (!iNetworkController->getNetworkStatus())
     {
+        LOG( "IRApplication::verifyNetworkConnectivity--1");
         ret = false;
         if (!iNetworkController->isConnectRequestIssued())
         {
+            LOG( "IRApplication::verifyNetworkConnectivity--2");
             iConnectingText = aConnectingText;
             iNetworkController->chooseAccessPoint();
         }
     }
     
     return ret;
-}
-
-void IRApplication::startLoadingAnimation(const QPointF& aPos)
-{
-    if( NULL == iLoadingAnimation )
-    {
-        getLoadingAnimation();
-    }
-    
-    if (iLoadingAnimation)
-    {
-        iLoadingAnimation->setPos(aPos);
-        iLoadingAnimation->show();
-        iLoadingAnimation->animator().startAnimation();
-    }    
-}
+} 
 
 void IRApplication::startLoadingAnimation(const QObject *aReceiver, const char *aFunc)
 {
@@ -217,27 +254,27 @@
     //is initiated by low layer, we don't show any dialog
     if (!iNetworkController->getNetworkStatus())
     {
-        IRBaseView *currentView = static_cast<IRBaseView*>(iViewManager->currentView());
-        if (currentView && EIR_UseNetwork_NoReason == currentView->getUseNetworkReason())
-        {
-            return;
+        if (EIR_UseNetwork_NoReason == iUseNetworkReason) // network is not used by the Application
+        {            
+            IRBaseView *currentView = static_cast<IRBaseView*>(iViewManager->currentView());
+            if (currentView && EIR_UseNetwork_NoReason == currentView->getUseNetworkReason())
+            {
+                return;
+            }
         }
     }
     
-    //if in search, we could not show the dialog
-    TIRViewId curViewID = static_cast<IRBaseView*>(iViewManager->currentView())->id();
-    if ( EIRView_SearchView == curViewID )
-    {
-        return;        
-    }
-    
     if (NULL == iLoadingNote)
     {
         iLoadingNote = new HbProgressDialog(HbProgressDialog::WaitDialog);
         iLoadingNote->setModal(true);
         iLoadingNote->setTimeout(HbPopup::NoTimeout);
         QAction *action = iLoadingNote->actions().at(0);
+#ifdef SUBTITLE_STR_BY_LOCID
         action->setText(hbTrId("txt_common_button_cancel"));
+#else
+        action->setText(hbTrId("Cancel"));        
+#endif
     }
     
     iLoadingNote->disconnect(SIGNAL(cancelled()));
@@ -256,7 +293,11 @@
     }
     else
     {
+#ifdef SUBTITLE_STR_BY_LOCID
         iLoadingNote->setText(hbTrId("txt_common_info_loading"));
+#else
+        iLoadingNote->setText(hbTrId("Loading"));        
+#endif
     }
     
     iLoadingNote->show();
@@ -265,16 +306,19 @@
 void IRApplication::stopLoadingAnimation()
 {
     LOG_METHOD_ENTER;
+
+    // this function is the endpoint of cancel loading actions for all views
+	// so we can do cleanup action here, including player stop action.
+	// No need to stop the player in each views in the slot connected to the cancel signal of the loading note
+    if (!getPlayController()->isPlaying())
+    {
+        getPlayController()->stop(EIRQUnknownTermination);
+    }
+    
     if (iLoadingNote)
     {
         iLoadingNote->close();
-    }
-    
-    if( iLoadingAnimation )
-    {
-        iLoadingAnimation->animator().stopAnimation();
-        iLoadingAnimation->hide();         
-    }
+    } 
 }
 
 /*
@@ -407,6 +451,10 @@
 void IRApplication::createComponents()
 {
     getSettings();
+#ifdef HS_WIDGET_ENABLED    
+    iControlService = new IrControlService(this);
+    iMonitorService = new IrMonitorService(this);	
+#endif	
 }
 
 /*
@@ -445,6 +493,14 @@
     
     delete iMediaKeyObserver;
     iMediaKeyObserver = NULL;
+	
+#ifdef HS_WIDGET_ENABLED    
+    delete iControlService;
+    iControlService = NULL;
+    
+    delete iMonitorService;
+    iMonitorService = NULL;
+#endif	
 }
 
 void IRApplication::setupConnection()
@@ -514,8 +570,14 @@
             
         case EIRQDisplayNetworkMessageNoConnectivity:
             {
-                stopLoadingAnimation();
-                HbMessageBox::warning(hbTrId("txt_irad_info_no_network_connectiion"), (QObject*)NULL, NULL);
+                stopLoadingAnimation();                
+                LOG("IRApplication::networkEventNotified::no network connection");
+                if( !iMessageBox->isVisible() )
+                {
+                    LOG("IRApplication::networkEventNotified::no network connection -- show dialog");
+                    iMessageBox->show();
+                }
+                
                 if (!iDisconnected)
                 {
                     /* the handling is up to each view */
@@ -537,14 +599,12 @@
 
     if (!hasCache)
     {
-        IRBaseView *currView = static_cast<IRBaseView*>(iViewManager->currentView());
-        Q_ASSERT(currView);
-        currView->setUseNetworkReason(EIR_UseNetwork_LoadCategory);
+        iUseNetworkReason = EIR_UseNetwork_LoadCategory;
         if (false == verifyNetworkConnectivity())
         {
             return;
         }
-        currView->setUseNetworkReason(EIR_UseNetwork_NoReason);
+        iUseNetworkReason = EIR_UseNetwork_NoReason;
     }
     
     IRCategoryView *categoryView = static_cast<IRCategoryView*>(getViewManager()->getView(EIRView_CategoryView, true));
@@ -561,26 +621,7 @@
     delete socket;
     
     iViewManager->raise();
-}
-
-void IRApplication::getLoadingAnimation()
-{
-    HbIconAnimationManager::global()->addDefinitionFile("qtg_anim_loading.axml");
-    iLoadingAnimation = new HbIconItem("qtg_anim_loading");
-    iLoadingAnimation->hide();
-    QGraphicsScene *targetScene = getViewManager()->scene();
-    QGraphicsScene *oldScene = iLoadingAnimation->scene();
-
-    if (targetScene != oldScene)
-    {
-        if (oldScene)
-        {
-            oldScene->removeItem(iLoadingAnimation);
-        }
-        targetScene->addItem(iLoadingAnimation); // takes ownership
-    }
-
-}
+} 
 
 void IRApplication::initApp()
 {
@@ -595,6 +636,19 @@
     getMediaKeyObserver();	
     startSystemEventMonitor();
     startLocalServer();
+    //when IR is running, remove activity. Otherwise user can see two items in task switcher
+    iViewManager->removeActivity();
+    
+#ifdef HS_WIDGET_ENABLED		
+    // Write the startup timestamp to P&S key for the homescreen widget
+    XQSettingsManager settingsManager;
+    XQPublishAndSubscribeUtils psUtils(settingsManager);
+    XQPublishAndSubscribeSettingsKey irStartupKey(KInternetRadioPSUid, KInternetRadioStartupKey);
+    if (psUtils.defineProperty(irStartupKey, XQSettingsManager::TypeInt))
+    {
+        settingsManager.writeItemValue(irStartupKey, (int)QDateTime::currentDateTime().toTime_t());
+    } 
+#endif        
 }
 
 bool IRApplication::event(QEvent* e)
@@ -610,18 +664,29 @@
 
 TIRHandleResult IRApplication::handleConnectionEstablished()
 {
-    IRBaseView *currView = static_cast<IRBaseView*>(iViewManager->currentView());
-    Q_ASSERT(currView);
-    
-    if (EIR_UseNetwork_LoadCategory == currView->getUseNetworkReason())
+    TIRHandleResult retVal = EIR_DoDefault;
+    switch (iUseNetworkReason)
     {
-        IRCategoryView *categoryView = static_cast<IRCategoryView*>(getViewManager()->getView(EIRView_CategoryView, true));
-        categoryView->loadCategory(IRQIsdsClient::EGenre);
-        currView->setUseNetworkReason(EIR_UseNetwork_NoReason);
-        return EIR_NoDefault;
+        case EIR_UseNetwork_LoadCategory:
+        {
+            IRCategoryView *categoryView = static_cast<IRCategoryView*>(getViewManager()->getView(EIRView_CategoryView, true));
+            categoryView->loadCategory(IRQIsdsClient::EGenre); 
+            retVal = EIR_NoDefault;        
+            break;    
+        }
+            
+#ifdef HS_WIDGET_ENABLED            
+        case EIR_UseNetwork_PlayStation: // play last station when player is in Idle state while there is no connection.
+            getPlayController()->resume();
+            retVal = EIR_NoDefault;        
+            break;  
+#endif
+        default:
+            break;
     }
     
-    return EIR_DoDefault;
+    iUseNetworkReason = EIR_UseNetwork_NoReason;    
+    return retVal;
 }
 
 void IRApplication::handleTermsConsAccepted()
@@ -639,29 +704,33 @@
 
 void IRApplication::launchStartingView(TIRViewId aViewId)
 {
-    bool isFirstTimeUsage = false;
+    iStartingViewId = aViewId;
+    /* bool isFirstTimeUsage = false;
     iSettings->isFlagTermsAndConditions(isFirstTimeUsage);
-    iStartingViewId = aViewId;
+    
     if(isFirstTimeUsage)
     {
         iViewManager->activateView(EIRView_TermsConsView);  
 		QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);    
     }
-    else
+    else*/
     {
         iViewManager->activateView(iStartingViewId);
         QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
         QEvent* initEvent = new QEvent(iInitEvent);
         QCoreApplication::postEvent(this, initEvent, Qt::HighEventPriority);         
-    }	
+    }
+    
+    iAppFullyStarted = true;
+}
+
+bool IRApplication::isAppFullyStarted() const
+{
+    return iAppFullyStarted;
 }
 
 void IRApplication::setExitingView()
-{
-    if (XQServiceUtil::isService())
-    {
-        return;
-    }    
+{  
     TIRViewId viewId = iViewManager->getExitingView();
     if(EIRView_InvalidId != viewId)
     {
@@ -669,6 +738,52 @@
     }
 }
 
+
+#ifdef HS_WIDGET_ENABLED
+bool IRApplication::startPlaying()
+{
+    // if any loading is in progress, disallow to play
+    if (iLoadingNote && iLoadingNote->isVisible())
+    {
+        LOG( "IRApplication::startPlaying() in the return false1");
+        return false;
+    }
+    
+    if (getPlayController()->isStopped())
+    {         
+        LOG_FORMAT( "IRApplication::startPlaying(), the station name is %s", 
+                STRING2CHAR(getPlayController()->getNowPlayingPreset()->name));
+        iUseNetworkReason = EIR_UseNetwork_PlayStation;
+        getPlayController()->setConnectingStationName(getPlayController()->getNowPlayingPreset()->name);
+        if (verifyNetworkConnectivity())
+        {
+            iUseNetworkReason = EIR_UseNetwork_NoReason;
+            getPlayController()->resume();
+        }
+        return true;
+    }
+    else
+    {
+        LOG( "IRApplication::startPlaying() in the return false2");
+        return false;
+    }
+}
+
+void IRApplication::cancelPlayerLoading()
+{
+    if (IRPlayController::EConnecting == getPlayController()->state() 
+        || IRPlayController::EBuffering == getPlayController()->state())
+    {       
+        if (iLoadingNote && iLoadingNote->isVisible())
+        {
+            iLoadingNote->cancel();
+        }      
+    }   
+}
+
+#endif
+
+
 void IRApplication::startLocalServer()
 {
     QString serverName = QCoreApplication::applicationName();
@@ -745,8 +860,13 @@
 void IRApplication::handleDiskSpaceLow(qint64 aCriticalLevel)
 {
     Q_UNUSED(aCriticalLevel);
-    HbDeviceMessageBox messageBox(hbTrId("txt_irad_info_no_space_on_c_drive_internet_radio_closed"),
+#ifdef SUBTITLE_STR_BY_LOCID
+    HbDeviceMessageBox messageBox(hbTrId("txt_irad_info_insufficient_disk_space"),
             HbMessageBox::MessageTypeWarning);
+#else
+    HbDeviceMessageBox messageBox(hbTrId("Insufficient disk space"),
+                HbMessageBox::MessageTypeWarning);    
+#endif
     messageBox.setTimeout(HbPopup::NoTimeout);
     messageBox.exec();
     qApp->quit();