startupservices/startupanimation/sanimctrl/src/sanimstartupctrl.cpp
changeset 0 2e3d3ce01487
child 13 096dad6e50a9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/startupservices/startupanimation/sanimctrl/src/sanimstartupctrl.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,521 @@
+/*
+* Copyright (c) 2007,2008 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 of CSAnimStartupCtrl class
+*
+*/
+
+
+#include <aknappui.h>
+#include <aknsoundsystem.h>
+#include <centralrepository.h>
+#include <featmgr.h>
+#include <MediatorDomainUIDs.h>
+#include <Profile.hrh>
+#include <ProfileEngineSDKCRKeys.h>
+#include "sanimengine.h"
+#include <SecondaryDisplay/SecondaryDisplayStartupAPI.h>
+
+#include "sanimstartupctrl.h"
+#include "trace.h"
+
+const TInt KMinVolume( 0 );  /** Minimum allowed volume level. */
+const TInt KMaxVolume( 10 ); /** Maximum allowed volume level. */
+
+const TInt KDefaultRepeatCount( 1 ); /** Default repeat count for animation and tone. */
+const TInt KDefaultVolumeRamp( 0 );  /** Default volume ramp value in microseconds. */
+
+static const TInt KMediatorTimeout( 1000000 ); /** Default timeout for Mediator commands. */
+
+// ======== LOCAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// FileExists
+//
+// ---------------------------------------------------------------------------
+//
+static TBool FileExists( RFs& aFs, const TDesC& aPath )
+    {
+    FUNC_LOG;
+    INFO_1( "File name: %S", &aPath );
+
+    if ( aPath.Length() > 0 )
+        {
+        RFile file;
+        TInt errorCode = file.Open( aFs, aPath, EFileRead | EFileShareReadersOnly );
+        ERROR( errorCode, "File open failed" );
+
+        file.Close();
+        return ( errorCode == KErrNone );
+        }
+
+    return EFalse;
+    }
+
+
+// ---------------------------------------------------------------------------
+// IsSilentL
+//
+// ---------------------------------------------------------------------------
+//
+static TBool IsSilentL()
+    {
+    FUNC_LOG;
+
+    TBool retVal = ETrue;
+    CRepository* repository = CRepository::NewLC( KCRUidProfileEngine );
+
+    TInt type( EProfileRingingTypeSilent );
+    User::LeaveIfError( repository->Get( KProEngActiveRingingType, type ) );
+
+    INFO_1( "Ringing type: %d", type );
+
+    if ( type != EProfileRingingTypeSilent )
+        {
+        TInt volume( 0 );
+        User::LeaveIfError(
+            repository->Get( KProEngActiveRingingVolume, volume ) );
+
+        INFO_1( "Ringing volume: %d", volume );
+
+        if ( volume != 0 && volume != EProfileRingingVolumeLevel1 )
+            {
+            retVal = EFalse;
+            }
+        }
+
+    CleanupStack::PopAndDestroy( repository );
+
+    INFO_1( "Is silent: %d", retVal );
+
+    return retVal;
+    }
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CSAnimStartupCtrl::NewL
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CSAnimStartupCtrl* CSAnimStartupCtrl::NewL(
+    const TRect& aRect,
+    const CCoeControl& aContainer )
+    {
+    FUNC_LOG;
+
+    CSAnimStartupCtrl* self = new( ELeave ) CSAnimStartupCtrl;
+    CleanupStack::PushL( self );
+    self->ConstructL( aRect, aContainer );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimStartupCtrl::~CSAnimStartupCtrl
+//
+// ---------------------------------------------------------------------------
+//
+CSAnimStartupCtrl::~CSAnimStartupCtrl()
+    {
+    FUNC_LOG;
+
+    delete iCommandResponder;
+    delete iCommandInitiator;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimStartupCtrl::HasContent
+//
+// ---------------------------------------------------------------------------
+//
+TBool CSAnimStartupCtrl::HasContent() const
+    {
+    FUNC_LOG;
+
+    return iHasContent;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimStartupCtrl::Load
+//
+// ---------------------------------------------------------------------------
+//
+void CSAnimStartupCtrl::Load(
+    const TAnimationParams& aParams,
+    const TBool aPlayDefaultBeep,
+    const TInt aSyncCommand,
+    TRequestStatus& aStatus )
+    {
+    FUNC_LOG;
+
+    iPlayDefaultBeep = aPlayDefaultBeep;
+    iSyncCommand = aSyncCommand;
+
+    TRAPD( errorCode, LoadL( aParams, aStatus ) );
+    ERROR( errorCode, "Failed to load" );
+    if ( errorCode != KErrNone )
+        {
+        TRequestStatus* status = &aStatus;
+        User::RequestComplete( status, errorCode );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimStartupCtrl::Start
+//
+// ---------------------------------------------------------------------------
+//
+void CSAnimStartupCtrl::Start( TRequestStatus& aStatus )
+    {
+    FUNC_LOG;
+
+    aStatus = KRequestPending;
+
+    if ( !iClientStatus )
+        {
+        if ( !HasContent() )
+            {
+            TRequestStatus* status = &aStatus;
+            User::RequestComplete( status, KErrNone );
+            }
+        else if ( iCommandInitiator )
+            {
+            INFO_1( "Secondary display data: %d", iSyncCommand );
+
+            iClientStatus = &aStatus;
+            iWaitingForSyncResponse = ETrue;
+            TInt errorCode = iCommandInitiator->IssueCommand(
+                KMediatorSecondaryDisplayDomain,
+                SecondaryDisplay::KCatStartup,
+                SecondaryDisplay::ECmdStartupSync,
+                TVersion( 0, 0, 0 ),
+                TPckgBuf<TInt>( iSyncCommand ) );
+            if ( errorCode != KErrNone )
+                {
+                ERROR( errorCode, "Failed issue command" );
+
+                iClientStatus = &aStatus;
+                StartAnimation();
+                }
+            }
+        else
+            {
+            iClientStatus = &aStatus;
+            StartAnimation();
+            }
+        }
+    else
+        {
+        TRequestStatus* status = &aStatus;
+        User::RequestComplete( status, KErrNotReady );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimStartupCtrl::HandlePointerEventL
+//
+// ---------------------------------------------------------------------------
+void CSAnimStartupCtrl::HandlePointerEventL( const TPointerEvent& aPointerEvent )
+    {
+    FUNC_LOG;
+
+    if ( aPointerEvent.iType == TPointerEvent::EButton1Down ||
+         aPointerEvent.iType == TPointerEvent::EButton2Down ||
+         aPointerEvent.iType == TPointerEvent::EButton3Down )
+        {
+        INFO( "Pointer event -> cancel animation" );
+
+        Cancel();
+        }
+
+    CCoeControl::HandlePointerEventL( aPointerEvent );
+    }
+
+
+// ----------------------------------------------------------------------------
+// CSAnimStartupCtrl::MediatorCommandL
+//
+// ----------------------------------------------------------------------------
+//
+void CSAnimStartupCtrl::MediatorCommandL(
+    TUid aDomain,
+    TUid aCategory,
+    TInt aCommandId,
+    TVersion /*aVersion*/,
+    const TDesC8& /*aData*/ )
+    {
+    FUNC_LOG;
+
+    if ( aCommandId == SecondaryDisplay::ECmdStartupPhaseSkip )
+        {
+        INFO( "Command ECmdStartupPhaseSkip -> cancel animation" );
+
+        Cancel();
+        }
+
+    if ( iCommandResponder )
+        {
+        iCommandResponder->IssueResponse(
+            aDomain, aCategory, aCommandId, KErrNone, TPckgBuf<TInt>( 0 ) );
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// CSAnimStartupCtrl::CancelMediatorCommand
+//
+// ----------------------------------------------------------------------------
+//
+void CSAnimStartupCtrl::CancelMediatorCommand(
+    TUid /*aDomain*/,
+    TUid /*aCategory*/,
+    TInt /*aCommandId*/ )
+    {
+    FUNC_LOG;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CSAnimStartupCtrl::CommandResponseL
+//
+// ----------------------------------------------------------------------------
+//
+void CSAnimStartupCtrl::CommandResponseL(
+    TUid aDomain,
+    TUid aCategory,
+    TInt aCommandId,
+    TInt /*aStatus*/,
+    const TDesC8& /*aData*/ )
+    {
+    FUNC_LOG;
+    INFO_3( "Domain: 0x%08x, category: 0x%08x, %d", aDomain.iUid, aCategory.iUid, aCommandId );
+
+    if ( aDomain == KMediatorSecondaryDisplayDomain &&
+         aCategory == SecondaryDisplay::KCatStartup &&
+         aCommandId == SecondaryDisplay::ECmdStartupSync &&
+         iWaitingForSyncResponse )
+        {
+        iWaitingForSyncResponse = EFalse;
+        StartAnimation();
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimStartupCtrl::CSAnimStartupCtrl
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CSAnimStartupCtrl::CSAnimStartupCtrl()
+  : iPlayDefaultBeep( EFalse ),
+    iSyncCommand( 0 ),
+    iHasContent( EFalse ),
+    iWaitingForSyncResponse( EFalse )
+    {
+    FUNC_LOG;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimStartupCtrl::ConstructL
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CSAnimStartupCtrl::ConstructL(
+    const TRect& aRect,
+    const CCoeControl& aContainer )
+    {
+    FUNC_LOG;
+
+    FeatureManager::InitializeLibL();
+    TBool secondaryDisplaySupported =
+        FeatureManager::FeatureSupported( KFeatureIdCoverDisplay );
+    FeatureManager::UnInitializeLib();
+
+    if ( secondaryDisplaySupported )
+        {
+        iCommandInitiator = CMediatorCommandInitiator::NewL( this );
+        iCommandResponder = CMediatorCommandResponder::NewL( this );
+
+        TInt errorCode = iCommandResponder->RegisterCommand(
+            KMediatorSecondaryDisplayDomain,
+            SecondaryDisplay::KCatStartup,
+            SecondaryDisplay::ECmdStartupPhaseSkip,
+            TVersion( 0, 0, 0 ),
+            ECapabilitySwEvent,
+            KMediatorTimeout );
+        ERROR( errorCode, "Failed to register command ECmdStartupPhaseSkip with mediator" );
+        User::LeaveIfError( errorCode );
+        }
+
+    CSAnimCtrl::BaseConstructL( aRect, aContainer );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimStartupCtrl::LoadL
+//
+// ---------------------------------------------------------------------------
+//
+void CSAnimStartupCtrl::LoadL(
+    const TAnimationParams& aParams,
+    TRequestStatus& aStatus )
+    {
+    FUNC_LOG;
+
+    CRepository* repository = CRepository::NewLC( aParams.iRepositoryUid );
+
+    TPath img;
+    ReadFileNameL(
+        iCoeEnv->FsSession(), *repository, aParams.iAnimationPathKey, img );
+    TTimeIntervalMicroSeconds32 frameDelay( 0 );
+    TInt scaling( 0 );
+    if ( img.Length() > 0 )
+        {
+        frameDelay = ReadIntValue( *repository, aParams.iFrameDelayKey );
+        scaling = ReadIntValue( *repository, aParams.iEnableScalingKey );
+        }
+
+    TPath tone;
+    TInt volume = ReadVolume( *repository, aParams.iVolumeKey );
+    if ( volume > 0 )
+        {
+        ReadFileNameL(
+            iCoeEnv->FsSession(), *repository, aParams.iTonePathKey, tone );
+
+        iPlayDefaultBeep = iPlayDefaultBeep && tone.Length() <= 0;
+        }
+
+    iHasContent = ( img.Length() > 0 || tone.Length() > 0 );
+
+    CleanupStack::PopAndDestroy( repository );
+
+    CSAnimCtrl::Load(
+        img, frameDelay, scaling, KDefaultRepeatCount,
+        tone, volume, KDefaultVolumeRamp, KDefaultRepeatCount,
+        aStatus );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimStartupCtrl::ReadFileNameL
+//
+// ---------------------------------------------------------------------------
+//
+void CSAnimStartupCtrl::ReadFileNameL(
+    RFs& aFs,
+    CRepository& aRepository,
+    const TUint32 aKey,
+    TDes& aBuf )
+    {
+    FUNC_LOG;
+
+    TInt errorCode = aRepository.Get( aKey, aBuf );
+    ERROR_1( errorCode, "Failed to read value of key %d", aKey );
+    if ( errorCode != KErrNone || !FileExists( aFs, aBuf ) )
+        {
+        aBuf = KNullDesC;
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimStartupCtrl::ReadVolume
+//
+// ---------------------------------------------------------------------------
+//
+TInt CSAnimStartupCtrl::ReadVolume(
+    CRepository& aRepository,
+    const TUint32 aKey )
+    {
+    FUNC_LOG;
+
+    TInt volume( 0 );
+    TInt errorCode = aRepository.Get( aKey, volume );
+    ERROR( errorCode, "Failed to get volume level from central repository" );
+
+    if ( volume > 0 )
+        {
+        TBool isSilent = ETrue;
+        TRAPD_ERR( errorCode, isSilent = IsSilentL() );
+        ERROR( errorCode, "Failed to silent info" );
+        if ( isSilent )
+            {
+            volume = 0;
+            }
+        }
+
+    TInt retVal = Max( KMinVolume, Min( volume, KMaxVolume ) );
+
+    INFO_1( "Volume: %d", retVal );
+
+    return retVal;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimStartupCtrl::ReadIntValue
+//
+// ---------------------------------------------------------------------------
+//
+TInt CSAnimStartupCtrl::ReadIntValue(
+    CRepository& aRepository,
+    const TUint32 aKey )
+    {
+    FUNC_LOG;
+
+    TInt value( 0 );
+    TInt errorCode = aRepository.Get( aKey, value );
+    ERROR_1( errorCode, "Failed to read value of key 0x%08x from central repository", aKey );
+    return value;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimStartupCtrl::StartAnimation
+//
+// ---------------------------------------------------------------------------
+//
+void CSAnimStartupCtrl::StartAnimation()
+    {
+    FUNC_LOG;
+
+    if ( iClientStatus )
+        {
+        iBackgroundColour = iEngine->BackroundColour();
+
+        if ( iPlayDefaultBeep )
+            {
+            INFO( "Default startup beep requested" );
+
+            CAknAppUi* appUi = static_cast<CAknAppUi*>( iEikonEnv->EikAppUi() );
+            if ( appUi )
+                {
+                INFO( "Playing default startup beep" );
+
+                appUi->KeySounds()->PlaySound( EAvkonSIDPowerOnTone );
+                }
+            }
+
+        iEngine->Start( *iClientStatus );
+        iClientStatus = NULL;
+        }
+    }
+