diff -r 000000000000 -r 2e3d3ce01487 systemsettings/GSAccessoryPlugin/src/gsaccessoryplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/systemsettings/GSAccessoryPlugin/src/gsaccessoryplugin.cpp Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,461 @@ +/* +* Copyright (c) 2005-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: View for Shortcuts sub-folder +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include // For HlpLauncher +#include + +#include "acclocalviewids.h" +#include "gsaccessoryplugin.h" +#include "gsaccessoryplugin.hrh" +#include "gsaccessorypluginconst.hrh" +#include "gsaccessoryplugincontainer.h" +#include "gsaccessorypluginmodel.h" +#include "gsacchacview.h" +#include "gsaccheadphonesview.h" +#include "gsaccheadsetview.h" +#include "gsaccloopsetview.h" +#include "gsaccmusicstandview.h" +#include "gsacctextphoneview.h" +#include "gsacctvoutview.h" +#include "gsaccwiredcarkitview.h" +#include "gsaccwirelesscarkitview.h" +#include "trace.h" + +// LOCAL CONSTANTS AND MACROS +_LIT( KGSAccessoryPluginResourceFileName, "z:gsaccessoryplugin.rsc" ); + +#ifdef __SCALABLE_ICONS +_LIT( KGSAccPluginIconFileName, "\\resource\\apps\\gsaccplugin.mif" ); // svg file +#else //__SCALABLE_ICONS +_LIT( KGSAccPluginIconFileName, "\\resource\\apps\\gsaccplugin.mbm" ); // bitmap +#endif //__SCALABLE_ICONS + +// ========================= LOCAL FUNCTIONS ================================ + +// --------------------------------------------------------------------------- +// ListIdToViewId +// --------------------------------------------------------------------------- +// +static TUid ListIdToViewId( TInt aListId ) + { + switch ( aListId ) + { + case EGSHACListItemId: return KAccHACViewId; + case EGSHeadphonesListItemId: return KAccHeadphonesViewId; + case EGSHeadsetListItemId: return KAccHeadsetViewId; + case EGSLoopsetListItemId: return KAccLoopsetViewId; + case EGSMusicStandListItemId: return KAccMusicStandViewId; + case EGSTextPhoneListItemId: return KAccTextPhoneViewId; + case EGSTvOutListItemId: return KAccTvoutViewId; + case EGSWiredCarKitListItemId: return KAccWiredCarkitViewId; + case EGSWirelessCarKitListItemId: return KAccWirelessCarkitViewId; + default: + break; + } + + return TUid::Null(); + } + + +// ========================= MEMBER FUNCTIONS ================================ + +// --------------------------------------------------------------------------- +// CGSAccessoryPlugin::NewL() +// --------------------------------------------------------------------------- +// +CGSAccessoryPlugin* CGSAccessoryPlugin::NewL( TAny* /*aInitParams*/ ) + { + CGSAccessoryPlugin* self = new( ELeave ) CGSAccessoryPlugin(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// CGSAccessoryPlugin::~CGSAccessoryPlugin +// --------------------------------------------------------------------------- +// +CGSAccessoryPlugin::~CGSAccessoryPlugin() + { + FUNC_LOG; + + // Do not call RemoveLocalViews(), iAppUi has already been deleted. + iSubViewIds.Close(); + delete iModel; + iResourceLoader.Close(); + FeatureManager::UnInitializeLib(); + } + + +// --------------------------------------------------------------------------- +// CGSAccessoryPlugin::NewContainerL() +// --------------------------------------------------------------------------- +// +void CGSAccessoryPlugin::NewContainerL() + { + FUNC_LOG; + + iContainer = new( ELeave ) CGSAccessoryPluginContainer( *iModel ); + } + + +// --------------------------------------------------------------------------- +// CGSAccessoryPlugin::HandleListBoxSelectionL() +// --------------------------------------------------------------------------- +// +void CGSAccessoryPlugin::HandleListBoxSelectionL() + { + FUNC_LOG; + + iRockerPress = ETrue; + TRAPD( error, SelectLocalViewL() ); + ERROR( error, "Failed to select local view" ); + iRockerPress = EFalse; + User::LeaveIfError( error ); + } + + +// --------------------------------------------------------------------------- +// CGSAccessoryPlugin::GetCaption +// --------------------------------------------------------------------------- +// +void CGSAccessoryPlugin::GetCaptionL( TDes& aCaption ) const + { + FUNC_LOG; + + // The resource file is already opened. + HBufC* result = StringLoader::LoadL( R_ACC_MAIN_VIEW_CAPTION ); + aCaption.Copy( *result ); + delete result; + } + + +// --------------------------------------------------------------------------- +// CGSAccessoryPlugin::CreateIconL +// --------------------------------------------------------------------------- +// +CGulIcon* CGSAccessoryPlugin::CreateIconL( const TUid aIconType ) + { + FUNC_LOG; + + CGulIcon* icon( NULL ); + if ( aIconType == KGSIconTypeLbxItem ) + { + icon = AknsUtils::CreateGulIconL( + AknsUtils::SkinInstance(), + KAknsIIDQgnPropSetAccessorySub, + KGSAccPluginIconFileName, + EMbmGsaccpluginQgn_prop_set_accessory_sub, + EMbmGsaccpluginQgn_prop_set_accessory_sub_mask ); + } + else + { + icon = CGSPluginInterface::CreateIconL( aIconType ); + } + + return icon; + } + + +// --------------------------------------------------------------------------- +// CGSAccessoryPlugin::PluginProviderCategory +// --------------------------------------------------------------------------- +// +TInt CGSAccessoryPlugin::PluginProviderCategory() const + { + // To identify internal plug-ins. + return KGSPluginProviderInternal; + } + + +// --------------------------------------------------------------------------- +// TUid CGSAccessoryPlugin::Id() +// --------------------------------------------------------------------------- +// +TUid CGSAccessoryPlugin::Id() const + { + return TUid::Uid( KGSAccessoryPluginUid ); + } + + +// --------------------------------------------------------------------------- +// CGSAccessoryPlugin::ProcessCommandL +// --------------------------------------------------------------------------- +// +void CGSAccessoryPlugin::ProcessCommandL( TInt aCommand ) + { + FUNC_LOG; + + if ( aCommand == EGSCmdAppOpen ) + { + SelectLocalViewL(); + } + else + { + CAknView::ProcessCommandL( aCommand ); + } + } + + +// --------------------------------------------------------------------------- +// CGSAccessoryPlugin::HandleCommandL +// --------------------------------------------------------------------------- +// +void CGSAccessoryPlugin::HandleCommandL( TInt aCommand ) + { + FUNC_LOG; + + iRockerPress = EFalse; + + switch ( aCommand ) + { + case EAknSoftkeyOpen: + SelectLocalViewL(); + break; + case EAknSoftkeyBack: + RemoveLocalViews(); + iAppUi->ActivateLocalViewL( KGSGenPluginUid ); + break; + case EAknCmdHelp: + { + if ( FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + HlpLauncher::LaunchHelpApplicationL( + iEikonEnv->WsSession(), iAppUi->AppHelpContextL() ); + } + break; + } + case EGSCmdAppSetasDefault: + ChangeDefaultAccessoryL(); + break; + default: + iAppUi->HandleCommandL( aCommand ); + break; + } + } + + +// --------------------------------------------------------------------------- +// CGSAccessoryPlugin::DynInitMenuPaneL() +// --------------------------------------------------------------------------- +// +void CGSAccessoryPlugin::DynInitMenuPaneL( + TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + FUNC_LOG; + + if ( aResourceId == R_GS_MENU_ITEM_HELP ) + { + User::LeaveIfNull( aMenuPane ); + + if ( iRockerPress || !FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + // Remove help if rocker key is pressed or help is not supported + aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue ); + } + else + { + aMenuPane->SetItemDimmed( EAknCmdHelp, EFalse ); + } + } + else if ( aResourceId == R_GS_MENU_ITEM_EXIT ) + { + User::LeaveIfNull( aMenuPane ); + + if ( iRockerPress ) + { + // Remove exit if rocker key is pressed + aMenuPane->SetItemDimmed( EAknCmdExit, ETrue ); + } + } + } + + +// --------------------------------------------------------------------------- +// CGSAccessoryPlugin::CGSAccessoryPlugin() +// --------------------------------------------------------------------------- +// +CGSAccessoryPlugin::CGSAccessoryPlugin() + : iResourceLoader( *iCoeEnv ) + { + FUNC_LOG; + } + + +// --------------------------------------------------------------------------- +// CGSAccessoryPlugin::ConstructL() +// --------------------------------------------------------------------------- +// +void CGSAccessoryPlugin::ConstructL() + { + FUNC_LOG; + + FeatureManager::InitializeLibL(); + + // Initialize the Model + iModel = CGSAccessoryPluginModel::NewL(); + + // TParse uses a lot of stack space, so allocate it from heap. + TParse* parse = new ( ELeave ) TParse; + CleanupStack::PushL( parse ); + TInt errorCode = parse->Set( + KGSAccessoryPluginResourceFileName, + &KDC_RESOURCE_FILES_DIR, + NULL ); + ERROR( errorCode, "parse::Set() failed" ); + User::LeaveIfError( errorCode ); + + // TFileName uses a lot of stack space, so allocate it from heap. + TFileName* fileName = new ( ELeave ) TFileName( parse->FullName() ); + CleanupStack::PushL( fileName ); + + // Get language of resource file + BaflUtils::NearestLanguageFile( iCoeEnv->FsSession(), *fileName ); + + // Open resource file + iResourceLoader.OpenL( *fileName ); + + CleanupStack::PopAndDestroy( fileName ); + CleanupStack::PopAndDestroy( parse ); + + BaseConstructL( R_ACC_MAIN_VIEW ); + } + + +// --------------------------------------------------------------------------- +// CGSAccessoryPlugin::SelectLocalViewL() +// --------------------------------------------------------------------------- +// +void CGSAccessoryPlugin::SelectLocalViewL() + { + FUNC_LOG; + + CGSAccessoryPluginContainer* container = + static_cast( iContainer ); + TUid viewId = ListIdToViewId( container->CurrentFeatureId() ); + + if ( !LocalViewExists( viewId ) ) + { + CGSAccBaseView* view( NULL ); + // Unsupported items are already hidden - no need to check them here. + switch ( container->CurrentFeatureId() ) + { + case EGSHeadsetListItemId: + view = CGSAccHeadsetView::NewLC( *iModel ); + break; + case EGSHeadphonesListItemId: + view = CGSAccHeadphonesView::NewLC( *iModel ); + break; + case EGSLoopsetListItemId: + view = CGSAccLoopsetView::NewLC( *iModel ); + break; + case EGSTextPhoneListItemId: + view = CGSAccTextPhoneView::NewLC( *iModel ); + break; + case EGSMusicStandListItemId: + view = CGSAccMusicStandView::NewLC( *iModel ); + break; + case EGSWiredCarKitListItemId: + view = CGSAccWiredCarkitView::NewLC( *iModel ); + break; + case EGSWirelessCarKitListItemId: + view = CGSAccWirelessCarkitView::NewLC( *iModel ); + break; + case EGSTvOutListItemId: + view = CGSAccTvoutView::NewLC( *iModel ); + break; + case EGSHACListItemId: + view = CGSAccHACView::NewLC( *iModel ); + break; + default: + break; + } + + if ( view ) + { + iSubViewIds.AppendL( view->Id() ); // Store id + iAppUi->AddViewL( view ); + CleanupStack::Pop( view ); + } + } + + iAppUi->ActivateLocalViewL( viewId ); // Activate the view + } + + +// --------------------------------------------------------------------------- +// CGSAccessoryPlugin::RemoveLocalViews() +// --------------------------------------------------------------------------- +// +void CGSAccessoryPlugin::RemoveLocalViews() + { + FUNC_LOG; + + TInt count = iSubViewIds.Count(); + for ( TInt i = 0; i < count; i++ ) + { + iAppUi->RemoveView( iSubViewIds[i] ); // Deletes the object also. + } + iSubViewIds.Reset(); // No need to close after this. + } + + +// --------------------------------------------------------------------------- +// CGSAccessoryPlugin::LocalViewExists() +// --------------------------------------------------------------------------- +// +TBool CGSAccessoryPlugin::LocalViewExists( const TUid& aViewId ) const + { + FUNC_LOG; + + return ( iSubViewIds.Find( aViewId ) != KErrNotFound ); + } + + +// --------------------------------------------------------------------------- +// CGSAccessoryPlugin::ChangeDefaultAccessoryL() +// --------------------------------------------------------------------------- +// +void CGSAccessoryPlugin::ChangeDefaultAccessoryL() + { + FUNC_LOG; + + CGSAccessoryPluginContainer* container = + static_cast( iContainer ); + + TInt currentFeatureId = container->CurrentFeatureId(); + TInt oldDefaultItem = iModel->DefaultAccessory(); + if ( oldDefaultItem != currentFeatureId ) + { + // Here we set the item selected as "Set as Default" + container->ChangeDefaultItemL( currentFeatureId, oldDefaultItem ); + iModel->SetDefaultAccessoryL( currentFeatureId ); + container->DrawNow(); + } + }