javauis/lcdui_akn/lcdui/src/CMIDRemConObserver.cpp
branchRCL_3
changeset 19 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/lcdui_akn/lcdui/src/CMIDRemConObserver.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,276 @@
+/*
+* Copyright (c) 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:  ?Description
+*
+*/
+
+
+// CRemConCoreApiTarget* iCoreTarget
+#include <remconcoreapitarget.h>
+// CRemConInterfaceSelector* iInterfaceSelector;
+#include <remconinterfaceselector.h>
+// using avkon constants
+#include <aknconsts.h>
+#include <j2me/jdebug.h>
+
+#include "CMIDRemConObserver.h"
+#include "CMIDKeyDecoder.h"
+
+
+// Keyboard delays and repeat periods
+const TInt KFirstTimerExpiryInterval = KAknKeyboardRepeatInitialDelay;
+// For second time onwards ,the duration of the time interval, is below
+// Should not be greater than 1 Minute
+const TInt KTimerExpiryInterval = KAknStandardKeyboardRepeatRate;
+
+
+CMIDRemConObserver* CMIDRemConObserver::NewL()
+{
+    CMIDRemConObserver* self = new(ELeave) CMIDRemConObserver();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+}
+
+
+CMIDRemConObserver::~CMIDRemConObserver()
+{
+    DEBUG("CMIDRemConObserver::~CMIDRemConObserver() +");
+
+    if (iJavaRemConManager != NULL)
+    {
+        iJavaRemConManager->RemoveObserver(*iJavaRemConObserver);
+    }
+    if (iJavaRemConObserver != NULL)
+    {
+        delete iJavaRemConObserver;
+        iJavaRemConObserver = NULL;
+    }
+    if (iJavaRemConManager != NULL)
+    {
+        delete iJavaRemConManager;
+        iJavaRemConManager = NULL;
+    }
+    iListeners.Close();
+
+    if (iRepeatTimer)
+    {
+        iRepeatTimer->Cancel();
+        delete iRepeatTimer;
+    }
+
+    DEBUG("CMIDRemConObserver::~CMIDRemConObserver() -");
+}
+
+
+void CMIDRemConObserver::AddMediaKeysListenerL(MMIDMediaKeysListener* aListener)
+{
+    User::LeaveIfError(iListeners.Append(aListener));
+}
+
+
+void CMIDRemConObserver::RemoveMediaKeysListener(MMIDMediaKeysListener* aListener)
+{
+    for (TInt i = 0;  i < iListeners.Count(); i++)
+    {
+        if (iListeners[i] == aListener)
+        {
+            iListeners.Remove(i);
+        }
+    }
+
+}
+
+
+// ---------------------------------------------------------------------------
+// This function handles the events when following buttons are press/click/rel
+// - Play, Stop, Forward, Backward
+// ---------------------------------------------------------------------------
+void CMIDRemConObserver::MrccatoCommand(TRemConCoreApiOperationId aOperationId,
+                                        TRemConCoreApiButtonAction aButtonAct)
+{
+    DEBUG_INT2("CMIDRemConObserver::MrccatoCommand - JAVA operationId %d JAVA buttonAct %d",
+               aOperationId, aButtonAct);
+
+    MMIDMediaKeysListener::TMediaKey mediaKey = MMIDMediaKeysListener::EMIDMediaKeyNone;
+
+    switch (aOperationId)
+    {
+    case ERemConCoreApiPausePlayFunction:
+        mediaKey = MMIDMediaKeysListener::EMIDMediaKeyPlay;
+        break;
+    case ERemConCoreApiStop:
+        mediaKey = MMIDMediaKeysListener::EMIDMediaKeyStop;
+        break;
+    case ERemConCoreApiForward:
+    case ERemConCoreApiFastForward:
+        mediaKey = MMIDMediaKeysListener::EMIDMediaKeyNext;
+        break;
+    case ERemConCoreApiBackward:
+    case ERemConCoreApiRewind:
+        mediaKey = MMIDMediaKeysListener::EMIDMediaKeyPrevious;
+        break;
+    default:
+        return;
+    }
+
+    TMIDKeyEvent::TEvent keyEvent = TMIDKeyEvent::EPressed;
+
+    switch (aButtonAct)
+    {
+    case ERemConCoreApiButtonPress: // Long key press
+        iKeyRepeating = mediaKey;
+        break;
+    case ERemConCoreApiButtonClick: // Short key press
+        keyEvent = TMIDKeyEvent::EPressed;
+        break;
+    case ERemConCoreApiButtonRelease: // Key released after long key press.
+        keyEvent = TMIDKeyEvent::EReleased;
+        break;
+    default:
+        return;
+    }
+
+
+    // Media keys do not provide keyReleased events when a key is pressed shortly.
+    // However, keyReleased events are posted after long key press of next and previous keys.
+
+    // Play and Stop does not provide keyRepeated nor keyReleased Java events at all.
+    // Reason for these limitation is RemCon that does not provide such events for us.
+
+    iRepeatTimer->Cancel(); //Repeat timer is always canceled if any Media key event occurs.
+
+    if (aButtonAct == ERemConCoreApiButtonPress
+            && !(mediaKey == MMIDMediaKeysListener::EMIDMediaKeyPlay || mediaKey == MMIDMediaKeysListener::EMIDMediaKeyStop))
+    {
+        // keyPressed event is posted first, then timer for key repeats is started.
+        PostEventToListeners(mediaKey, TMIDKeyEvent::EPressed);
+        iRepeatTimer->Start(KFirstTimerExpiryInterval, KTimerExpiryInterval,
+                            TCallBack(RepeatTimerCallback, this));
+    }
+    else if ((aButtonAct == ERemConCoreApiButtonRelease ||  aButtonAct == ERemConCoreApiButtonPress)
+             && (mediaKey == MMIDMediaKeysListener::EMIDMediaKeyPlay || mediaKey == MMIDMediaKeysListener::EMIDMediaKeyStop))
+    {
+        // If Press or Release event occur for Play or Stop keys we just ignore them.
+        // This should not happen normally, but is possible e.g. in certain error situations.
+        // Also some media key accessories differ from each other so that some might post these events.
+        return;
+    }
+    else
+    {
+        PostEventToListeners(mediaKey, keyEvent);
+    }
+
+    DEBUG("CMIDRemConObserver::MrccatoCommand -");
+}
+
+
+void CMIDRemConObserver::MrccatoPlay(TRemConCoreApiPlaybackSpeed aSpeed, TRemConCoreApiButtonAction aButtonAct)
+{
+    DEBUG("CMIDRemConObserver::MrccatoPlay +");
+    DEBUG_INT2("RemConObserver::MrccatoPlay - JAVA speed %d JAVA buttonAct %d", aSpeed, aButtonAct);
+    (void)aSpeed; // Just to suppress warning in release build
+
+    switch (aButtonAct)
+    {
+    case ERemConCoreApiButtonPress:
+    case ERemConCoreApiButtonClick:
+    {
+        PostEventToListeners(MMIDMediaKeysListener::EMIDMediaKeyPlay, TMIDKeyEvent::EPressed);
+        break;
+    }
+    default:
+    {
+        break;
+    }
+    }
+    DEBUG("CMIDRemConObserver::MrccatoPlay -");
+}
+
+void CMIDRemConObserver::MrceoError(TInt /*aError*/)
+{
+    DEBUG("CMIDRemConObserver::MrceoError +");
+    iRepeatTimer->Cancel();
+    DEBUG("CMIDRemConObserver::MrceoError -");
+}
+
+
+CMIDRemConObserver::CMIDRemConObserver()
+{
+}
+
+
+void CMIDRemConObserver::ConstructL()
+{
+    DEBUG("CMIDRemConObserver::ConstructL +");
+    iJavaRemConObserver = CJavaRemConObserver::NewL(*this);
+    iJavaRemConManager = CJavaRemConManager::NewL();
+    iJavaRemConManager->SetObserverL(*iJavaRemConObserver);
+    // Timer for implementing key repeat feature.
+    iRepeatTimer = CPeriodic::NewL(CActive::EPriorityStandard);
+
+    iKeyRepeating = MMIDMediaKeysListener::EMIDMediaKeyNone;
+
+    DEBUG("CMIDRemConObserver::ConstructL -");
+}
+
+
+void CMIDRemConObserver::PostEventToListeners(MMIDMediaKeysListener::TMediaKey aKeyCode, TMIDKeyEvent::TEvent aEventType)
+{
+    DEBUG("CMIDRemConObserver::PostEventToListeners +");
+
+    TMIDKeyEvent event;
+    event.iKeyCode = aKeyCode;
+    event.iEvents = aEventType;
+
+    if (event.iEvents == TMIDKeyEvent::ERepeated)
+    {
+        event.iRepeats = 1; // repeats
+    }
+    else
+    {
+        event.iRepeats = 0; // no repeats
+    }
+
+    for (TInt i = 0;  i < iListeners.Count(); i++)
+    {
+        iListeners[i]->HandleMediaKeyEvent(event);
+    }
+
+    DEBUG("CMIDRemConObserver::PostEventToListeners -");
+}
+
+
+TInt CMIDRemConObserver::RepeatTimerCallback(TAny* aThis)
+{
+    CMIDRemConObserver* observer = static_cast<CMIDRemConObserver*>(aThis);
+    observer->HandleRepeatTimerEvent();
+    return 0;
+}
+
+
+void CMIDRemConObserver::HandleRepeatTimerEvent()
+{
+    DEBUG("CMIDRemConObserver::HandleTimerEvent +");
+    if (iKeyRepeating != MMIDMediaKeysListener::EMIDMediaKeyNone)
+    {
+        DEBUG("CMIDRemConObserver::HandleTimerEvent calling PosTEventToListeners +");
+        PostEventToListeners(iKeyRepeating, TMIDKeyEvent::ERepeated);
+        DEBUG("CMIDRemConObserver::HandleTimerEvent calling PostEventToListeners -");
+    }
+    DEBUG("CMIDRemConObserver::HandleTimerEvent -");
+}
+
+//  End of File