internetradio2.0/uisrc/irstationdirectoryview.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 19 Apr 2010 14:01:53 +0300
changeset 0 09774dfdd46b
permissions -rw-r--r--
Revision: 201011 Kit: 201015

/*
* Copyright (c)  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:  Station Directory View
*
*/

/* ---------------------------------------------------------------------------
*  Version history:
*  Template version:
*  <ccm_history>
*
*  Version: 2, Fri March 21 17:20:00 2008 by Prabina
*  Ref:
*  Added WorkAround for supporting different Resolutions , Added Wait Dialog for Loading of stations , 
*  Handled Single/Double tapping on the list itmes
*
*  </ccm_history>
* ============================================================================
*/
/* ---------------------------------------------------------------------------
*  Version history:
*  Template version:
*  <ccm_history>
*
*  Version: 3, Tues March 25 17:30:00 2008 by Prabina
*  Ref:
*  Fixing the PCLint errors
*
*
*  </ccm_history>
* ============================================================================
*/
/* ---------------------------------------------------------------------------
*  Version history:
*  Template version:
*  <ccm_history>
*
*  Version: 4, Tues April 04 16:40:00 2008 by Prabina
*  Ref:
*  Added WorkAround for retaining of focus & Page retaining
*
*
*  </ccm_history>
* ============================================================================
*/
/* ---------------------------------------------------------------------------
*  Version history:
*  Template version:
*  <ccm_history>
*
*  Version: 5, Thurs July 18 12:00:00 2008 by Prabina
*  Ref:
*  Code Review Comments Fixed
*
*
*  </ccm_history>
* ============================================================================
*/
// SYSTEM INCLUDE FILES
#include <akntitle.h>
#include <eikmenup.h>
#include <psserv.h>
#include <hlplch.h>
#include <eikenv.h>
#include <internetradio.rsg>

// INCLUDE FILES
#include "irdebug.h"
#include "irui.h"
#include "irbaseview.h"
#include "irstationdirectoryview.h"
#include "irstationdirectorycontainer.h"
#include "ircategoryview.h"
#include "ir.hrh"
#include "ircommon.h"
#include "irviewstack.h"
#include "irisdswrapper.h"
#include "irnowplayingwrapper.h"
#include "hlplch.h"
#include "irsettings.h"
#include "irnetworkcontroller.h" 	//Added for demo of ALR //TO DO::Remove after demo
#include "iractivenetworkobserver.h"
#include "irtopstationsview.h"

// ==================== LOCAL FUNCTIONS ====================

// ================= MEMBER FUNCTIONS =======================


// ---------------------------------------------------------------------------
// C++ default constructor can NOT contain any code, that might leave.
// ---------------------------------------------------------------------------
//
CIRStationDirectoryView::CIRStationDirectoryView( ):iCallRequestPending(EFalse)
    {
	IRLOG_DEBUG( "CIRStationDirectoryView::CIRStationDirectoryView" );
	}
// ---------------------------------------------------------------------------
// EPOC default constructor can leave.
// ---------------------------------------------------------------------------
//
void CIRStationDirectoryView::ConstructL()
    {
	IRLOG_DEBUG( "CIRStationDirectoryView::ConstructL - Entering" );
    CIRBaseView::ConstructL( R_IR_STATION_DIRECTORY );
	SetCurrentFocus(0);
	iRequestPending = EFalse;
	IRLOG_DEBUG( "CIRStationDirectoryView::ConstructL - Exiting" );
    }

// -----------------------------------------------------------------------------
// CIRStationDirectoryView::NewL()
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CIRStationDirectoryView* CIRStationDirectoryView::NewL()
    {
 	IRLOG_DEBUG( "CIRStationDirectoryView::NewL" );
    CIRStationDirectoryView* self = CIRStationDirectoryView::NewLC();
    CleanupStack::Pop( self );
    IRLOG_DEBUG( "CIRStationDirectoryView::NewL - Exiting" );
    return self;
    }

// ---------------------------------------------------------------------------
// CIRStationDirectoryView::NewLC()
// Two-phased constructor.
// ---------------------------------------------------------------------------
//
CIRStationDirectoryView* CIRStationDirectoryView::NewLC()
    {
 	IRLOG_DEBUG( "CIRStationDirectoryView::NewLC" );
   	CIRStationDirectoryView* self = new( ELeave ) CIRStationDirectoryView();
    CleanupStack::PushL( self );
    self->ConstructL();
    IRLOG_DEBUG( "CIRStationDirectoryView::NewLC - Exiting" );
    return self;
    }
// ---------------------------------------------------------------------------
// Destructor
// ---------------------------------------------------------------------------
//
CIRStationDirectoryView::~CIRStationDirectoryView()
    {
	IRLOG_DEBUG( "CIRStationDirectoryView::~CIRStationDirectoryView - Entering" );
    if ( iContainer )
        {
        AppUi()->RemoveFromViewStack( *this, iContainer );
        iContainer->MakeVisible( EFalse );
        delete iContainer;
        iContainer = NULL;
        }
	IRLOG_DEBUG( "CIRStationDirectoryView::~CIRStationDirectoryView - Exiting" );
    }

// ---------------------------------------------------------------------------
// From class CAknView.
// Returns view id.
// ---------------------------------------------------------------------------
//
TUid CIRStationDirectoryView::Id() const
    {
    IRLOG_DEBUG( "CIRStationDirectoryView::Id" );
    return KIRStationDirectoryViewId;
    }

// ---------------------------------------------------------------------------
// From class CAknView.
// Event handler for status pane size changes.
// ---------------------------------------------------------------------------
//
void CIRStationDirectoryView::HandleStatusPaneSizeChange()
    {
 	IRLOG_DEBUG( "CIRStationDirectoryView::HandleStatusPaneSizeChange - Entering" );
   	CIRBaseView::HandleStatusPaneSizeChange();

    if ( iContainer )
        {
        iContainer->SetRect( ClientRect() );
        }
	IRLOG_DEBUG( "CIRStationDirectoryView::HandleStatusPaneSizeChange - Exiting" );
    }

// ---------------------------------------------------------------------------
// From class CAknView.
// Handles view activation.
// ---------------------------------------------------------------------------
//
void CIRStationDirectoryView::DoActivateL( const TVwsViewId& aPrevViewId, TUid aCustomMessageId,
					 const TDesC8& aCustomMessage )
    {
	IRLOG_DEBUG( "CIRStationDirectoryView::DoActivateL - Entering" );
	
	TInt customMessageId = aCustomMessageId.iUid;
	if(customMessageId == 1)
		{
		SetCurrentFocus(0);	
		}
	aCustomMessageId.iUid = 0;
	iUi->iPresentViewID = KIRStationDirectoryViewId;
	
    if ( !iContainer )
        {
	    iContainer = CIRStationDirectoryContainer::NewL( *this, ClientRect() );
	    iContainer->SetMopParent( this );
  		AppUi()->AddToViewStackL( *this, iContainer );
        }
    else
        {
        iContainer->SetRect( ClientRect( ) );
        iContainer->HandleResourceChange(KEikDynamicLayoutVariantSwitch);
        }

    iContainer->ActivateL( );
    iContainer->MakeVisible( ETrue );

    SetTitleL(R_IRAPP_STAT_DIR_TITLE);
    CIRBaseView::DoActivateL( aPrevViewId, aCustomMessageId, aCustomMessage );
    HandleStatusPaneSizeChange();
    
    iUi->iNetworkController->RegisterActiveNetworkObserverL(*this);
    EnableObserverL(EIRSystemEventObserver);
	IRLOG_DEBUG( "CIRStationDirectoryView::DoActivateL - Exiting" );
    }

// ---------------------------------------------------------------------------
// From class CAknView.
// Handles view deactivation.
// ---------------------------------------------------------------------------
//
void CIRStationDirectoryView::DoDeactivate()
    {
	IRLOG_DEBUG( "CIRStationDirectoryView::DoDeactivate - Entering" );
    if(&(iUi->SystemEventCollector()))
	    {
		DisableObserver(EIRSystemEventObserver);
	    }
    if ( iContainer )
        {
        AppUi()->RemoveFromViewStack( *this, iContainer );
        iContainer->MakeVisible( EFalse );
        delete iContainer;
        iContainer = NULL;
        }
    iUi->iNetworkController->DeleteActiveNetworkObserver(*this);
	IRLOG_DEBUG( "CIRStationDirectoryView::DoDeactivate - Exiting" );
    }


// ---------------------------------------------------------------------------
// From class CAknView.
// Command handling function.
// ---------------------------------------------------------------------------
//
void CIRStationDirectoryView::HandleCommandL( TInt aCommand )
    {
	IRLOG_DEBUG( "CIRStationDirectoryView::HandleCommandL - Entering" );
    CIRUi* appUi = static_cast<CIRUi*>( AppUi() );
	CIRViewStack& viewStack = appUi->ViewStack();	
    switch ( aCommand )
        {
        case ESelectCmd:
	        {
			if( iUi->CheckAndNotifyLowDiskSpaceL() )
				{
				break;
				}
			else if( iUi->VerifyNetworkConnectivityL() )
				{
				iRequestPending = ETrue;
				}
			else
				{
				SetCurrentFocus(iContainer->GetCurrentItemIndex());
				iRequestIssued = ETrue;
				DoCategoryRequestL();
				}
	        }
        break;

        case EGotoNowPlayingViewCmd:
			{
			appUi->SetHistory(EFalse);
			appUi->SavePrevIDL(KIRStationDirectoryViewId, aCommand); 			
			}
        break;
		//Activate settings view.	
        case ESettingsCmd:
        	{
			AppUi()->ActivateLocalViewL(KIRSettingsViewId);		
			}
		break;

        case EHelpCmd:
	        {
			if ( !iUi->CheckAndNotifyLowDiskSpaceL() )
				{
	       		HlpLauncher::LaunchHelpApplicationL(iEikonEnv->WsSession(),
	       							AppUi()->AppHelpContextL());
				}
			}
		break;
		case EAknSoftkeyBack:
			{
			if((appUi->IsFirstTime()))
				{
				CIRBaseView::HandleCommandL( aCommand );	                
				}
			else
				{
				if(viewStack.Count() == 2 )
					{
					TUid topView = viewStack.Pop();
					if(viewStack.Peek()==KIRMainChoiceViewID)
						{
						viewStack.PushL(topView);
						CIRBaseView::HandleCommandL( aCommand );	                
						}
					else
						{
						viewStack.Pop();
						appUi->ActivateLocalViewL(KIRMainChoiceViewID);	
						}
					}

				else if(viewStack.Count() >2 )
					{
					CIRBaseView::HandleCommandL( aCommand );	
					}
				else
					{
					viewStack.Pop();
					appUi->ActivateLocalViewL(KIRMainChoiceViewID);
					}
				}
			}
	    break;
        default:
            {
            CIRBaseView::HandleCommandL( aCommand );
            }
        break;
        }
	IRLOG_DEBUG( "CIRStationDirectoryView::HandleCommandL - Exiting" );
    }

// ---------------------------------------------------------------------------
// From class CAknView.
// Foreground event handling function.
// ---------------------------------------------------------------------------
//
void CIRStationDirectoryView::HandleForegroundEventL( TBool aForeground )
    {
	IRLOG_DEBUG( "CIRStationDirectoryView::HandleForegroundEventL - Entering" );

    CIRBaseView::HandleForegroundEventL( aForeground );
	if ( aForeground )
		{
		if ( iContainer )
			{
			iContainer->DrawDeferred();
			}
		}
	IRLOG_DEBUG( "CIRStationDirectoryView::HandleForegroundEventL - Exiting" );
    }

// ---------------------------------------------------------------------------
// CIRStationDirectoryView::DoCategoryRequestL()
// 
// ---------------------------------------------------------------------------
//
void CIRStationDirectoryView::DoCategoryRequestL()
	{
	IRLOG_DEBUG( "CIRStationDirectoryView::DoCategoryRequestL - Entering" );
	iLoadingCancelled = EFalse;
	TInt currentIndex = iContainer->GetCurrentItemIndex();
	if(currentIndex >= 0)
		{
		switch (currentIndex)
			{
			// if the browse by genre's is selected.
			case EGenreData:
				{
		        iIsdsWrapper->IsdsCategoryRequestL(this,CIRIsdsClient::EGenre);
				iUi->iCategoryView->iCategoryReqMade = ETrue;		        
				}
				break;
			// if the browse by language's is selected.	
			case ELanguageData:
				{
		        iIsdsWrapper->IsdsCategoryRequestL(this,CIRIsdsClient::ELanguages);
		        iUi->iCategoryView->iCategoryReqMade = ETrue;
				}
				break;
			// if the browse by country is selected.	
			case ECountryData:
				{
		        iIsdsWrapper->IsdsCategoryRequestL(this,CIRIsdsClient::ECountries);
		        iUi->iCategoryView->iCategoryReqMade = ETrue;
				}
				break;
			// if top station's is selected.	
			case ETopStationData:
				{
		        iIsdsWrapper->IsdsCategoryRequestL(this,CIRIsdsClient::Ehotpicks);
		        iUi->iTopStationsView->iResultsReqMade = ETrue;
				}
				break;
			default:
				{
				//No implementation
				}
				break;
			}
		}
	IRLOG_DEBUG( "CIRStationDirectoryView::DoCategoryRequestL - Exiting" );
	}

// ---------------------------------------------------------------------------
// void CIRStationDirectoryView::ResponseL()
// Activates the SearchResults view after getting the IsdsResponse
// ---------------------------------------------------------------------------
//
void CIRStationDirectoryView::ResponseL( CIRIsdsPreset* /*aPreset*/ )
	{
	IRLOG_DEBUG( "CIRStationDirectoryView::ResponseL - Entering" );
	ResetPendingRequests(EFalse);
	if(!iLoadingCancelled)
		{
		TInt currentIndex = iContainer->GetCurrentItemIndex();
		if(currentIndex >= 0)
			{
			switch (currentIndex)
				{
				// if the browse by genre's is selected.
				case EGenreData:
					{
					iUi->iCategoryViewTitleType = EGenreData;
					ActivateCategoryViewL();
					}
					break;
				// if the browse by language's is selected.	
				case ELanguageData:
					{
					iUi->iCategoryViewTitleType = ELanguageData;
					ActivateCategoryViewL();
					}
					break;
				// if the browse by country is selected.	
				case ECountryData:
					{
					iUi->iCategoryViewTitleType = ECountryData;
					ActivateCategoryViewL();
					}
					break;
				// if top station's is selected.	
				case ETopStationData:
					{
					iUi->iCategoryViewTitleType = ETopStationData;
		            TBuf8<2> dummy;
		 			TVwsViewId viewId(TUid::Uid(KUIDIRAPP),KIRTopStationsViewId);
					if(iUi->IsForeground())
						{
						AppUi()->ActivateViewL(viewId ,TUid::Uid(1),dummy);
						iUi->iActivationPending = KNullUid ;	
						}
					else
						{
						iUi->iActivationPending =KIRTopStationsViewId;	
						}
					}
					break;
				default:
					{
					//No implementation
					}
					break;
				}
			}
		}
	IRLOG_DEBUG( "CIRStationDirectoryView::ResponseL - Exiting" );
	}
// ---------------------------------------------------------------------------
// void CIRStationDirectoryView::ActivateCategoryViewL()
// Activates the Category view 
// ---------------------------------------------------------------------------
//
void CIRStationDirectoryView::ActivateCategoryViewL()
	{
	IRLOG_DEBUG( "CIRStationDirectoryView::ActivateCategoryViewL - Entering" );
	CIRUi* appUi = static_cast<	CIRUi*>(AppUi());
	TBuf8<2> dummy;
	TVwsViewId viewId(TUid::Uid(KUIDIRAPP),KIRCategoryViewId);
	
	if(appUi->IsForeground())
		{
		AppUi()->ActivateViewL(viewId ,TUid::Uid(1),dummy);
		appUi->iActivationPending = KNullUid ;	
		}
	else
		{
		appUi->iActivationPending =KIRCategoryViewId;	
		}
	IRLOG_DEBUG( "CIRStationDirectoryView::ActivateCategoryViewL - Exiting" );
	
	}
// ---------------------------------------------------------------------------
// void CIRStationDirectoryView::PresetResponseL()
// Issues Request to listen to a particular channel 
// ---------------------------------------------------------------------------
//
void CIRStationDirectoryView::PresetResponseL(CIRIsdsPreset* /*aPreset*/)
	{
	IRLOG_DEBUG( "CIRStationDirectoryView::PresetResponseL - Entering" );
	
		//No Implementation Required

	IRLOG_DEBUG( "CIRStationDirectoryView::PresetResponseL - Exiting" );
	}
// ---------------------------------------------------------------------------
// void CIRStationDirectoryView::ErrorL()
// Handles the errors from Isds 
// ---------------------------------------------------------------------------
//
void CIRStationDirectoryView::ErrorL()
	{
	IRLOG_DEBUG( "CIRStationDirectoryView::ErrorL - Entering" );
	if(iIsdsWrapper->iConnTimeOut)
		{
		iIsdsWrapper->iConnTimeOut = EFalse;	
		}
	IRLOG_DEBUG( "CIRStationDirectoryView::ErrorL - Exiting" );
	}

// ---------------------------------------------------------------------------
// void CIRStationDirectoryView::DynInitMenuPaneL()
// Dynamically initialises a menu pane
// ---------------------------------------------------------------------------
//
void CIRStationDirectoryView::DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane)
	{
	IRLOG_DEBUG( "CIRStationDirectoryView::DynInitMenuPaneL - Entering" );
	CIRUi* appUi = static_cast<CIRUi*>( AppUi() );

	if(!aMenuPane) User::Leave(KErrNotFound);
		{
		if(aResourceId == R_IR_STATION_DIRECTORY_MENU)
			{				
			// Now Playing option
			if(iNowPlayingWrapper->iPlaying)
				{
				 aMenuPane->SetItemDimmed(EGotoNowPlayingViewCmd,EFalse);
				}
			else
				{
				 aMenuPane->SetItemDimmed(EGotoNowPlayingViewCmd,ETrue);
				}
			}
		}
	IRLOG_DEBUG( "CIRStationDirectoryView::DynInitMenuPaneL - Exiting" );
	}
// ---------------------------------------------------------------------------
//Notifies all observers whose network request is active
// to reissue the request  
//NotifyActiveNetworkObserversL()
// ---------------------------------------------------------------------------

void CIRStationDirectoryView::NotifyActiveNetworkObserversL(TIRNetworkEvent aEvent)
	{
	IRLOG_DEBUG( "CIRStationDirectoryView::NotifyActiveNetworkObserversL - Entering" );
	IRRDEBUG2("CIRStationDirectoryView::NotifyActiveNetworkObserversL entering ", KNullDesC);

	switch(aEvent)
		{
		case ENetworkConnectionDisconnected:
			{
			iNowPlayingWrapper->HandleNetworkDisconnected();
			}
			break;
		case ENetworkConnectionEstablished:
			{
			if(iContainer)
				{
				if(iRequestPending)
					{
					iRequestIssued = ETrue;
					SetCurrentFocus(iContainer->GetCurrentItemIndex());
					iRequestPending=EFalse;
					DoCategoryRequestL();
					}
				
				if(iUi->iNetworkController->IsHandingOverConnection())
					{
					if(iRequestIssued)
						{
						iRequestIssued=EFalse;
						SetCurrentFocus(iContainer->GetCurrentItemIndex());
						DoCategoryRequestL();
						}
					}
				}
			}
		}
		
	IRLOG_DEBUG( "CIRStationDirectoryView::NotifyActiveNetworkObserversL - Exiting" );
	IRRDEBUG2("CIRStationDirectoryView::NotifyActiveNetworkObserversL exiting ", KNullDesC);

	}
	
	
	
	
// -----------------------------------------------------------------------------
// Notified by network controller when user cancels network connection, to reset 
// the pending requests  
// ResetPendingRequests()
// -----------------------------------------------------------------------------
void CIRStationDirectoryView::ResetPendingRequests(TBool aValue)
	{
	iRequestPending = aValue;
	iRequestIssued  = aValue;
	}
	
// ---------------------------------------------------------
// CIRStationDirectoryView::HandleSystemEventL
// from base class MIRSystemEventObserver
// ---------------------------------------------------------
//
void CIRStationDirectoryView::HandleSystemEventL(TIRSystemEventType aEventType)
	{
	IRLOG_DEBUG(" CIRStationDirectoryView::HandleSystemEventL - Entering");
	
	switch (aEventType)
		{
		case EIRCallActivated:
			{
			if( iUi->GetNetworkControllerInstance()->IdentifyConnectionType() != EWiFi )
				{
				if(iUi->iIsdsWrapper->iIsdsWaitDialog)
					{
					TRAP_IGNORE( iUi->iIsdsWrapper->DestroyWaitDialogL() );
					}
				if(!iCallRequestPending && iCommand==ESelectCmd)
					{
					iUi->iIsdsWrapper->IsdsCancelRequest();
					iCallRequestPending = ETrue;
					}
				}
			break;
			}
		case EIRCallDeactivated:
			{
			if(iCallRequestPending && iCommand==ESelectCmd)
				{
				iCallRequestPending = EFalse;
				HandleCommandL( iCommand );
				}
			break;
			}
		default:
			{
			break;
			}
		}
	IRLOG_DEBUG( "CIRStationDirectoryView::HandleSystemEventL - Exiting." );
	}	
// ---------------------------------------------------------------------------
// void CIRStationDirectoryView::IssueSearchRequestL()
// Issues a search request to the Isds Client
// ---------------------------------------------------------------------------
//
void CIRStationDirectoryView::RefreshView()
	{
	IRLOG_DEBUG( "CIRStationDirectoryView::IssueSearchRequestL - Entering" );
    if ( iContainer )
        {
        iContainer->SetRect( ClientRect() );
        }
	IRLOG_DEBUG( "CIRStationDirectoryView::IssueSearchRequestL - Exiting" );
	}
// End of file