src/screensaverengine.cpp
branchRCL_3
changeset 11 4784a3bc2236
parent 10 1c806ee746e7
child 12 0bfd55b8504e
--- 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 <barsread.h>
-#include <activitymanager.h>
 #include <featmgr.h>
 #include <PUAcodes.hrh>
 #include <Profile.hrh>
@@ -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
 // -----------------------------------------------------------------------------