diff -r 839377eedc2b -r befca0ec475f videoplayback/videoplaybackviews/src/mpxvideoplaybackcontainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoplayback/videoplaybackviews/src/mpxvideoplaybackcontainer.cpp Wed Sep 01 12:30:28 2010 +0100 @@ -0,0 +1,669 @@ +/* +* 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: Implementation of Video playback view's container. +* +*/ + + +// Version : %version: 30 % + + +// INCLUDE FILES + +#include // RWindowBase +#include +#include +#include +#include +#include +#include +#include // SetSize for the icons +#include +#include +#include // Side volume key +#include // KDC_APP_BITMAP_DIR +#include +#include +#include + +#include "mpxcommonvideoplaybackview.hrh" +#include "mpxvideoplaybackview.h" +#include "mpxvideoplaybackviewfiledetails.h" +#include "mpxvideoplaybackcontainer.h" +#include "mpxvideoplaybackcontrolscontroller.h" +#include "mpxvideoplaybackuserinputhandler.h" +#include +#include "mpxvideo_debug.h" + +using namespace AknLayoutScalable_Apps; + +// +// CONSTANTS +// +const TInt KMPXRealOneLogoTimeOut = 600000; + +// ======== MEMBER FUNCTIONS ======================================================================= + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackContainer::CMPXVideoPlaybackContainer() +// ------------------------------------------------------------------------------------------------- +// +CMPXVideoPlaybackContainer::CMPXVideoPlaybackContainer( CMPXVideoBasePlaybackView* aView ) + : iView( aView ) +{ +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackContainer::NewL() +// ------------------------------------------------------------------------------------------------- +// +CMPXVideoPlaybackContainer* CMPXVideoPlaybackContainer::NewL( CMPXVideoBasePlaybackView* aView ) +{ + MPX_DEBUG(_L("CMPXVideoPlaybackContainer::NewL()")); + + CMPXVideoPlaybackContainer* self = new (ELeave) CMPXVideoPlaybackContainer( aView ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; +} + +// ------------------------------------------------------------------------------------------------- +// CMPNormalScreenPlaybackContainer::ConstructL +// Symbian 2nd phase constructor can leave. +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoPlaybackContainer::ConstructL() +{ + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackContainer::ConstructL()")); + + SetMopParent( iView ); + CreateWindowL(); + + TAknWindowLineLayout screenLayout = AknLayout::screen(); + TRect screenRect = screenLayout.Rect(); + + SetRect( screenRect ); + + CreateControlsL(); + + iUserInputHandler = + CMPXVideoPlaybackUserInputHandler::NewL( this ); + + ActivateL(); +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackContainer::~CMPXVideoPlaybackContainer() +// ------------------------------------------------------------------------------------------------- +// +CMPXVideoPlaybackContainer::~CMPXVideoPlaybackContainer() +{ + if ( iRealOneBitmapTimer ) + { + iRealOneBitmapTimer->Cancel(); + delete iRealOneBitmapTimer; + iRealOneBitmapTimer = NULL; + } + + if ( iFileDetails ) + { + delete iFileDetails; + iFileDetails = NULL; + } + + if ( iControlsController ) + { + delete iControlsController; + iControlsController = NULL; + } + + if ( iUserInputHandler ) + { + delete iUserInputHandler; + iUserInputHandler = NULL; + } + + CloseWindow(); +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackContainer::AddFileDetailsL() +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoPlaybackContainer::AddFileDetailsL( CMPXVideoPlaybackViewFileDetails* aDetails ) +{ + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackContainer::AddFileDetailsL()")); + + // + // If clip is audio only Real Media, delay adding the file details until the + // Real One bitmap has been shown. + // + if ( iRealOneBitmapTimer && iRealOneBitmapTimer->IsActive() && ! aDetails->iVideoEnabled ) + { + MPX_DEBUG(_L("CMPXVideoPlaybackContainer::AddFileDetailsL() file details delayed")); + + iDelayedFileDetails = aDetails; + } + else + { + iControlsController->AddFileDetailsL( aDetails ); + + // + // Delete the temp file details since plugin initialization is complete + // + if ( iFileDetails ) + { + delete iFileDetails; + iFileDetails = NULL; + } + } +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackContainer::GetWindow() +// ------------------------------------------------------------------------------------------------- +// +RWindow& CMPXVideoPlaybackContainer::GetWindow() const +{ + return Window(); +} + +// ------------------------------------------------------------------------------------------------- +// From CCoeControl +// Handles key events. +// ------------------------------------------------------------------------------------------------- +// +TKeyResponse CMPXVideoPlaybackContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) +{ + MPX_ENTER_EXIT( + _L("CMPXVideoPlaybackContainer::OfferKeyEventL()"), + _L("aKeyEvent = (%d,%d), aType = %d"), aKeyEvent.iCode, aKeyEvent.iScanCode, aType ); + + iKeyResponse = EKeyWasNotConsumed; + + iUserInputHandler->ProcessKeyEventL( aKeyEvent, aType ); + + return iKeyResponse; +} + + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackContainer::DoHandleKeyEventL() +// ------------------------------------------------------------------------------------------------- +// +EXPORT_C void +CMPXVideoPlaybackContainer::DoHandleKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType ) +{ + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackContainer::DoHandleKeyEventL()")); + + switch ( aKeyEvent.iScanCode ) + { + case EStdKeyDevice3: // rocker middle key + case EStdKeyEnter: // enter key on a qwerty key board + { + HandleRockerMiddleKeyL( aKeyEvent, aType ); + iKeyResponse = EKeyWasConsumed; + break; + } + case EStdKeyUpArrow: // rocker up key + { + if ( aType != EEventKeyUp ) + { + HandleCommandL( EMPXPbvCmdIncreaseVolume ); + iKeyResponse = EKeyWasConsumed; + } + + break; + } + case EStdKeyDownArrow: // rocker down key + { + if ( aType != EEventKeyUp ) + { + HandleCommandL( EMPXPbvCmdDecreaseVolume ); + iKeyResponse = EKeyWasConsumed; + } + + break; + } + case EStdKeyLeftArrow: // rocker left key + { + HandleSeekBackL( aType ); + iKeyResponse = EKeyWasConsumed; + break; + } + case EStdKeyRightArrow: // rocker right key + { + HandleSeekFwdL( aType ); + iKeyResponse = EKeyWasConsumed; + break; + } + case EStdKeyDevice0: // LSK + case EStdKeyDevice1: // RSK + { + if ( aType == EEventKeyUp ) + { + iControlsController->HandleEventL( EMPXControlCmdSoftKeyPressed, + aKeyEvent.iScanCode ); + } + + iKeyResponse = EKeyWasConsumed; + break; + } + } +} + +// ------------------------------------------------------------------------------------------------- +// Handles rocker's middle key => Toggles between play & pause +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoPlaybackContainer::HandleRockerMiddleKeyL( const TKeyEvent& aKeyEvent, + TEventCode aType ) +{ + if ( aKeyEvent.iCode == EKeyNull && aType == EEventKeyDown ) + { + iView->HandleCommandL( EMPXPbvCmdPlayPause ); + } +} + +// ------------------------------------------------------------------------------------------------- +// Starts/Stops Seeking Forward +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoPlaybackContainer::HandleSeekFwdL( TEventCode aType ) +{ + if ( aType == EEventKeyDown ) + { + iView->HandleCommandL( EMPXPbvCmdSeekForward ); + } + else if ( aType == EEventKeyUp ) + { + iView->HandleCommandL( EMPXPbvCmdEndSeek ); + } +} + +// ------------------------------------------------------------------------------------------------- +// Starts/Stops Seeking Backward +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoPlaybackContainer::HandleSeekBackL( TEventCode aType ) +{ + if ( aType == EEventKeyDown ) + { + iView->HandleCommandL(EMPXPbvCmdSeekBackward); + } + else if ( aType == EEventKeyUp ) + { + iView->HandleCommandL( EMPXPbvCmdEndSeek ); + } +} + +// ------------------------------------------------------------------------------------------------- +// From CCoeControl +// Handles a change to the control's resources. +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoPlaybackContainer::HandleResourceChange( TInt aType ) +{ + CCoeControl::HandleResourceChange( aType ); +} + +// ------------------------------------------------------------------------------------------------- +// From CCoeControl +// Gets the control's help context. +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoPlaybackContainer::GetHelpContext( TCoeHelpContext& /*aContext*/ ) const +{ +} + +// ------------------------------------------------------------------------------------------------- +// From CCoeControl +// Gets the number of controls contained in a compound control. +// ------------------------------------------------------------------------------------------------- +// +TInt CMPXVideoPlaybackContainer::CountComponentControls() const +{ + TInt count = 0; + + if ( iRealOneBitmap ) + { + count = 1; + } + + return count; +} + +// ------------------------------------------------------------------------------------------------- +// From CCoeControl +// Gets an indexed component of a compound control. +// ------------------------------------------------------------------------------------------------- +// +CCoeControl* CMPXVideoPlaybackContainer::ComponentControl( TInt aIndex ) const +{ + CCoeControl* control = NULL; + + switch ( aIndex ) + { + case 0: + { + control = iRealOneBitmap; + break; + } + } + + return control; +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackContainer::HandlePointerEventL() +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoPlaybackContainer::HandlePointerEventL( const TPointerEvent& aPointerEvent ) +{ + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackContainer::HandlePointerEventL()")); + + iUserInputHandler->ProcessPointerEventL( this, aPointerEvent, EMpxVideoPlaybackContainer ); +} + + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackContainer::DoHandlePointerEventL() +// +// Gets called from the Controls Controller +// only if if OK to handle pointer events +// ------------------------------------------------------------------------------------------------- +// +EXPORT_C +void CMPXVideoPlaybackContainer::DoHandlePointerEventL( const TPointerEvent& aPointerEvent ) +{ + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackContainer::DoHandlePointerEventL()"), + _L("aPointerEvent.iType = %d"), aPointerEvent.iType ); + + if ( AknLayoutUtils::PenEnabled() ) + { + if ( aPointerEvent.iType == TPointerEvent::EButton1Up ) + { + iControlsController->HandleEventL( EMPXControlCmdToggleVisibility ); + + SetPointerCapture( EFalse ); + ClaimPointerGrab( EFalse ); + } + else if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) + { + SetPointerCapture( ETrue ); + ClaimPointerGrab( ETrue ); + } + } +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackContainer::Draw() +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoPlaybackContainer::Draw( const TRect& aRect ) const +{ + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackContainer::Draw()")); + + CWindowGc& gc = SystemGc(); + + gc.SetBrushStyle( CGraphicsContext::ESolidBrush ); + gc.SetDrawMode( CGraphicsContext::EDrawModeWriteAlpha ); + + if ( Window().DisplayMode() == EColor16MAP ) + { + gc.SetBrushColor( TRgb::Color16MAP(255) ); + } + else if ( Window().DisplayMode() == EColor16MA ) + { + gc.SetBrushColor( TRgb::Color16MA(0) ); + } + + gc.Clear( aRect ); +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackContainer::HandleEventL() +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoPlaybackContainer::HandleEventL( TMPXVideoPlaybackControlCommandIds aEvent, + TInt aValue ) +{ + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackContainer::HandleEventL()")); + + if ( aEvent == EMPXControlCmdHandleBackgroundEvent ) + { + iUserInputHandler->SetForeground(EFalse); + } + else if ( aEvent == EMPXControlCmdHandleForegroundEvent ) + { + iUserInputHandler->SetForeground(ETrue); + } + + iControlsController->HandleEventL( aEvent, aValue ); +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackContainer::HandleCommandL() +// ------------------------------------------------------------------------------------------------- +// +EXPORT_C void CMPXVideoPlaybackContainer::HandleCommandL( TInt aCommand, TInt aValue ) +{ + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackContainer::HandleCommandL()"), + _L("aCommand = %d aValue = %d"), aCommand, aValue ); + + switch ( aCommand ) + { + case EMPXPbvCmdSetPosition: + { + iView->SetPropertyL( EPbPropertyPosition, (TInt)aValue * KPbMilliMultiplier ); + break; + } + case EMPXPbvCmdResetControls: + { + if ( iRealOneBitmapTimer ) + { + iRealOneBitmapTimer->Cancel(); + delete iRealOneBitmapTimer; + iRealOneBitmapTimer = NULL; + } + + // + // Recreate the controls with the new clip + // + CreateControlsL(); + + // + // Retrieve the PDL information for container + // + iView->RetrievePdlInformationL(); + + break; + } + case EAknSoftkeyOptions: + { + static_cast(iView)->ProcessCommandL( EAknSoftkeyOptions ); + break; + } + case EMPXPbvCmdSetVolume: + { + iView->SetPropertyL( EPbPropertyVolume, aValue ); + break; + } + case EMPXPbvSurfaceCreated: + { + iControlsController->HandleEventL( EMPXControlCmdSurfaceCreated ); + DrawNow(); + break; + } + case EMPXPbvSurfaceRemoved: + { + iControlsController->HandleEventL( EMPXControlCmdSurfaceRemoved ); + DrawNow(); + break; + } + default: + { + iView->HandleCommandL( aCommand ); + break; + } + } +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackContainer::CreateControlsL() +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoPlaybackContainer::CreateControlsL() +{ + MPX_ENTER_EXIT(_L("CMPXVideoPlaybackContainer::CreateControlsL()")); + + // + // Query playback plugin for filename and mode + // + CMPXCommand* cmd = CMPXCommand::NewL(); + CleanupStack::PushL( cmd ); + + iView->RetrieveFileNameAndModeL( cmd ); + + // + // Create a temporary file details that is populated with the + // file name and playback mode. This will be delete when + // plugin initialization is complete + // + if ( iFileDetails ) + { + delete iFileDetails; + iFileDetails = NULL; + } + + iFileDetails = CMPXVideoPlaybackViewFileDetails::NewL(); + + TPtrC fileName( cmd->ValueText( KMPXMediaVideoPlaybackFileName ) ); + iFileDetails->iClipName = fileName.AllocL(); + + iFileDetails->iPlaybackMode = (TMPXVideoMode) cmd->ValueTObjectL( KMPXMediaVideoMode ); + + iFileDetails->iTvOutConnected = cmd->ValueTObjectL( KMPXMediaVideoTvOutConnected ); + + TPtrC mimeType( cmd->ValueText( KMPXMediaVideoRecognizedMimeType ) ); + iFileDetails->iMimeType = mimeType.AllocL(); + + CleanupStack::PopAndDestroy( cmd ); + + if ( iControlsController ) + { + delete iControlsController; + iControlsController = NULL; + } + + iControlsController = CMPXVideoPlaybackControlsController::NewL( this, Rect(), iFileDetails ); + + // + // Retrieve the Real One Logo bitmap + // + iRealOneBitmap = iControlsController->GetBitmap( EMPXRealLogoBitmap ); + + if ( iRealOneBitmap ) + { + // + // Start timer since Real One bitmap is created + // + iRealOneBitmapTimer = CPeriodic::NewL( CActive::EPriorityStandard ); + + iRealOneBitmapTimer->Start( + KMPXRealOneLogoTimeOut, + 0, + TCallBack( CMPXVideoPlaybackContainer::HandleRealOneBitmapTimeout, this ) ); + + DrawNow(); + } +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackContainer::UserInputHandler() +// ------------------------------------------------------------------------------------------------- +// +EXPORT_C CMPXVideoPlaybackUserInputHandler* CMPXVideoPlaybackContainer::UserInputHandler() +{ + MPX_DEBUG(_L("CMPXVideoPlaybackContainer::UserInputHandler()")); + return iUserInputHandler; +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackContainer::IsRealOneBitmapTimerActive() +// ------------------------------------------------------------------------------------------------- +// +TBool CMPXVideoPlaybackContainer::IsRealOneBitmapTimerActive() +{ + TBool timerActive( EFalse ); + + if ( iRealOneBitmapTimer ) + { + timerActive = iRealOneBitmapTimer->IsActive(); + } + + MPX_DEBUG(_L("CMPXVideoPlaybackContainer::IsRealOneBitmapTimerActive(%d)"), timerActive); + + return timerActive; +} + + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackContainer::HandleRealOneBitmapTimeout +// ------------------------------------------------------------------------------------------------- +// +TInt CMPXVideoPlaybackContainer::HandleRealOneBitmapTimeout( TAny* aPtr ) +{ + MPX_DEBUG(_L("CMPXVideoPlaybackContainer::HandleRealOneBitmapTimeout()")); + static_cast(aPtr)->DoHandleRealOneBitmapTimeout(); + return KErrNone; +} + +// ------------------------------------------------------------------------------------------------- +// CMPXVideoPlaybackContainer::DoHandleRealOneBitmapTimeout +// ------------------------------------------------------------------------------------------------- +// +void CMPXVideoPlaybackContainer::DoHandleRealOneBitmapTimeout() +{ + MPX_DEBUG(_L("CMPXVideoPlaybackContainer::DoHandleRealOneBitmapTimeout()")); + + if ( iDelayedFileDetails ) + { + MPX_TRAPD( err, iControlsController->AddFileDetailsL( iDelayedFileDetails ) ); + + // + // Delete the temp file details since plugin initialization is complete + // + if ( iFileDetails ) + { + delete iFileDetails; + iFileDetails = NULL; + } + + iDelayedFileDetails = NULL; + } + + if ( iRealOneBitmapTimer->IsActive() ) + { + iRealOneBitmapTimer->Cancel(); + delete iRealOneBitmapTimer; + iRealOneBitmapTimer = NULL; + } + + MPX_TRAPD( err, iView->HandleCommandL( EMPXPbvCmdRealOneBitmapTimeout ) ); +} + +// EOF