diff -r f5050f1da672 -r 04becd199f91 javauis/softnotification_akn/src/CSoftNotification.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/softnotification_akn/src/CSoftNotification.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,366 @@ +/* +* Copyright (c) 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: Controls the native soft notifications. +* +*/ + + +// INCLUDE FILES +#include "CSoftNotification.h" +#include "CSoftNotificationEvent.h" +#include "CSoftNotificationEventSource.h" + +#include +#include +#include + +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif + + +// CONSTANTS +namespace +{ +/// Default soft notification priority (range: 1000...3000) +const TInt KSoftNotificationPriority = 1000; +/// Event id when user accepted notification +const TInt KEventNoteAccepted = 1; +/// Event id when user canceled notification +const TInt KEventNoteCanceled = 2; +} + +// ============================ MEMBER FUNCTIONS =============================== +// ----------------------------------------------------------------------------- +// CSoftNotification::NewLC +// Static constructor +// ----------------------------------------------------------------------------- +// +CSoftNotification* CSoftNotification::NewL( + TInt aAppId, + TInt aNotificationId, + CSoftNotificationEventSource& aEventSource) +{ + DEBUG("CSoftNotification::NewL"); + + CSoftNotification* self = + new(ELeave) CSoftNotification(aAppId, + aNotificationId, + aEventSource); + CleanupStack::PushL(self); + + self->ConstructL(); + CleanupStack::Pop(self); + + return self; +} + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +CSoftNotification::~CSoftNotification() +{ + DEBUG("CSoftNotification::~CSoftNotification +"); + + delete iSoftkey1; + delete iSoftkey2; + + delete iLabel; + delete iGroupLabel; + + delete iImageData; + + delete iNotifier; + + DEBUG("CSoftNotification::~CSoftNotification -"); +} + +// ----------------------------------------------------------------------------- +// CSoftNotification::NotificationAccepted +// Dynamic soft notification was accepted by user. +// ----------------------------------------------------------------------------- +// +void CSoftNotification::NotificationAccepted(TInt aIdentifier) +{ + DEBUG_INT("CSoftNotification::NotificationAccepted +, id=%d", aIdentifier); + + if (iNotificationId == aIdentifier && iPeer) + { + // Error ignored since there is no other way to get the error to + // the Java side than posting. + TRAP_IGNORE(PostEventL(KEventNoteAccepted)); + } + + DEBUG("CSoftNotification::NotificationAccepted -"); +} + +// ----------------------------------------------------------------------------- +// CSoftNotification::NotificationCanceled +// Dynamic soft notification was canceled by user. +// ----------------------------------------------------------------------------- +// +void CSoftNotification::NotificationCanceled(TInt aIdentifier) +{ + DEBUG_INT("CSoftNotification::NotificationCanceled +, id=%d", aIdentifier); + + if (iNotificationId == aIdentifier && iPeer) + { + // Error ignored since there is no other way to get the error to + // the Java side than posting. + TRAP_IGNORE(PostEventL(KEventNoteCanceled)); + } + + DEBUG("CSoftNotification::NotificationCanceled -"); +} + +// ----------------------------------------------------------------------------- +// CSoftNotification::ShowSoftNotificationL +// Displays a soft notification +// ----------------------------------------------------------------------------- +// +void CSoftNotification::ShowSoftNotificationL() +{ + DEBUG("CSoftNotification::ShowSoftNotificationL +"); + + TAknDynamicSoftNotificationParams param(KSoftNotificationPriority); + FillNotificationParams(param); + + TInt oldId = iNotificationId; + iNotificationId = + iNotifier->SetDynamicNotificationCountL(param, iNotificationId, 1); + + // Stop observing the removed note (=id changed). + if (oldId != iNotificationId) + { + iNotifier->StopObserving(oldId); + iNotifier->StartObservingL(iNotificationId, this); + } + + DEBUG("CSoftNotification::ShowSoftNotificationL -"); +} + +// ----------------------------------------------------------------------------- +// CSoftNotification::RemoveSoftNotificationL +// Cancels and removes the soft notification +// ----------------------------------------------------------------------------- +// +void CSoftNotification::RemoveSoftNotificationL() +{ + DEBUG("CSoftNotification::RemoveSoftNotificationL +"); + + iNotifier->CancelDynamicNotificationL(iNotificationId); + + DEBUG("CSoftNotification::RemoveSoftNotificationL -"); +} + +// ----------------------------------------------------------------------------- +// CSoftNotification::SetTextL +// Sets a text for a soft notification +// ----------------------------------------------------------------------------- +// +void CSoftNotification::SetTextL(const TDesC& aText, const TDesC& aGroupText) +{ + DEBUG("CSoftNotification::SetTextL +"); + + HBufC* txt = aText.AllocL(); + delete iLabel; + iLabel = txt; + + txt = aGroupText.AllocL(); + delete iGroupLabel; + iGroupLabel = txt; + + DEBUG("CSoftNotification::SetTextL -"); +} + +// ----------------------------------------------------------------------------- +// CSoftNotification::SetSoftkeyLabelsL +// Sets new labels for softkeys +// ----------------------------------------------------------------------------- +// +void CSoftNotification::SetSoftkeyLabelsL( + const TDesC& aSoftkey1Label, + const TDesC& aSoftkey2Label) +{ + DEBUG("CSoftNotification::SetSoftkeyLabelsL +"); + + HBufC* txt = aSoftkey1Label.AllocL(); + delete iSoftkey1; + iSoftkey1 = txt; + + txt = aSoftkey2Label.AllocL(); + delete iSoftkey2; + iSoftkey2 = txt; + + DEBUG("CSoftNotification::SetSoftkeyLabelsL -"); +} + +// ----------------------------------------------------------------------------- +// CSoftNotification::SetImageL +// Sets an image for a soft notification +// ----------------------------------------------------------------------------- +// +void CSoftNotification::SetImageL( + const TDesC8& aImage) +{ + DEBUG("CSoftNotification::SetImageL +"); + + HBufC8* image = aImage.AllocL(); + delete iImageData; + iImageData = image; + + DEBUG("CSoftNotification::SetImageL -"); +} + +// ----------------------------------------------------------------------------- +// CSoftNotification::Id +// Notification Id +// ----------------------------------------------------------------------------- +// +TInt CSoftNotification::Id() +{ + DEBUG("CSoftNotification::Id"); + + return iNotificationId; +} + +// ----------------------------------------------------------------------------- +// CSoftNotification::SetPeerObserverL +// ----------------------------------------------------------------------------- +// +void CSoftNotification::SetPeerObserver(jobject aPeer, jmethodID aMethodId) +{ + DEBUG("CSoftNotification::SetPeerObserver"); + + iPeer = aPeer; + iMethodId = aMethodId; +} + +// ----------------------------------------------------------------------------- +// CSoftNotification::RemovePeerObserverL +// ----------------------------------------------------------------------------- +// +void CSoftNotification::RemovePeerObserver(JNIEnv& aJniEnv) +{ + DEBUG("CSoftNotification::RemovePeerObserver +"); + + // The stored global reference has to be deleted since it is not + // used anymore. + if (iPeer) + { + aJniEnv.DeleteWeakGlobalRef((jweak)iPeer); + } + + iPeer = NULL; + iMethodId = NULL; + + DEBUG("CSoftNotification::RemovePeerObserver -"); +} + +// ----------------------------------------------------------------------------- +// CSoftNotification::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CSoftNotification::ConstructL() +{ + DEBUG("CSoftNotification::ConstructL +"); + + iNotifier = CAknDynamicSoftNotifier::NewL(); + + // Try to start observing. Ignore the leave, it means that the note is + // already observed by another instance of this class or the note is not + // valid anymore. + // The observing has to be started after creation so that notifications + // are observed in every case (use case: an instance of this class is + // created by using an id to a notification already visible on the screen). + TRAP_IGNORE(iNotifier->StartObservingL(iNotificationId, this)); + + DEBUG("CSoftNotification::ConstructL -"); +} + +// ----------------------------------------------------------------------------- +// CSoftNotification::PostEventL +// Posts an event to the Java side. +// ----------------------------------------------------------------------------- +// +void CSoftNotification::PostEventL(TInt aEventId) +{ + DEBUG("CSoftNotification::PostEventL +"); + + CSoftNotificationEvent* javaEvent = + new(ELeave) CSoftNotificationEvent(iPeer, iMethodId, aEventId); + + // Event source takes the ownership to the event. + iEventSource.PostEvent(javaEvent, CJavaEventBase::EEventPriority); + + DEBUG("CSoftNotification::PostEventL -"); +} + +// ----------------------------------------------------------------------------- +// CSoftNotification::CSoftNotification +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CSoftNotification::CSoftNotification( + TInt aAppId, + TInt aNotificationId, + CSoftNotificationEventSource& aEventSource) : + iNotificationId(aNotificationId), + iEventSource(aEventSource) +{ + DEBUG("CSoftNotification::CSoftNotification"); + + iAppId = TUid::Uid(aAppId); +} + +// ----------------------------------------------------------------------------- +// CSoftNotification::FillNotificationParams +// ----------------------------------------------------------------------------- +// +void CSoftNotification::FillNotificationParams( + TAknDynamicSoftNotificationParams& aParam) +{ + DEBUG("CSoftNotification::FillNotificationParams +"); + + if (iSoftkey1 && iSoftkey2) + { + aParam.SetSoftkeys(*iSoftkey1, *iSoftkey2); + } + + if (iLabel) + { + aParam.SetNoteLabels(*iLabel, *iLabel); + } + + if (iGroupLabel) + { + aParam.SetGroupLabels(*iGroupLabel, *iGroupLabel); + } + + if (iImageData) + { + aParam.SetImageData(*iImageData); + } + + TVwsViewId view(iAppId, iAppId); + aParam.SetViewActivationParams(view); + aParam.EnableObserver(); + + DEBUG("CSoftNotification::FillNotificationParams -"); +} + +// End of File