src/screensavershareddatamonitor.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:46:04 +0200
changeset 0 040fcad49f44
child 10 25957ccd51ab
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2003 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:   Implementation for screensaver shared data monitoring.
*
*/



#include <coemain.h>
#include <ScreensaverInternalCRKeys.h>
#include <UsbWatcherInternalPSKeys.h>
#include <avkondomainpskeys.h>               // kaknkeyguardstatus
#include <ctsydomainpskeys.h>                // kpsuidctsycallinformation
#include <startupdomainpskeys.h>             // kpsglobalsystemstate
#include <ScreensaverInternalPSKeys.h>
#include <UikonInternalPSKeys.h>             // kuikmmcinserted

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

#include "screensavershareddatamonitor.h"
#include "screensavershareddatai.h"
#include "screensaverrepositorywatcher.h"
#include "screensaverview.h"
#include "screensaverengine.h"
#include "screensaverappui.h"
#include "screensaversubscriber.h"
#include "screensaverutility.h"

//System shuttingdown value
const TInt KSystemShuttingdown = 1;

// -----------------------------------------------------------------------------
// CScreensaverSharedDataMonitor::~CScreensaverSharedDataMonitor
// -----------------------------------------------------------------------------
//
CScreensaverSharedDataMonitor::~CScreensaverSharedDataMonitor()
    {
    DeleteSubscriber( iPreviewModeSubscriber );
    iPreviewModeProperty.Close();
    
    DeleteSubscriber( iMMCWatchSubscriber );
    iMMCWatchProperty.Close();
    
    DeleteSubscriber( iUSBWatchSubscriber );
    iUSBWatchProperty.Close();
    
    DeleteSubscriber( iKeyguardStateSubscriber );
    iKeyguardStateProperty.Close();
    
    DeleteSubscriber( iCallStateSubscriber );
    iCallStateProperty.Close();
    
    DeleteSubscriber( iShuttingDownSubscriber );
    iShuttingDownProperty.Close();
    }

// -----------------------------------------------------------------------------
// CScreensaverSharedDataMonitor::NewL
// -----------------------------------------------------------------------------
//
CScreensaverSharedDataMonitor* CScreensaverSharedDataMonitor::NewL( CScreensaverSharedDataI* aData )
    {
    CScreensaverSharedDataMonitor* self = new( ELeave )CScreensaverSharedDataMonitor( aData );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop(); // self;
    return self;
    }

// -----------------------------------------------------------------------------
// CScreensaverSharedDataMonitor::CScreensaverSharedDataMonitor
// -----------------------------------------------------------------------------
//
CScreensaverSharedDataMonitor::CScreensaverSharedDataMonitor(
    CScreensaverSharedDataI* aData )
    :iData( aData )
    {
    // No implementation required
    }

// -----------------------------------------------------------------------------
// CScreensaverSharedDataMonitor::ConstructL
// -----------------------------------------------------------------------------
// 
void CScreensaverSharedDataMonitor::ConstructL()
    {
    User::LeaveIfError(iPreviewModeProperty.Attach(KPSUidScreenSaver, KScreenSaverPreviewMode));
    iPreviewModeSubscriber = new (ELeave) CSubscriber(TCallBack(HandlePreviewModeChanged, this), iPreviewModeProperty);
    iPreviewModeSubscriber->SubscribeL();
    
    
    // MMC watcher
    User::LeaveIfError(iMMCWatchProperty.Attach(KPSUidUikon, KUikMMCInserted));
    iMMCWatchSubscriber = new (ELeave) CSubscriber(
        TCallBack(HandleMMCStateChanged, this), iMMCWatchProperty);
    iMMCWatchSubscriber->SubscribeL();
    
    // USB watcher (MMC dismount)
    User::LeaveIfError(iUSBWatchProperty.Attach(
           KPSUidUsbWatcher, KUsbWatcherSelectedPersonality));
    iUSBWatchSubscriber = new (ELeave) CSubscriber(
        TCallBack(HandleUSBStateChanged, this), iUSBWatchProperty);
    iUSBWatchSubscriber->SubscribeL();

    // Keyguard state watcher
    User::LeaveIfError(iKeyguardStateProperty.Attach(
        KPSUidAvkonDomain, KAknKeyguardStatus));
    iKeyguardStateSubscriber = new (ELeave) CSubscriber(
        TCallBack(HandleKeyguardStateChanged, this), iKeyguardStateProperty);
    iKeyguardStateSubscriber->SubscribeL();

    // Call state watcher
    User::LeaveIfError(iCallStateProperty.Attach( KPSUidCtsyCallInformation, KCTsyCallState ) );
    iCallStateSubscriber = new (ELeave) CSubscriber(
        TCallBack(HandleCallStateChanged, this), iCallStateProperty);
    iCallStateSubscriber->SubscribeL();

    // Shutting down state watcher
    User::LeaveIfError( iShuttingDownProperty.Attach( KPSUidStartup, KPSGlobalSystemState ) );
    iShuttingDownSubscriber = new (ELeave) CSubscriber(
        TCallBack(HandleShuttingDownStateChanged, this), iShuttingDownProperty);
    iShuttingDownSubscriber->SubscribeL();
    }

// -----------------------------------------------------------------------------
// CScreensaverSharedDataMonitor::View
// -----------------------------------------------------------------------------
// 
CScreensaverView* CScreensaverSharedDataMonitor::View()
    {
    return STATIC_CAST( CScreensaverAppUi*, CCoeEnv::Static()->AppUi() )->ScreensaverView();
    }

// -----------------------------------------------------------------------------
// CScreensaverSharedDataMonitor::Model
// -----------------------------------------------------------------------------
//
CScreensaverEngine& CScreensaverSharedDataMonitor::Model()
    {
    return STATIC_CAST( CScreensaverAppUi*, CCoeEnv::Static()->AppUi() )->Model();
    }


// -----------------------------------------------------------------------------
// CScreensaverSharedDataMonitor::DeteleSubscriber
// -----------------------------------------------------------------------------
//
void CScreensaverSharedDataMonitor::DeleteSubscriber( CSubscriber*& aSubscriber )
    {
    if ( aSubscriber )
        {
        aSubscriber->StopSubscribe();
        }
    delete aSubscriber;
    }

// -----------------------------------------------------------------------------
// CScreensaverSharedDataMonitor::HandlePreviewModeChanged
// Handles preview mode property key change. If key is changed to 1,
// preview mode is started
// -----------------------------------------------------------------------------
//
TInt CScreensaverSharedDataMonitor::HandlePreviewModeChanged(TAny *aPtr)
    {
    CScreensaverSharedDataMonitor *data = STATIC_CAST(CScreensaverSharedDataMonitor*, aPtr);

    if ( data->iData->ScreensaverPreviewMode() == 1)
        {
        TRAP_IGNORE( data->Model().StartPreviewModeL() );
        }
    
    return KErrNone;
    }


// -----------------------------------------------------------------------------
// CScreensaverSharedDataMonitor::HandleMMCStateChanged
// Handles MMC state change callback. If current plugin is loaded from
// MMC, screensaver defaults to date & time when MMC removed
// -----------------------------------------------------------------------------
//
TInt CScreensaverSharedDataMonitor::HandleMMCStateChanged(TAny* aPtr)
    {
    STATIC_CAST(CScreensaverSharedDataMonitor*, aPtr)->Model().StopScreenSaver();
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// CScreensaverSharedDataMonitor::HandleUSBStateChanged
// Handles USB state change callback. If current plugin is loaded from
// MMC, screensaver defaults to date & time when USB attached
// -----------------------------------------------------------------------------
//
TInt CScreensaverSharedDataMonitor::HandleUSBStateChanged(TAny* aPtr)
    {
    // Same handler as in MMC removal, parameter tells it's because of USB
    STATIC_CAST(CScreensaverSharedDataMonitor*, aPtr)->Model().StopScreenSaver();
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// CScreensaverSharedDataMonitor::HandleKeyguardStateChanged
// Handles keyguards status change callback.
// When keys become locked, screensaver timeout is shortened.
// -----------------------------------------------------------------------------
//
TInt CScreensaverSharedDataMonitor::HandleKeyguardStateChanged(TAny* aPtr)
    {
    // If keyguard just became unlocked, inform model so that
    // short timeout use is reset. Otherwise there might be a situation
    // where short timeout was in use, user opened keys, did something
    // without letting the device idle for short timeout period and
    // locked keys again. Then short timeout would remain in use without this
    // notification.
    // Also inform of keys locked, in case Screensaver is running this
    // happened because of automatic keyguard fired, and screensaver
    // should update the display to show the keyguard indicator
    CScreensaverSharedDataMonitor* _this =
        STATIC_CAST(CScreensaverSharedDataMonitor*, aPtr);

    if ( _this->iData->IsKeyguardOn() )
        {
        // Keys locked - if screensaver is running, this was caused by
        // automatic keyguard and screensaver should refresh the view
        // to show the keylock indicator
        if ( _this->Model().ScreenSaverIsOn() )
            {
            _this->View()->UpdateAndRefresh();
            }
        }

    return KErrNone;
    }

// -----------------------------------------------------------------------------
// CScreensaverSharedDataMonitor::HandleCallStateChanged
// Handles call state change callback. If call state changes,
// screensaver is stopped
// -----------------------------------------------------------------------------
//
TInt CScreensaverSharedDataMonitor::HandleCallStateChanged(TAny* aPtr)
    {
#ifdef RD_UI_TRANSITION_EFFECTS_PHASE2
    // Prevent fullscreen transition from screensaver on incoming call
    CAknTransitionUtils::SetData( KScreensaverCallStateChange, (TAny*)1 );
#endif

    STATIC_CAST(CScreensaverSharedDataMonitor*, aPtr)->Model().StopScreenSaver();
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// CScreensaverSharedDataMonitor::HandleShuttingDownStateChanged
// -----------------------------------------------------------------------------
//
TInt CScreensaverSharedDataMonitor::HandleShuttingDownStateChanged( TAny* /*aPtr*/ )
    {
    TInt startupState = -1;
    
    RProperty::Get( KPSUidStartup, KPSGlobalSystemState, startupState );
    
    if( startupState == ESwStateShuttingDown )
        {
        RProperty::Set( KPSUidScreenSaver, KScreenSaverAllowScreenSaver, KSystemShuttingdown);
        }
    
    return KErrNone;
    }

// End of file