javauis/nokiauiapi_qt/src/CSoftNotification.cpp
changeset 72 1f0034e370aa
child 78 71ad690e91f5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/nokiauiapi_qt/src/CSoftNotification.cpp	Fri Sep 17 16:44:34 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 <w32std.h>
+#include <apgtask.h>
+#include <hbdevicenotificationdialogsymbian.h>
+#include <hbsymbianvariant.h>
+#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<KIndicatorTypeStringLength> 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<KIndicatorTypeStringLength> 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<const TInt*>(aData.Get(KNotificationId)->Data());
+    TUid midletId(TUid::Uid(*reinterpret_cast<const TUint*>(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<KMidletUidLength> midletId;
+    _LIT(MidletId,"%u");
+    midletId.Format(MidletId,iMidletId);
+    array->AppendL(midletId);
+    array->AppendL(reinterpret_cast<TDesC16&>(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<MDesCArray*>(array);
+    CHbSymbianVariant* varValues = CHbSymbianVariant::NewL( marray, CHbSymbianVariant::EDesArray);
+    CleanupStack::PopAndDestroy(array);
+    return varValues;
+    }