diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/notifsrc/AknSoftNotifier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/notifsrc/AknSoftNotifier.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,372 @@ +/* +* Copyright (c) 2002-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: +* +*/ + +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif +#include "AknSoftNotifier.h" +#include +#include +#include +#include +#include "AknSoftNoteConsts.h" + +const TInt KBufferGranularity = 128; +const TInt KGlobalNoteTextLength = 256; + + +#ifdef RD_UI_TRANSITION_EFFECTS_POPUPS +#include +#include +#include + + +class CWait; +const TInt KNoteDelayToIdleState = 450000; // 0,45s. + +/* +* AknSoftNotifier's extension class +*/ +NONSHARABLE_CLASS(CAknSoftNotifierExt): public CBase + { + public: + static CAknSoftNotifierExt* NewL(); + ~CAknSoftNotifierExt(); + void ShowNotifsDelayed( TBool aShow ); + void SetNotifier( CAknSoftNotifier* aNotifier ); + void CancelNotifDelay(); + + private: // Methods + CAknSoftNotifierExt(); + void ConstructL(); + TInt DoShowNotifs(); + + private: // Data + CAknSoftNotifier* iNotifier; + CWait* iWait; + TBool iNotifsShowState; + + public: + friend class CWait; + + + }; + +/* +* Class used from CAknSoftNotifierExt to create +* small delay when entering idle state +* Delay is needed for soft notification transition to be shown +*/ +NONSHARABLE_CLASS(CWait) : public CTimer + { + public: + static CWait* NewL(); + void Wait( CAknSoftNotifierExt* aExt, TInt aTimeToWait ); + private: + CWait(); + void ConstructL(); + void RunL(); + private: + CAknSoftNotifierExt* iExt; + }; + + +CWait* CWait::NewL() + { + CWait * self = new(ELeave) CWait; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +void CWait::Wait( CAknSoftNotifierExt* aExt, TInt aTimeToWait ) + { + iExt = aExt; + After(aTimeToWait); + } + +CWait::CWait() : CTimer(CActive::EPriorityIdle) + { + CActiveScheduler::Add(this); + } + +void CWait::ConstructL() + { + CTimer::ConstructL(); + } + +void CWait::RunL() + { + TInt error = iExt->DoShowNotifs(); + User::LeaveIfError( error ); + } + + +CAknSoftNotifierExt* CAknSoftNotifierExt::NewL() + { + CAknSoftNotifierExt * self = new(ELeave) CAknSoftNotifierExt; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +CAknSoftNotifierExt::~CAknSoftNotifierExt() + { + delete iWait; + iWait = NULL; + } + +void CAknSoftNotifierExt::ShowNotifsDelayed( TBool aShow ) + { + iNotifsShowState = aShow; + iWait->Cancel(); + + if( aShow && iWait ) + { + iWait->Wait( this, KNoteDelayToIdleState ); + } + else + { + // no delay when exiting idle state + iWait->Wait( this, 0 ); + } + } + +void CAknSoftNotifierExt::SetNotifier( CAknSoftNotifier* aNotifier ) + { + iNotifier = aNotifier; + } + +void CAknSoftNotifierExt::CancelNotifDelay() + { + iWait->Cancel(); + } + +CAknSoftNotifierExt::CAknSoftNotifierExt() + { + } + +void CAknSoftNotifierExt::ConstructL() + { + iWait = CWait::NewL(); + } + + +TInt CAknSoftNotifierExt::DoShowNotifs() + { + TRAPD( error,iNotifier->PrepareBufferL(ESetIdleState, iNotifsShowState, NULL, EFalse, ETrue)); + return error; + } + + +#endif // RD_UI_TRANSITION_EFFECTS_POPUPS + + + + + +EXPORT_C CAknSoftNotifier* CAknSoftNotifier::NewL() + { + CAknSoftNotifier* self = NewLC(); + CleanupStack::Pop(); + return self; + } + +EXPORT_C CAknSoftNotifier* CAknSoftNotifier::NewLC() + { + CAknSoftNotifier * self = new(ELeave) CAknSoftNotifier; + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +EXPORT_C CAknSoftNotifier::~CAknSoftNotifier() + { + delete iBuffer; + +#ifdef RD_UI_TRANSITION_EFFECTS_POPUPS + delete iExt; +#endif + } + +void CAknSoftNotifier::ConstructL() + { + CAknNotifyBase::ConstructL(); +#ifdef RD_UI_TRANSITION_EFFECTS_POPUPS + iExt = CAknSoftNotifierExt::NewL(); + iExt->SetNotifier( this ); +#endif + } + +EXPORT_C void CAknSoftNotifier::AddNotificationL(TAknSoftNotificationType aType, TPtrC* aText) + { + PrepareBufferL(aType, 1, aText, EFalse, ETrue); + } + +EXPORT_C void CAknSoftNotifier::AddNotificationL(TAknSoftNotificationType aType,TInt aCount) + { + PrepareBufferL(aType, aCount, NULL, EFalse, ETrue); + } + +EXPORT_C void CAknSoftNotifier::SetNotificationCountL(TAknSoftNotificationType aType, TInt aCount, + TPtrC* aText) + { + PrepareBufferL(aType, aCount, aText, EFalse, EFalse); + } + +EXPORT_C void CAknSoftNotifier::CancelSoftNotificationL(TAknSoftNotificationType aType) + { + PrepareBufferL(aType, 0, NULL, ETrue, EFalse); + } + +CAknSoftNotifier::CAknSoftNotifier() : CAknNotifyBase(KAknSoftNotificationUid) + { + } + +EXPORT_C void CAknSoftNotifier::SetIdleStateL(TBool aIdleState) + { +#ifdef RD_UI_TRANSITION_EFFECTS_POPUPS + iExt->CancelNotifDelay(); + + if( CAknTransitionUtils::TransitionsEnabled( AknTransEffect::EComponentTransitionsOff ) && + aIdleState ) + { + // Shows notes in idle with small delay when going to idle, if popup transitions + // are enabled. This is to secure that note appear transition can be seen. + iExt->ShowNotifsDelayed( aIdleState ); + } + else + { + PrepareBufferL(ESetIdleState, aIdleState, NULL, EFalse, ETrue); + } +#else + PrepareBufferL(ESetIdleState, aIdleState, NULL, EFalse, ETrue); +#endif + } + +void CAknSoftNotifier::PrepareBufferL(TAknSoftNotificationType aType, TInt aCount, TPtrC* aText, + TBool aCancel, TBool aAddCount, CAknSoftNotificationParameters* aParams) + { + delete iBuffer; + iBuffer = NULL; + + if ( aText && aText->Length() > KGlobalNoteTextLength ) + { + User::Leave( KErrTooBig ); + } + + iBuffer = CBufFlat::NewL(KBufferGranularity); + + RBufWriteStream bufStream; + bufStream.Open(*iBuffer); + + CleanupClosePushL(bufStream); + + bufStream.WriteInt32L(KAKNNOTIFIERSIGNATURE); + + bufStream.WriteUint8L(aType); + bufStream.WriteInt16L(aCount); // count + bufStream.WriteUint8L(aCancel); // iscancel + bufStream.WriteUint8L(aAddCount); // add + + if (aText) + { + bufStream << (*aText); + } + else + { + bufStream << KNullDesC(); + } + + if (aParams) + { + bufStream.WriteInt32L( aParams->iNoteResourceId); // Works as unique ID + bufStream.WriteInt16L( KAknSoftNotificationCustom ); // parameter type + + // If this sequence is changed, remeber also change the reading in notify plugin's side + bufStream.WriteInt32L(aParams->iResourceFile->Length()); + bufStream << (*aParams->iResourceFile); + bufStream.WriteInt32L(aParams->iNoteResourceId); + bufStream.WriteInt32L(aParams->iPriority); + bufStream.WriteInt32L(aParams->iSoftkeys); + bufStream.WriteInt32L(aParams->iTone); + bufStream.WriteUint32L(aParams->iViewId.iAppUid.iUid); + bufStream.WriteUint32L(aParams->iViewId.iViewUid.iUid); + bufStream.WriteUint32L(aParams->iCustomMessageId.iUid); + bufStream.WriteInt32L(aParams->iAcceptSoftKey); + + bufStream.WriteUint32L(aParams->iPluralViewId.iAppUid.iUid); + bufStream.WriteUint32L(aParams->iPluralViewId.iViewUid.iUid); + bufStream.WriteUint32L(aParams->iGroupedTextResourceId); + + if ( aParams->iViewId != KNullViewId ) + { + bufStream.WriteInt32L(aParams->iViewActivationMsg->Length()); + bufStream << (*aParams->iViewActivationMsg); + } + else + { + bufStream.WriteInt32L(KErrNotFound); + } + + // only custrom notes may need to send data to cover ui + if (SecondaryDisplayData()) + { + bufStream.WriteInt8L(ETrue); + bufStream << *(SecondaryDisplayData()); + } + else + { + bufStream.WriteInt8L(EFalse); + } + } + + CleanupStack::PopAndDestroy(); // bufStream + + iBufferPtr.Set(iBuffer->Ptr(0)); + + TBuf8<1> resp; + StartOrUpdateL(iBufferPtr,resp); + } + +EXPORT_C void CAknSoftNotifier::CAknNotifyBase_Reserved() + { + } + +EXPORT_C void CAknSoftNotifier::AddCustomNotificationL( + CAknSoftNotificationParameters& aParams, + TInt aCount ) + { + PrepareBufferL(ECustomSoftNotification, aCount, NULL, EFalse, ETrue, &aParams ); + } + +EXPORT_C void CAknSoftNotifier::SetCustomNotificationCountL( + CAknSoftNotificationParameters& aParams, + TInt aCount ) + { + PrepareBufferL(ECustomSoftNotification, aCount, NULL, EFalse, EFalse, &aParams ); + } + +EXPORT_C void CAknSoftNotifier::CancelCustomSoftNotificationL( + CAknSoftNotificationParameters& aParams ) + { + PrepareBufferL(ECustomSoftNotification, 0, NULL, ETrue, EFalse, &aParams ); + } + +// End of File