systemsettings/GSAccessoryPlugin/src/gsaccessoryplugin.cpp
changeset 0 2e3d3ce01487
--- /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 <bautils.h>
+#include <eikmenup.h>
+#include <featmgr.h>
+#include <gsaccessoryplugin.rsg>
+#include <gsaccplugin.mbg>
+#include <gscommon.hrh>
+#include <gsfwviewuids.h>
+#include <gsprivatepluginproviderids.h>
+#include <hlplch.h> // For HlpLauncher
+#include <StringLoader.h>
+
+#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<CGSAccessoryPluginContainer*>( 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<CGSAccessoryPluginContainer*>( 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();
+        }
+    }