internetradio2.0/uisrc/irnowplayingviewcontainer.cpp
changeset 0 09774dfdd46b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/internetradio2.0/uisrc/irnowplayingviewcontainer.cpp	Mon Apr 19 14:01:53 2010 +0300
@@ -0,0 +1,478 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#include <aknutils.h>
+#include <alf/alfanchorlayout.h>
+#include <alf/alfcontrolgroup.h>
+#include <alf/alfdecklayout.h>
+#include <alf/alfenv.h>
+#include <alf/alfevent.h>
+#include <alf/alfimagevisual.h>
+#include <alf/alftextvisual.h>
+#include <alf/alfvisual.h>
+#include <alf/alftimedvalue.h>
+#include <alf/alfdisplay.h>
+#include <data_caging_path_literals.hrh>
+#include <touchfeedback.h>
+
+
+#include <internetradio.rsg>
+#include <alf/alfimagevisual.h>
+#include <aknview.h>
+#include <aknview.h>
+#include <aknvolumepopup.h>
+#include <stringloader.h>
+#include <e32des8.h>
+#include "internetradio.mbg"
+#include "irui.h"
+#include "ir.hrh"
+#include "ircommon.h"
+#include "irdebug.h"
+#include "irnowplayingviewcontainer.h"
+#include "irnowplayingview.h"
+#include "irnowplayingwrapper.h"
+#include "irfavoritesdb.h"
+#include "irstationlogocontrol.h"
+#include "irstationinformationdisplay.h"
+#include "irradioidle.h"
+
+#ifdef MUL_USE_COMMON_COMPONENTS
+using namespace GestureHelper;
+/** The base value for the control group id needed when constructing gesture control. */
+const TInt KIRFreeControlGroupIdBase = 10;
+#endif
+const TInt KControl1 =0;
+
+
+
+// ---------------------------------------------------------------------------
+// CIRNowPlayingViewContainer::CIRNowPlayingViewContainer()
+// Default constructor
+// ---------------------------------------------------------------------------
+//
+CIRNowPlayingViewContainer::CIRNowPlayingViewContainer(CAlfEnv& aEnv ):iAlfEnv (aEnv)
+    {
+    IRLOG_DEBUG( "CIRNowPlayingViewContainer::CIRNowPlayingViewContainer" );
+    }
+
+// ---------------------------------------------------------------------------
+// CIRNowPlayingViewContainer* CIRNowPlayingViewContainer::NewL( CAlfEnv& aEnv )
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CIRNowPlayingViewContainer* CIRNowPlayingViewContainer::NewL( CAlfEnv& aEnv,
+				CIRNowPlayingView* aInstance)
+{
+	IRLOG_DEBUG( "CIRNowPlayingViewContainer::NewL" );
+	CIRNowPlayingViewContainer* self = CIRNowPlayingViewContainer::NewLC(aEnv,aInstance);
+	CleanupStack::Pop(self);
+	IRLOG_DEBUG( "CIRNowPlayingViewContainer::NewL - Exiting." );
+	return self;
+
+}
+
+// ---------------------------------------------------------------------------
+// CIRNowPlayingViewContainer* CIRNowPlayingViewContainer::NewL( CAlfEnv& aEnv )
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CIRNowPlayingViewContainer* CIRNowPlayingViewContainer::NewLC( CAlfEnv& aEnv,
+			CIRNowPlayingView* aInstance)
+    {
+    IRLOG_DEBUG( "CIRNowPlayingViewContainer::NewLC - Entering" );
+    CIRNowPlayingViewContainer* self = new( ELeave ) CIRNowPlayingViewContainer(aEnv);
+    CleanupStack::PushL( self );
+    self->ConstructL(aInstance);
+    IRLOG_DEBUG( "CIRNowPlayingViewContainer::NewLC - Exiting" );
+    return self;
+    }
+
+
+
+// ---------------------------------------------------------------------------
+// void CIRNowPlayingViewContainer::ConstructL( CAlfEnv& aEnv )
+// Second phase constructor
+// ---------------------------------------------------------------------------
+//
+void CIRNowPlayingViewContainer::ConstructL( CIRNowPlayingView* aInstance )
+	{
+	IRLOG_DEBUG( "CIRNowPlayingViewContainer::ConstructL - Entering" );
+	iNowPlayingView=aInstance;
+	#ifdef MUL_USE_COMMON_COMPONENTS
+	    // Control group id that client must not use.
+	 	const TInt freeControlGroupId  = KIRFreeControlGroupIdBase + KIRMaximumViewId.iUid;
+	    CGestureControl::ConstructL( *this, iAlfEnv, iAlfEnv.PrimaryDisplay(), freeControlGroupId );
+	#else
+	    CAlfControl::ConstructL( iAlfEnv );
+	#endif
+	// Create Main View
+	iLayout = CAlfAnchorLayout::AddNewL( *this );
+	LayoutControl();
+	iByteCounter=CAlfTextVisual::AddNewL( *this, iLayout);
+	iBitrate = CAlfTextVisual::AddNewL( *this, iLayout);
+	CAlfDeckLayout* deck = CAlfDeckLayout::AddNewL( *this, iLayout );
+	iLogoControl = CIRStationLogoControl::NewL( Env(), KIRNowPlayingViewID.iUid, deck );
+	iRadioIdle = CIRRadioIdle::NewL( iAlfEnv, KIRNowPlayingViewID.iUid, deck );
+		// Update radio idle skin color
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    if ( skin )
+    	{
+    	TRgb textColor; // text color when not highlighted
+    	AknsUtils::GetCachedColor( skin, textColor, KAknsIIDQsnTextColors, 
+    								EAknsCIQsnTextColorsCG6 );
+    	TRgb highlightColor; // text color when highlighted
+    	AknsUtils::GetCachedColor( skin, highlightColor, KAknsIIDQsnTextColors,
+    								 EAknsCIQsnTextColorsCG10 );
+    	iRadioIdle->SetPrimaryColor( textColor );
+    	iRadioIdle->SetSecondaryColor( highlightColor );
+    	}
+	iStationInformationDisplay = CIRStationInformationDisplay::NewL( iAlfEnv, 
+					KIRNowPlayingViewID.iUid,iLayout);
+	if (iNowPlayingView->iUi->IsLandscapeOrientation() )
+        {
+        // Set display orientation.
+        iStationInformationDisplay->SetDisplayOrientation( ETrue );
+        }
+	iAlfEnv.ControlGroup( KIRNowPlayingViewID.iUid ).AppendL( this ); // Transfers ownership. No leaving code must be run after this call.
+    iFeedback = MTouchFeedback::Instance();
+	IRLOG_DEBUG( "CIRNowPlayingViewContainer::ConstructL - Exiting" );
+	}
+
+
+
+// ---------------------------------------------------------------------------
+// CIRNowPlayingViewContainer::~CIRNowPlayingViewContainer()
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CIRNowPlayingViewContainer::~CIRNowPlayingViewContainer()
+    {
+    IRLOG_DEBUG( "CIRNowPlayingViewContainer::~CIRNowPlayingViewContainer - Entering" );
+    iLogoControl = NULL;
+	iLayout = NULL;
+	iStationInformationDisplay = NULL;
+	iBitrate = NULL;
+	iByteCounter = NULL;
+	iNowPlayingView = NULL;
+	IRLOG_DEBUG( "CIRNowPlayingViewContainer::~CIRNowPlayingViewContainer - Exiting" );
+    }
+
+// ---------------------------------------------------------------------------
+// Returns a reference to the station logo control.
+// ---------------------------------------------------------------------------
+//
+CIRStationLogoControl& CIRNowPlayingViewContainer::StationLogoControl()
+    {
+    IRLOG_DEBUG( "CIRNowPlayingViewContainer::StationLogoControl" );
+    return *iLogoControl;
+    }
+
+// ---------------------------------------------------------------------------
+// Returns a reference to the radio idle control.
+// ---------------------------------------------------------------------------
+//
+CIRRadioIdle& CIRNowPlayingViewContainer::RadioIdle()
+    {
+    return *iRadioIdle;
+    }
+#ifdef MUL_USE_COMMON_COMPONENTS
+// ---------------------------------------------------------------------------
+// From class MGestureObserver.
+// Called when user makes gestures.
+// ---------------------------------------------------------------------------
+//
+void CIRNowPlayingViewContainer::HandleGestureL( const MGestureEvent& aEvent )
+    {
+    IRLOG_DEBUG(" *** S60VisualRadio -- CVRNowPlayingContainer::HandleGestureL ");
+    TGestureCode eventCode( aEvent.Code( MGestureEvent::EAxisBoth ) );
+    switch ( eventCode )
+        {
+        case GestureHelper::EGestureStart:
+            {
+            if ( iFeedback )
+                {
+                // Give feedback when gesture starts.
+                iFeedback->InstantFeedback( ETouchFeedbackBasic );
+                }
+            break;
+            }
+        case GestureHelper::EGestureTap:
+            {
+            iNowPlayingView->HandleCommandL(EIRCmdVolumeControl);
+            break;
+            }
+        case GestureHelper::EGestureSwipeLeft:
+            {
+            iNowPlayingView->HandleCommandL( EIRCmdStepPrevPreset );
+            break;
+            }
+        case GestureHelper::EGestureSwipeRight:
+            {
+            iNowPlayingView->HandleCommandL( EIRCmdStepNextPreset );
+            break;
+            }
+        default:
+            break;
+        }
+    }
+#else
+
+
+// ---------------------------------------------------------------------------
+// From class CAlfControl.
+// Called when an event occurs.
+// ---------------------------------------------------------------------------
+//
+TBool CIRNowPlayingViewContainer::OfferEventL( const TAlfEvent& aEvent )
+	{
+    TBool eventHandled = EFalse;
+    IRLOG_DEBUG( "CIRNowPlayingViewContainer::OfferEventL - Entering" );
+	if(aEvent.IsPointerEvent())
+		{
+		if ( iFeedback )
+			{	
+			iFeedback->InstantFeedback( ETouchFeedbackBasic );
+			}
+		TriggerCommandL(EIRCmdVolumeControl);
+        eventHandled = ETrue;
+		}
+	else if(aEvent.IsKeyEvent() )
+		{
+		const TKeyEvent& kEvent = aEvent.KeyEvent();
+		KeyHitL( kEvent.iScanCode );
+		}
+	IRLOG_DEBUG( "CIRNowPlayingViewContainer::OfferEventL - Exiting" );
+    return eventHandled;
+	}
+#endif
+// ---------------------------------------------------------------------------
+// Returns a reference to the station information display.
+// ---------------------------------------------------------------------------
+//
+CIRStationInformationDisplay& CIRNowPlayingViewContainer::StationInformationDisplay()
+    {
+    IRLOG_DEBUG( "CIRNowPlayingViewContainer::StationInformationDisplay " );
+    return *iStationInformationDisplay;
+    }
+// ---------------------------------------------------------------------------
+// void CIRNowPlayingViewContainer::SetRdsTextL( const TDesC& aText )
+// Set the text in the visual.
+// ---------------------------------------------------------------------------
+//
+void CIRNowPlayingViewContainer::SetBitrateL( const TDesC& aText )
+    {
+    IRLOG_DEBUG( "CIRNowPlayingViewContainer::SetBitrateL - Entering" );
+    iBitrate->SetColor( KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6 );
+    iBitrate->SetStyle( EAlfTextStyleSmall );
+    iBitrate->SetTextL( aText );
+    iBitrate->SetWrapping( CAlfTextVisual::ELineWrapManual );
+    IRLOG_DEBUG( "CIRNowPlayingViewContainer::SetBitrateL - Exiting" );
+    }
+
+// ---------------------------------------------------------------------------
+// void CIRNowPlayingViewContainer::SetRdsTextL1( const TDesC& aText )
+// Set the text in the visual.
+// ---------------------------------------------------------------------------
+//
+void CIRNowPlayingViewContainer::SetByteCounterL( const TDesC& aText )
+	{
+	IRLOG_DEBUG( "CIRNowPlayingViewContainer::SetByteCounterL - Entering" );
+	iByteCounter->SetColor( KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6 );
+	iByteCounter->SetStyle( EAlfTextStyleSmall );
+	iByteCounter->SetTextL( aText );
+	IRLOG_DEBUG( "CIRNowPlayingViewContainer::SetByteCounterL - Exiting" );
+	}
+// ---------------------------------------------------------------------------
+// CIRNowPlayingViewContainer::KeyHit()
+// Loads the fonts required to draw this view
+// ---------------------------------------------------------------------------
+//
+
+TBool CIRNowPlayingViewContainer::KeyHitL(  TInt aScanCode 
+	                  /*TVRRockerButtonHitTestType aType */)
+	{
+     IRLOG_DEBUG( "CIRNowPlayingViewContainer::KeyHit - Entering" );
+	TBool ret = EFalse;
+	switch ( aScanCode )
+		{
+		case EStdKeyRightArrow:
+			{
+			TriggerCommandL(EIRCmdStepNextPreset);
+			}
+		break;
+		case EStdKeyLeftArrow:
+			{
+			TriggerCommandL(EIRCmdStepPrevPreset);
+			}
+		break;
+		case EStdKeyDevice3:
+			{
+			if(iNowPlayingView->iNowPlayingWrapper->iPlaying)
+				{
+				TriggerCommandL(EIRCmdStop);
+				}
+			else
+				{
+				TriggerCommandL(EIRCmdPlay);
+				}
+			}
+		break;
+		case EStdKeyUpArrow:
+		break;
+		case EStdKeyDownArrow:
+		break;
+		default:
+		break;
+		}
+	IRLOG_DEBUG( "CIRNowPlayingViewContainer::KeyHit - Exiting" );
+	return ret;
+	}
+// ---------------------------------------------------------------------------
+// Layouts this control.
+// ---------------------------------------------------------------------------
+//
+void CIRNowPlayingViewContainer::LayoutControl()
+    {
+    IRLOG_DEBUG( "CIRNowPlayingViewContainer::LayoutControl - Entering" );
+     TInt ordinal = KControl1;
+	 TInt resId ;
+    
+    
+    //Set anchor for ByteCounter
+    resId = iNowPlayingView->iUi->ChooseLayoutResource( 
+    									 R_IR_NOWPLAYING_VIEW_BYTECOUNTER_LAYOUT, 
+                                         R_IR_NOWPLAYING_VIEW_BYTECOUNTER_LAYOUT_MIRRORED, 
+                                         R_IR_NOWPLAYING_VIEW_BYTECOUNTER_LAYOUT_LANDSCAPE, 
+                                 R_IR_NOWPLAYING_VIEW_BYTECOUNTER_LAYOUT_LANDSCAPE_MIRRORED );
+    SetLayoutAnchor( ordinal, resId );
+    ordinal++;
+
+    //Set anchor for the BitRate
+     resId = iNowPlayingView->iUi->ChooseLayoutResource( 
+        								 R_IR_NOWPLAYING_VIEW_BITRATE_LAYOUT, 
+                                         R_IR_NOWPLAYING_VIEW_BITRATE_LAYOUT_MIRRORED, 
+                                         R_IR_NOWPLAYING_VIEW_BITRATE_LAYOUT_LANDSCAPE, 
+                                 R_IR_NOWPLAYING_VIEW_BITRATE_LAYOUT_LANDSCAPE_MIRRORED );
+    SetLayoutAnchor( ordinal, resId );  
+     ordinal++;
+                                
+    // Set anchor for station logo.
+    resId = iNowPlayingView->iUi->ChooseLayoutResource( 
+    									 R_IR_NOWPLAYING_VIEW_LOGO_BITMAP_LAYOUT, 
+                                         R_IR_NOWPLAYING_VIEW_LOGO_BITMAP_LAYOUT_MIRRORED, 
+                                         R_IR_NOWPLAYING_VIEW_LOGO_BITMAP_LAYOUT_LANDSCAPE, 
+                                 R_IR_NOWPLAYING_VIEW_LOGO_BITMAP_LAYOUT_LANDSCAPE_MIRRORED );
+    SetLayoutAnchor( ordinal, resId );
+     ordinal++;
+
+    // Set anchor for station information.
+    resId = iNowPlayingView->iUi->ChooseLayoutResource(
+    									 R_IR_NOWPLAYING_VIEW_STATION_INFORMATION_LAYOUT, 
+                                         R_IR_NOWPLAYING_VIEW_STATION_INFORMATION_LAYOUT_MIRRORED, 
+                           R_IR_NOWPLAYING_VIEW_STATION_INFORMATION_LAYOUT_LANDSCAPE,
+                           R_IR_NOWPLAYING_VIEW_STATION_INFORMATION_LAYOUT_LANDSCAPE_MIRRORED );
+    SetLayoutAnchor( ordinal, resId );
+    ordinal++;
+    
+    if ( iNowPlayingView->iUi->IsLandscapeOrientation() )
+        {
+        // Set anchor for RDS data on landscape.
+        resId = R_IR_NOWPLAYING_VIEW_METADATA_LAYOUT_LANDSCAPE;
+        if ( AknLayoutUtils::LayoutMirrored() )
+            {
+            resId = R_IR_NOWPLAYING_VIEW_METADATA_LAYOUT_LANDSCAPE_MIRRORED;    
+            }
+        SetLayoutAnchor( ordinal, resId );
+        ordinal++;
+        } 
+    else
+	    {
+        // If RDS data is on separate layout then remove it 
+        iLayout->Detach( ordinal );
+	    }
+    if ( iStationInformationDisplay )
+        {
+        iStationInformationDisplay->SetDisplayOrientation( 
+        			iNowPlayingView->iUi->IsLandscapeOrientation() );
+        }
+    iLayout->UpdateChildrenLayout();
+
+    IRLOG_DEBUG( "CIRNowPlayingViewContainer::LayoutControl - Exiting" );
+    }
+
+// ---------------------------------------------------------------------------
+// Sets layout anchor for child visual.
+// ---------------------------------------------------------------------------
+//
+void CIRNowPlayingViewContainer::SetLayoutAnchor( TInt aOrdinal, TInt aResourceId )
+    {
+    IRLOG_DEBUG( "CIRNowPlayingViewContainer::SetLayoutAnchor - Entering" );
+
+    // Read LAFs.
+    TSize size = iAlfEnv.PrimaryDisplay().VisibleArea().Size();
+    TRect rect( size );
+    
+    TAknLayoutRect layoutRect;
+    layoutRect.LayoutRect( rect, aResourceId );
+    
+    // Set top/left anchor.
+    iLayout->Attach( aOrdinal, 
+                     EAlfAnchorTypeTopLeft,
+                     TAlfXYMetric( TAlfMetric( layoutRect.Rect().iTl.iX ),
+                     TAlfMetric( layoutRect.Rect().iTl.iY ) ),
+                     EAlfAnchorAttachmentOriginTopLeft );
+
+    // Set bottom/right anchor.
+    iLayout->Attach( aOrdinal, 
+                     EAlfAnchorTypeBottomRight, 
+                     TAlfXYMetric( TAlfMetric( layoutRect.Rect().iBr.iX ),
+                     TAlfMetric( layoutRect.Rect().iBr.iY ) ),
+                     EAlfAnchorAttachmentOriginTopLeft );
+    IRLOG_DEBUG( "CIRNowPlayingViewContainer::SetLayoutAnchor - Exiting" );
+    }
+
+// ---------------------------------------------------------------------------
+// Triggers the command to view handling
+// ---------------------------------------------------------------------------
+//
+void CIRNowPlayingViewContainer::TriggerCommandL( TInt iCommandId)
+	{
+	IRLOG_DEBUG( "CIRNowPlayingViewContainer::TriggerCommandL - Entering" );
+	TVwsViewId viewId( KNullUid, KNullUid );
+	CAknViewAppUi* appUi = static_cast<CAknViewAppUi*>( CCoeEnv::Static()->AppUi() );
+	TInt err = appUi->GetActiveViewId( viewId );
+	RProcess process;
+	TSecureId id = process.SecureId();
+	// TO be DOne GetActiveViewId doesn't always work (when switched back to VRA through RadioLauncher icon
+	if( !err && viewId.iAppUid.iUid == id.iId )
+		{
+		CAknView* view = appUi->View( viewId.iViewUid );
+		if( view )
+			{
+			view->ProcessCommandL( iCommandId );
+			}
+		}
+	IRLOG_DEBUG( "CIRNowPlayingViewContainer::TriggerCommandL - Exiting" );
+	}
+//Calls the Views Draw Function
+// ---------------------------------------------------------------------------
+//
+void CIRNowPlayingViewContainer::DrawViewL( TBool aStationHasLogo)
+	{
+	IRLOG_DEBUG( "CIRNowPlayingViewContainer::TriggerCommandL - Entering" );
+	iNowPlayingView->DrawViewL(aStationHasLogo);
+	IRLOG_DEBUG( "CIRNowPlayingViewContainer::TriggerCommandL - Entering" );
+	}