logsui/logsapp/src/logsviewmanager.cpp
changeset 20 6a40edd41841
parent 19 e4c884866116
--- a/logsui/logsapp/src/logsviewmanager.cpp	Fri Sep 17 08:29:34 2010 +0300
+++ b/logsui/logsapp/src/logsviewmanager.cpp	Mon Oct 04 00:17:41 2010 +0300
@@ -26,7 +26,8 @@
 #include "logsservicehandler.h"
 #include "logsservicehandlerold.h"
 #include "logsmainwindow.h"
-#include "logsapplication.h"
+#include "logsappsettings.h"
+#include "logsforegroundwatcher.h"
 
 //SYSTEM
 #include <hbmainwindow.h>
@@ -44,10 +45,12 @@
 //
 LogsViewManager::LogsViewManager( 
         LogsMainWindow& mainWindow, LogsServiceHandler& service,
-        LogsServiceHandlerOld& serviceOld ) : 
+        LogsServiceHandlerOld& serviceOld,
+        LogsAppSettings& settings) : 
     QObject( 0 ), mMainWindow( mainWindow ), 
-    mService( service ), mServiceOld( serviceOld ),
-    mFirstActivation(true), mViewActivationShowDialpad(false)
+    mService( service ), mServiceOld( serviceOld ), mSettings( settings ),
+    mFirstActivation(true), mViewActivationShowDialpad(false), 
+    mBackgroundStartupWatcher(0)
 {
     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::LogsViewManager()" );
 
@@ -56,6 +59,7 @@
     connect( &mainWindow, SIGNAL(orientationChanged(Qt::Orientation)),
             this, SLOT(handleOrientationChanged()) );
     connect( &mainWindow, SIGNAL(appGainedForeground()), this, SLOT(appGainedForeground()) );
+    connect( &mainWindow, SIGNAL(appLostForeground()), this, SLOT(appLostForeground()) );
 
     mComponentsRepository = new LogsComponentRepository(*this);
     
@@ -88,6 +92,7 @@
     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::~LogsViewManager()" );
      
     delete mComponentsRepository;
+    delete mBackgroundStartupWatcher;
     
     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::~LogsViewManager()" );
 }
@@ -131,7 +136,7 @@
 {
     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::proceedExit()" );
     
-    if ( static_cast<LogsApplication*>( qApp )->logsFeatureFakeExitEnabled() ){
+    if ( mSettings.logsFeatureFakeExitEnabled() ){
         doFakeExit();
     } else {
         qApp->quit();
@@ -177,27 +182,11 @@
 {
     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::exitApplication()" );
     
-    LOGS_QDEBUG( "logs [UI] Exit delayed" );
-    
-    // Fake exit by sending app to background
+    // Send app immetiately to background as there might be some async stuff
+    // that needs to complete before the process can be terminated.
     mMainWindow.sendAppToBackground();
 
-    bool exitAllowed( true );
-    foreach ( LogsBaseView* view, mViewStack ){
-        if ( !view->isExitAllowed() ){
-            exitAllowed = false;
-            connect( view, SIGNAL(exitAllowed()),
-                     this, SLOT(proceedExit()), 
-                     Qt::UniqueConnection );
-        }
-    }
-    if ( exitAllowed ){
-        LOGS_QDEBUG( "logs [UI] Handle exit immediataly" );
-        proceedExit();
-    } else {
-        // Just wait for signal from view(s) that exiting can proceed
-        LOGS_QDEBUG( "logs [UI] Delayed exit handling" );
-    }
+    doExitApplication();
     
     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::exitApplication()" );
 }
@@ -392,26 +381,33 @@
 void LogsViewManager::handleFirstActivation()
 {      
     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::handleFirstActivation()" );
-    LogsApplication* app = static_cast<LogsApplication*>(qApp);
-    Hb::ActivationReason reason = app->activateReason();
-    bool isStartedByService( 
-        mService.isStartedUsingService() || mServiceOld.isStartedUsingService() );
-    if ( !app->logsFeaturePreloadingEnabled() || 
-         reason == Hb::ActivationReasonActivity || 
-         isStartedByService ){
+
+    if ( mSettings.logsFeaturePreloadingEnabled() ) {
+        delete mBackgroundStartupWatcher;
+        mBackgroundStartupWatcher = 0;
+        mBackgroundStartupWatcher = new LogsForegroundWatcher();
+        connect( mBackgroundStartupWatcher, SIGNAL(gainingForeground()), 
+                 this, SLOT(bgStartupForegroundGained()) );
+        setTaskSwitcherVisibility(false);
+
+    } else {
+        Hb::ActivationReason reason = static_cast<HbApplication*>(qApp)->activateReason();
+        bool isStartedByService( 
+            mService.isStartedUsingService() || mServiceOld.isStartedUsingService() );
+        
         // Start immediately using all possible resources
         mComponentsRepository->model()->refreshData();
+        
+        if ( reason == Hb::ActivationReasonActivity && loadActivity() ){
+            LOGS_QDEBUG( "logs [UI] loaded saved activity" );    
+            mMainWindow.bringAppToForeground();
+        } else if ( mFirstActivation && !isStartedByService ) {
+            activateDefaultView();
+            mMainWindow.bringAppToForeground();
+        }
+        
+        clearActivities();
     }
-    
-    if ( reason == Hb::ActivationReasonActivity && loadActivity() ){
-        LOGS_QDEBUG( "logs [UI] loaded saved activity" );    
-        mMainWindow.bringAppToForeground();
-    } else if ( mFirstActivation && !isStartedByService ) {
-        changeRecentView( XQService::LogsViewAll, false );
-        mMainWindow.bringAppToForeground();
-    }
-
-    clearActivities();
 
     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::handleFirstActivation()" );
 }
@@ -461,11 +457,8 @@
         disconnect( view, SIGNAL(exitAllowed()), this, SLOT(proceedExit()) );
     }
     
-    if ( static_cast<LogsApplication*>( qApp )->logsFeatureFakeExitEnabled() || 
-         static_cast<LogsApplication*>( qApp )->logsFeaturePreloadingEnabled() ){
-        mComponentsRepository->model()->refreshData();
-        TsTaskSettings taskSettings;
-        taskSettings.setVisibility(true);
+    if ( mSettings.logsFeatureFakeExitEnabled() || mSettings.logsFeaturePreloadingEnabled() ){
+        endFakeExit();
     }
     
     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::appGainedForeground()" );
@@ -475,11 +468,28 @@
 //
 // -----------------------------------------------------------------------------
 //
+void LogsViewManager::appLostForeground()
+{
+    LOGS_QDEBUG( "logs [UI] -> LogsViewManager::appLostForeground()" );
+    
+    if ( mSettings.logsFeatureFakeExitEnabled() ){
+        doExitApplication(false); // Bypass view exit handling
+    }
+    // TODO: non-continuus app should also do exit at this point if 
+    // didn't loose foreground because of embedded app. However, no sensible
+    // way at the moment for handling embedded app foreground monitoring.
+    
+    LOGS_QDEBUG( "logs [UI] <- LogsViewManager::appLostForeground()" );
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
 void LogsViewManager::activityRequested(const QString &activityId)
 {
     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::activityRequested()" );
     if ( doLoadActivity(activityId) ){
-        clearActivities();
         mMainWindow.bringAppToForeground();
     }
     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::activityRequested()" );
@@ -489,6 +499,20 @@
 //
 // -----------------------------------------------------------------------------
 //
+void LogsViewManager::bgStartupForegroundGained()
+{
+    LOGS_QDEBUG( "logs [UI] -> LogsViewManager::bgStartupForegroundGained()" );
+    delete mBackgroundStartupWatcher;
+    mBackgroundStartupWatcher = 0;
+    endFakeExit();
+    mMainWindow.bringAppToForeground(); 
+    LOGS_QDEBUG( "logs [UI] <- LogsViewManager::bgStartupForegroundGained()" );
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
 void LogsViewManager::doFakeExit()
 {
     saveActivity();
@@ -497,8 +521,21 @@
     connect( activityManager, SIGNAL(activityRequested(QString)), 
              this, SLOT(activityRequested(QString)), Qt::UniqueConnection );
     mComponentsRepository->model()->compressData();
-    TsTaskSettings taskSettings;
-    taskSettings.setVisibility(false);
+    setTaskSwitcherVisibility(false);
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void LogsViewManager::endFakeExit()
+{
+    setTaskSwitcherVisibility(true);
+    mComponentsRepository->model()->refreshData();
+    if ( !mMainWindow.currentView() ){
+        activateDefaultView();
+    }
+    clearActivities();
 }
 
 // -----------------------------------------------------------------------------
@@ -546,7 +583,7 @@
         
         QVariant args = matchingView->loadActivity(activityId, stream, params);
         loaded = doActivateView( 
-            matchingView->viewId(), showDialpad, args, dialpadText, true );
+            matchingView->viewId(), showDialpad, args, dialpadText );
     }
     
     LOGS_QDEBUG_2( "logs [UI] <- LogsViewManager::doLoadActivity() loaded:", loaded );
@@ -579,12 +616,64 @@
     LOGS_QDEBUG_2( "logs [UI] -> LogsViewManager::activateViewViaService()", viewId );
     clearActivities();
     closeEmbeddedApplication();
-    mMainWindow.bringAppToForeground();
     Dialpad* dpad = mComponentsRepository->dialpad();
     if ( !showDialpad ){
         dpad->closeDialpad();
     }
     dpad->editor().setText(dialpadText);
-    doActivateView(viewId, showDialpad, args, QString(), true);
+    if ( doActivateView(viewId, showDialpad, args, QString(), true) ){
+        mMainWindow.bringAppToForeground();
+    }
     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::activateViewViaService()" );
 }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void LogsViewManager::setTaskSwitcherVisibility(bool visible)
+{
+    LOGS_QDEBUG_2( "logs [UI] -> LogsViewManager::setTaskSwitcherVisibility()", visible );
+    TsTaskSettings taskSettings;
+    taskSettings.setVisibility(visible);
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void LogsViewManager::doExitApplication(bool viewExitHandling)
+{
+    LOGS_QDEBUG( "logs [UI] -> LogsViewManager::doExitApplication()" );
+    
+    bool exitAllowed( true );
+    foreach ( LogsBaseView* view, mViewStack ){
+        if ( viewExitHandling ){
+            view->handleExit();
+        }
+        if ( !view->isExitAllowed() ){
+            exitAllowed = false;
+            connect( view, SIGNAL(exitAllowed()),
+                     this, SLOT(proceedExit()), 
+                     Qt::UniqueConnection );
+        }
+    }
+    if ( exitAllowed ){
+        LOGS_QDEBUG( "logs [UI] Handle exit immediately" );
+        proceedExit();
+    } else {
+        // Just wait for signal from view(s) that exiting can proceed
+        LOGS_QDEBUG( "logs [UI] Delayed exit handling" );
+    }
+    
+    LOGS_QDEBUG( "logs [UI] <- LogsViewManager::doExitApplication()" );
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void LogsViewManager::activateDefaultView()
+{
+    changeRecentView( XQService::LogsViewAll, false );
+}