fmradio/fmradio/src/fmradioalfmediaidle.cpp
branchRCL_3
changeset 20 93c594350b9a
equal deleted inserted replaced
19:cce62ebc198e 20:93c594350b9a
       
     1 /*
       
     2 * Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Implementation of the class CFMRadioAlfMediaIdle
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 
       
    21 #include <aknlayoutscalable_apps.cdl.h>
       
    22 #include <alf/alfenv.h>
       
    23 #include <alf/alftextvisual.h>
       
    24 #include <alf/alfevent.h>
       
    25 #include <alf/alftransformation.h>
       
    26 #include <alf/alfgradientbrush.h>
       
    27 #include <alf/alfbrusharray.h>
       
    28 #include <alf/alfborderbrush.h>
       
    29 #include <alf/alfimagebrush.h>
       
    30 #include <alf/alftexturemanager.h>
       
    31 #include <alf/alfviewportlayout.h>
       
    32 #include <alf/alfdecklayout.h>
       
    33 #include <alf/alfflowlayout.h> 
       
    34 #include <alf/alfutil.h>
       
    35 #include <alf/alftextstyle.h>
       
    36 #include <AknsItemID.h>
       
    37 #include <data_caging_path_literals.hrh>
       
    38 #include <e32math.h>
       
    39 #include <eikenv.h>
       
    40 #include <StringLoader.h>
       
    41 
       
    42 #include "fmradioalfmediaidle.h"
       
    43 #include "fmradioappui.h"
       
    44 #include "debug.h"
       
    45 
       
    46 // CONSTANTS
       
    47 
       
    48 
       
    49 _LIT8( KMediaIdleAnchorTag, "mediaIdleAnchor" );
       
    50 _LIT8( KMediaIdleViewportTag, "mediaIdleViewport" );
       
    51 _LIT8( KMediaIdleFlowLayoutTag, "mediaIdleFlowLayout" );
       
    52 _LIT8( KMediaIdleBackgroundTextTag, "mediaIdleBackgroundText" );
       
    53 _LIT8( KMediaIdleItemTag, "mediaIdleItem" );
       
    54 
       
    55 const TInt KNumberOfTextStyles = 4;
       
    56 const TReal KRelativeFontSizeArray[KNumberOfTextStyles] = {0.12f, 0.17f, 0.25f, 0.33f};
       
    57 const TReal KRelativeSizeOfMediaIdleBackgroundFont = 0.7f;
       
    58 
       
    59 const TInt KMediaIdleFadeOutDurationTime = 500;
       
    60 const TInt KMediaIdleFadeInDurationTime = 500;
       
    61 
       
    62 const TInt  KMediaIdleBackgroundTextScrollInterval = 12000;
       
    63 const TReal KMediaIdleBackgroundTextOpacity = 0.2f;
       
    64 const TInt  KMediaIdleBackgroundTextSideToSideTransitionDurationTime = 25000;
       
    65 const TInt  KMediaIdleBackgroundTextYTransition = 10;
       
    66 
       
    67 //const TInt KMediaIdleModeChangeInterval = 20000;
       
    68 
       
    69 const TInt KMaxNumberOfMediaIdleItems = 5;
       
    70 const TInt KMaxMediaIdleItemScrollDurationTime = 35000;
       
    71 const TInt KMinMediaIdleItemScrollDurationTime = 25000;
       
    72 const TInt KMinMediaIdleItemHideDurationTime = 5000;
       
    73 const TInt KModeChangingFactor = 3;
       
    74 
       
    75 const TReal KMaxOpacity = 0.3f;
       
    76 const TReal KMinOpacity = 0.1f;
       
    77 
       
    78 const TRgb KMediaIdleItemDefaultColor(0, 0, 0);  
       
    79 const TRgb KMediaIdleItemBackgroundColor(255, 255, 255); 
       
    80 const TReal KMediaIdleItemBackgroundOpacity = 0.4f;
       
    81 
       
    82 const TInt KMediaIdleItemArrayGranularity = 4;
       
    83 
       
    84 const TInt KLAFVarietyRadioIdlePortrait = 0;
       
    85 const TInt KLAFVarietyRadioIdleLandscape = 1;
       
    86 
       
    87 
       
    88 // ============================ MEMBER FUNCTIONS ===============================
       
    89 
       
    90 
       
    91 // ============================ LOCAL FUNCTIONS ===============================
       
    92 
       
    93 namespace LocalFunctions {
       
    94 
       
    95 // ---------------------------------------------------------------------------
       
    96 // fullyVerticallyVisibleRect
       
    97 // Check does the given rect fit vertically into a CAlfLayout area
       
    98 // ---------------------------------------------------------------------------
       
    99 //
       
   100 static TBool fullyVerticallyVisibleRect( const CAlfLayout& aLayout, const TAlfRealRect & aRect )
       
   101 	{	
       
   102 	TBool ret = ETrue;
       
   103 	TInt layoutHeight = aLayout.Size().IntTarget().iY;
       
   104 	TInt bottomY = aRect.BottomLeft().iY;
       
   105 	TInt topY = aRect.TopRight().iY;
       
   106 	
       
   107 	if ( bottomY >= layoutHeight || topY < 0 ) ret = EFalse;
       
   108 	
       
   109 	return ret;
       
   110 	}
       
   111 // ---------------------------------------------------------------------------
       
   112 // updateItemVisibility
       
   113 // Hide (or unhide) an visual depending is it going to be not fully visible or not
       
   114 // ---------------------------------------------------------------------------
       
   115 //
       
   116 static void updateItemVisibility( const CAlfLayout& aLayout, TInt index )
       
   117 	{
       
   118 	CAlfVisual& visual = aLayout.Visual( index );
       
   119 	if ( !LocalFunctions::fullyVerticallyVisibleRect( aLayout, visual.DisplayRectTarget() ) )
       
   120 		{
       
   121 		visual.SetOpacity( TAlfTimedValue( 0.0f, KMinMediaIdleItemHideDurationTime ) );
       
   122 		}
       
   123 	}
       
   124 }
       
   125 
       
   126 // ============================ MEMBER FUNCTIONS ===============================
       
   127 
       
   128 // ---------------------------------------------------------------------------
       
   129 // CFMRadioAlfMediaIdle::NewL
       
   130 // Two-phase constructor of CFMRadioAlfMediaIdle
       
   131 // ---------------------------------------------------------------------------
       
   132 //
       
   133 CFMRadioAlfMediaIdle* CFMRadioAlfMediaIdle::NewL( CAlfEnv& aEnv )
       
   134 	{
       
   135 	CFMRadioAlfMediaIdle* self = new (ELeave) CFMRadioAlfMediaIdle( );
       
   136 	CleanupStack::PushL(self);
       
   137 	self->ConstructL( aEnv );
       
   138 	CleanupStack::Pop(self);
       
   139 	return self;
       
   140 	}
       
   141 
       
   142 // ----------------------------------------------------------------------------
       
   143 // CFMRadioAlfMediaIdle::CFMRadioAlfMediaIdle
       
   144 // Default constructor
       
   145 // ----------------------------------------------------------------------------
       
   146 //
       
   147 CFMRadioAlfMediaIdle::CFMRadioAlfMediaIdle() 
       
   148 :   iFontsOrientation( EOrientationNone ),
       
   149     iOrientation( EOrientationNone ),
       
   150 	iMediaIdleItemBackgroundTextStyleId( KErrNotFound ), 
       
   151 	iMediaIdleState( EStopped ),
       
   152 	iMediaIdleMode( EBackgroundTextAndMediaIdleItems ),
       
   153 	iMediaIdleRequestedMode( EBackgroundTextAndMediaIdleItems ),	
       
   154 	iMediaIdlePrimaryColor( KRgbBlue ),
       
   155 	iMediaIdleSecondaryColor( KRgbBlue ),
       
   156 	iPsName( NULL )
       
   157 	{
       
   158 	}
       
   159 
       
   160 // ----------------------------------------------------------------------------
       
   161 // CFMRadioAlfMediaIdle::ConstructL
       
   162 // Symbian 2nd phase constructor can leave.
       
   163 // ----------------------------------------------------------------------------
       
   164 //
       
   165 void CFMRadioAlfMediaIdle::ConstructL( CAlfEnv& aEnv )
       
   166     {
       
   167     CAlfControl::ConstructL( aEnv );
       
   168     UpdateLayout();
       
   169     iIsConstructed = ETrue;
       
   170     }
       
   171 
       
   172 // ----------------------------------------------------------------------------
       
   173 // CFMRadioAlfMediaIdle::CreateFontsL
       
   174 // Create fonts that are based on a list of relative sizes
       
   175 // ----------------------------------------------------------------------------
       
   176 //
       
   177 void CFMRadioAlfMediaIdle::CreateFontsL()
       
   178 	{
       
   179 	TInt layoutHeight = 20;
       
   180 	
       
   181 	if ( iMediaIdleLayout.Rect().Height() != 0 )
       
   182 		{
       
   183 		layoutHeight = iMediaIdleLayout.Rect().Height();
       
   184 		}
       
   185 	
       
   186 	if( iFontsOrientation != iOrientation ||  
       
   187 		iFontReferenceHeight != layoutHeight )
       
   188 		{
       
   189 		CAlfTextStyleManager& manager = Env().TextStyleManager();
       
   190 		for( TInt i=0; i < iTextStyleIdArray.Count(); i++ )
       
   191 			{
       
   192 			manager.DeleteTextStyle( iTextStyleIdArray[i] );
       
   193 			iTextStyleIdArray.Reset();
       
   194 			}
       
   195 		if( iMediaIdleItemBackgroundTextStyleId != KErrNotFound )
       
   196 			{
       
   197 			manager.DeleteTextStyle( iMediaIdleItemBackgroundTextStyleId );
       
   198 			iMediaIdleItemBackgroundTextStyleId = KErrNotFound;
       
   199 			}
       
   200 
       
   201 		// Create largest font for the background text of media idle
       
   202 		iMediaIdleItemBackgroundTextStyleId = manager.CreatePlatformTextStyleL();	
       
   203 		CAlfTextStyle* mediaIdleItemStyle = manager.TextStyle( iMediaIdleItemBackgroundTextStyleId );					
       
   204 		mediaIdleItemStyle->SetTextSizeInPixels( KRelativeSizeOfMediaIdleBackgroundFont * layoutHeight, ETrue );
       
   205 		// Create text styles for other media idle items
       
   206 		for( TInt i = 0; i < KNumberOfTextStyles; i++ )
       
   207 			{		
       
   208 			TInt mediaIdleItemTextStyleId = manager.CreatePlatformTextStyleL();	
       
   209 			CAlfTextStyle* mediaIdleItemStyle = manager.TextStyle( mediaIdleItemTextStyleId );					
       
   210 			mediaIdleItemStyle->SetTextSizeInPixels( KRelativeFontSizeArray[i] * layoutHeight, ETrue ); 
       
   211 			iTextStyleIdArray.AppendL( mediaIdleItemTextStyleId );
       
   212 			}
       
   213 		iFontsOrientation = iOrientation;
       
   214 		iFontReferenceHeight = layoutHeight;
       
   215 		}
       
   216 	}
       
   217 
       
   218 // ---------------------------------------------------------------------------
       
   219 // ~CFMRadioAlfMediaIdle::~CFMRadioAlfMediaIdle
       
   220 // Destructor
       
   221 // ---------------------------------------------------------------------------
       
   222 //
       
   223 CFMRadioAlfMediaIdle::~CFMRadioAlfMediaIdle()
       
   224 	{
       
   225 	Env().CancelCustomCommands( this );
       
   226 	if( iMediaIdleItemArray )
       
   227 		{
       
   228 		if( iMediaIdleItemArray->Count() > 0 )
       
   229 			{
       
   230 			iMediaIdleItemArray->Reset();	
       
   231 			}
       
   232 		delete iMediaIdleItemArray;
       
   233 		}
       
   234 	CAlfTextStyleManager& manager = Env().TextStyleManager();
       
   235 	for( TInt i=0; i < iTextStyleIdArray.Count(); i++ )
       
   236 		{
       
   237 		manager.DeleteTextStyle( iTextStyleIdArray[i] );
       
   238 		}
       
   239 	iTextStyleIdArray.Close();
       
   240     if ( iMediaIdleItemBackgroundTextStyleId != KErrNotFound )
       
   241         {
       
   242         manager.DeleteTextStyle( iMediaIdleItemBackgroundTextStyleId );
       
   243         }
       
   244     delete iPsName;
       
   245     }
       
   246  
       
   247 // ----------------------------------------------------------------------------
       
   248 // CFMRadioAlfMediaIdle::AddMediaIdleL
       
   249 // Creates the media idle with passed number of media idle items
       
   250 // ----------------------------------------------------------------------------
       
   251 //
       
   252 void CFMRadioAlfMediaIdle::AddMediaIdleL( const TInt aNumberOfMediaIdleItems ) 
       
   253 	{	
       
   254 	FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::AddMediaIdleL(%d)"), aNumberOfMediaIdleItems ) );
       
   255 	
       
   256 	CAlfAnchorLayout* mediaIdleAnchor = static_cast<CAlfAnchorLayout*> ( FindTag( KMediaIdleAnchorTag ) );
       
   257 	if ( !mediaIdleAnchor )
       
   258 		{
       
   259 		mediaIdleAnchor = CAlfAnchorLayout::AddNewL( *this );	
       
   260 		}
       
   261 	mediaIdleAnchor->SetTagL( KMediaIdleAnchorTag );
       
   262 	
       
   263 	CAlfViewportLayout* mediaIdleViewport = static_cast<CAlfViewportLayout*> ( FindTag( KMediaIdleViewportTag ) );
       
   264 	if( !mediaIdleViewport )
       
   265 		{
       
   266 		mediaIdleViewport = CAlfViewportLayout::AddNewL( *this, mediaIdleAnchor );
       
   267 		mediaIdleViewport->SetTagL( KMediaIdleViewportTag );
       
   268 		mediaIdleViewport->SetViewportPos( TAlfRealPoint( .0f, .0f ), 0 );
       
   269 		mediaIdleViewport->SetViewportSize( TAlfRealSize( 1.0f, 1.0f ), 0 );
       
   270 		}
       
   271 	MediaIdleFadeOut( ETrue ); 
       
   272 
       
   273 	// Create the flow layout for the other media idle items
       
   274 	CAlfFlowLayout* mediaIdleFlowLayout = static_cast<CAlfFlowLayout*> ( FindTag( KMediaIdleFlowLayoutTag ) );
       
   275 	if( !mediaIdleFlowLayout )
       
   276 		{
       
   277 		mediaIdleFlowLayout = CAlfFlowLayout::AddNewL( *this, mediaIdleViewport );
       
   278 		mediaIdleFlowLayout->SetTagL( KMediaIdleFlowLayoutTag );
       
   279 		mediaIdleFlowLayout->SetFlowDirection( CAlfFlowLayout::EFlowVertical );
       
   280 		mediaIdleFlowLayout->SetMode( CAlfFlowLayout::EModeCenterPerpendicular );
       
   281 		}
       
   282 	
       
   283 	InitializeMediaIdleItemsL( aNumberOfMediaIdleItems );
       
   284 	UpdateLayout();	
       
   285 	AnimateMediaIdleItems();
       
   286 	MediaIdleFadeIn();
       
   287 	}
       
   288 	
       
   289 // ----------------------------------------------------------------------------
       
   290 // CFMRadioAlfMediaIdle::CreateBackgroundTextL
       
   291 // Creates backgrounf text for media idle content
       
   292 // ----------------------------------------------------------------------------
       
   293 //
       
   294 void CFMRadioAlfMediaIdle::CreateBackgroundTextL()
       
   295 	{
       
   296 	FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::CreateBackgroundTextL()") ) );
       
   297 
       
   298 	CAlfViewportLayout* mediaIdleViewport = static_cast<CAlfViewportLayout*> ( FindTag( KMediaIdleViewportTag ) );
       
   299 	// Create and animate the background text of the media idle
       
   300 	HBufC* itemText = GetRandomMediaIdleContentL();
       
   301 	CleanupStack::PushL( itemText ); 
       
   302 	CAlfTextVisual* backgroundText = static_cast<CAlfTextVisual*> ( mediaIdleViewport->FindTag( KMediaIdleBackgroundTextTag ) );
       
   303 	if( !backgroundText && itemText )
       
   304 		{	
       
   305 		backgroundText = AddMediaIdleItemL( mediaIdleViewport, *itemText, EFalse, KMediaIdleItemBackgroundColor, KMediaIdleItemBackgroundOpacity );			
       
   306 		backgroundText->SetTagL( KMediaIdleBackgroundTextTag );
       
   307 		SetMediaIdleItemSettingsL( backgroundText, *itemText, iMediaIdleItemBackgroundTextStyleId );
       
   308 		backgroundText->SetOpacity( TAlfTimedValue( KMediaIdleBackgroundTextOpacity ) ); 
       
   309 		backgroundText->EnableBrushesL();
       
   310 		backgroundText->EnableShadow( EFalse );
       
   311         backgroundText->SetFlag( EAlfVisualFlagManualSize );
       
   312 		SetScrollingToBackgroundText( backgroundText,
       
   313 						   KMediaIdleBackgroundTextSideToSideTransitionDurationTime,
       
   314 						   EMediaIdleBackgroundTextScrollEnd );	
       
   315 		}
       
   316 	else if( itemText )
       
   317 		{
       
   318 		SetMediaIdleItemSettingsL( backgroundText, *itemText, iMediaIdleItemBackgroundTextStyleId );
       
   319 		backgroundText->SetOpacity( TAlfTimedValue( KMediaIdleBackgroundTextOpacity ) ); 
       
   320 		SetScrollingToBackgroundText( backgroundText, KMediaIdleBackgroundTextSideToSideTransitionDurationTime, EMediaIdleBackgroundTextScrollEnd );
       
   321 		}
       
   322 	CleanupStack::PopAndDestroy( itemText ); 
       
   323 	}
       
   324 
       
   325 // ----------------------------------------------------------------------------
       
   326 // CFMRadioAlfMediaIdle::InitializeMediaIdleItemsL
       
   327 // Initializes the media idle items
       
   328 // ----------------------------------------------------------------------------
       
   329 //	
       
   330 void CFMRadioAlfMediaIdle::InitializeMediaIdleItemsL( const TInt aNumberOfMediaIdleItems )
       
   331 	{
       
   332 	FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::InitializeMediaIdleItemsL(%d)"), aNumberOfMediaIdleItems ) );
       
   333 
       
   334 	CAlfFlowLayout* mediaIdleFlowLayout = static_cast<CAlfFlowLayout*> ( FindTag( KMediaIdleFlowLayoutTag ) );
       
   335 	if( mediaIdleFlowLayout )
       
   336 		{
       
   337 		CreateFontsL();
       
   338 		CreateBackgroundTextL();
       
   339 		// Create the media idle items 	  	
       
   340 		for( TInt i = 0, fontStyleIdIx = 0; i < aNumberOfMediaIdleItems; i++, fontStyleIdIx++ )
       
   341 			{
       
   342 			HBufC* itemText = GetRandomMediaIdleContentL();
       
   343 			const TPtrC& text = itemText ? itemText->Des() : KNullDesC();
       
   344 
       
   345 			CleanupStack::PushL( itemText ); 
       
   346             TInt randFontStyleIx = AlfUtil::RandomInt( 0,  iTextStyleIdArray.Count() - 1 );
       
   347             CAlfTextVisual* mediaIdleItem = NULL;
       
   348             if( mediaIdleFlowLayout->Count() < aNumberOfMediaIdleItems )	
       
   349                 {
       
   350                 mediaIdleItem  = AddMediaIdleItemL( mediaIdleFlowLayout, text, EFalse, KMediaIdleItemBackgroundColor, KMediaIdleItemBackgroundOpacity );					
       
   351                 }
       
   352             else
       
   353                 {
       
   354                 mediaIdleItem = static_cast<CAlfTextVisual*> ( &mediaIdleFlowLayout->Visual( i ) );
       
   355                 mediaIdleItem->SetOpacity( TAlfTimedValue( .0f ) );
       
   356                 mediaIdleItem->EnableTransformationL( ETrue );
       
   357                 mediaIdleItem->Transformation().LoadIdentity();
       
   358                 }	
       
   359             SetMediaIdleItemSettingsL( mediaIdleItem, text, iTextStyleIdArray[ randFontStyleIx ] );		
       
   360             CleanupStack::PopAndDestroy( itemText );
       
   361 			} 
       
   362 		}
       
   363 	}
       
   364 
       
   365 // ----------------------------------------------------------------------------
       
   366 // CFMRadioAlfMediaIdle::AnimateMediaIdleItems
       
   367 // Sets defined animation to the created media idle items
       
   368 // ----------------------------------------------------------------------------
       
   369 //	
       
   370 void CFMRadioAlfMediaIdle::AnimateMediaIdleItems()
       
   371 	{
       
   372 	FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::AnimateMediaIdleItems()") ) );
       
   373 
       
   374 	CAlfFlowLayout* mediaIdleFlowLayout = static_cast<CAlfFlowLayout*> ( FindTag( KMediaIdleFlowLayoutTag ) );
       
   375 	if( mediaIdleFlowLayout )
       
   376 		{		  	
       
   377 		for( TInt i = 0; i < mediaIdleFlowLayout->Count(); i++ )
       
   378 			{	
       
   379 		    CAlfTextVisual* mediaIdleItem = static_cast<CAlfTextVisual*> ( &mediaIdleFlowLayout->Visual( i ) );
       
   380 		    if( mediaIdleItem )	
       
   381 				{
       
   382 			 	SetMediaIdleItemAnimation( mediaIdleItem );	
       
   383 				}	
       
   384 			} 
       
   385 		}
       
   386 	}
       
   387 
       
   388 // ----------------------------------------------------------------------------
       
   389 // CFMRadioAlfMediaIdle::AddMediaIdleItemL
       
   390 // Creates the media idle item to the passed media idle view port.
       
   391 // ----------------------------------------------------------------------------
       
   392 //	
       
   393 CAlfTextVisual* CFMRadioAlfMediaIdle::AddMediaIdleItemL( CAlfLayout* aMediaIdle, 
       
   394                                                          const TDesC& aMediaIdleItemText, 
       
   395                                                          TBool aMediaIdleItemHasBackground, 
       
   396                                                          const TRgb& aBackgroundColor, 
       
   397                                                          const TReal aBackgroundOpacity )
       
   398 	{
       
   399 	FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::AddMediaIdleItemL('%S')"), &aMediaIdleItemText ) );
       
   400 	
       
   401 	CAlfTextVisual* mediaIdleItem = CAlfTextVisual::AddNewL( *this, aMediaIdle );
       
   402     mediaIdleItem->EnableBrushesL();
       
   403     mediaIdleItem->SetTextL( aMediaIdleItemText );	
       
   404     mediaIdleItem->SetTagL( KMediaIdleItemTag );
       
   405     mediaIdleItem->EnableShadow( EFalse );
       
   406     mediaIdleItem->SetAlign( EAlfAlignHCenter, EAlfAlignVCenter );
       
   407    	// mediaIdleItem->SetFlag( EAlfVisualFlagManualLayout );
       
   408     mediaIdleItem->SetSize( mediaIdleItem->TextExtents() );
       
   409         
       
   410     if ( aMediaIdleItemHasBackground )
       
   411 	    {
       
   412 		CAlfGradientBrush* gradientBrush = CAlfGradientBrush::NewLC( Env() );
       
   413 		gradientBrush->SetColor( aBackgroundColor, aBackgroundOpacity );
       
   414 		mediaIdleItem->Brushes()->AppendL( gradientBrush, EAlfHasOwnership );
       
   415 		CleanupStack::Pop( gradientBrush );		
       
   416 	    }
       
   417 	return mediaIdleItem;
       
   418 	}
       
   419 	
       
   420 // ----------------------------------------------------------------------------
       
   421 // CFMRadioAlfMediaIdle::SetMediaIdleItemSettings
       
   422 // Sets color, opacity and scaling settings to the media idle item
       
   423 // ----------------------------------------------------------------------------
       
   424 //	
       
   425 void CFMRadioAlfMediaIdle::SetMediaIdleItemSettingsL( CAlfTextVisual* aMediaIdleItem, const TDesC& aMediaIdleItemText, const TInt aTextStyleId )
       
   426 	{
       
   427 	// Set text of the media idle item
       
   428 	aMediaIdleItem->SetTextL( aMediaIdleItemText );	
       
   429 	aMediaIdleItem->SetOpacity( TAlfTimedValue( .0f ) );
       
   430 	aMediaIdleItem->EnableTransformationL( ETrue );
       
   431 	CAlfTransformation* mediaIdleItemTransformation = &( aMediaIdleItem->Transformation() );
       
   432 	mediaIdleItemTransformation->LoadIdentity();	
       
   433 	
       
   434 	// Select text color of the media idle item	
       
   435 	TInt randomColorSelector = AlfUtil::RandomInt( 0, 1 );
       
   436 	if ( randomColorSelector )
       
   437 		{
       
   438 		// Set text color of the media idle item 	
       
   439 		aMediaIdleItem->SetColor( iMediaIdlePrimaryColor );	
       
   440 		}
       
   441 	else
       
   442 		{
       
   443 		// Set text color of the media idle item 	
       
   444 		aMediaIdleItem->SetColor( iMediaIdleSecondaryColor );
       
   445 		}
       
   446 				    	
       
   447 	// Set text style of the media idle	item   
       
   448 	aMediaIdleItem->SetTextStyle( aTextStyleId );
       
   449 		
       
   450 	TSize itemSize( 0, 0 );
       
   451 	if ( aMediaIdleItem->TextExtents() != itemSize )
       
   452 		{
       
   453 		aMediaIdleItem->SetSize( aMediaIdleItem->TextExtents() );	
       
   454 		}		
       
   455 	}
       
   456 
       
   457 // ----------------------------------------------------------------------------
       
   458 // CFMRadioAlfMediaIdle::SetMediaIdleItemAnimation
       
   459 // Sets translating animations to the media idle item
       
   460 // ----------------------------------------------------------------------------
       
   461 //
       
   462 void CFMRadioAlfMediaIdle::SetMediaIdleItemAnimation( CAlfTextVisual* aMediaIdleItem )
       
   463 	{	
       
   464 	FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::SetMediaIdleItemAnimation()") ) );
       
   465 
       
   466 	CAlfFlowLayout* mediaIdleFlowLayout = static_cast<CAlfFlowLayout*> ( aMediaIdleItem->Layout() );
       
   467 	TInt mediaIdleItemCount = mediaIdleFlowLayout->Count();
       
   468 	TInt mediaIdleItemIndex = mediaIdleFlowLayout->FindVisual( aMediaIdleItem );
       
   469 	
       
   470 	TInt mediaIdleItemWidth = aMediaIdleItem->DisplayRect().Width();
       
   471 	TInt mediaIdleWidth = mediaIdleFlowLayout->Size().IntTarget().iX;
       
   472 	
       
   473 	TInt randomTranslateDuration = AlfUtil::RandomInt( KMinMediaIdleItemScrollDurationTime, KMaxMediaIdleItemScrollDurationTime );
       
   474 	TInt scrollDirection = AlfUtil::RandomInt( 0,  1 );
       
   475 	TAlfTimedValue targetPositionX;
       
   476 	if( scrollDirection )
       
   477 		{
       
   478 		targetPositionX.SetValueNow( -mediaIdleWidth/2 - mediaIdleItemWidth/2 ); 
       
   479 		targetPositionX.SetTarget( mediaIdleWidth/2 + mediaIdleItemWidth/2, randomTranslateDuration ); 
       
   480 		}
       
   481 	else
       
   482 		{
       
   483 		targetPositionX.SetValueNow( mediaIdleWidth/2 + mediaIdleItemWidth/2  );
       
   484 		targetPositionX.SetTarget( -mediaIdleWidth/2 - mediaIdleItemWidth/2, randomTranslateDuration ); 
       
   485 		}
       
   486 
       
   487 	Translate( aMediaIdleItem, targetPositionX, TAlfTimedValue(0)); // targetPositionY );
       
   488 
       
   489 	if( mediaIdleItemIndex >= 0 )
       
   490 		{
       
   491 		Env().Send( TAlfCustomEventCommand( EMediaIdleItemTransformationEnd,
       
   492 											this,
       
   493 											mediaIdleItemIndex ),
       
   494 											randomTranslateDuration );
       
   495 		}
       
   496 	// Set text opacity of the media idle item
       
   497 	if( !LocalFunctions::fullyVerticallyVisibleRect( *mediaIdleFlowLayout, aMediaIdleItem->DisplayRect() ) )
       
   498 		{
       
   499 		aMediaIdleItem->SetOpacity( TAlfTimedValue( 0.0f ) );
       
   500 		}
       
   501 	else
       
   502 		{
       
   503 		TReal randomOpacity = AlfUtil::RandomReal( KMinOpacity, KMaxOpacity );
       
   504 		aMediaIdleItem->SetOpacity( TAlfTimedValue( randomOpacity ) );
       
   505 		}
       
   506 	
       
   507 	mediaIdleFlowLayout->UpdateChildrenLayout( KMinMediaIdleItemScrollDurationTime );
       
   508 	
       
   509 	// Checking all items, should they fade or not; must be done after UpdateChildrenLayout
       
   510 	for (TInt i=0; i<mediaIdleItemCount; i++ ) 
       
   511 		{
       
   512 		LocalFunctions::updateItemVisibility( *mediaIdleFlowLayout, i );
       
   513 		}
       
   514 	}
       
   515 
       
   516 // ---------------------------------------------------------------------------
       
   517 // CFMRadioAlfMediaIdle::MediaIdleFadeIn
       
   518 // Fades in media idle
       
   519 // ---------------------------------------------------------------------------
       
   520 //		
       
   521 void CFMRadioAlfMediaIdle::MediaIdleFadeIn( TBool aNow )
       
   522 	{
       
   523 	FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::MediaIdleFadeIn(%d)"), aNow ) );
       
   524 
       
   525 	CAlfViewportLayout* mediaIdle = static_cast<CAlfViewportLayout*> ( FindTag( KMediaIdleViewportTag ) );
       
   526 	if ( mediaIdle )
       
   527 		{	
       
   528 		if( aNow )
       
   529 			{
       
   530 			FadeIn( mediaIdle, 0 );
       
   531 			}
       
   532 		else
       
   533 			{
       
   534 			FadeIn( mediaIdle, KMediaIdleFadeInDurationTime );	
       
   535 			}
       
   536 		}
       
   537 	}
       
   538 
       
   539 // ---------------------------------------------------------------------------
       
   540 // CFMRadioAlfMediaIdle::MediaIdleFadeOut
       
   541 // Fades out media idle
       
   542 // ---------------------------------------------------------------------------
       
   543 //	
       
   544 void CFMRadioAlfMediaIdle::MediaIdleFadeOut( TBool aNow )
       
   545 	{
       
   546 	FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::MediaIdleFadeOut(%d)"), aNow ) );
       
   547 
       
   548 	CAlfViewportLayout* mediaIdle = static_cast<CAlfViewportLayout*> ( FindTag( KMediaIdleViewportTag ) );
       
   549 	if ( mediaIdle )
       
   550 		{		
       
   551 		if( aNow )
       
   552 			{
       
   553 			FadeOut( mediaIdle, 0 );
       
   554 			}
       
   555 		else
       
   556 			{
       
   557 			FadeOut( mediaIdle, KMediaIdleFadeOutDurationTime );	
       
   558 			}
       
   559 		}
       
   560 	}
       
   561 
       
   562 // ---------------------------------------------------------------------------
       
   563 // CFMRadioAlfMediaIdle::StartMediaIdleL
       
   564 // Launches media idle.
       
   565 // ---------------------------------------------------------------------------
       
   566 //
       
   567 void CFMRadioAlfMediaIdle::StartMediaIdleL() 
       
   568     {
       
   569     FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::StartMediaIdleL()") ) );
       
   570 
       
   571     if ( iMediaIdleState == EStopped )
       
   572         {
       
   573         Env().CancelCustomCommands( this );
       
   574         iMediaIdleState = ERunning;
       
   575         AddMediaIdleL( KMaxNumberOfMediaIdleItems );
       
   576         }
       
   577     }
       
   578 
       
   579 // ----------------------------------------------------------------------------
       
   580 // CFMRadioAlfMediaIdle::AddMediaIdleContentL
       
   581 // Adds media idle item text to be used in the media idle
       
   582 // ----------------------------------------------------------------------------
       
   583 //		
       
   584 void CFMRadioAlfMediaIdle::AddMediaIdleContentL( const TDesC& aMediaIdleItemText )
       
   585 	{
       
   586 	FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::AddMediaIdleContentL('%S')"), &aMediaIdleItemText ) );
       
   587 
       
   588 	if( !iMediaIdleItemArray )
       
   589 		{
       
   590 		// Array for media idle items
       
   591     	iMediaIdleItemArray = new( ELeave ) CDesCArrayFlat( KMediaIdleItemArrayGranularity );
       
   592     	iMediaIdleItemArray->AppendL( aMediaIdleItemText );
       
   593 		}
       
   594 	else
       
   595 	    {
       
   596 	    TInt searchResultIndex = 0;
       
   597 	    if ( iMediaIdleItemArray->Find( aMediaIdleItemText, searchResultIndex ) )
       
   598 	        {
       
   599 	        // text wasn't added earlier
       
   600 	        iMediaIdleItemArray->AppendL( aMediaIdleItemText );
       
   601 	        }
       
   602 	    }
       
   603 	}
       
   604 
       
   605 // ----------------------------------------------------------------------------
       
   606 // CFMRadioAlfMediaIdle::GetRandomMediaIdleContentL
       
   607 // Retrieves text from randomly chousen media idle item
       
   608 // ----------------------------------------------------------------------------
       
   609 //	
       
   610 HBufC* CFMRadioAlfMediaIdle::GetRandomMediaIdleContentL()	
       
   611 	{
       
   612 	if( !iMediaIdleItemArray )
       
   613 		{	
       
   614 		return NULL;		
       
   615 		}
       
   616 	TInt count = iMediaIdleItemArray->MdcaCount();
       
   617 	if( count > 0 )
       
   618     	{  
       
   619     	TInt mediaIdleItemIndex;
       
   620     	mediaIdleItemIndex = AlfUtil::RandomInt( 0, count - 1 );
       
   621     	TPtrC itemContent( iMediaIdleItemArray->MdcaPoint( mediaIdleItemIndex ) );
       
   622     	return itemContent.AllocL();
       
   623     	}
       
   624     else
       
   625     	{
       
   626     	return NULL;	
       
   627     	}
       
   628 	}
       
   629 
       
   630 // ----------------------------------------------------------------------------
       
   631 // CFMRadioAlfMediaIdle::ResetMediaIdleContent
       
   632 // Removes all media idle item texts
       
   633 // ----------------------------------------------------------------------------
       
   634 //
       
   635 void  CFMRadioAlfMediaIdle::ResetMediaIdleContent()
       
   636 	{
       
   637 	FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::ResetMediaIdleContent()") ) );
       
   638 
       
   639 	delete iPsName;
       
   640 	iPsName = NULL;
       
   641 	if( iMediaIdleItemArray )
       
   642 		{
       
   643 		if( iMediaIdleItemArray->Count() > 0 )
       
   644 			{
       
   645 			iMediaIdleItemArray->Reset();	
       
   646 			iMediaIdleItemArray->Compress();
       
   647 			}	
       
   648 		}	
       
   649 	}
       
   650 
       
   651 // ----------------------------------------------------------------------------
       
   652 // CFMRadioAlfMediaIdle::MediaIdleContentCount
       
   653 // Returns number of media idle content items  
       
   654 // ----------------------------------------------------------------------------
       
   655 //
       
   656 TInt CFMRadioAlfMediaIdle::MediaIdleContentCount() const
       
   657 	{
       
   658 	if( iMediaIdleItemArray )
       
   659 		{
       
   660 		return iMediaIdleItemArray->Count();
       
   661 		}
       
   662 	else
       
   663 		{
       
   664 		return 0;
       
   665 		}
       
   666 	}
       
   667 
       
   668 // ----------------------------------------------------------------------------
       
   669 // CFMRadioAlfMediaIdle::SetPrimaryColor
       
   670 // Sets primary color for the media idle
       
   671 // ----------------------------------------------------------------------------
       
   672 //
       
   673 void CFMRadioAlfMediaIdle::SetPrimaryColor( const TRgb& aColor )		
       
   674 	{
       
   675 	iMediaIdlePrimaryColor = aColor;	
       
   676 	}
       
   677 
       
   678 // ----------------------------------------------------------------------------
       
   679 // CFMRadioAlfMediaIdle::SetSecondaryColor
       
   680 // Sets secondary color for the media idle
       
   681 // ----------------------------------------------------------------------------
       
   682 //
       
   683 void CFMRadioAlfMediaIdle::SetSecondaryColor( const TRgb& aColor )		
       
   684 	{
       
   685 	iMediaIdleSecondaryColor = aColor;	
       
   686 	}
       
   687 
       
   688 // ----------------------------------------------------------------------------
       
   689 // CFMRadioAlfMediaIdle::Translate
       
   690 // Translates the visual object with passed arguments
       
   691 // ----------------------------------------------------------------------------
       
   692 //	
       
   693 void CFMRadioAlfMediaIdle::Translate( CAlfTextVisual* aTextVisual, const TAlfTimedValue& aX, const TAlfTimedValue& aY )
       
   694 	{
       
   695 	if( aTextVisual )
       
   696 		{
       
   697 		TRAPD( err, aTextVisual->EnableTransformationL( ETrue ) );
       
   698 		if( err == KErrNone )
       
   699 			{
       
   700 			CAlfTransformation* visualTransformation = &( aTextVisual->Transformation() );
       
   701 			TAlfTimedValue x(aX);
       
   702 			x.SetStyle( EAlfTimedValueStyleLinear );
       
   703 			
       
   704 			TAlfTimedValue y(aY);
       
   705 			y.SetStyle( EAlfTimedValueStyleLinear );
       
   706 			
       
   707 			visualTransformation->Translate( x, y );
       
   708 			}			
       
   709 		}
       
   710 	}
       
   711 
       
   712 // ----------------------------------------------------------------------------
       
   713 // CFMRadioAlfMediaIdle::LoadTextVisualIdentity
       
   714 // Removes all transformations of the visual object such as the scaling and translating.
       
   715 // ----------------------------------------------------------------------------
       
   716 //
       
   717 void CFMRadioAlfMediaIdle::LoadTextVisualIdentity( CAlfTextVisual* aTextVisual )
       
   718 	{
       
   719 	if( aTextVisual )
       
   720 		{
       
   721 		TRAPD( err, aTextVisual->EnableTransformationL( ETrue ) );
       
   722 		if( err == KErrNone )
       
   723 			{
       
   724 			CAlfTransformation* visualTransformation = &( aTextVisual->Transformation() );
       
   725 			visualTransformation->LoadIdentity();		
       
   726 			}
       
   727 		}
       
   728 	}
       
   729 	
       
   730 // ----------------------------------------------------------------------------
       
   731 // CFMRadioAlfMediaIdle::UpdateLayout
       
   732 // Calculates display layout
       
   733 // ----------------------------------------------------------------------------
       
   734 //
       
   735 void CFMRadioAlfMediaIdle::UpdateLayout()
       
   736 	{
       
   737 	FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::UpdateLayout()") ) );
       
   738 	
       
   739     TRect mainPaneRect;
       
   740     AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect );   
       
   741     TRect displayRect( mainPaneRect.Size() );   	
       
   742 
       
   743     TInt lafVarietyMediaIdle = 0;
       
   744 
       
   745     // Adjust positions of the visual elements 
       
   746     if ( iOrientation == EPortrait || iOrientation == EOrientationNone )
       
   747         {
       
   748         lafVarietyMediaIdle = KLAFVarietyRadioIdlePortrait;		
       
   749         }
       
   750     else if ( iOrientation == ELandscape )
       
   751         {
       
   752         lafVarietyMediaIdle = KLAFVarietyRadioIdleLandscape;
       
   753         }
       
   754 
       
   755     iMediaIdleLayout.LayoutRect( displayRect,
       
   756             AknLayoutScalable_Apps::area_fmrd2_visual_pane( lafVarietyMediaIdle ).LayoutLine() );
       
   757 
       
   758 	if ( iIsConstructed )
       
   759 		{
       
   760 		CAlfVisual* thirdVisual = FindTag( KMediaIdleAnchorTag );
       
   761 		if ( thirdVisual )
       
   762 			{
       
   763 			CAlfAnchorLayout* mediaIdleAnchor = static_cast<CAlfAnchorLayout*>( thirdVisual );
       
   764 			SetAbsoluteCornerAnchors( mediaIdleAnchor, 0, iMediaIdleLayout.Rect().iTl, iMediaIdleLayout.Rect().iBr  );
       
   765 			mediaIdleAnchor->UpdateChildrenLayout();
       
   766 			}
       
   767 		}
       
   768 	}
       
   769 
       
   770 // ----------------------------------------------------------------------------
       
   771 // CFMRadioAlfMediaIdle::SetModeChangeRequest
       
   772 // Sets request for mode change
       
   773 // ----------------------------------------------------------------------------
       
   774 //
       
   775 void CFMRadioAlfMediaIdle::SetModeChangeRequestL( TMediaIdleMode aRequestedMode )
       
   776 	{
       
   777 	FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::SetModeChangeRequestL(%d)"), aRequestedMode ) );
       
   778 
       
   779 	iMediaIdleRequestedMode = aRequestedMode;
       
   780 	if( iMediaIdleRequestedMode == EBackgroundTextAndMediaIdleItems && 
       
   781 		Mode() == EOnlyBackgroundText )
       
   782 		{
       
   783 		InitializeMediaIdleItemsL( KMaxNumberOfMediaIdleItems );
       
   784 		AnimateMediaIdleItems();
       
   785 		SetMode( EBackgroundTextAndMediaIdleItems );
       
   786 		}
       
   787 	}
       
   788 
       
   789 // ----------------------------------------------------------------------------
       
   790 // CFMRadioAlfMediaIdle::SetMode
       
   791 // Sets the media idle mode
       
   792 // ----------------------------------------------------------------------------
       
   793 //
       
   794 void CFMRadioAlfMediaIdle::SetMode( TMediaIdleMode aMode )
       
   795 	{
       
   796 	FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::SetMode(%d)"), aMode ) );
       
   797 
       
   798 	iMediaIdleMode = aMode;
       
   799 	}
       
   800 	
       
   801 // ----------------------------------------------------------------------------
       
   802 // CFMRadioAlfMediaIdle::Mode
       
   803 // Retrieves the media idle mode
       
   804 // ----------------------------------------------------------------------------
       
   805 //
       
   806 CFMRadioAlfMediaIdle::TMediaIdleMode CFMRadioAlfMediaIdle::Mode()
       
   807 	{
       
   808 	return iMediaIdleMode;
       
   809 	}
       
   810 
       
   811 // ----------------------------------------------------------------------------
       
   812 // CFMRadioAlfMediaIdle::Orientation
       
   813 // Return orientation of the display
       
   814 // ----------------------------------------------------------------------------
       
   815 //
       
   816 CFMRadioAlfMediaIdle::TOrientation CFMRadioAlfMediaIdle::Orientation()
       
   817 	{
       
   818 	return iOrientation;
       
   819 	}
       
   820 
       
   821 // ----------------------------------------------------------------------------
       
   822 // CFMRadioAlfMediaIdle::Orientation
       
   823 // Set orientation of the display
       
   824 // ----------------------------------------------------------------------------
       
   825 //		
       
   826 void CFMRadioAlfMediaIdle::SetOrientation( TOrientation aOrientation )
       
   827 	{
       
   828 	iOrientation = aOrientation;
       
   829 	}
       
   830 
       
   831 // ----------------------------------------------------------------------------
       
   832 // CFMRadioAlfMediaIdle::OfferEventL
       
   833 // From CAlfControl, takes care of alfred event handling.
       
   834 // ----------------------------------------------------------------------------
       
   835 //
       
   836 TBool CFMRadioAlfMediaIdle::OfferEventL( const TAlfEvent& aEvent )
       
   837 	{
       
   838 	TBool isHandled = EFalse;
       
   839 	if( aEvent.IsCustomEvent() )
       
   840 		{
       
   841 		FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::OfferEventL(aEvent.CustomParameter()=%d)"), aEvent.CustomParameter() ) );
       
   842 
       
   843 		switch( aEvent.CustomParameter() )
       
   844 			{
       
   845 			case EMediaIdleItemTransformationEnd:
       
   846 				{
       
   847 				HandleMediaIdleItemTransformationEndEventL( aEvent );	
       
   848 				isHandled = ETrue;
       
   849 				}
       
   850 				break;
       
   851 			case EMediaIdleBackgroundTextScrollEnd:
       
   852 				{	
       
   853 				HandleBackgroundTextScrollEndEventL( aEvent );		
       
   854 				isHandled = ETrue;
       
   855 				}
       
   856 				break;
       
   857 			case EMediaIdleChangeMode:
       
   858 				{	
       
   859 				if( Mode() == EBackgroundTextAndMediaIdleItems )
       
   860 					{
       
   861 					SetModeChangeRequestL( EOnlyBackgroundText );
       
   862 					}
       
   863 				else
       
   864 					{
       
   865 					SetModeChangeRequestL( EBackgroundTextAndMediaIdleItems );
       
   866 					}
       
   867 				isHandled = ETrue;
       
   868 				}
       
   869 				break;
       
   870 			default:
       
   871 			break;
       
   872 			}
       
   873 		}
       
   874 	return isHandled;
       
   875 	}
       
   876 
       
   877 // ----------------------------------------------------------------------------
       
   878 // CFMRadioAlfMediaIdle::HandleMediaIdleItemTransformationEndEventL
       
   879 // ----------------------------------------------------------------------------
       
   880 //
       
   881 void CFMRadioAlfMediaIdle::HandleMediaIdleItemTransformationEndEventL( const TAlfEvent& aEvent )
       
   882 	{
       
   883 	FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::HandleMediaIdleItemTransformationEndEventL()") ) );
       
   884 	
       
   885 	iItemsTransformationEndEventCounter++;
       
   886 	if ( iMediaIdleRequestedMode == EOnlyBackgroundText || Mode() == EOnlyBackgroundText )
       
   887 		{			
       
   888 		CAlfFlowLayout* mediaIdleFlowLayout = static_cast<CAlfFlowLayout*> ( FindTag( KMediaIdleFlowLayoutTag ) );			
       
   889 		if ( mediaIdleFlowLayout )
       
   890 			{					
       
   891 			TInt mediaIdleItemIndex = aEvent.CustomEventData(); 
       
   892 			CAlfTextVisual* mediaIdleItem = static_cast<CAlfTextVisual*> ( &mediaIdleFlowLayout->Visual( mediaIdleItemIndex ) );
       
   893 			if ( mediaIdleItem )
       
   894 				{
       
   895 				mediaIdleItem->SetOpacity( TAlfTimedValue( .0f ) ); 
       
   896 				}
       
   897 			
       
   898 			if( iItemsTransformationEndEventCounter == mediaIdleFlowLayout->Count() )
       
   899 				{
       
   900 				SetMode( EOnlyBackgroundText ); 
       
   901 				iItemsTransformationEndEventCounter = 0;
       
   902 				Env().Send( TAlfCustomEventCommand( EMediaIdleBackgroundTextScrollEnd, this ), 0 );
       
   903 				}
       
   904 			}
       
   905 		}
       
   906 	else 
       
   907 		{ 
       
   908 		CAlfFlowLayout* mediaIdleFlowLayout = static_cast<CAlfFlowLayout*> ( FindTag( KMediaIdleFlowLayoutTag ) );			
       
   909 		if ( mediaIdleFlowLayout )
       
   910 			{
       
   911 			HBufC* itemText = GetRandomMediaIdleContentL();
       
   912 			if( itemText )
       
   913 				{
       
   914 				CleanupStack::PushL( itemText ); 
       
   915 				TInt mediaIdleItemIndex = aEvent.CustomEventData(); 
       
   916 				CAlfTextVisual* mediaIdleItem = static_cast<CAlfTextVisual*> ( &mediaIdleFlowLayout->Visual( mediaIdleItemIndex ) );
       
   917 				if ( mediaIdleItem && iTextStyleIdArray.Count() > 0 )
       
   918 					{
       
   919 			    	// First hide the media idle item	
       
   920 					mediaIdleItem->SetOpacity( TAlfTimedValue( .0f ) );
       
   921 					mediaIdleItem->EnableTransformationL( ETrue );
       
   922 					mediaIdleItem->Transformation().LoadIdentity();	
       
   923 										
       
   924 					TInt randFontStyleIx = AlfUtil::RandomInt( 0,  iTextStyleIdArray.Count() - 1 );
       
   925 					SetMediaIdleItemSettingsL( mediaIdleItem, *itemText,  iTextStyleIdArray[ randFontStyleIx ] );				
       
   926 					SetMediaIdleItemAnimation( mediaIdleItem );	
       
   927 					
       
   928 					if ( iMediaIdleRequestedMode != EOnlyBackgroundText )
       
   929 						{
       
   930 						if( iItemsTransformationEndEventCounter == mediaIdleFlowLayout->Count() )
       
   931 							{
       
   932 							Env().Send( TAlfCustomEventCommand( EMediaIdleChangeMode, this ),
       
   933 									KMaxMediaIdleItemScrollDurationTime * KModeChangingFactor );
       
   934 							iItemsTransformationEndEventCounter = 0;
       
   935 							}
       
   936 						}
       
   937 					}
       
   938 				CleanupStack::PopAndDestroy( itemText ); 
       
   939 				}
       
   940 			}
       
   941 		}
       
   942 	}
       
   943 
       
   944 // ----------------------------------------------------------------------------
       
   945 // CFMRadioAlfMediaIdle::HandleBackgroundTextScrollEndEventL
       
   946 // ----------------------------------------------------------------------------
       
   947 //
       
   948 void CFMRadioAlfMediaIdle::HandleBackgroundTextScrollEndEventL( const TAlfEvent& /*aEvent*/ )
       
   949 	{
       
   950     FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::HandleBackgroundTextScrollEndEventL()") ) );
       
   951 	   
       
   952 	CAlfViewportLayout* mediaIdleViewport = static_cast<CAlfViewportLayout*> ( FindTag( KMediaIdleViewportTag ) );
       
   953 	if( mediaIdleViewport )
       
   954 		{
       
   955 		CAlfTextVisual* backgroundText = static_cast<CAlfTextVisual*> ( mediaIdleViewport->FindTag( KMediaIdleBackgroundTextTag ) );
       
   956 		if( backgroundText )
       
   957 			{				
       
   958 			backgroundText->SetOpacity( TAlfTimedValue( .0f ) );
       
   959 
       
   960 			if ( iMediaIdleRequestedMode == EOnlyBackgroundText && Mode() ==  EBackgroundTextAndMediaIdleItems )
       
   961 				{
       
   962 				}
       
   963 			else
       
   964 				{
       
   965 				if( iMediaIdleRequestedMode == EOnlyBackgroundText && 
       
   966 						Mode() == EOnlyBackgroundText )
       
   967 					{
       
   968 					Env().CancelCustomCommands( this );
       
   969 					Env().Send( TAlfCustomEventCommand( EMediaIdleChangeMode, this ),
       
   970 							KMediaIdleBackgroundTextSideToSideTransitionDurationTime );
       
   971 					}
       
   972 				backgroundText->EnableTransformationL( ETrue );
       
   973 				backgroundText->Transformation().LoadIdentity();
       
   974 				HBufC* itemText = GetRandomMediaIdleContentL();
       
   975 				if( itemText )
       
   976 					{
       
   977 					CleanupStack::PushL( itemText ); 
       
   978 					SetMediaIdleItemSettingsL( backgroundText, *itemText, iMediaIdleItemBackgroundTextStyleId );
       
   979 					CleanupStack::PopAndDestroy( itemText );
       
   980 					}
       
   981 				backgroundText->SetOpacity( TAlfTimedValue( KMediaIdleBackgroundTextOpacity ) );
       
   982 				SetScrollingToBackgroundText( backgroundText,
       
   983 								   KMediaIdleBackgroundTextSideToSideTransitionDurationTime,
       
   984 								   EMediaIdleBackgroundTextScrollEnd );		
       
   985 				}	
       
   986 			}
       
   987 		}
       
   988 	}
       
   989 
       
   990 // ---------------------------------------------------------------------------
       
   991 // CFMRadioAlfMediaIdle::SetAbsoluteCornerAnchors
       
   992 // Sets absolute rect of the anchor by top left and bottom right points.
       
   993 // ---------------------------------------------------------------------------
       
   994 //
       
   995 void CFMRadioAlfMediaIdle::SetAbsoluteCornerAnchors( CAlfAnchorLayout* aAnchor,
       
   996                                                      TInt aOrdinal,
       
   997                                                      const TPoint& aTopLeftPosition,
       
   998                                                      const TPoint& aBottomRightPosition )
       
   999     {
       
  1000     if ( aAnchor )
       
  1001         {
       
  1002         // Set top/left anchor.
       
  1003         aAnchor->Attach( aOrdinal, 
       
  1004                          EAlfAnchorTypeTopLeft,
       
  1005                          TAlfXYMetric( TAlfMetric( aTopLeftPosition.iX ), TAlfMetric( aTopLeftPosition.iY ) ),
       
  1006                          EAlfAnchorAttachmentOriginTopLeft );
       
  1007         
       
  1008         // Set bottom/right anchor.
       
  1009         aAnchor->Attach( aOrdinal, 
       
  1010                          EAlfAnchorTypeBottomRight, 
       
  1011                          TAlfXYMetric( TAlfMetric( aBottomRightPosition.iX ), TAlfMetric( aBottomRightPosition.iY ) ),
       
  1012                          EAlfAnchorAttachmentOriginTopLeft );
       
  1013         }
       
  1014     }
       
  1015 
       
  1016 // ----------------------------------------------------------------------------
       
  1017 // CFMRadioAlfMediaIdle::SetScrollingToBackgroundText
       
  1018 // ----------------------------------------------------------------------------
       
  1019 //
       
  1020 void CFMRadioAlfMediaIdle::SetScrollingToBackgroundText( CAlfTextVisual* aVisual, TInt aTransitionTime, TMediaIdleCustomEvent aEventAfterScrollingEnd )
       
  1021     {
       
  1022     FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::SetScrollingToBackgroundText(aTransitionTime=%d)"), aTransitionTime ) );
       
  1023     
       
  1024     CAlfViewportLayout* mediaIdle = static_cast<CAlfViewportLayout*> ( aVisual->Layout() );
       
  1025     TInt mediaIdleItemWidth = aVisual->DisplayRect().Width();
       
  1026     TInt mediaIdleWidth = mediaIdle->Size().IntTarget().iX;
       
  1027     
       
  1028     TAlfTimedValue targetPositionX;
       
  1029     if ( iBackgroundTextScrollDirection == EScrollRightToLeft )
       
  1030         {
       
  1031         targetPositionX.SetValueNow(  -mediaIdleItemWidth );
       
  1032         targetPositionX.SetTarget( mediaIdleWidth, aTransitionTime );
       
  1033         iBackgroundTextScrollDirection = EScrollLeftToRight;
       
  1034         }
       
  1035     else
       
  1036         { 	
       
  1037         targetPositionX.SetValueNow( mediaIdleWidth );
       
  1038         targetPositionX.SetTarget( -mediaIdleItemWidth, aTransitionTime ); 
       
  1039         iBackgroundTextScrollDirection = EScrollRightToLeft;
       
  1040         }
       
  1041     Translate( aVisual, targetPositionX, TAlfTimedValue( KMediaIdleBackgroundTextYTransition ) );
       
  1042     Env().Send( TAlfCustomEventCommand( aEventAfterScrollingEnd, this ), 
       
  1043                 aTransitionTime + KMediaIdleBackgroundTextScrollInterval );
       
  1044     }
       
  1045 
       
  1046 // ---------------------------------------------------------------------------
       
  1047 // CFMRadioAlfMediaIdle::FadeIn
       
  1048 // Sets fade-in animation to the CAlfVisual.
       
  1049 // ---------------------------------------------------------------------------
       
  1050 //
       
  1051 void CFMRadioAlfMediaIdle::FadeIn( CAlfVisual* aVisual, TInt aTime, TReal aOpacity ) const
       
  1052 	{
       
  1053 	FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::FadeIn(aVisual=0x%x, aTime=%d)"), aVisual, aTime ) );
       
  1054 	
       
  1055 	TAlfTimedValue opacity;
       
  1056 	opacity.SetValueNow( 0.0f ); // immediate change
       
  1057 	opacity.SetTarget( aOpacity, aTime ); // and smooth target
       
  1058 	aVisual->SetOpacity( opacity );
       
  1059 	}
       
  1060 
       
  1061 // ---------------------------------------------------------------------------
       
  1062 // CFMRadioAlfMediaIdle::FadeOut
       
  1063 // Sets fade-out animation to the CAlfVisual.
       
  1064 // ---------------------------------------------------------------------------
       
  1065 //
       
  1066 void CFMRadioAlfMediaIdle::FadeOut( CAlfVisual* aVisual, TInt aTime, TReal aOpacity ) const
       
  1067 	{
       
  1068 	FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::FadeOut(aVisual=0x%x, aTime=%d)"), aVisual, aTime ) );
       
  1069 	TAlfTimedValue opacity;
       
  1070 	opacity.SetTarget( aOpacity, aTime ); 
       
  1071 	aVisual->SetOpacity( opacity );
       
  1072 	}
       
  1073 
       
  1074 // ---------------------------------------------------------------------------
       
  1075 // CFMRadioAlfMediaIdle::AddPsNameToMediaIdleL
       
  1076 // Adds PS name to the media idle item array
       
  1077 // ---------------------------------------------------------------------------
       
  1078 //
       
  1079 void CFMRadioAlfMediaIdle::AddPsNameToMediaIdleL( const TDesC& aPsName )
       
  1080 	{
       
  1081 	FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::AddPsNameToMediaIdleL('%S')"), &aPsName ) );
       
  1082 	
       
  1083 	if ( !iMediaIdleItemArray )
       
  1084 		{
       
  1085 		// Array for media idle items
       
  1086     	iMediaIdleItemArray = new ( ELeave ) CDesCArrayFlat( KMediaIdleItemArrayGranularity );
       
  1087     	iPsName = aPsName.AllocL();
       
  1088     	iMediaIdleItemArray->AppendL( *iPsName );
       
  1089     	return;
       
  1090 		}
       
  1091 	else if ( !iPsName ) 	
       
  1092 		{	
       
  1093 		// PS name is added for the first time or media idle item array is reseted			
       
  1094 		if ( iMediaIdleItemArray->Count() < KFMRadioMaxNumberOfMediaIdleContentItem )
       
  1095 			{
       
  1096 			iPsName = aPsName.AllocL();							
       
  1097 			iMediaIdleItemArray->AppendL( *iPsName );
       
  1098 			}
       
  1099 		return;
       
  1100 		}
       
  1101 		
       
  1102 	TInt returnValue;
       
  1103 	TInt searchResultIndex;	
       
  1104 	
       
  1105 	returnValue = iMediaIdleItemArray->Find( *iPsName, searchResultIndex );
       
  1106 		
       
  1107 	if ( returnValue == 0 ) 
       
  1108 		{
       
  1109 		// if old PS name is found, replace it with new name
       
  1110         iMediaIdleItemArray->InsertL( searchResultIndex, aPsName );
       
  1111         iMediaIdleItemArray->Delete( searchResultIndex + 1 );
       
  1112 		}
       
  1113 						
       
  1114 	delete iPsName;
       
  1115 	iPsName = NULL;
       
  1116 	iPsName = aPsName.AllocL();			
       
  1117 	}
       
  1118 
       
  1119 // ---------------------------------------------------------------------------
       
  1120 // CFMRadioAlfMediaIdle::StopAndFadeOutMediaIdle
       
  1121 // stops media idle and clears out animation and background image
       
  1122 // ---------------------------------------------------------------------------
       
  1123 //
       
  1124 void CFMRadioAlfMediaIdle::StopAndFadeOutMediaIdle()
       
  1125     {
       
  1126     FTRACE( FPrint( _L("CFMRadioAlfMediaIdle::StopAndFadeOutMediaIdle() - iMediaIdleState was %d"), iMediaIdleState ) );
       
  1127 
       
  1128     if ( iMediaIdleState != EStopped )
       
  1129         {
       
  1130         Env().CancelCustomCommands( this );
       
  1131         iMediaIdleState = EStopped;
       
  1132         MediaIdleFadeOut();
       
  1133         }
       
  1134     }
       
  1135 
       
  1136 // ---------------------------------------------------------------------------
       
  1137 // CFMRadioAlfMediaIdle::Show
       
  1138 // from MFMRadioIdleControlInterface
       
  1139 // ---------------------------------------------------------------------------
       
  1140 //
       
  1141 void CFMRadioAlfMediaIdle::Show()
       
  1142     {
       
  1143     TRAP_IGNORE( StartMediaIdleL() )
       
  1144     }
       
  1145 
       
  1146 // ---------------------------------------------------------------------------
       
  1147 // CFMRadioAlfMediaIdle::Hide
       
  1148 // from MFMRadioIdleControlInterface
       
  1149 // ---------------------------------------------------------------------------
       
  1150 //
       
  1151 void CFMRadioAlfMediaIdle::Hide()
       
  1152     {
       
  1153     StopAndFadeOutMediaIdle();
       
  1154     }
       
  1155 
       
  1156 // ---------------------------------------------------------------------------
       
  1157 // CFMRadioAlfMediaIdle::Deactivate
       
  1158 // from MFMRadioIdleControlInterface
       
  1159 // ---------------------------------------------------------------------------
       
  1160 //
       
  1161 void CFMRadioAlfMediaIdle::Deactivate()
       
  1162     {
       
  1163     StopAndFadeOutMediaIdle();
       
  1164     }
       
  1165 
       
  1166 //  End of File