logsui/logsapp/src/logsviewmanager.cpp
changeset 19 e4c884866116
parent 16 c5af8598d22c
child 20 6a40edd41841
equal deleted inserted replaced
16:c5af8598d22c 19:e4c884866116
    24 #include "logsdefs.h"
    24 #include "logsdefs.h"
    25 #include "logslogger.h"
    25 #include "logslogger.h"
    26 #include "logsservicehandler.h"
    26 #include "logsservicehandler.h"
    27 #include "logsservicehandlerold.h"
    27 #include "logsservicehandlerold.h"
    28 #include "logsmainwindow.h"
    28 #include "logsmainwindow.h"
       
    29 #include "logsapplication.h"
    29 
    30 
    30 //SYSTEM
    31 //SYSTEM
    31 #include <hbmainwindow.h>
    32 #include <hbmainwindow.h>
    32 #include <hbview.h>
    33 #include <hbview.h>
    33 #include <QApplication>
    34 #include <QApplication>
    34 #include <hblineedit.h>
    35 #include <hblineedit.h>
    35 #include <dialpad.h>
    36 #include <dialpad.h>
    36 #include <hbactivitymanager.h>
    37 #include <hbactivitymanager.h>
    37 #include <hbapplication.h>
    38 #include <hbapplication.h>
       
    39 #include <tstasksettings.h>
    38 
    40 
    39 // -----------------------------------------------------------------------------
    41 // -----------------------------------------------------------------------------
    40 // LogsViewManager::LogsViewManager
    42 // LogsViewManager::LogsViewManager
    41 // -----------------------------------------------------------------------------
    43 // -----------------------------------------------------------------------------
    42 //
    44 //
    95 // -----------------------------------------------------------------------------
    97 // -----------------------------------------------------------------------------
    96 //
    98 //
    97 void LogsViewManager::changeRecentViewViaService(
    99 void LogsViewManager::changeRecentViewViaService(
    98     XQService::LogsViewIndex view, bool showDialpad, QString dialpadText)
   100     XQService::LogsViewIndex view, bool showDialpad, QString dialpadText)
    99 {
   101 {
   100     closeEmbeddedApplication();
   102     QVariant args(view);
   101     mMainWindow.bringAppToForeground();
   103     activateViewViaService(LogsRecentViewId, showDialpad, dialpadText, args);
   102     mComponentsRepository->dialpad()->editor().setText(dialpadText);
       
   103     changeRecentView(view, showDialpad);
       
   104 }
   104 }
   105 
   105 
   106 // -----------------------------------------------------------------------------
   106 // -----------------------------------------------------------------------------
   107 // LogsViewManager::changeMatchesViewViaService
   107 // LogsViewManager::changeMatchesViewViaService
   108 // -----------------------------------------------------------------------------
   108 // -----------------------------------------------------------------------------
   109 //
   109 //
   110 void LogsViewManager::changeMatchesViewViaService(QString dialpadText)
   110 void LogsViewManager::changeMatchesViewViaService(QString dialpadText)
   111 {
   111 {
   112     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::changeMatchesView()" );
   112     activateViewViaService(LogsMatchesViewId, true, dialpadText);
   113     closeEmbeddedApplication();
       
   114     mMainWindow.bringAppToForeground();
       
   115     mComponentsRepository->dialpad()->editor().setText(dialpadText);
       
   116     doActivateView(LogsMatchesViewId, true, QVariant());
       
   117     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::changeMatchesView()" );
       
   118 }
   113 }
   119 
   114 
   120 // -----------------------------------------------------------------------------
   115 // -----------------------------------------------------------------------------
   121 // LogsViewManager::changeRecentView
   116 // LogsViewManager::changeRecentView
   122 // -----------------------------------------------------------------------------
   117 // -----------------------------------------------------------------------------
   134 //
   129 //
   135 void LogsViewManager::proceedExit()
   130 void LogsViewManager::proceedExit()
   136 {
   131 {
   137     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::proceedExit()" );
   132     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::proceedExit()" );
   138     
   133     
   139     qApp->quit();
   134     if ( static_cast<LogsApplication*>( qApp )->logsFeatureFakeExitEnabled() ){
       
   135         doFakeExit();
       
   136     } else {
       
   137         qApp->quit();
       
   138     }
   140     
   139     
   141     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::proceedExit()" );
   140     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::proceedExit()" );
   142 }
   141 }
   143 
   142 
   144 
   143 
   221 // previously activated view and activates new view and place it at top of
   220 // previously activated view and activates new view and place it at top of
   222 // view stack.
   221 // view stack.
   223 // -----------------------------------------------------------------------------
   222 // -----------------------------------------------------------------------------
   224 //
   223 //
   225 bool LogsViewManager::doActivateView(
   224 bool LogsViewManager::doActivateView(
   226         LogsAppViewId viewId, bool showDialpad, QVariant args, const QString& dialpadText)
   225         LogsAppViewId viewId, bool showDialpad, 
       
   226         QVariant args, const QString& dialpadText, bool reset)
   227 {
   227 {
   228     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::doActivateView()" );
   228     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::doActivateView()" );
   229     
   229     
   230     bool activated(false);
   230     bool activated(false);
   231     LogsBaseView* newView = 0; 
   231     LogsBaseView* newView = 0; 
   249         disconnect( &mMainWindow, SIGNAL(localeChanged()), oldView, SLOT(localeChanged()) );
   249         disconnect( &mMainWindow, SIGNAL(localeChanged()), oldView, SLOT(localeChanged()) );
   250     }
   250     }
   251     
   251     
   252     if ( newView ){
   252     if ( newView ){
   253         mViewStack.insert(0, newView);
   253         mViewStack.insert(0, newView);
       
   254         if ( reset ){
       
   255             newView->resetView();
       
   256         }
   254         mMainWindow.setCurrentView(newView);
   257         mMainWindow.setCurrentView(newView);
   255         //Setting mainwindow interactive to enable user input during
   258         //Setting mainwindow interactive to enable user input during
   256         //view switching animation.
   259         //view switching animation.
   257         mMainWindow.setInteractive(true);
   260         mMainWindow.setInteractive(true);
   258         mViewActivationArgs = args;
   261         mViewActivationArgs = args;
   287                  newView, SLOT(callKeyPressed()),
   290                  newView, SLOT(callKeyPressed()),
   288                  Qt::UniqueConnection );
   291                  Qt::UniqueConnection );
   289         connect( &mMainWindow, SIGNAL(localeChanged()), 
   292         connect( &mMainWindow, SIGNAL(localeChanged()), 
   290                  newView, SLOT(localeChanged()),
   293                  newView, SLOT(localeChanged()),
   291                  Qt::UniqueConnection );
   294                  Qt::UniqueConnection );
   292         
       
   293         // First activation completed, clear counter
       
   294         mComponentsRepository->model()->clearMissedCallsCounter();
       
   295     }
   295     }
   296     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::completeViewActivation()" );
   296     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::completeViewActivation()" );
   297 }
   297 }
   298 
   298 
   299 // -----------------------------------------------------------------------------
   299 // -----------------------------------------------------------------------------
   317     
   317     
   318     if ( mViewStack.count() == 0 ){
   318     if ( mViewStack.count() == 0 ){
   319         return;
   319         return;
   320     }
   320     }
   321     
   321     
       
   322     clearActivities();
       
   323     
   322     HbActivityManager* activityManager = static_cast<HbApplication*>(qApp)->activityManager();
   324     HbActivityManager* activityManager = static_cast<HbApplication*>(qApp)->activityManager();
   323     foreach ( LogsBaseView* view, mViewStack ){
       
   324         view->clearActivity(*activityManager);
       
   325     }
       
   326     
       
   327     QVariantHash metaData;
   325     QVariantHash metaData;
   328     LOGS_QDEBUG( "logs [UI] Start taking screenshot" );
   326     LOGS_QDEBUG( "logs [UI] Start taking screenshot" );
   329     QImage* img = new QImage(mMainWindow.rect().size(), QImage::Format_ARGB32_Premultiplied);
   327     QImage* img = new QImage(mMainWindow.rect().size(), QImage::Format_ARGB32_Premultiplied);
   330     QPainter p( img );
   328     QPainter p( img );
   331     // Use render instead of QPixmap::grabWidget as otherwise screenshot
   329     // Use render instead of QPixmap::grabWidget as otherwise screenshot
   359 // -----------------------------------------------------------------------------
   357 // -----------------------------------------------------------------------------
   360 //
   358 //
   361 bool LogsViewManager::loadActivity()
   359 bool LogsViewManager::loadActivity()
   362 {
   360 {
   363     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::loadActivity()" );
   361     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::loadActivity()" );
       
   362     HbApplication* hbApp = static_cast<HbApplication*>(qApp);
       
   363     QString activityId = hbApp->activateId();
       
   364     return doLoadActivity(activityId);
       
   365 }
       
   366 
       
   367 // -----------------------------------------------------------------------------
       
   368 //
       
   369 // -----------------------------------------------------------------------------
       
   370 //
       
   371 LogsAppViewId LogsViewManager::checkMatchesViewTransition(
       
   372     LogsAppViewId viewId, const QString& dialpadText)
       
   373 {
       
   374     if ( !dialpadText.isEmpty() ){
       
   375         mComponentsRepository->dialpad()->editor().setText(dialpadText);
       
   376     }
       
   377     
       
   378     if ( viewId == LogsMatchesViewId ){
       
   379         LogsModel* model = mComponentsRepository->model();
       
   380         if ( model && model->predictiveSearchStatus() != logsContactSearchEnabled ){
       
   381             LOGS_QDEBUG( "logs [UI]     contact search disabled, go to recent view" );
       
   382             viewId = LogsRecentViewId;
       
   383         }
       
   384     }
       
   385     return viewId;
       
   386 }
       
   387 
       
   388 // -----------------------------------------------------------------------------
       
   389 //
       
   390 // -----------------------------------------------------------------------------
       
   391 //
       
   392 void LogsViewManager::handleFirstActivation()
       
   393 {      
       
   394     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::handleFirstActivation()" );
       
   395     LogsApplication* app = static_cast<LogsApplication*>(qApp);
       
   396     Hb::ActivationReason reason = app->activateReason();
       
   397     bool isStartedByService( 
       
   398         mService.isStartedUsingService() || mServiceOld.isStartedUsingService() );
       
   399     if ( !app->logsFeaturePreloadingEnabled() || 
       
   400          reason == Hb::ActivationReasonActivity || 
       
   401          isStartedByService ){
       
   402         // Start immediately using all possible resources
       
   403         mComponentsRepository->model()->refreshData();
       
   404     }
       
   405     
       
   406     if ( reason == Hb::ActivationReasonActivity && loadActivity() ){
       
   407         LOGS_QDEBUG( "logs [UI] loaded saved activity" );    
       
   408         mMainWindow.bringAppToForeground();
       
   409     } else if ( mFirstActivation && !isStartedByService ) {
       
   410         changeRecentView( XQService::LogsViewAll, false );
       
   411         mMainWindow.bringAppToForeground();
       
   412     }
       
   413 
       
   414     clearActivities();
       
   415 
       
   416     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::handleFirstActivation()" );
       
   417 }
       
   418 
       
   419 // -----------------------------------------------------------------------------
       
   420 //
       
   421 // -----------------------------------------------------------------------------
       
   422 //
       
   423 LogsBaseView* LogsViewManager::createView(LogsAppViewId viewId)
       
   424 {
       
   425     LogsBaseView* newView = 0;
       
   426     if ( viewId == LogsRecentViewId ){
       
   427         newView = mComponentsRepository->recentCallsView();
       
   428         mMainWindow.addView(newView);
       
   429     } else if ( viewId == LogsMatchesViewId ) {
       
   430         newView = mComponentsRepository->matchesView();
       
   431         mMainWindow.addView(newView);
       
   432     } else if ( viewId == LogsDetailsViewId ) {
       
   433         newView = mComponentsRepository->detailsView();
       
   434         mMainWindow.addView(newView);
       
   435     }
       
   436     return newView;
       
   437 }
       
   438 
       
   439 // -----------------------------------------------------------------------------
       
   440 //
       
   441 // -----------------------------------------------------------------------------
       
   442 //
       
   443 void LogsViewManager::closeEmbeddedApplication()
       
   444 {
       
   445     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::closeEmbeddedApplication()" );
       
   446     if (mViewStack.count()) {
       
   447         mViewStack.at(0)->cancelServiceRequest();
       
   448     }
       
   449     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::closeEmbeddedApplication()" );
       
   450 }
       
   451 
       
   452 // -----------------------------------------------------------------------------
       
   453 // If application comes back to foreground while exit is pending due unfinished
       
   454 // operations, finising of those operations does not cause anymore real exit.
       
   455 // -----------------------------------------------------------------------------
       
   456 //
       
   457 void LogsViewManager::appGainedForeground()
       
   458 {
       
   459     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::appGainedForeground()" );
       
   460     foreach ( LogsBaseView* view, mViewStack ){
       
   461         disconnect( view, SIGNAL(exitAllowed()), this, SLOT(proceedExit()) );
       
   462     }
       
   463     
       
   464     if ( static_cast<LogsApplication*>( qApp )->logsFeatureFakeExitEnabled() || 
       
   465          static_cast<LogsApplication*>( qApp )->logsFeaturePreloadingEnabled() ){
       
   466         mComponentsRepository->model()->refreshData();
       
   467         TsTaskSettings taskSettings;
       
   468         taskSettings.setVisibility(true);
       
   469     }
       
   470     
       
   471     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::appGainedForeground()" );
       
   472 }
       
   473 
       
   474 // -----------------------------------------------------------------------------
       
   475 //
       
   476 // -----------------------------------------------------------------------------
       
   477 //
       
   478 void LogsViewManager::activityRequested(const QString &activityId)
       
   479 {
       
   480     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::activityRequested()" );
       
   481     if ( doLoadActivity(activityId) ){
       
   482         clearActivities();
       
   483         mMainWindow.bringAppToForeground();
       
   484     }
       
   485     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::activityRequested()" );
       
   486 }
       
   487 
       
   488 // -----------------------------------------------------------------------------
       
   489 //
       
   490 // -----------------------------------------------------------------------------
       
   491 //
       
   492 void LogsViewManager::doFakeExit()
       
   493 {
       
   494     saveActivity();
       
   495     HbActivityManager* activityManager = 
       
   496         static_cast<HbApplication*>(qApp)->activityManager();
       
   497     connect( activityManager, SIGNAL(activityRequested(QString)), 
       
   498              this, SLOT(activityRequested(QString)), Qt::UniqueConnection );
       
   499     mComponentsRepository->model()->compressData();
       
   500     TsTaskSettings taskSettings;
       
   501     taskSettings.setVisibility(false);
       
   502 }
       
   503 
       
   504 // -----------------------------------------------------------------------------
       
   505 //
       
   506 // -----------------------------------------------------------------------------
       
   507 //
       
   508 bool LogsViewManager::doLoadActivity(const QString& activityId)
       
   509 {
       
   510     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::doLoadActivity()" );
   364     bool loaded = false;
   511     bool loaded = false;
   365     HbApplication* hbApp = static_cast<HbApplication*>(qApp);
   512     HbApplication* hbApp = static_cast<HbApplication*>(qApp);
   366     QString activityId = hbApp->activateId();
       
   367     LOGS_QDEBUG_2( "logs [UI] activity id:", activityId );
   513     LOGS_QDEBUG_2( "logs [UI] activity id:", activityId );
   368     bool ok = hbApp->activityManager()->waitActivity();
   514     bool ok = hbApp->activityManager()->waitActivity();
   369     if ( !ok ){
   515     if ( !ok ){
   370         LOGS_QDEBUG( "logs [UI] Activity reschedule failed" );
   516         LOGS_QDEBUG( "logs [UI] Activity reschedule failed" );
   371     }
   517     }
   397         
   543         
   398         QByteArray serializedActivity = hbApp->activateData().toByteArray();
   544         QByteArray serializedActivity = hbApp->activateData().toByteArray();
   399         QDataStream stream(&serializedActivity, QIODevice::ReadOnly);
   545         QDataStream stream(&serializedActivity, QIODevice::ReadOnly);
   400         
   546         
   401         QVariant args = matchingView->loadActivity(activityId, stream, params);
   547         QVariant args = matchingView->loadActivity(activityId, stream, params);
   402         loaded = doActivateView( matchingView->viewId(), showDialpad, args, dialpadText );
   548         loaded = doActivateView( 
   403     }
   549             matchingView->viewId(), showDialpad, args, dialpadText, true );
   404     LOGS_QDEBUG_2( "logs [UI] <- LogsViewManager::loadActivity() loaded:", loaded );
   550     }
       
   551     
       
   552     LOGS_QDEBUG_2( "logs [UI] <- LogsViewManager::doLoadActivity() loaded:", loaded );
   405     return loaded;
   553     return loaded;
   406 }
   554 }
   407 
   555 
   408 // -----------------------------------------------------------------------------
   556 // -----------------------------------------------------------------------------
   409 //
   557 //
   410 // -----------------------------------------------------------------------------
   558 // -----------------------------------------------------------------------------
   411 //
   559 //
   412 LogsAppViewId LogsViewManager::checkMatchesViewTransition(
   560 void LogsViewManager::clearActivities()
   413     LogsAppViewId viewId, const QString& dialpadText)
   561 {
   414 {
   562     HbApplication* hbApp = static_cast<HbApplication*>(qApp);
   415     if ( !dialpadText.isEmpty() ){
   563     HbActivityManager* activityManager = hbApp->activityManager();
   416         mComponentsRepository->dialpad()->editor().setText(dialpadText);
       
   417     }
       
   418     
       
   419     if ( viewId == LogsMatchesViewId ){
       
   420         LogsModel* model = mComponentsRepository->model();
       
   421         if ( model && model->predictiveSearchStatus() != logsContactSearchEnabled ){
       
   422             LOGS_QDEBUG( "logs [UI]     contact search disabled, go to recent view" );
       
   423             viewId = LogsRecentViewId;
       
   424         }
       
   425     }
       
   426     return viewId;
       
   427 }
       
   428 
       
   429 // -----------------------------------------------------------------------------
       
   430 //
       
   431 // -----------------------------------------------------------------------------
       
   432 //
       
   433 void LogsViewManager::handleFirstActivation()
       
   434 {      
       
   435     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::handleFirstActivation()" );
       
   436     bool useSavedActivity( static_cast<HbApplication*>(qApp)->activateReason() == 
       
   437             Hb::ActivationReasonActivity );
       
   438     
       
   439     if ( useSavedActivity && loadActivity() ){
       
   440         LOGS_QDEBUG( "logs [UI] loaded saved activity" );    
       
   441         mMainWindow.bringAppToForeground();
       
   442     } else if ( mFirstActivation && !mService.isStartedUsingService() && 
       
   443                 !mServiceOld.isStartedUsingService()) {
       
   444         changeRecentView( XQService::LogsViewAll, false );
       
   445         mMainWindow.bringAppToForeground();
       
   446     }
       
   447 
       
   448     // Clear previously stored activations
       
   449 
       
   450     HbActivityManager* activityManager = static_cast<HbApplication*>(qApp)->activityManager();
       
   451     foreach ( LogsBaseView* view, mViewStack ){
   564     foreach ( LogsBaseView* view, mViewStack ){
   452         view->clearActivity(*activityManager);
   565         view->clearActivity(*activityManager);
   453     }
   566     }
   454     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::handleFirstActivation()" );
   567     disconnect( activityManager, SIGNAL(activityRequested(QString)), 
   455 }
   568                 this, SLOT(activityRequested(QString)) );
   456 
   569 }
   457 // -----------------------------------------------------------------------------
   570 
   458 //
   571 // -----------------------------------------------------------------------------
   459 // -----------------------------------------------------------------------------
   572 //
   460 //
   573 // -----------------------------------------------------------------------------
   461 LogsBaseView* LogsViewManager::createView(LogsAppViewId viewId)
   574 //
   462 {
   575 void LogsViewManager::activateViewViaService(
   463     LogsBaseView* newView = 0;
   576     LogsAppViewId viewId, bool showDialpad, 
   464     if ( viewId == LogsRecentViewId ){
   577     const QString& dialpadText, const QVariant& args)
   465         newView = mComponentsRepository->recentCallsView();
   578 {
   466         mMainWindow.addView(newView);
   579     LOGS_QDEBUG_2( "logs [UI] -> LogsViewManager::activateViewViaService()", viewId );
   467     } else if ( viewId == LogsMatchesViewId ) {
   580     clearActivities();
   468         newView = mComponentsRepository->matchesView();
   581     closeEmbeddedApplication();
   469         mMainWindow.addView(newView);
   582     mMainWindow.bringAppToForeground();
   470     } else if ( viewId == LogsDetailsViewId ) {
   583     Dialpad* dpad = mComponentsRepository->dialpad();
   471         newView = mComponentsRepository->detailsView();
   584     if ( !showDialpad ){
   472         mMainWindow.addView(newView);
   585         dpad->closeDialpad();
   473     }
   586     }
   474     return newView;
   587     dpad->editor().setText(dialpadText);
   475 }
   588     doActivateView(viewId, showDialpad, args, QString(), true);
   476 
   589     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::activateViewViaService()" );
   477 // -----------------------------------------------------------------------------
   590 }
   478 //
       
   479 // -----------------------------------------------------------------------------
       
   480 //
       
   481 void LogsViewManager::closeEmbeddedApplication()
       
   482 {
       
   483     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::closeEmbeddedApplication()" );
       
   484     if (mViewStack.count()) {
       
   485         mViewStack.at(0)->cancelServiceRequest();
       
   486     }
       
   487     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::closeEmbeddedApplication()" );
       
   488 }
       
   489 
       
   490 // -----------------------------------------------------------------------------
       
   491 // If application comes back to foreground while exit is pending due unfinished
       
   492 // operations, finising of those operations does not cause anymore real exit.
       
   493 // -----------------------------------------------------------------------------
       
   494 //
       
   495 void LogsViewManager::appGainedForeground()
       
   496 {
       
   497     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::appGainedForeground()" );
       
   498     foreach ( LogsBaseView* view, mViewStack ){
       
   499         disconnect( view, SIGNAL(exitAllowed()), this, SLOT(proceedExit()) );
       
   500     }
       
   501     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::appGainedForeground()" );
       
   502 }