diff -r 2e08ef6b6eda -r 1f307dce3b5a src/screensaverengine.cpp --- a/src/screensaverengine.cpp Tue May 25 12:43:23 2010 +0300 +++ b/src/screensaverengine.cpp Wed Jun 09 09:42:47 2010 +0300 @@ -23,7 +23,6 @@ #include #include #include -#include #include "screensaverengine.h" #include "screensaverctrlmovingtext.h" @@ -32,12 +31,14 @@ #include "screensaverappui.h" #include "ScreensaverUtils.h" #include "screensaverutility.h" +#include "screensaveractivitymanager.h" // Minimum plugin suspension time const TInt KMinPluginSuspensionTime = 500000; // 0.5 sec // Inactivity timeout in seconds when keys locked const TInt KTimeoutShort = 5000000; +const TInt KTimeoutPreviewLocked = 2000000; const TInt KNoPreview = 0; @@ -126,14 +127,12 @@ { SCRLOGGER_WRITE("Model: StartScreenSaver()"); - // Ignore start while in preview to avoid double-start lock + // Stop if previewing. If keylock was activated, the pause timer will + // be started and the selected (not necessarily previewed) screensaver + // will start if ( iScreenSaverIsPreviewing ) { - // Reset user activity so that screensaver is enabled after - // preview even if no user activity happens any more - // Note that this puts on backlight but it should be on at this - // time anyway (unless a plugin set it off, but what the hey) - User::ResetInactivityTime(); + StopScreenSaver(); return; } @@ -186,7 +185,7 @@ { SCRLOGGER_WRITE("Stopping Screensaver"); - if ( !iScreenSaverIsPreviewing && iSharedDataI->IsKeyguardOn() ) + if ( iSharedDataI->IsKeyguardOn() || iScreenSaverIsPreviewing ) { StartPauseTimer(); } @@ -219,6 +218,7 @@ iSharedDataI->SetScreensaverPreviewState( EScreenSaverPreviewNone ); KillTimer( iPreviewTimer ); + ResetInactivityTimeout(); } } @@ -252,6 +252,7 @@ { ScreensaverUtility::BringToForeground(); } + iActivityManagerScreensaver->SetInactivityTimeout(0); } // ----------------------------------------------------------------------------- @@ -563,7 +564,7 @@ // Start monitoring activity for screensaver iActivityManagerScreensaver - = CUserActivityManager::NewL( CActive::EPriorityStandard ); + = CScreensaverActivityManager::NewL( CActive::EPriorityUserInput ); iActivityManagerScreensaver->Start( Timeout(), TCallBack( HandleInactiveEventL,this ), TCallBack( HandleActiveEventL, this ) ); @@ -573,7 +574,7 @@ // CScreensaverEngine::StopActivityMonitoring // ----------------------------------------------------------------------------- // -void CScreensaverEngine::StopActivityMonitoring( CUserActivityManager*& aActivityManager ) +void CScreensaverEngine::StopActivityMonitoring( CScreensaverActivityManager*& aActivityManager ) { if ( aActivityManager ) { @@ -665,6 +666,14 @@ // void CScreensaverEngine::StartPauseTimer() { + if ( iScreenSaverIsPreviewing ) + { + iPauseTimerStartedAfterPreview = ETrue; + } + + TInt timeout = ( iScreenSaverIsPreviewing )? KTimeoutPreviewLocked : + KTimeoutShort; + KillTimer( iPauseTimer ); TRAP_IGNORE( iPauseTimer = CPeriodic::NewL( CActive::EPriorityHigh ) ); @@ -675,7 +684,7 @@ return; } - iPauseTimer->Start( KTimeoutShort, KTimeoutShort, TCallBack( + iPauseTimer->Start( timeout, timeout, TCallBack( HandlePauseTimerExpiry, this ) ); } @@ -717,6 +726,7 @@ { CScreensaverEngine* _this= STATIC_CAST(CScreensaverEngine*, aPtr); _this->KillTimer( _this->iPauseTimer ); + _this->iPauseTimerStartedAfterPreview = EFalse; if ( _this->iSharedDataI->IsKeyguardOn() ) { @@ -731,11 +741,14 @@ // CScreensaverEngine::HandleActiveEventL // ----------------------------------------------------------------------------- // -TInt CScreensaverEngine::HandleActiveEventL( TAny* /* aPtr */) +TInt CScreensaverEngine::HandleActiveEventL( TAny* aPtr ) { - SCRLOGGER_WRITE("HandleActiveEventL(), do nothing"); - // We can be pretty sure the short timeout has passed and its - // active event handler stops the saver + SCRLOGGER_WRITE("HandleActiveEventL(), stop if previewing"); + CScreensaverEngine* _this= STATIC_CAST(CScreensaverEngine*, aPtr); + if ( _this->iScreenSaverIsPreviewing ) + { + _this->StopScreenSaver(); + } return KErrNone; } @@ -748,7 +761,12 @@ SCRLOGGER_WRITE("HandleInactiveEventL(), starting screensaver"); CScreensaverEngine* _this= STATIC_CAST(CScreensaverEngine*, aPtr); - + // Inactivity is detected immediately when preview starts + if ( _this->iScreenSaverIsPreviewing ) + { + _this->ResetInactivityTimeout(); + return KErrNone; + } // Double-start is OK, it will be checked in StartScreenSaver() // This will be trigged by keylock activation after keyguard // timeout, or if keylock is disabled @@ -774,6 +792,33 @@ return KErrNone; } +// --------------------------------------------------------------------------- +// CScreensaverEngine::HandleKeyguardStateChanged +// --------------------------------------------------------------------------- +// +void CScreensaverEngine::HandleKeyguardStateChanged( TBool aEnabled ) + { + if ( aEnabled ) + { + // Keys locked - if screensaver is running, this was caused by + // automatic keyguard and screensaver should refresh the view + // to show the keylock indicator + if ( iScreenSaverIsOn && !iScreenSaverIsPreviewing ) + { + View()->UpdateAndRefresh(); + } + if ( !( iPauseTimerStartedAfterPreview && + iPauseTimer && iPauseTimer->IsActive() ) ) + { + StartScreenSaver(); + } + } + else + { + StopScreenSaver(); + } + } + // ----------------------------------------------------------------------------- // CScreensaverEngine::View // -----------------------------------------------------------------------------