diff -r aaeeca1f15af -r e8d784ac1a4b src/screensaverbase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/screensaverbase.cpp Wed Sep 01 12:30:40 2010 +0100 @@ -0,0 +1,339 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: The control base class of display object. +* +*/ + + + +#include +#include + +#include "screensaverbase.h" +#include "screensaverview.h" +#include "screensaverappui.h" +#include "ScreensaverUtils.h" +#include "screensavershareddatai.h" +#include "screensaverutility.h" + +const TInt KRefreshRate = 60000000; // 60 sec + + +// Time delayed before a wserv heartbeat stop request is issued. +// Delay is needed, because draw commands may still be handled, if +// stop request is issued right after screen refresh. +#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2 +const TInt KCaptureDelay = 2000000; // 2.0 sec, used to delay the capturing operation +#else +const TInt KCaptureDelay = 100000; // 0.1 sec +#endif + +// ----------------------------------------------------------------------------- +// CScreensaverBase::CScreensaverBase +// ----------------------------------------------------------------------------- +// +CScreensaverBase::CScreensaverBase() + { + + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::~CScreensaverBase +// ----------------------------------------------------------------------------- +// +CScreensaverBase::~CScreensaverBase() + { + DeleteTimer( iCaptureScreenTimer ); + + delete iPowerSaveDisplayMode; + + delete iOffScrnBmp; + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::StartDrawObject +// ----------------------------------------------------------------------------- +// +void CScreensaverBase::StartDrawObject() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::StartDrawObject start") ); + StartTimer(); + + DrawObject(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::StopDrawObject +// ----------------------------------------------------------------------------- +// +void CScreensaverBase::StopDrawObject() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::StopDrawObject start") ); + if ( LcdPartialMode() && LcdPartialMode()->Status() ) + { + SCRLOGGER_WRITE("Model: StopScreenSaver(), exit power save"); + LcdPartialMode()->Exit(); + } + + CancelTimer(); + + ClearScreen(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::DrawObject +// ----------------------------------------------------------------------------- +// +void CScreensaverBase::DrawObject() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::DrawObject start") ); + SetRect( Rect() ); + + DrawNow(); + + StartCaptureScreenTimer(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::View +// ----------------------------------------------------------------------------- +// +CScreensaverView* CScreensaverBase::View() const + { + return STATIC_CAST( CScreensaverAppUi*, CCoeEnv::Static()->AppUi() )->ScreensaverView(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::Model +// ----------------------------------------------------------------------------- +// +const CScreensaverEngine& CScreensaverBase::Model() const + { + return STATIC_CAST( CScreensaverAppUi*, CCoeEnv::Static()->AppUi() )->Model(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::Array +// ----------------------------------------------------------------------------- +// +CScreensaverIndicatorArray& CScreensaverBase::Array() const + { + return Model().IndicatorArray(); + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::SetPowerSaveDisplayActiveArea +// ----------------------------------------------------------------------------- +// +TInt CScreensaverBase::SetPowerSaveDisplayActiveArea( TRect& aRect ) + { + // Save the requested area + iPowerSaveDisplayActiveArea = aRect; + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::ActivatePowerSaveDisplay +// ----------------------------------------------------------------------------- +// +TInt CScreensaverBase::ActivatePowerSaveDisplay( TBool aFullColors ) const + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::ActivatePowerSaveDisplay start") ); + TInt err = KErrNone; + + if ( ( Model().ScreenSaverIsOn() + && ( !iPowerSaveDisplayActiveArea.IsEmpty() ) ) ) + { + TInt startLine = 0; + TInt endLine = 0; + + // Normal mode - using saver bar height + startLine = iPowerSaveDisplayActiveArea.iTl.iY; + endLine = iPowerSaveDisplayActiveArea.iBr.iY; + + SCRLOGGER_WRITEF( _L("SCR: Powersave supports %d lines"), + LcdPartialMode()->MaxLines() ); + + // Check whether power save mode should be used + // When local variation added, PS will override if local says + // yes, but PS says no + if ( Model().SharedDataInterface()->IsUsePowerSaveMode() ) + { + SCRLOGGER_WRITEF( _L("SCR: Requesting powersave, lines: %d, %d"), + startLine, endLine ); + TUint16* addr = ( TUint16* )iOffScrnBmp->DataAddress(); + err = LcdPartialMode()->Set( startLine, endLine, addr, aFullColors ); + + Model().SharedDataInterface()->SetSSForcedLightsOn( 0 ); + } + else + { + SCRLOGGER_WRITE("Power save mode not in use, not requested"); + err = KErrCancel; + } + } + else + { + // Screensaver not on - cannot set power save mode on + err = KErrNotReady; + } + + return err; + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::DrawPictographArea +// ----------------------------------------------------------------------------- +// +void CScreensaverBase::DrawPictographArea() + { + // Currently animation is not supported - do nothing + } + +// ---------------------------------------------------------------------------- +// CScreensaverBase::StartCaptureScreenTimer +// ----------------------------------------------------------------------------- +// +void CScreensaverBase::StartCaptureScreenTimer() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::StartCaptureScreenTimer start") ); + DeleteTimer( iCaptureScreenTimer ); + + TRAP_IGNORE( iCaptureScreenTimer = CPeriodic::NewL( CActive::EPriorityStandard ) ); + + iCaptureScreenTimer->Start( KCaptureDelay , KCaptureDelay , + TCallBack( HandleCaptureTimerExpiry, this ) ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::InitialRefreshRate +// ----------------------------------------------------------------------------- +// +TInt CScreensaverBase::InitialRefreshRate() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::InitialRefreshRate start") ); + TTime homeTime, timeTmp; + TTimeIntervalSeconds interval; + TInt initialRefresh = KRefreshRate; + homeTime.HomeTime(); + timeTmp = homeTime; + timeTmp.RoundUpToNextMinute(); + if ( timeTmp.SecondsFrom( homeTime, interval ) == KErrNone ) + { + initialRefresh = interval.Int() * 1000000; + } + + return initialRefresh; + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::DeleteTimer +// ----------------------------------------------------------------------------- +// +void CScreensaverBase::DeleteTimer( CPeriodic*& aTimer ) + { + if ( aTimer ) + { + aTimer->Cancel(); + delete aTimer; + aTimer = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::ConstructAndConnectLCDL +// ----------------------------------------------------------------------------- +// +void CScreensaverBase::ConstructAndConnectLCDL() + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::ConstructAndConnectLCD start") ); + // User side handle object is created + TRAPD( err, iPowerSaveDisplayMode = CPowerSaveDisplayMode::NewL() ); + if ( ( err != KErrNone ) || ( !iPowerSaveDisplayMode ) ) + { + SCRLOGGER_WRITEF( _L("SCR: Model: No power save mode (err = %d)"), err ); + } + + iOffScrnBmp = new ( ELeave ) CFbsBitmap; + User::LeaveIfError( iOffScrnBmp->Create( Size(), EColor64K ) ); + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::LcdPartialMode +// ----------------------------------------------------------------------------- +// +CPowerSaveDisplayMode* CScreensaverBase::LcdPartialMode() const + { + return iPowerSaveDisplayMode; + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::HandleRefreshTimerExpiry +// ----------------------------------------------------------------------------- +// +TInt CScreensaverBase::HandleRefreshTimerExpiry( TAny* aPtr ) + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::HandleRefreshTimerExpiry start") ); + CScreensaverBase* control = STATIC_CAST(CScreensaverBase*, aPtr); + + SCRLOGGER_WRITEF( _L("SCR: Inside CScreensaverView::HandleRefreshTimerExpiry()") ); + + control->DrawObject(); + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::HandleCaptureTimerExpiry +// Handles capture screen timer timeout +// ----------------------------------------------------------------------------- +// +TInt CScreensaverBase::HandleCaptureTimerExpiry( TAny* aPtr ) + { + SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::HandleCaptureTimerExpiry start") ); + CScreensaverBase *control= STATIC_CAST( CScreensaverBase*, aPtr ); + + SCRLOGGER_WRITEF( _L("SCR: Inside CScreensaverView::HandleWsHbStopTimerTimeout()") ); + + if ( control ) + { + TInt err = control->CaptureScreen(); + control->DeleteTimer( control->iCaptureScreenTimer ); + ScreensaverUtility::StopWServHeartBeat(); + +#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2 + + if ( KErrNone == err ) + { + control->ActivatePowerSaveDisplay(); + } + +#endif + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CScreensaverBase::CaptureScreen +// ----------------------------------------------------------------------------- +// +TInt CScreensaverBase::CaptureScreen() + { + CWsScreenDevice* device = iCoeEnv->ScreenDevice(); + TInt err = device->CopyScreenToBitmap( iOffScrnBmp, iPowerSaveDisplayActiveArea ); + return err; + } + +//End of file