src/screensaverengine.cpp
branchRCL_3
changeset 16 1f307dce3b5a
parent 15 2e08ef6b6eda
child 18 98bf2adac59c
--- 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 <Profile.hrh>
 #include <screensaver.rsg>
 #include <AknUtils.h>
-#include <activitymanager.h>
 
 #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
 // -----------------------------------------------------------------------------