screensaver/screensaverplugins/snsrbigclockscreensaverplugin/src/snsrbigclockscreensaver.cpp
changeset 69 87476091b3f5
parent 62 341166945d65
child 86 e4f038c420f7
--- a/screensaver/screensaverplugins/snsrbigclockscreensaverplugin/src/snsrbigclockscreensaver.cpp	Wed Jul 14 15:53:30 2010 +0300
+++ b/screensaver/screensaverplugins/snsrbigclockscreensaverplugin/src/snsrbigclockscreensaver.cpp	Fri Jul 23 13:47:57 2010 +0300
@@ -24,14 +24,16 @@
 #include <QDebug>
 #include <QTime>
 #include <QTimer>
+#include <XQSettingsManager> 
+#include <HbInstance>
+#include <HbMainWindow>
 
-#include <hbinstance.h>
-#include <hbmainwindow.h>
-
+#include <screensaverdomaincrkeys.h>
 #include "snsranalogclockcontainer.h"
 #include "snsrdigitalclockcontainer.h"
 #include "snsroledanalogclockcontainer.h"
 #include "snsroleddigitalclockcontainer.h"
+#include "snsrblankcontainer.h"
 #include "snsrindicatormodel.h"
 
 /*!
@@ -40,15 +42,14 @@
     \brief Screensaver with big digital clock.
  */
 
-const int gTimeInterval(100);
-
 /*!
     Constructs a new SnsrBigClockScreensaver.
  */
 SnsrBigClockScreensaver::SnsrBigClockScreensaver() :
     mMainWindow(0),
     mCurrentContainer(0),
-    mIndicatorModel(0)
+    mIndicatorModel(0),
+    m_setManager(0)
 {
     mMainWindow = HbInstance::instance()->allMainWindows().at(0);
     // for nice looking clock hand transformations
@@ -64,6 +65,7 @@
  */
 SnsrBigClockScreensaver::~SnsrBigClockScreensaver()
 {
+    mMainWindow->unsetOrientation( /*animate*/false );
     // mCurrentContainer, mIndicatorModel - deleted by the parent
 }
 
@@ -86,6 +88,8 @@
 
     removeCurrentContainer();
 
+    emit screenPowerModeRequested( Screensaver::ScreenModeFullPower );
+    
     SnsrBigClockContainer* newContainer( 0 );
     if (clockFormat() == ClockFormatAnalog) {
         newContainer = new SnsrAnalogClockContainer();
@@ -95,7 +99,7 @@
     }
 
     setCurrentContainer( newContainer );
-
+    
     SCREENSAVER_TEST_FUNC_EXIT("SnsrBigClockScreensaver::onForeground")
     return true;
 }
@@ -111,13 +115,34 @@
     removeCurrentContainer();
     
     SnsrBigClockContainer* newContainer( 0 );
-    if (clockFormat() == ClockFormatAnalog) {
-        newContainer = new SnsrOledAnalogClockContainer();
+        
+    // Check ScreensaverStatus from repository
+    XQSettingsManager::Error error;
+    int screensaverOn = 1; 
+    XQCentralRepositorySettingsKey settingsKey(
+            KCRUidScreensaverSettings.iUid, KScreensaverStatus ); // TUid as same repository used in control panel via Symbian APIs 
+    m_setManager = new XQSettingsManager(this);
+    if (m_setManager) {
+        screensaverOn = m_setManager->readItemValue(settingsKey, XQSettingsManager::TypeInt).toInt();
+        error = m_setManager->error();
+        if (error != XQSettingsManager::NoError) {
+            qDebug("Error reading value from XQSettingsManager.. error = %d", error);
+        }
+        delete m_setManager;
+    }
+    
+    if (screensaverOn) {
+        if (clockFormat() == ClockFormatAnalog) {
+            newContainer = new SnsrOledAnalogClockContainer();
+        }
+        else {
+            newContainer = new SnsrOledDigitalClockContainer();
+        }
     }
     else {
-        newContainer = new SnsrOledDigitalClockContainer();
+        newContainer = new SnsrBlankContainer();
     }
-
+    
     setCurrentContainer( newContainer );
 
     SCREENSAVER_TEST_FUNC_EXIT("SnsrBigClockScreensaver::onPartialForeground")
@@ -196,6 +221,46 @@
     mIndicatorModel->handleDeactivatedIndicator(deactivatedIndicator);
 }
 
+/*!
+    @copydoc Screensaver::getActiveScreenRows
+ */
+void SnsrBigClockScreensaver::getActiveScreenRows(int *firstActiveRow, int *lastActiveRow)
+{
+    if ( mCurrentContainer ) {
+        mCurrentContainer->getActiveScreenRows( firstActiveRow, lastActiveRow );
+    }
+    else {
+        qWarning() << "No current container when active rows queried.";
+    }
+}
+
+/*!
+    @copydoc Screensaver::updateLayout
+ */
+void SnsrBigClockScreensaver::updateLayout()
+{
+    if ( mCurrentContainer ) {
+        if ( mCurrentContainer->isOrientationLocked() ) {
+            mMainWindow->setOrientation( mMainWindow->orientation(), /*animate*/false );
+        }
+        else {
+            mMainWindow->unsetOrientation( /*animate*/false );
+        }
+        mCurrentContainer->changeLayout( mMainWindow->orientation() );
+    }
+    else {
+        qWarning() << "No current container when updateLayout called.";
+    }
+}
+
+/*!
+    Update the area visible in the power save screen mode. Power save mode gets
+    also activated on call if not already active.
+ */
+void SnsrBigClockScreensaver::updateActiveAreaForLowPower()
+{
+    emit screenPowerModeRequested( Screensaver::ScreenModeLowPower );
+}
 
 /*!
     Determines the curent clock format settings.
@@ -223,38 +288,41 @@
 {
     if ( mCurrentContainer ) {
         disconnect(
-            mMainWindow, SIGNAL(orientationChanged(Qt::Orientation)),
-            mCurrentContainer, SLOT(changeLayout(Qt::Orientation))
-            );
-        disconnect(
             &mTimer, SIGNAL(timeout()),
             mCurrentContainer, SLOT(update())
             );
         disconnect( 
             mCurrentContainer, SIGNAL(unlockRequested()), 
             this, SIGNAL(unlockRequested()) );
-        mTimer.stop();
+        if (mTimer.timerId()!= -1) {
+            mTimer.stop();
+        }
         emit viewChanged(0);
         
         delete mCurrentContainer;
         mCurrentContainer = 0;
     }
+    
+    mMainWindow->unsetOrientation( /*animate*/false );
 }
 
 void SnsrBigClockScreensaver::setCurrentContainer( SnsrBigClockContainer* newContainer )
 {
     mCurrentContainer = newContainer;
-    connect(
-            mMainWindow, SIGNAL(orientationChanged(Qt::Orientation)),
-            mCurrentContainer, SLOT(changeLayout(Qt::Orientation))
-        );
+    mCurrentContainer->setParent(this);
     connect( &mTimer, SIGNAL(timeout()), mCurrentContainer, SLOT(update()) );
     connect( mCurrentContainer, SIGNAL(unlockRequested()), SIGNAL(unlockRequested()) );
+    connect( mCurrentContainer, SIGNAL(activeAreaMoved()), SLOT(updateActiveAreaForLowPower()) );
 
-    mCurrentContainer->initIndicators(*mIndicatorModel);
+    mCurrentContainer->setIndicatorModel(*mIndicatorModel);
+
+    int updateInterval = mCurrentContainer->updateIntervalInMilliseconds(); 
+    // blankcontainer is empty one, don't start timer with -1 return value
+    if ( updateInterval != -1) {
+        mTimer.start(updateInterval);
+    }
     
-    mCurrentContainer->changeLayout(mMainWindow->orientation());
-    mTimer.start( mCurrentContainer->updateIntervalInMilliseconds() );
+    
     emit viewChanged(mCurrentContainer);
 }