diff -r 000000000000 -r ff3acec5bc43 mpxplugins/viewplugins/views/commonplaybackview/src/mpxbuttonmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpxplugins/viewplugins/views/commonplaybackview/src/mpxbuttonmanager.cpp Thu Dec 17 08:45:05 2009 +0200 @@ -0,0 +1,748 @@ +/* +* 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: Button state manager for playback view +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mpxbuttonmanager.h" +#include "mpxplaybackviewlayoutinterface.h" +#include "mpxcommonplaybackview.hrh" +#include "mpxlog.h" + +// CONSTANTS + + +struct TStateAndCommandIds + { + TInt iState; + TInt iEnterCommand; + TInt iExitCommand; + TInt iLongEnterCommand; + TInt iLongExitCommand; + }; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMPXButtonManager::CMPXButtonManager +// ----------------------------------------------------------------------------- +// +CMPXButtonManager::CMPXButtonManager( + MMPXButtonCmdObserver* aObserver, + MMPXPlaybackViewLayout* aLayout ) + : iObserver(aObserver), + iLayout(aLayout), + iEnabled(ETrue) + { + MPX_FUNC("CMPXButtonManager::CMPXButtonManager()"); + } + +// ----------------------------------------------------------------------------- +// CMPXButtonManager::NewL +// ----------------------------------------------------------------------------- +// +CMPXButtonManager* CMPXButtonManager::NewL( + MMPXButtonCmdObserver* aObserver, + MMPXPlaybackViewLayout* aLayout, + const CCoeControl &aContainer) + { + MPX_FUNC("CMPXButtonManager::NewL()"); + CMPXButtonManager* self = new (ELeave) CMPXButtonManager( + aObserver, + aLayout); + + CleanupStack::PushL(self); + //self->ConstructL(aRect, aContainer); + self->ConstructL(aContainer); + CleanupStack::Pop(); + return self; + } +// ----------------------------------------------------------------------------- +// CMPXButtonManager::~CMPXButtonManager +// ----------------------------------------------------------------------------- +// +CMPXButtonManager::~CMPXButtonManager() + { + MPX_FUNC("CMPXButtonManager::~CMPXButtonManager()"); +// iButtons.ResetAndDestroy(); + iAvkonButtons.ResetAndDestroy(); + if (iLongKeyTimer) + { + iLongKeyTimer->Cancel(); + delete iLongKeyTimer; + } + } + +// ----------------------------------------------------------------------------- +// CMPXButtonManager::ConstructL (overloaded for avkon button rocker) +// ----------------------------------------------------------------------------- +// +void CMPXButtonManager::ConstructL(const CCoeControl &aContainer) + { + MPX_FUNC("CMPXButtonManager::ConstructL()"); + iIsLongPress = EFalse; + iVolumeInRocker = (!FeatureManager::FeatureSupported( KFeatureIdSideVolumeKeys )); + + if( AknLayoutUtils::PenEnabled() ) + { + iIsTouchUi = ETrue; + } + else + { + iIsTouchUi = EFalse; + } + + if (!iVolumeInRocker) + { + iStopInRocker = ETrue; + } + else + { + iStopInRocker = EFalse; + } + + if( !iIsTouchUi) + { + CreateRockerAvkonButtonsL(aContainer); + } + + ActivateL(); + + iLongKeyTimer = CPeriodic::NewL(CActive::EPriorityStandard); + + } + +// ----------------------------------------------------------------------------- +// CMPXButtonManager::UpdateButtonStates +// ----------------------------------------------------------------------------- +// +void CMPXButtonManager::UpdateButtonStates( TMPXPlaybackState aState ) + { + MPX_DEBUG2("CMPXButtonManager::UpdateButtonStates(%d) entering", aState); + if( !iIsTouchUi && !iIsSeeking ) + { + if (aState == EPbStatePlaying) + { + // Playing + if (iAvkonButtons[EButtonPlay]->IsVisible()) + { + iAvkonButtons[EButtonPlay]->MakeVisible(EFalse); + } + if (!iAvkonButtons[EButtonPause]->IsVisible()) + { + iAvkonButtons[EButtonPause]->MakeVisible(ETrue); + } + } + else + { + // Not playing + if (!iAvkonButtons[EButtonPlay]->IsVisible()) + { + iAvkonButtons[EButtonPlay]->MakeVisible(ETrue); + } + if (iAvkonButtons[EButtonPause]->IsVisible()) + { + iAvkonButtons[EButtonPause]->MakeVisible(EFalse); + } + } + + if (iAvkonButtons[EButtonPlay]->IsVisible()) + { + if (aState == EPbStateNotInitialised && + !iAvkonButtons[EButtonPlay]->IsDimmed()) + { + iAvkonButtons[EButtonPlay]->SetDimmed(ETrue); + } + if (aState != EPbStateNotInitialised && + iAvkonButtons[EButtonPlay]->IsDimmed()) + { + iAvkonButtons[EButtonPlay]->SetDimmed(EFalse); + } + } + + for (TInt i = 0; i< iRockerAvkonButtonCount; i++) + { + iAvkonButtons[i]->SetCurrentState(0, ETrue); + } + } + + MPX_DEBUG1("CMPXButtonManager::UpdateButtonStates() exiting"); + } + + +// ----------------------------------------------------------------------------- +// CMPXButtonManager::OfferKeyEventL +// ----------------------------------------------------------------------------- +// +TKeyResponse CMPXButtonManager::OfferKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + MPX_DEBUG3("CMPXButtonManager::OfferKeyEventL(%d, %d) entering", aKeyEvent.iScanCode, aType); + + TKeyResponse response( EKeyWasNotConsumed ); + response = SetAvkonButtonState(aKeyEvent, aType); + MPX_DEBUG2("CMPXButtonManager::OfferKeyEventL() exiting %d", response); + return response; + } + +// ----------------------------------------------------------------------------- +// CMPXButtonManager::SetParentRect +// ----------------------------------------------------------------------------- +// +void CMPXButtonManager::SetParentRect( + const TRect& aRect ) + { + iParentRect = aRect; + } + +// ----------------------------------------------------------------------------- +// CMPXButtonManager::SetEnabled +// ----------------------------------------------------------------------------- +// +void CMPXButtonManager::SetEnabled( TBool aEnabled ) + { + MPX_DEBUG2("CMPXButtonManager::SetEnabled(%d) entering", aEnabled); + iEnabled = aEnabled; + MPX_DEBUG1("CMPXButtonManager::SetEnabled() exiting"); + } + +// ----------------------------------------------------------------------------- +// CMPXButtonManager::HandleForegroundLostL +// ----------------------------------------------------------------------------- +// +void CMPXButtonManager::HandleForegroundLostL() + { + MPX_FUNC( "CMPXButtonManager::HandleForegroundLostL" ); + iIsSeeking = EFalse; + + if (iIsLongPress) + { + iIsLongPress = EFalse; + iObserver->HandleButtonCommandL(EMPXPbvCmdEndSeek); + } + + if(iLongKeyTimer) + { + iLongKeyTimer->Cancel(); + } + } + +// ----------------------------------------------------------------------------- +// CMPXCommonPlaybackViewContainer::CreateRockerAvkonButtonsL +// ----------------------------------------------------------------------------- +// +void CMPXButtonManager::CreateRockerAvkonButtonsL(const CCoeControl &aContainer) + { + TResourceReader reader; + iRockerAvkonButtonCount = 0; + CCoeEnv::Static()->CreateResourceReaderLC( reader, R_MPX_PBV_ROCKER_AVKON_BUTTONS ); + TInt numButtons( reader.ReadInt16() ); + + CCoeControl::SetContainerWindowL(aContainer); + + for (TInt i = 0; i < numButtons; i++ ) + { + CAknButton* aknButton = CAknButton::NewL(); + CleanupStack::PushL( aknButton ); + aknButton->SetContainerWindowL(*this); + aknButton->SetParent( this ); + aknButton->ConstructFromResourceL( reader ); + aknButton->SetObserver( this ); + aknButton->SetLongPressInterval(1000);//KAknKeyboardRepeatInitialDelay / 1000); + aknButton->SetKeyRepeatInterval(0, KAknKeyboardRepeatInitialDelay / 1000); + aknButton->ActivateL(); + iAvkonButtons.AppendL( aknButton ); + CleanupStack::Pop( aknButton ); + iRockerAvkonButtonCount++; + } + + CleanupStack::PopAndDestroy(); // reader; + + TResourceReader reader2; + if (iVolumeInRocker) + { + CCoeEnv::Static()->CreateResourceReaderLC( reader2, R_MPX_PBV_ROCKER_VOLUME_AVKON_BUTTONS ); + numButtons = reader2.ReadInt16(); + for (TInt i = 0; i < numButtons; i++ ) + { + CAknButton* aknButton = CAknButton::NewL(); + CleanupStack::PushL( aknButton ); + aknButton->SetContainerWindowL( *this ); + aknButton->SetParent( this ); + aknButton->ConstructFromResourceL( reader2 ); + aknButton->SetObserver( this ); + aknButton->SetLongPressInterval(1000);//KAknKeyboardRepeatInitialDelay / 1000); + aknButton->SetKeyRepeatInterval(0, KAknKeyboardRepeatInitialDelay / 1000); + aknButton->ActivateL(); + iAvkonButtons.AppendL( aknButton ); + CleanupStack::Pop( aknButton ); + iRockerAvkonButtonCount++; + } + } + else + { + CCoeEnv::Static()->CreateResourceReaderLC( reader2, R_MPX_PBV_ROCKER_STOP_AVKON_BUTTON ); + CAknButton* aknButton = CAknButton::NewL(); + CleanupStack::PushL( aknButton ); + aknButton->SetContainerWindowL( *this ); + aknButton->SetParent( this ); + aknButton->ConstructFromResourceL( reader2 ); + aknButton->SetObserver( this ); + aknButton->SetLongPressInterval(1000);//KAknKeyboardRepeatInitialDelay / 1000); + aknButton->SetKeyRepeatInterval(0, KAknKeyboardRepeatInitialDelay / 1000); + aknButton->ActivateL(); + iAvkonButtons.AppendL( aknButton ); + CleanupStack::Pop( aknButton ); + iRockerAvkonButtonCount++; + } + + CleanupStack::PopAndDestroy(); // reader2; + + } + +// ----------------------------------------------------------------------------- +// CMPXCommonPlaybackViewContainer::SetAvkonButtonState +// ----------------------------------------------------------------------------- +// +TKeyResponse CMPXButtonManager::SetAvkonButtonState(const TKeyEvent& aKeyEvent, + TEventCode aType) + { + + TKeyResponse response = EKeyWasNotConsumed; + + if (aKeyEvent.iScanCode == EStdKeyLeftArrow || aKeyEvent.iCode == EKeyLeftArrow) + { + MPX_DEBUG1( "CMPXButtonManager::SetAvkonButtonState LeftArrow" ); + if (aType == EEventKeyDown) + { + if (!iIsTouchUi) + { + iAvkonButtons[EButtonRewind]->SetCurrentState(1, ETrue); + } + iLongKeyTimer->Cancel(); + iLongKeyTimer->Start(KAknKeyboardRepeatInitialDelay, + KAknKeyboardRepeatInitialDelay, + TCallBack(TimerCallback, this)); + iLongPressCommandId = EMPXPbvCmdSeekBackward; + iIsSeeking = ETrue; + } + else if (aType == EEventKeyUp) + { + if (!iIsTouchUi) + { + iAvkonButtons[EButtonRewind]->SetCurrentState(0, ETrue); + } + iLongKeyTimer->Cancel(); + if (iIsLongPress) + { + MPX_DEBUG1( "CMPXButtonManager::SetAvkonButtonState LeftArrow long press" ); + iIsLongPress = EFalse; + iObserver->HandleButtonCommandL(EMPXPbvCmdEndSeek); + } + else + { + MPX_DEBUG1( "CMPXButtonManager::SetAvkonButtonState LeftArrow short press" ); + iObserver->HandleButtonCommandL(EMPXPbvCmdPreviousListItem); + } + iIsLongPress = EFalse; + response = EKeyWasConsumed; + iIsSeeking = EFalse; + } + } + else if (aKeyEvent.iScanCode == EStdKeyRightArrow || aKeyEvent.iCode == EKeyRightArrow) + { + if (aType == EEventKeyDown) + { + if (!iIsTouchUi) + { + iAvkonButtons[EButtonFastForward]->SetCurrentState(1, ETrue); + } + iLongKeyTimer->Cancel(); + iLongKeyTimer->Start(KAknKeyboardRepeatInitialDelay, + KAknKeyboardRepeatInitialDelay, + TCallBack(TimerCallback, this)); + iLongPressCommandId = EMPXPbvCmdSeekForward; + iIsSeeking = ETrue; + } + else if (aType == EEventKeyUp) + { + if (!iIsTouchUi) + { + iAvkonButtons[EButtonFastForward]->SetCurrentState(0, ETrue); + } + iLongKeyTimer->Cancel(); + if (iIsLongPress) + { + MPX_DEBUG1( "CMPXButtonManager::SetAvkonButtonState RightArrow long press" ); + iIsLongPress = EFalse; + iObserver->HandleButtonCommandL(EMPXPbvCmdEndSeek); + } + else + { + MPX_DEBUG1( "CMPXButtonManager::SetAvkonButtonState RightArrow short press" ); + iObserver->HandleButtonCommandL(EMPXPbvCmdNextListItem); + } + iIsLongPress = EFalse; + iIsSeeking = EFalse; + response = EKeyWasConsumed; + } + } + else if (aKeyEvent.iScanCode == EStdKeyDevice3 || aKeyEvent.iCode == EKeyDevice3 + || aKeyEvent.iScanCode == EStdKeyEnter || aKeyEvent.iCode == EKeyEnter) + { + MPX_DEBUG1( "CMPXButtonManager::SetAvkonButtonState EStdKeyDevice3 or EStdKeyEnter pressed" ); + if (!iIsTouchUi) + { + if (aType == EEventKeyDown) + { + iKeyDownEventReceived = ETrue; + + if (iAvkonButtons[EButtonPause]->IsVisible()) + { + iAvkonButtons[EButtonPause]->SetCurrentState(1, ETrue); + } + else + { + iAvkonButtons[EButtonPlay]->SetCurrentState(1, ETrue); + } + } + else if (aType == EEventKeyUp) + { + if ( iKeyDownEventReceived ) + { + if (iAvkonButtons[EButtonPause]->IsVisible()) + { + iAvkonButtons[EButtonPause]->SetCurrentState(0, ETrue); + iObserver->HandleButtonCommandL(EMPXPbvCmdPause); + response = EKeyWasConsumed; + } + else + { + iAvkonButtons[EButtonPlay]->SetCurrentState(0, ETrue); + iObserver->HandleButtonCommandL(EMPXPbvCmdPlay); + response = EKeyWasConsumed; + } + } + iKeyDownEventReceived= EFalse; + } + } + else //iIsTouchUi + { + if (aType == EEventKeyDown) + { + iKeyDownEventReceived = ETrue; + } + else if (aType == EEventKeyUp) + { + if ( iKeyDownEventReceived ) + { + iObserver->HandleButtonCommandL(EMPXPbvCmdPlayPause ); + response = EKeyWasConsumed; + } + iKeyDownEventReceived = EFalse; + } + } + } + else if (aKeyEvent.iScanCode == EStdKeyDownArrow || aKeyEvent.iCode == EKeyDownArrow) + { + MPX_DEBUG1( "CMPXButtonManager::SetAvkonButtonState EStdKeyDownArrow pressed" ); + if (iVolumeInRocker || iStopInRocker) + { + if (!iIsTouchUi) + { + if (aType == EEventKeyDown) + { + iAvkonButtons[EButtonVolumeDown]->SetCurrentState(1, ETrue); + } + else if (aType == EEventKeyUp) + { + iAvkonButtons[EButtonVolumeDown]->SetCurrentState(0, ETrue); + if(iVolumeInRocker) + { + iObserver->HandleButtonCommandL(EMPXPbvCmdDecreaseVolume); + } + else + { + iObserver->HandleButtonCommandL(EMPXPbvCmdStop); + } + response = EKeyWasConsumed; + } + } + else //iIsTouchUi + { + if (iVolumeInRocker && aType == EEventKeyUp ) + { + iObserver->HandleButtonCommandL(EMPXPbvCmdDecreaseVolume); + } + else if (iStopInRocker && aType == EEventKeyUp) + { + iObserver->HandleButtonCommandL(EMPXPbvCmdStop); + } + response = EKeyWasConsumed; + } + } + } + else if (aKeyEvent.iScanCode == EStdKeyUpArrow || aKeyEvent.iCode == EKeyUpArrow) + { + MPX_DEBUG1( "CMPXButtonManager::SetAvkonButtonState EStdKeyUpArrow pressed" ); + if(iVolumeInRocker) + { + if (!iIsTouchUi) + { + if (aType == EEventKeyDown) + { + iAvkonButtons[EButtonVolumeUp]->SetCurrentState(1, ETrue); + } + else if (aType == EEventKeyUp) + { + iAvkonButtons[EButtonVolumeUp]->SetCurrentState(0, ETrue); + iObserver->HandleButtonCommandL(EMPXPbvCmdIncreaseVolume); + response = EKeyWasConsumed; + } + } + else //iIsTouchUi + { + if (aType == EEventKeyUp) + { + iObserver->HandleButtonCommandL(EMPXPbvCmdIncreaseVolume); + response = EKeyWasConsumed; + } + } + } + } + return response; + } + +// ----------------------------------------------------------------------------- +// CMPlayerPlaybackContainer::TimerCallback +// ----------------------------------------------------------------------------- +// +TInt CMPXButtonManager::TimerCallback(TAny* aPtr) + { + //HandleLongPress(); + static_cast(aPtr)->HandleLongPress(); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CMPlayerPlaybackContainer::HandleLongPress +// ----------------------------------------------------------------------------- +// +void CMPXButtonManager::HandleLongPress() + { + iObserver->HandleButtonCommandL(iLongPressCommandId); + iLongKeyTimer->Cancel(); + iIsLongPress = ETrue; + } + +// ----------------------------------------------------------------------------- +// void CMPXCommonPlaybackViewContainer::HandleControlEventL +// ---------------------------------------------------------------------------- +// +void CMPXButtonManager::HandleControlEventL( CCoeControl* aControl, TCoeEvent aEventType ) + { + + if( AknLayoutUtils::PenEnabled() ) + { + switch( aEventType ) + { + case EEventStateChanged: + { + if (iVolumeInRocker) + { + if ( aControl == iAvkonButtons[EButtonVolumeUp] ) + { + iAvkonButtons[EButtonVolumeUp]->SetCurrentState(0, ETrue); + iObserver->HandleButtonCommandL(EMPXPbvCmdIncreaseVolume); + } + else if ( aControl == iAvkonButtons[EButtonVolumeDown] ) + { + iAvkonButtons[EButtonVolumeDown]->SetCurrentState(0, ETrue); + iObserver->HandleButtonCommandL(EMPXPbvCmdDecreaseVolume); + } + + } + + break; + } + case CAknButton::ELongPressEvent: + { + if ( aControl == iAvkonButtons[EButtonFastForward] ) + { + iIsLongPress = ETrue; + iAvkonButtons[EButtonFastForward]->SetCurrentState(0, ETrue); + iObserver->HandleButtonCommandL(EMPXPbvCmdSeekForward); + } + else if ( aControl == iAvkonButtons[EButtonRewind] ) + { + iIsLongPress = ETrue; + iAvkonButtons[EButtonRewind]->SetCurrentState(0, ETrue); + iObserver->HandleButtonCommandL(EMPXPbvCmdSeekBackward); + } + break; + } + case MCoeControlObserver::EEventRequestExit: + { + if ( aControl == iAvkonButtons[EButtonPlay] ) + { + iAvkonButtons[EButtonPlay]->SetCurrentState(0, ETrue); + iObserver->HandleButtonCommandL(EMPXPbvCmdPlay); + } + else if ( aControl == iAvkonButtons[EButtonPause] ) + { + iAvkonButtons[EButtonPause]->SetCurrentState(0, ETrue); + iObserver->HandleButtonCommandL(EMPXPbvCmdPause); + } + else if ( aControl == iAvkonButtons[EButtonFastForward] ) + { + if (iIsLongPress) + { + iIsLongPress = EFalse; + iAvkonButtons[EButtonFastForward]->SetCurrentState(0, ETrue); + iObserver->HandleButtonCommandL(EMPXPbvCmdEndSeek); + } + else + { + iAvkonButtons[EButtonFastForward]->SetCurrentState(0, ETrue); + iObserver->HandleButtonCommandL(EMPXPbvCmdNextListItem); + } + } + else if ( aControl == iAvkonButtons[EButtonRewind] ) + { + if (iIsLongPress) + { + iIsLongPress = EFalse; + iAvkonButtons[EButtonRewind]->SetCurrentState(0, ETrue); + iObserver->HandleButtonCommandL(EMPXPbvCmdEndSeek); + } + else + { + iAvkonButtons[EButtonRewind]->SetCurrentState(0, ETrue); + iObserver->HandleButtonCommandL(EMPXPbvCmdPreviousListItem); + } + } + else if ( !iVolumeInRocker) + { + if(aControl == iAvkonButtons[EButtonVolumeDown]) + { + iAvkonButtons[EButtonVolumeDown]->SetCurrentState(0, ETrue); + iObserver->HandleButtonCommandL(EMPXPbvCmdStop); + } + } + break; + } + default: + break; + } + } + + } + +// --------------------------------------------------------------------------- +// From CCoeControl +// Gets the number of controls contained in a compound control. +// --------------------------------------------------------------------------- +// +TInt CMPXButtonManager::CountComponentControls() const + { + return iRockerAvkonButtonCount; + } + +// --------------------------------------------------------------------------- +// From CCoeControl +// Gets an indexed component of a compound control. +// --------------------------------------------------------------------------- +// +CCoeControl* CMPXButtonManager::ComponentControl( TInt aIndex ) const + { + ASSERT( aIndex < iRockerAvkonButtonCount ); + return iAvkonButtons[aIndex]; + } + +// --------------------------------------------------------------------------- +// From CCoeControl +// Handles a change to the control's resources. +// --------------------------------------------------------------------------- +// +void CMPXButtonManager::HandleResourceChange( TInt aType ) + { + + if ( aType == KAknsMessageSkinChange ) + { + for (TInt i = 0; i< iRockerAvkonButtonCount; i++) + { + iAvkonButtons[i]->HandleResourceChange( aType ); + } + + } + } +// --------------------------------------------------------------------------- +// From CCoeControl +// Handles a size change +// --------------------------------------------------------------------------- +// +void CMPXButtonManager::SizeChanged() + { + iParentRect = Rect(); + TRect rockerRect = iLayout->ButtonLayout(iParentRect); + TRect controlButtonRect; + for (TInt i = 0; i< iRockerAvkonButtonCount; i++) + { + controlButtonRect = iLayout->ButtonLayout(rockerRect, i); + iAvkonButtons[i]->SetRect( controlButtonRect ); + } + } + +void CMPXButtonManager::Draw(CWindowGc& /*aGc*/, const CCoeControl& /*aControl*/, const TRect& /*aRect*/) const + { + // Do Nothing + } + +// ----------------------------------------------------------------------------- +// CMPXButtonManager::RestoreButtonStates +// ----------------------------------------------------------------------------- +// +void CMPXButtonManager::RestoreButtonStates( TMPXPlaybackState aState ) + { + MPX_DEBUG2("CMPXButtonManager::RestoreButtonStates(%d) entering", aState); + if( !iIsTouchUi) + { + if (aState == EPbStatePlaying) + { + // Playing + if (!iAvkonButtons[EButtonFastForward]->IsDimmed()) + { + iAvkonButtons[EButtonFastForward]->SetDimmed(ETrue); + } + if (!iAvkonButtons[EButtonRewind]->IsDimmed()) + { + iAvkonButtons[EButtonRewind]->SetDimmed(ETrue); + } + } + } + MPX_DEBUG1("CMPXButtonManager::ResoreButtonStates() exiting"); + } +// End of File