coreapplicationuis/SysAp/Src/SysApShutdownAnimation.cpp
changeset 0 2e3d3ce01487
child 33 332e7bf3b42f
child 51 50b444048a8d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/coreapplicationuis/SysAp/Src/SysApShutdownAnimation.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,618 @@
+/*
+* Copyright (c) 2005-2007 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: 
+*     This class is the container class of the CSysApShutdownAnimation.
+*     Is used to show welcome animation.
+*
+*/
+
+
+
+#ifdef RD_STARTUP_ANIMATION_CUSTOMIZATION
+
+#include <aknappui.h>
+#include <SecondaryDisplay/SecondaryDisplayStartupAPI.h>
+#include <startupdomaincrkeys.h>
+
+#include "SysApShutdownAnimation.h"
+#include "SysApShutdownImage.h"
+#include "SysAp.hrh"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::NewL
+//
+// ---------------------------------------------------------------------------
+//
+CSysApShutdownAnimation* CSysApShutdownAnimation::NewL( CSysApShutdownImage& aView )
+    {
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::NewL()") ) );
+
+    CSysApShutdownAnimation* self =
+        new( ELeave ) CSysApShutdownAnimation( aView );
+
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::NewL(): End") ) );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::~CSysApShutdownAnimation
+//
+// ---------------------------------------------------------------------------
+//
+CSysApShutdownAnimation::~CSysApShutdownAnimation()
+    {
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::~CSysApShutdownAnimation()") ) );
+
+    Cancel();
+
+    if ( iCtrl )
+        {
+        iCtrl->Cancel();
+        iView.RemoveComponent();
+        delete iCtrl;
+        }
+
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::~CSysApShutdownAnimation(): end") ) );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::HasContent
+//
+// ---------------------------------------------------------------------------
+//
+TBool CSysApShutdownAnimation::HasContent() const
+    {
+    if ( iCtrl ) return iCtrl->HasContent();
+    return EFalse;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::Play
+//
+// ---------------------------------------------------------------------------
+//
+void CSysApShutdownAnimation::Play( const TCallBack& aCallBack )
+    {
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::Load()") ) );
+
+    if ( !IsActive() )
+        {
+        if ( iCtrl )
+            {
+            delete iCtrl;
+            iCtrl = NULL;
+            }
+
+        iAvkonAppUi->StatusPane()->MakeVisible( EFalse );
+        iView.SetRect( iAvkonAppUi->ApplicationRect() );
+        iState = ELoading;
+
+        TRAPD( errorCode, iCtrl = CSAnimStartupCtrl::NewL( iView.Rect(), iView ) );
+        if ( errorCode == KErrNone )
+            {
+            iCallBack = aCallBack;
+
+            iCtrl->SetRect( iView.Rect() );
+
+            CSAnimStartupCtrl::TAnimationParams params;
+            params.iRepositoryUid = KCRUidStartupConf;
+                params.iAnimationPathKey = KShutdownAnimationPath;
+                params.iFrameDelayKey = KShutdownAnimationFrameDelay;
+                params.iEnableScalingKey = KShutdownAnimationScaling;
+                params.iTonePathKey = KShutdownTonePath;
+                params.iVolumeKey = KShutdownToneVolume;
+
+            iCtrl->Load(
+                params,
+                EFalse,
+                SecondaryDisplay::EStartShutdownAnimation,
+                iStatus );
+            SetActive();
+            }
+        else
+            {
+            TRACES( RDebug::Print(_L( "CSysApShutdownAnimation: failed to create animation control: %d"), errorCode ) );
+
+            aCallBack.CallBack();
+            }
+        }
+
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::Load(): End") ) );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::DoCancel
+//
+// ---------------------------------------------------------------------------
+//
+void CSysApShutdownAnimation::DoCancel()
+    {
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::DoCancel()") ) );
+
+    if ( iCtrl ) iCtrl->Cancel();
+    iCallBack.CallBack();
+
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::DoCancel(): End") ) );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::RunL
+//
+// ---------------------------------------------------------------------------
+//
+void CSysApShutdownAnimation::RunL()
+    {
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::RunL(): iStatus = %d"), iStatus.Int() ) );
+
+    if ( iState == ELoading )
+        {
+        iState = EPlaying;
+        iView.SetComponent( *iCtrl );
+        iCtrl->Start( iStatus );
+        SetActive();
+        }
+    else if ( iState == EPlaying )
+        {
+        iState = EFinished;
+        iCallBack.CallBack();
+        }
+
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::RunL(): End") ) );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::CSysApShutdownAnimation
+//
+// ---------------------------------------------------------------------------
+//
+CSysApShutdownAnimation::CSysApShutdownAnimation( CSysApShutdownImage& aView )
+  : CActive( EPriorityStandard ),
+    iView( aView ),
+    iState( EInitial )
+    {
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::CSysApShutdownAnimation()") ) );
+
+    CActiveScheduler::Add( this );
+
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::CSysApShutdownAnimation(): End") ) );
+    }
+
+
+#else // RD_STARTUP_ANIMATION_CUSTOMIZATION
+
+// INCLUDE FILES
+#include <aknappui.h>
+#include <aknnotewrappers.h>
+#include <barsread.h> //use of TResourceReader
+#include <aknbitmapanimation.h>
+#include <ConeResLoader.h>
+#include "SysApShutdownAnimation.h"
+#include <SysApShutdownAnimation.rsg>
+#include "SysAp.hrh"
+#include "SysApAppUi.h"
+#include "SysApShutdownTone.h"
+
+// CONSTANTS
+_LIT( KShutdownAnimationResource, "z:sysapshutdownanimation.rsc");
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+void CSysApShutdownAnimation::ConstructL()
+    {
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::ConstructL()") ) );
+
+    CreateWindowL();
+
+    iAnimTimer = CPeriodic::NewL( EPriorityNormal );
+
+    iAvkonAppUi->StatusPane()->MakeVisible(EFalse);
+
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation : animation loading started") ) );
+    iAnim = CAknBitmapAnimation::NewL();
+    iAnim->SetContainerWindowL( *this );
+    iAnim->SetScaleModeForAnimationFrames(EAspectRatioPreservedAndUnusedSpaceRemoved);
+    TResourceReader rr;
+    RConeResourceLoader loader( *iCoeEnv );
+
+    TParse* fp = new(ELeave) TParse();
+    fp->Set(KShutdownAnimationResource, &KDC_APP_RESOURCE_DIR, NULL);
+    #ifdef _DEBUG
+        RDebug::Print( _L( "CSysApShutdownAnimation : Operator animation resource path: %S"), &fp->FullName() );
+    #endif
+    TFileName name( fp->FullName() );
+    delete fp;
+
+    TInt fileError = loader.Open( name );
+    if ( fileError == KErrNone )
+        {
+        CleanupClosePushL( loader );
+        iCoeEnv->CreateResourceReaderLC(rr, R_SHUTDOWN_ANIM);
+        TRAPD(err, iAnim->ConstructFromResourceL( rr ));
+        if( err == KErrNone )
+            {
+            TResourceReader timeReader;
+            iCoeEnv->CreateResourceReaderLC(timeReader, R_ANIM_DURATION);
+            iShowingTime = timeReader.ReadInt16();
+            #ifdef _DEBUG
+                RDebug::Print( _L( "CSysApShutdownAnimation : Operator animation showing time: %d"), iShowingTime );
+            #endif
+            CleanupStack::PopAndDestroy(); // pop timeReader
+
+            TRACES( RDebug::Print( _L( "CSysApShutdownAnimation::ConstructL: Initialise shutdown tone") ) );
+
+            if ( iShowingTime > 0 )
+                {
+                // Initialize shutdown tone. Animation can be shown without any tone, so trap all leaves.
+                // To maintain binary compatibility , check resource availability first to avoid panic in case tone is missing.
+                TBool isTonePathAvailable(EFalse);
+                TRAP(err, isTonePathAvailable = iCoeEnv->IsResourceAvailableL(R_SHUTDOWN_TONE_PATH));
+                if ( isTonePathAvailable )
+                    {
+                    HBufC* tonePath = NULL;
+                    TRAP(err, tonePath = iCoeEnv->AllocReadResourceL(R_SHUTDOWN_TONE_PATH));
+                    if ( err != KErrNone )
+                        {
+                        TRACES( RDebug::Print( _L( "CSysApShutdownAnimation::ConstructL: Unable to allocate resource for shutdown tone: %d"), err ) );
+                        }
+                    else
+                        {
+                        TRAP(err, iShutdownTone = CSysApShutdownTone::NewL(*tonePath, this));
+                        if ( err != KErrNone )
+                            {
+                            TRACES( RDebug::Print( _L( "CSysApShutdownAnimation::ConstructL: Unable to initialize shutdown tone: %d"), err ) );
+                            }
+                        }
+                    delete tonePath;
+                    }
+                else
+                    {
+                    TRACES( RDebug::Print( _L( "CSysApShutdownAnimation::ConstructL: Resource not available for shutdown tone: %d"), err ) );
+                    }
+                }
+            }
+        else
+            {
+            iShowingTime = 0;
+            TRACES( RDebug::Print(_L( "CSysApShutdownAnimation : animation loading failed") ) );
+            }
+
+        CleanupStack::PopAndDestroy(); //pop rr
+        TRACES( RDebug::Print(_L( "CSysApShutdownAnimation : animation loading ended") ) );
+
+        CleanupStack::PopAndDestroy(); //pop loader
+        }
+    else
+        {
+        TRACES( RDebug::Print(_L( "CSysApShutdownAnimation : resource file loading failed") ) );
+        }
+
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation : ConstructL ended") ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CSysApShutdownAnimation::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CSysApShutdownAnimation* CSysApShutdownAnimation::NewL( CSysApAppUi* aSysApAppUi)
+    {
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::NewL()") ) );
+    CSysApShutdownAnimation* self = new (ELeave) CSysApShutdownAnimation( aSysApAppUi );
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// ---------------------------------------------------------
+// CSysApShutdownAnimation::CSysApShutdownAnimation()
+// ---------------------------------------------------------
+CSysApShutdownAnimation::CSysApShutdownAnimation( CSysApAppUi* aSysApAppUi ) :
+    iSysApAppUi( aSysApAppUi ),
+    iAnimationShowing( EFalse ),
+    iAnimationCancelled ( EFalse ),
+    iShutdownTone( NULL ),
+    iHandleNextKey( ETrue )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::StartL()
+// ---------------------------------------------------------------------------
+void CSysApShutdownAnimation::StartL( TBool iShortPowerKeyPressShutdown )
+    {
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::StartL() begin: iShortPowerKeyPressShutdown=%d"),
+                          iShortPowerKeyPressShutdown ) );
+
+    ControlEnv()->WsSession().Flush(); // force draw of the context
+
+    SetRect(iAvkonAppUi->ApplicationRect());
+    iAnim->SetPosition( TPoint( (iAvkonAppUi->ApplicationRect().Width()/2) - (iAnim->BitmapAnimData()->Size().iWidth/2),
+                                (iAvkonAppUi->ApplicationRect().Height()/2) - (iAnim->BitmapAnimData()->Size().iHeight/2) ) );
+
+    ActivateL();
+
+    iReadyForToneSync = ETrue;
+
+    // If the device is switched off with a long power key press, the next event key must be ignored as it is leaked from application class
+    if ( !iShortPowerKeyPressShutdown )
+        {
+        iHandleNextKey = EFalse;
+        }
+
+    if ( iShutdownTone )
+        {
+        // Shutdown tone takes a while to initialize before it can be played, so synchronize here.
+        if ( iToneReady )
+            {
+            // Tone already ready, so continue start
+            ContinueStart();
+            }
+        else
+            {
+            TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::StartL() - Waiting for shutdown tone to finish initializing") ) );
+            }
+        }
+    else
+        {
+        // No tone, so pretend that sync is done
+        ContinueStart();
+        }
+
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::StartL() end") ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::ContinueStart()
+// ---------------------------------------------------------------------------
+void CSysApShutdownAnimation::ContinueStart()
+    {
+    iAnimationShowing = ETrue;
+
+    if ( iShutdownTone )
+        {
+        TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::ContinueStart() Playing the tone") ) );
+        iShutdownTone->Play();
+        }
+
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::ContinueStart() Start animation") ) );
+    TRAPD(err, iAnim->StartAnimationL());
+
+    if ( err != KErrNone )
+        {
+        TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::ContinueStart() Starting animation failed") ) );
+        }
+
+    iSysApAppUi->StartAnimTiming();
+    }
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::ToneReady()
+// ---------------------------------------------------------------------------
+void CSysApShutdownAnimation::ToneReady()
+    {
+    // If animation has been canceled, do not continue
+    if ( !iAnimationCancelled )
+        {
+        iToneReady = ETrue;
+
+        if ( iReadyForToneSync )
+            {
+            TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::ToneReady() Tone is ready, continue animation start") ) );
+            ContinueStart();
+            }
+        else
+            {
+            TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::ToneReady() Tone is ready before animation") ) );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::DoDrawingL()
+// ---------------------------------------------------------------------------
+void CSysApShutdownAnimation::DoDrawingL() const
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::~CSysApShutdownAnimation()
+// ---------------------------------------------------------------------------
+CSysApShutdownAnimation::~CSysApShutdownAnimation()
+    {
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::~CSysApShutdownAnimation() begin") ) );
+
+    if( iAnim )
+        {
+        if( iAnimationShowing )
+            {
+            iAnim->CancelAnimation();
+            TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::~CSysApShutdownAnimation() animation cancelled") ) );
+            }
+        }
+    delete iAnim;
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::~CSysApShutdownAnimation() iAnim deleted") ) );
+
+    if (iBackgroundBitmap)
+        {
+        delete iBackgroundBitmap;
+        TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::~CSysApShutdownAnimation() iBackgroundBitmap deleted") ) );
+        }
+
+    if( iAnimTimer )
+        {
+        iAnimTimer->Cancel();
+        TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::~CSysApShutdownAnimation() timer cancelled") ) );
+        }
+    delete iAnimTimer;
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::~CSysApShutdownAnimation() iAnimTimer deleted") ) );
+
+    delete iShutdownTone;
+
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::~CSysApShutdownAnimation() end") ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::ComponentControl(TInt aIndex)
+// ---------------------------------------------------------------------------
+CCoeControl* CSysApShutdownAnimation::ComponentControl(TInt aIndex) const
+    {
+    switch ( aIndex )
+        {
+        case 0:
+            {
+            return iAnim;
+            }
+        default:
+            {
+            return NULL;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::CountComponentControls()
+// ---------------------------------------------------------------------------
+TInt CSysApShutdownAnimation::CountComponentControls() const
+    {
+    return iAnim ? 1 : 0; // return nbr of controls inside this container
+    }
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::Draw(const TRect& aRect) const
+// ---------------------------------------------------------------------------
+void CSysApShutdownAnimation::Draw(const TRect& ) const
+    {
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::Draw()") ) );
+    TRAPD(err, DoDrawingL());
+    if (err != KErrNone)
+        {
+        TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::DoDrawingL() error: %d"), err ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::ShowingTime()
+// ---------------------------------------------------------------------------
+TInt CSysApShutdownAnimation::ShowingTime()
+    {
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::ShowingTime() returns: %d"), iShowingTime ) );
+    return iShowingTime;
+    }
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::SizeChanged()
+// ---------------------------------------------------------------------------
+void CSysApShutdownAnimation::SizeChanged()
+    {
+    if( iAnim )
+        {
+        iAnim->SetRect(Rect());
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::EndAnimation()
+// ---------------------------------------------------------------------------
+void CSysApShutdownAnimation::EndAnimation()
+    {
+    if( iAnim && iAnimationShowing && !iAnimationCancelled )
+        {
+        TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::EndAnimation() Cancel animation.")) );
+        iAnim->CancelAnimation();
+        iAnimationCancelled = ETrue;
+        iAnimationShowing = EFalse;
+        // Stop shutdown tone
+        if ( iShutdownTone )
+            {
+            iShutdownTone->Stop();
+            }
+
+        // Continue shutdown
+        iAnimTimer->Start( 1000, 1000, TCallBack( iSysApAppUi->DoStopAnimTiming, iSysApAppUi ) );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::HandleControlEventL(...)
+// ---------------------------------------------------------------------------
+void CSysApShutdownAnimation::HandleControlEventL(
+        CCoeControl* ,
+        TCoeEvent )
+    {
+    //pure virtual from MCoeControlObserver
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::HandleControlEventL()") ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CSysApShutdownAnimation::OfferKeyEventL(...)
+// ---------------------------------------------------------------------------
+TKeyResponse CSysApShutdownAnimation::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType )
+    {
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::OfferKeyEventL() begin: aType=%d, iHandleNextKey=%d"), aType, iHandleNextKey ) );
+
+    // This block is for filtering the key events that are leaked from CSysApAppUi before the animation is active
+    // e.g. when device is shutdown with a long press of power key
+    if ( !iHandleNextKey )
+        {
+        if ( aType == EEventKeyDown || aType == EEventKeyUp )
+            {
+            iHandleNextKey = ETrue;
+            }
+        }
+
+    if ( aType == EEventKey )
+        {
+        if ( !iSysApAppUi->ResourcesFreed() )
+            {
+            TBool isDeviceModeKey = iSysApAppUi->IsDeviceModeKey( aKeyEvent );
+
+            // aType is used for filtering key events that are received when this control is visible
+            if( iAnimationShowing && !iAnimationCancelled && !isDeviceModeKey && iHandleNextKey )
+                {
+                EndAnimation();
+                iSysApAppUi->NotifyShutdownAnimationSkip();
+                }
+
+            if ( isDeviceModeKey ) // device mode keys are not consumed, so that application class is able to receive them
+                {
+                TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::OfferKeyEventL() end: return EKeyWasNotConsumed")) );
+                return EKeyWasNotConsumed;
+                }
+            }
+        else  // SysAp has relased almost all the allocations, just cancel
+            {
+            EndAnimation();
+            }
+        }
+    TRACES( RDebug::Print(_L( "CSysApShutdownAnimation::OfferKeyEventL() end: return EKeyWasConsumed")) );
+
+    return EKeyWasConsumed;
+    }
+
+#endif // RD_STARTUP_ANIMATION_CUSTOMIZATION
+
+//  End of File