diff -r 4ad59aaee882 -r 2f468c1958d0 javauis/nokiauiapi_qt/src/CSoftNotification.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/nokiauiapi_qt/src/CSoftNotification.cpp Mon Oct 04 00:10:53 2010 +0300 @@ -0,0 +1,279 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Nokia Corporation - initial implementation + *******************************************************************************/ + + +#include +#include +#include +#include +#include "CSoftNotification.h" + +_LIT(KMidletId, "MidletId"); +_LIT(KNotificationId, "NotificationId"); +_LIT(KIndicatorTypeJavaSoftNote,"com.nokia.javasoftnotification.indicatorplugin/1.0_%u_%i"); +const TInt KIndicatorTypeStringLength = 250; +const TInt KMidletUidLength = 50; + +// Event id when user accepted notification +const TInt KEventNoteAccepted = 1; + +// ============================ MEMBER FUNCTIONS =============================== +// ----------------------------------------------------------------------------- +// CSoftNotification::NewLC +// Static constructor +// ----------------------------------------------------------------------------- +// +CSoftNotification* CSoftNotification::NewL(TInt aAppId, TInt aNotificationId) + { + CSoftNotification* self = new (ELeave) CSoftNotification(aAppId, + aNotificationId); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CSoftNotification::CSoftNotification +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CSoftNotification::CSoftNotification(TInt aAppId, TInt aNotificationId) : + iNotificationId(aNotificationId) + { + iMidletId = TUid::Uid(aAppId); + } + +// ----------------------------------------------------------------------------- +// CSoftNotification::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CSoftNotification::ConstructL() + { + iIndicator = CHbIndicatorSymbian::NewL(); + iIndicator->SetObserver(this); + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +CSoftNotification::~CSoftNotification() + { + if (iPrimaryText) + { + delete iPrimaryText; + } + + if (iSecondaryText) + { + delete iSecondaryText; + } + + if (iImagePath) + { + delete iImagePath; + } + + if (iIndicator) + { + delete iIndicator; + } + + if (iPeer) + { + iJniEnv->DeleteWeakGlobalRef((jweak)iPeer); + } + + iPrimaryText = NULL; + iSecondaryText = NULL; + iImagePath = NULL; + iIndicator = NULL; + iPeer = NULL; + iMethodId = NULL; + } + +// ----------------------------------------------------------------------------- +// CSoftNotification::ShowSoftNotificationL +// Displays a soft notification +// ----------------------------------------------------------------------------- +// +bool CSoftNotification::ShowSoftNotificationL() + { + CHbDeviceNotificationDialogSymbian* dialog = + CHbDeviceNotificationDialogSymbian::NewL(); + CleanupStack::PushL(dialog); + + if(iPrimaryText != NULL) + { + dialog->SetTitleL(iPrimaryText->Des()); + } + + if(iSecondaryText != NULL) + { + dialog->SetTextL(iSecondaryText->Des()); + } + + if (iImagePath != NULL) + { + dialog->SetIconNameL(iImagePath->Des()); + } + + dialog->ShowL(); + + CHbSymbianVariant* varValues = NotificationParamsL(); + CleanupStack::PushL(varValues); + + TBuf indicatorType; + indicatorType.Format(KIndicatorTypeJavaSoftNote, iMidletId, iNotificationId); + bool indStatus = iIndicator->Activate(indicatorType, varValues); + + CleanupStack::PopAndDestroy(varValues); + CleanupStack::PopAndDestroy(dialog); + return indStatus; + } + +// ----------------------------------------------------------------------------- +// CSoftNotification::RemoveSoftNotificationL +// Cancels and removes the soft notification +// ----------------------------------------------------------------------------- +// +void CSoftNotification::RemoveSoftNotificationL() + { + TBuf type; + type.Format(KIndicatorTypeJavaSoftNote, iMidletId, iNotificationId); + iIndicator->Deactivate(type); + } + +// ----------------------------------------------------------------------------- +// CSoftNotification::SetTextL +// Sets a text for a soft notification +// ----------------------------------------------------------------------------- +// +void CSoftNotification::SetTextL(const TDesC& aPrimaryText, const TDesC& aSecondaryText) + { + HBufC* txt = aPrimaryText.AllocL(); + delete iPrimaryText; + iPrimaryText = txt; + + txt = aSecondaryText.AllocL(); + delete iSecondaryText; + iSecondaryText = txt; + } + +// ----------------------------------------------------------------------------- +// CSoftNotification::SetImagePathL +// Sets a text for a soft notification +// ----------------------------------------------------------------------------- +// +void CSoftNotification::SetImagePathL(const TDesC& aImagePath) + { + HBufC* txt = aImagePath.AllocL(); + delete iImagePath; + iImagePath = txt; + } + +// ----------------------------------------------------------------------------- +// CSoftNotification::Id +// Notification Id +// ----------------------------------------------------------------------------- +// +TInt CSoftNotification::Id() + { + return iNotificationId; + } + +// ----------------------------------------------------------------------------- +// CSoftNotification::SetPeerObserverL +// ----------------------------------------------------------------------------- +// +void CSoftNotification::SetPeerObserver(jobject aPeer, jmethodID aMethodId, + JNIEnv* aJniEnv) + { + iJniEnv = aJniEnv; + iPeer = aPeer; + iMethodId = aMethodId; + } + +// ----------------------------------------------------------------------------- +// CSoftNotification::IndicatorUserActivated +// Dynamic soft notification was accepted by user. +// ----------------------------------------------------------------------------- +// +void CSoftNotification::IndicatorUserActivated(const TDesC& /*aType*/, + CHbSymbianVariantMap &aData) + { + TInt notificationId = *reinterpret_cast(aData.Get(KNotificationId)->Data()); + TUid midletId(TUid::Uid(*reinterpret_cast(aData.Get(KMidletId)->Data()))); + if (iPeer && iMidletId == midletId && + iNotificationId == notificationId ) + { + // Can't attempt callback if JVM is processing an exception. Event is + // possibly lost by Java listener. + if (iJniEnv->ExceptionCheck() == JNI_TRUE) + { + return; + } + if (iMethodId) + { + iJniEnv->CallVoidMethod(iPeer, iMethodId, KEventNoteAccepted); + } + } + } + +// ----------------------------------------------------------------------------- +// CSoftNotification::FillNotificationParams +// ----------------------------------------------------------------------------- +// +CHbSymbianVariant* CSoftNotification::NotificationParamsL() + { + //only five parameter, so creat the array + //for five parameters to fit and append them + CDesC16ArrayFlat* array = new CDesC16ArrayFlat(5); + CleanupStack::PushL(array); + TBuf midletId; + _LIT(MidletId,"%u"); + midletId.Format(MidletId,iMidletId); + array->AppendL(midletId); + array->AppendL(reinterpret_cast(iNotificationId)); + if(iPrimaryText != NULL) + { + array->AppendL(iPrimaryText->Des()); + } + else + { + array->AppendL(KNullDesC); + } + + if(iSecondaryText != NULL) + { + array->AppendL(iSecondaryText->Des()); + } + else + { + array->AppendL(KNullDesC); + } + + if (iImagePath != NULL) + { + array->AppendL(iImagePath->Des()); + } + else + { + array->AppendL(KNullDesC); + } + MDesCArray* marray = static_cast(array); + CHbSymbianVariant* varValues = CHbSymbianVariant::NewL( marray, CHbSymbianVariant::EDesArray); + CleanupStack::PopAndDestroy(array); + return varValues; + }