diff -r 1c806ee746e7 -r 4784a3bc2236 src/screensaverengine.cpp --- a/src/screensaverengine.cpp Wed Mar 31 21:32:18 2010 +0300 +++ b/src/screensaverengine.cpp Wed Apr 14 15:58:13 2010 +0300 @@ -18,7 +18,6 @@ #include -#include #include #include #include @@ -32,6 +31,7 @@ #include "screensaverappui.h" #include "ScreensaverUtils.h" #include "screensaverutility.h" +#include "screensaveractivitymanager.h" // Minimum plugin suspension time @@ -43,6 +43,7 @@ const TInt KNoPreview = 0; const TInt KPreviewTimeout = 10000000; // 10 sec +const TInt KIgnoreActivityTimeout = 500000; // 0.5 sec const TText KSilentProfileInd= KPuaCodeSilentSymbol; const TText KSilentVibraInd= KPuaCodeAprofSilentVibra; @@ -76,6 +77,7 @@ delete iIndicatorArray; KillTimer( iPreviewTimer ); KillTimer( iExpiryTimer ); + KillTimer( iIgnoreActivityResetTimer ); iAknUiServer.Close(); } @@ -155,9 +157,10 @@ // Report whether started from Idle BEFORE bringing to foreground iSharedDataI->SetSSStartedFromIdleStatus(); - iSharedDataI->SetSSForcedLightsOn(1); - - ScreensaverUtility::BringToForeground(); + if ( !View()->IsContentlessScreensaver() ) + { + ScreensaverUtility::BringToForeground(); + } SCRLOGGER_WRITE("Model: SS is displaying (BringToForeground)"); @@ -202,7 +205,6 @@ View()->HideDisplayObject(); } - if( iScreenSaverIsPreviewing ) { iSharedDataI->SetScreensaverPreviewMode( KNoPreview ); @@ -226,6 +228,7 @@ void CScreensaverEngine::StartPreviewModeL( ) { SCRLOGGER_WRITEF(_L("SCR: Inside CScreensaverEngine::StartPreviewModeL()") ); + iActivityManagerScreensaverShort->SetInactivityTimeout(0); iScreenSaverIsPreviewing = ETrue; // Change the display object into what's being previewed @@ -245,7 +248,10 @@ iSharedDataI->SetScreensaverPreviewState( EScreenSaverPreviewStart ); - ScreensaverUtility::BringToForeground(); + if ( !View()->IsContentlessScreensaver() ) + { + ScreensaverUtility::BringToForeground(); + } } // ----------------------------------------------------------------------------- @@ -557,14 +563,14 @@ // Start monitoring activity for screensaver iActivityManagerScreensaver - = CUserActivityManager::NewL( CActive::EPriorityStandard ); + = CScreensaverActivityManager::NewL( CActive::EPriorityStandard ); iActivityManagerScreensaver->Start( Timeout(), TCallBack( HandleInactiveEventL,this ), TCallBack( HandleActiveEventL, this ) ); // Start monitoring activity for screensaver, short timeout iActivityManagerScreensaverShort - = CUserActivityManager::NewL( CActive::EPriorityStandard ); + = CScreensaverActivityManager::NewL( CActive::EPriorityUserInput ); iActivityManagerScreensaverShort->Start( KTimeoutShort, TCallBack( HandleInactiveEventShortL, this ), @@ -575,7 +581,7 @@ // CScreensaverEngine::StopActivityMonitoring // ----------------------------------------------------------------------------- // -void CScreensaverEngine::StopActivityMonitoring( CUserActivityManager*& aActivityManager ) +void CScreensaverEngine::StopActivityMonitoring( CScreensaverActivityManager*& aActivityManager ) { if ( aActivityManager ) { @@ -728,7 +734,15 @@ TInt CScreensaverEngine::HandleActiveEventShortL( TAny* aPtr ) { SCRLOGGER_WRITE("HandleActiveEventShortL(), stopping saver"); - STATIC_CAST(CScreensaverEngine*, aPtr)->StopScreenSaver(); + CScreensaverEngine* _this= STATIC_CAST(CScreensaverEngine*, aPtr); + if ( !_this->iIgnoreNextActivity ) + { + _this->StopScreenSaver(); + } + else + { + _this->iActivityManagerScreensaverShort->SetInactivityTimeout(0); + } return KErrNone; } @@ -743,6 +757,7 @@ CScreensaverEngine* _this= STATIC_CAST(CScreensaverEngine*, aPtr); // Restore inactivity timeout if it was reset at keylock activation _this->iActivityManagerScreensaverShort->SetInactivityTimeout(KTimeoutShort); + _this->iIgnoreNextActivity = EFalse; if ( _this->iSharedDataI->IsKeyguardOn() ) { @@ -771,16 +786,43 @@ } // --------------------------------------------------------------------------- +// CScreensaverEngine::ResetIgnoreFlagCb +// --------------------------------------------------------------------------- +// +TInt CScreensaverEngine::ResetIgnoreFlagCb( TAny* aPtr ) + { + CScreensaverEngine* engine = STATIC_CAST(CScreensaverEngine*, aPtr); + engine->KillTimer( engine->iIgnoreActivityResetTimer ); + engine->iIgnoreNextActivity = EFalse; + + return KErrNone; + } + +// --------------------------------------------------------------------------- // CScreensaverEngine::HandleKeyguardStateChanged // --------------------------------------------------------------------------- // void CScreensaverEngine::HandleKeyguardStateChanged( TBool aEnabled ) { + KillTimer( iIgnoreActivityResetTimer ); if ( aEnabled ) { - // Keyguard switch generates an activity event still, let the inactivity - // handler start the screensaver after one second - iActivityManagerScreensaverShort->SetInactivityTimeout(1); + if ( !iScreenSaverIsOn ) + { + // Start the screensaver, but set the ignore flag in case keylock + // was activated using the side switch. The switch will generate + // activity that must be ignored. + StartScreenSaver(); + iIgnoreNextActivity = ETrue; + + iIgnoreActivityResetTimer = CPeriodic::New( EPriorityLow ); + if ( iIgnoreActivityResetTimer ) + { + iIgnoreActivityResetTimer->Start( KIgnoreActivityTimeout, + KIgnoreActivityTimeout, + TCallBack( ResetIgnoreFlagCb, this ) ); + } + } } else { @@ -788,6 +830,18 @@ } } +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CScreensaverEngine::NotifyKeyEventReceived() + { + if ( iSharedDataI->IsKeyguardOn() ) + { + iIgnoreNextActivity = ETrue; + } + } + // ----------------------------------------------------------------------------- // CScreensaverEngine::View // -----------------------------------------------------------------------------