javauis/softnotification_akn/src/CSoftNotification.cpp
branchRCL_3
changeset 14 04becd199f91
--- /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 <AknDynamicSoftNotifier.h>
+#include <AknDynamicSoftNotificationParams.h>
+#include <jdebug.h>
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <vwsdefpartner.h>
+#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