src/screensaverutility.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 13 Oct 2010 14:33:00 +0300
branchRCL_3
changeset 31 8f536f98e1f8
parent 29 65be1d84df1f
permissions -rw-r--r--
Revision: 201039 Kit: 201041

/*
* Copyright (c) 2004 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:   Defines screensaver utility tools.
*
*/



#include <coecntrl.h>
#include <akntranseffect.h>
#include <data_caging_path_literals.hrh>
#include <gulicon.h>

#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2
#include <akntransitionutils.h>
#endif

#include "screensaverutility.h"
#include "screensaverappui.h"
#include "ScreensaverUtils.h"


// Screensaver window group priority boost (to ensure it's on top)
const TInt KSSWinPriorityBoost = 2;

_LIT(KSsBitmapName, "\\ssbackground.mbm");
_LIT(KSsBitmapUserDrive, "c:");
_LIT(KSsBitmapSystemDrive, "z:");

// -----------------------------------------------------------------------------
// CScreensaverUtility::Panic( TInt aPanic )
// -----------------------------------------------------------------------------
//
void ScreensaverUtility::Panic( TInt aPanic )
    {
    User::Panic( _L("Screensaver"),aPanic );
    }


// -----------------------------------------------------------------------------
// CScreensaverUtility::FlushDrawBuffer( TInt aPanic )
// Flushes pending draw commands. A "must" before activating power save
// mode, so that the image can be copied to power save memory
// -----------------------------------------------------------------------------
//
void ScreensaverUtility::FlushDrawBuffer()
    {
    CCoeEnv::Static()->WsSession().Flush();
    }

// -----------------------------------------------------------------------------
// CScreensaverUtility::ScreenRotated( TInt aPanic )
// Checks if screen has been rotated
// -----------------------------------------------------------------------------
//
TBool ScreensaverUtility::ScreenRotated()
    {
    TPixelsAndRotation pxRot;
    CCoeEnv::Static()->ScreenDevice()->GetDefaultScreenSizeAndRotation(pxRot);

    // Rotated, if 90 or 270 degrees
    return ((pxRot.iRotation == CFbsBitGc::EGraphicsOrientationRotated90)
            || (pxRot.iRotation == CFbsBitGc::EGraphicsOrientationRotated270));
    }

// -----------------------------------------------------------------------------
// ScreensaverUtility::Query12HourClock
// Query whether 12-hour clock is displayed
// -----------------------------------------------------------------------------
//
TBool ScreensaverUtility::Query12HourClock( )
    {
    TLocale locale;
    return (locale.TimeFormat() == ETime12);
    }


// -----------------------------------------------------------------------------
// ScreensaverUtility::BringToForeground
// -----------------------------------------------------------------------------
//
void ScreensaverUtility::BringToForeground()
    {
#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2
    const TInt KSsaCustomActivateContextNum = 1002;

    GfxTransEffect::BeginFullScreen( KSsaCustomActivateContextNum, TRect( ),
        AknTransEffect::EParameterType, AknTransEffect::GfxTransParam(
            KUidScreensaverApp,
            AknTransEffect::TParameter::EActivateExplicitContinue ) );
#endif
    CEikonEnv::Static()->SetAutoForwarding( ETrue );
    CEikonEnv::Static()->BringForwards( ETrue, ECoeWinPriorityAlwaysAtFront
        + KSSWinPriorityBoost );
    }

// -----------------------------------------------------------------------------
// ScreensaverUtility::SendToBackground
// -----------------------------------------------------------------------------
//
void ScreensaverUtility::SendToBackground()
    {
#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2

    // Start the exit effect context even if this is actually application switch. The exit context
    // makes possible to map effect by using the *previous* application uid (=Screen Saver).
    // Note: Not allowed to call GfxTransEffect::EndFullScreen() as AVKON takes care of that when
    // EApplicationExit context is used! 
    const TInt KSsaCustomDeactivateContextNum = 1001;

    //condition takes care of special case of incomeing call (should not have effect then)
    if ( CAknTransitionUtils::GetData( KScreensaverCallStateChange ) == NULL )
        {
        if ( static_cast<CScreensaverAppUi*>(CCoeEnv::Static()->AppUi())->IsForeground() )
            {
            GfxTransEffect::BeginFullScreen( KSsaCustomDeactivateContextNum,
            TRect( ), AknTransEffect::EParameterType,
            AknTransEffect::GfxTransParam( KUidScreensaverApp,
                AknTransEffect::TParameter::EActivateExplicitContinue ) );
            }
        }
    CAknTransitionUtils::RemoveData( KScreensaverCallStateChange );
#endif

    CEikonEnv::Static()->BringForwards( EFalse );
    }

// -----------------------------------------------------------------------------
// ScreensaverUtility::IsDrivePresent
// -----------------------------------------------------------------------------
//
TBool ScreensaverUtility::IsDrivePresent(TInt aDrive)
    {
    RFs& fs = CCoeEnv::Static()->FsSession();

    TInt error = KErrNone;
    TDriveInfo driveInfo;
    error = fs.Drive(driveInfo, aDrive );

    // Not present, locked or unknown is bad
    if ((error != KErrNone) ||
        (driveInfo.iMediaAtt & KMediaAttLocked) ||
        (driveInfo.iType == EMediaNotPresent) ||
        (driveInfo.iType == EMediaUnknown))
        {
        return EFalse;
        }

    // Read-only is fine
    return ETrue;
    }

// -----------------------------------------------------------------------------
// ScreensaverUtility::LoadBitmapL
// -----------------------------------------------------------------------------
//
CGulIcon* ScreensaverUtility::LoadBitmapL()
    {
    CGulIcon *icon = CGulIcon::NewL();
    CleanupStack::PushL( icon );
    icon->SetBitmap(new (ELeave) CFbsBitmap());
    CFbsBitmap* mask = new (ELeave) CFbsBitmap();

    // First try user path and then system path.
    TInt error;
    TFileName path;
    path.Copy(KSsBitmapUserDrive);
    path.Append(KDC_APP_BITMAP_DIR);
    path.Append(KSsBitmapName);

    for (TInt i = 0; i < 2; i++)
        {
        error = icon->Bitmap()->Load(path, 0);
        if (error == KErrNone)
            {
            error = mask->Load(path, 1);
            if (error != KErrNone)
                {
                delete mask;
                }
            else
                {
                icon->SetMask( mask );
                }
            CleanupStack::Pop(); // icon
            return icon;
            }
            path.Copy(KSsBitmapSystemDrive);
            path.Append(KDC_APP_BITMAP_DIR);
            path.Append(KSsBitmapName);
        }

    CleanupStack::PopAndDestroy(); // icon
    return NULL;
    }


// -----------------------------------------------------------------------------
// ScreensaverUtility::StopWServHeartBeat
// -----------------------------------------------------------------------------
//
void ScreensaverUtility::StopWServHeartBeat()
    {
    SCRLOGGER_WRITE("Model: Stopping WServ HB, snoozing...");
    RWsSession ws;
    TInt err = ws.Connect( );
    if ( !err )
        {
        ws.PrepareForSwitchOff( );
        ws.Close( );
        }
    }

// End of file