svgtopt/SVGTPlugin/src/VolumeKeyListener.cpp
branchRCL_3
changeset 39 1902ade171ab
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svgtopt/SVGTPlugin/src/VolumeKeyListener.cpp	Wed Sep 01 12:20:46 2010 +0100
@@ -0,0 +1,289 @@
+/*
+* Copyright (c) 2006 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:  It completes on a change in the volume property.  Used for 
+*                the new Central Repository Server.  Used in EKA2 builds only
+*
+*/
+
+
+#include <eikapp.h>
+#include <aknconsts.h>
+#include <browseruisdkcrkeys.h>
+
+#include "VolumeKeyListener.h" 
+#include "MRepositoryVolumeObserver.h"
+
+// CONSTANTS
+const TInt KFirstTimerExpiryInterval = 1; // Expire immediately
+const TInt KTimerExpiryInterval = KAknStandardKeyboardRepeatRate;
+
+const TInt KMinVolume = 0;  // Minimum volume level(Mute)
+const TInt KMaxVolume = 10; // Maximum volume level
+
+// ----------------------------------------------------
+// CVolumeKeyListener::NewL
+// Description: static constructor.
+// Output: none
+// Return: CVolumeKeyListener object
+// ----------------------------------------------------
+CVolumeKeyListener* CVolumeKeyListener::NewL( MRepositoryVolumeObserver* aObserver )
+    {
+    CVolumeKeyListener* self = new(ELeave) CVolumeKeyListener(
+                                                                aObserver);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// ----------------------------------------------------
+// CVolumeKeyListener::CVolumeKeyListener
+// Description: constructor.
+// Output: none
+// Return: none
+// ----------------------------------------------------
+CVolumeKeyListener::CVolumeKeyListener( MRepositoryVolumeObserver* aObserver ):
+                                                iInterfaceSelector(NULL),
+                                                iSelector(NULL),
+                                                iCenRepos(NULL),
+                                                iObserver(aObserver)
+    {
+    }   
+
+// ----------------------------------------------------
+// CVolumeKeyListener::ConstructL
+// Description: second phase constructor.
+// Input:  aObserver: link to the calling object
+// Output: none
+// Return: none
+// ----------------------------------------------------
+void CVolumeKeyListener::ConstructL()
+    {
+    //
+    // Open a connection to receive Volume Key events.
+    iSelector = CRemConInterfaceSelector::NewL();
+    iInterfaceSelector = CRemConCoreApiTarget::NewL(*iSelector,*this);
+    TRAP_IGNORE(iSelector->OpenTargetL());
+    // Timer for implementing repeat
+    iTimer = CPeriodic::NewL(CActive::EPriorityStandard);
+
+    //
+    // Open a connection to the Central Repository...
+    iCenRepos = CRepository::NewL(KCRUidBrowser);
+    //    iObservers=new(ELeave)CArrayFixSeg<MVolumePropertyWatchObserver*>
+    //                (KVolumeObserversArrayGranularity);
+    }
+
+// ----------------------------------------------------
+// CVolumeKeyListener::~CVolumeKeyListener
+// Description: destructor.
+// Input:  none
+// Output: none
+// ----------------------------------------------------
+CVolumeKeyListener::~CVolumeKeyListener()
+    {
+    if(iSelector)
+        {
+        delete iSelector;
+        iInterfaceSelector=NULL;
+        iSelector=NULL; //iSelector has been deleted by "delete iInterfaceSelector"
+        }
+
+    if(iTimer)
+        {
+        iTimer->Cancel();
+        delete iTimer;
+        }
+
+    if(iCenRepos)
+        {
+        delete iCenRepos;
+        }
+    }
+
+// ----------------------------------------------------
+// CVolumeKeyListener::SetObserver
+// Description: Used to set an observer 
+// Input:  aObserver: Point to observer
+// Output: none
+// Return: none
+// ----------------------------------------------------
+void CVolumeKeyListener::SetObserver( MRepositoryVolumeObserver* aObserver)
+    {
+    iObserver = aObserver;
+    }
+
+// ----------------------------------------------------
+// CVolumeKeyListener::GetCurrentVolume
+// Description: gets the current volume level from the 
+//   central directory.
+// Input:  none
+// Output: none
+// Return: volume level
+// ----------------------------------------------------
+TInt CVolumeKeyListener::GetCurrentVolume()
+    {
+    TInt currentVolume = 0;
+    //
+    // Get the current volume
+    if(iCenRepos)
+        iCenRepos->Get(KBrowserMediaVolumeControl, currentVolume);
+
+/*
+    #if defined(__WINSCW__) //offset required on the emulator
+        currentVolume += WINS_DEFAULT_VOLUME;
+    #endif
+*/
+    return currentVolume;
+    }
+
+// ----------------------------------------------------
+// CVolumeKeyListener::MrccatoCommand
+// Description: A Volume key command has been received
+//        (from MRemConCoreApiTargetObserver)
+// Input:aOperationId The operation ID of the command
+//         aButtonAct The button action associated with the command.
+// Output: none
+// Return: none
+// ----------------------------------------------------
+void CVolumeKeyListener::MrccatoCommand(TRemConCoreApiOperationId aOperationId, 
+                             TRemConCoreApiButtonAction aButtonAct )
+    {
+
+    switch(aOperationId)
+        {
+        case ERemConCoreApiVolumeUp:
+            {
+            switch (aButtonAct)
+                {
+                case ERemConCoreApiButtonPress:
+                    {
+                     //Start Timer
+                     if (!iTimer->IsActive())
+                        {
+                        iCommandId = EVolumeControlCmdVolumeUpByOne;
+                        iTimer->Start(KFirstTimerExpiryInterval,
+                                      KTimerExpiryInterval, 
+                                      TCallBack(TimerCallback, this));
+                        }
+                    break;
+                    }
+                case ERemConCoreApiButtonRelease:
+                    {
+                    iTimer->Cancel();
+                    break;
+                    }
+                case ERemConCoreApiButtonClick:
+                    {
+                    FilterAndSendCommand(EVolumeControlCmdVolumeUpByOne);
+                    break;
+                    }
+                default:
+                    {
+                    break;
+                    }
+                }
+            break;
+            }
+        case ERemConCoreApiVolumeDown:
+            {
+            switch (aButtonAct)
+                {
+                case ERemConCoreApiButtonPress:
+                    {
+                    //Start Timer
+                    iCommandId = EVolumeControlCmdVolumeDownByOne;
+                    if (!iTimer->IsActive())
+                        {
+                        iTimer->Start(KFirstTimerExpiryInterval,
+                                      KTimerExpiryInterval, 
+                                      TCallBack(TimerCallback, this));
+                        }
+                     break;
+                    }
+                case ERemConCoreApiButtonRelease:
+                    {
+                    iTimer->Cancel();
+                    break;
+                    }
+                case ERemConCoreApiButtonClick:
+                    {
+                    FilterAndSendCommand(EVolumeControlCmdVolumeDownByOne);
+                    break;
+                    }
+                default:
+                    {
+                    break;
+                    }
+                }
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }        
+    }        
+        
+// -----------------------------------------------------------------------
+// CVolumeKeyListener::HandleRepeatEvent
+// -----------------------------------------------------------------------
+//
+void CVolumeKeyListener::HandleRepeatEvent()
+    {
+    FilterAndSendCommand(iCommandId);
+    }
+
+// -----------------------------------------------------------------------
+// CVolumeKeyListener::TimerCallback
+// -----------------------------------------------------------------------
+//
+TInt CVolumeKeyListener::TimerCallback(TAny* aPtr)
+    {
+    static_cast<CVolumeKeyListener*>(aPtr)->HandleRepeatEvent();
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------
+// CVolumeKeyListener::FilterAndSendCommand
+// -----------------------------------------------------------------------
+//
+void CVolumeKeyListener::FilterAndSendCommand(TInt aCommandId)
+    {
+    TInt currentVolume = 0;
+
+    iCenRepos->Get(KBrowserMediaVolumeControl,currentVolume);
+    switch(aCommandId)
+        {
+        case EVolumeControlCmdVolumeUpByOne:
+            currentVolume=(currentVolume< KMaxVolume)? ++currentVolume : KMaxVolume;
+            break;
+        case EVolumeControlCmdVolumeDownByOne:
+            currentVolume=(currentVolume> KMinVolume)? --currentVolume : KMinVolume;
+            break;  
+        default:
+            break;      
+        }
+         
+    iCenRepos->Set(KBrowserMediaVolumeControl,currentVolume);
+    
+#if defined(__WINS__) //offset required on the emulator
+        currentVolume += WINS_DEFAULT_VOLUME;
+#endif   
+    
+    if(iObserver)
+        iObserver->VolumeChanged(currentVolume);
+    }
+
+// End of File