gssettingsuis/Gs/GSCallDivertPlugin/Src/GSCallDivertPlugin.cpp
changeset 68 13e71d907dc3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gssettingsuis/Gs/GSCallDivertPlugin/Src/GSCallDivertPlugin.cpp	Thu Nov 04 13:38:47 2010 +0800
@@ -0,0 +1,432 @@
+/*
+* Copyright (c) 2006-2008 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:  Main view handling for Call Divert.
+*
+*/
+
+
+// INCLUDE FILES
+#include "GSCallDivertPlugin.h"
+#include "GSCallDivertPluginContainer.h"
+#include "GSCallDivertView.h"
+#include "LocalViewId.h"
+#include "GSCallDivertModel.h"
+
+#include <gscommon.hrh>
+#include <coeaui.h>
+#include <hlplch.h>             // For HlpLauncher
+#include <aknViewAppUi.h>
+#include <gscalldivertpluginrsc.rsg>
+#include <gscalldivertplugin.mbg>
+#include <StringLoader.h>
+#include <featmgr.h>
+#include <gsfwviewuids.h>
+#include <gscommon.hrh>
+#include <gsprivatepluginproviderids.h>
+#include <BTSapInternalPSKeys.h>
+
+// LOCAL CONSTANTS
+_LIT( KGSCallDivertPluginResourceFileName, "z:gscalldivertpluginrsc.rsc" );
+_LIT( KGSNameOfClass, "CGSCallDivertPlugin" );
+enum
+    {
+    EGSCallDivertPluginPanicNullPtr
+    };
+
+// ========================= MEMBER FUNCTIONS ================================
+// ---------------------------------------------------------------------------
+// CGSCallDivertPlugin::CGSCallDivertPlugin
+//
+// C++ constructor.
+// ---------------------------------------------------------------------------
+CGSCallDivertPlugin::CGSCallDivertPlugin()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CGSCallDivertPlugin::ConstructL
+//
+// Symbian OS two-phased constructor
+// ---------------------------------------------------------------------------
+void CGSCallDivertPlugin::ConstructL()
+    {
+    FeatureManager::InitializeLibL();
+    OpenLocalizedResourceFileL( KGSCallDivertPluginResourceFileName,
+                                iResourceLoader );
+
+    //PS listener initialization
+    iBtSapListener = CGSPubSubsListener::NewL(
+                     KPSUidBluetoothSapConnectionState,
+                     KBTSapConnectionState, this );
+
+    SetCSPActiveL( ETrue );
+    BaseConstructL( R_CF_MAIN_VIEW );
+
+    iCallDivertModel = CGSCallDivertModel::NewL();
+    CGSCallDivertView* callDivertView = CGSCallDivertView::NewLC( iCallDivertModel );
+    iAppUi->AddViewL( callDivertView );
+    CleanupStack::Pop( callDivertView );
+    iCallDivertView = callDivertView;
+    }
+
+// ---------------------------------------------------------------------------
+// CGSCallDivertPlugin::~CGSCallDivertPlugin
+//
+// Destructor.
+// ---------------------------------------------------------------------------
+CGSCallDivertPlugin::~CGSCallDivertPlugin()
+    {
+    FeatureManager::UnInitializeLib();
+    TRAP_IGNORE( SetCSPActiveL( EFalse ) );
+    if ( iBtSapListener )
+        {
+        delete iBtSapListener;
+        }
+
+    if( iContainer )
+        {
+        AppUi()->RemoveFromViewStack( *this, iContainer );
+        AppUi()->RemoveView( KCallDivertPluginId );
+        delete iContainer;
+        }
+    delete iCallDivertModel;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSCallDivertPlugin::NewL()
+//
+// Symbian OS default constructor
+// ---------------------------------------------------------------------------
+CGSCallDivertPlugin* CGSCallDivertPlugin::NewL( TAny* /*aInitParams*/ )
+    {
+    CGSCallDivertPlugin* self = new( ELeave ) CGSCallDivertPlugin();
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSCallDivertPlugin::NewLC
+//
+// 1st phase constructor.
+// ---------------------------------------------------------------------------
+CGSCallDivertPlugin* CGSCallDivertPlugin::NewLC()
+    {
+    CGSCallDivertPlugin* self =
+            new ( ELeave ) CGSCallDivertPlugin;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CGSCallDivertPlugin::NewContainerL
+//
+// Creates new iContainer.
+// ---------------------------------------------------------------------------
+void CGSCallDivertPlugin::NewContainerL()
+    {
+    iContainer = new ( ELeave ) CGSCallDivertPluginContainer;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSCallDivertPlugin::Id
+//
+// implementation of the frameworks virtual function, closely related with view
+// architecture and has little or no relevance here
+// ---------------------------------------------------------------------------
+TUid CGSCallDivertPlugin::Id() const
+    {
+    return KCallDivertPluginId;
+    }
+
+// ---------------------------------------------------------------------------
+// CGSCallDivertPlugin::HandleCommandL
+//
+// Handles the received commands
+// ---------------------------------------------------------------------------
+void CGSCallDivertPlugin::HandleCommandL( TInt aCommand )
+    {
+    switch ( aCommand )
+        {
+        case EAknSoftkeyBack:
+            iAppUi->ActivateLocalViewL( KGSTelPluginUid );
+            break;
+        case EGSCmdAppOpen:
+        case EAknSoftkeyOpen:
+            HandleListBoxSelectionL();
+            break;
+        case ECFCmdCancelAll:
+            iCallDivertView->HandleCommandL( ECFCmdCancelAll );
+            break;
+        case EAknCmdHelp:
+            {
+            if( FeatureManager::FeatureSupported( KFeatureIdHelp ) )
+                {
+                HlpLauncher::LaunchHelpApplicationL(
+                    iEikonEnv->WsSession(), iAppUi->AppHelpContextL() );
+                }
+            break;
+            }
+        default:
+            iAppUi->HandleCommandL( aCommand );
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CGSCallDivertPlugin::HandleListBoxSelectionL
+//
+// Handles List box selection
+// ---------------------------------------------------------------------------
+void CGSCallDivertPlugin::HandleListBoxSelectionL()
+    {
+    // Other components will see updated value each time this funciton is 
+    // called.
+    iCallDivertModel->SetDivertServiceGroup( Container()->CurrentFeatureId() );
+
+    switch ( iCallDivertModel->DivertServiceGroup() )
+        {
+        case EGSSettIdVoiceDivert:
+        case EGSSettIdVideoDivert:
+            iAppUi->ActivateLocalViewL( KCallDivertViewId );
+            break;
+        default:
+            break;
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSCallDivertPlugin::UpdateListBox
+//
+// Calls Containers UpdateListBoxL method
+// ---------------------------------------------------------------------------
+void CGSCallDivertPlugin::UpdateListBox( TInt aItemId )
+    {
+    if ( Container() )
+        {
+        TRAP_IGNORE( Container()->UpdateListBoxL( aItemId ) );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CGSCallDivertPlugin::DoActivateL
+//
+// Activates view
+// ---------------------------------------------------------------------------
+void CGSCallDivertPlugin::DoActivateL( const TVwsViewId& aPrevViewId,
+                                             TUid aCustomMessageId,
+                                             const TDesC8& aCustomMessage )
+    {
+    CGSBaseView::DoActivateL( aPrevViewId, aCustomMessageId, aCustomMessage );
+
+    iContainer->iListBox->SetTopItemIndex( iTopItemIndex );
+
+    if ( iCurrentItem >= 0 &&
+        iCurrentItem < iContainer->iListBox->Model()->NumberOfItems() ) // magic
+        {
+        iContainer->iListBox->SetCurrentItemIndexAndDraw( iCurrentItem );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CGSCallDivertPlugin::DoDeactivate
+//
+// Deactivates view
+// ---------------------------------------------------------------------------
+void CGSCallDivertPlugin::DoDeactivate()
+    {
+    CGSBaseView::DoDeactivate();
+    }
+
+// ---------------------------------------------------------------------------
+// CGSCallDivertPlugin::Container
+//
+// Returns call container item
+// ---------------------------------------------------------------------------
+//
+CGSCallDivertPluginContainer* CGSCallDivertPlugin::Container()
+    {
+    return static_cast <CGSCallDivertPluginContainer*> ( iContainer );
+    }
+
+
+// ========================= From CGSPluginInterface ==================
+
+// ----------------------------------------------------------------------------
+// CGSCallDivertPlugin::GetCaption
+//
+// Return application/view caption.
+// ----------------------------------------------------------------------------
+//
+void CGSCallDivertPlugin::GetCaptionL( TDes& aCaption ) const
+    {
+    // the resource file is already opened.
+    HBufC* result = StringLoader::LoadL( R_GS_CALL_DIVERT_CAPTION );
+
+    aCaption.Copy( *result );
+    delete result;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CGSCallDivertPlugin::PluginProviderCategory
+//
+// A means to identify the location of this plug-in in the framework.
+// ----------------------------------------------------------------------------
+//
+TInt CGSCallDivertPlugin::PluginProviderCategory() const
+    {
+    //To identify internal plug-ins.
+    return KGSPluginProviderInternal;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CGSCallDivertPlugin::Visible
+//
+// Provides the visibility status of self to framework.
+// ----------------------------------------------------------------------------
+//
+TBool CGSCallDivertPlugin::Visible() const
+    {
+    TBool result( ETrue );
+    TInt value = 0;
+    iBtSapListener->Get( value );
+    if ( value == EBTSapNotConnected || value == EBTSapConnecting )
+        {
+        //Now checking also for CSP support
+        __ASSERT_ALWAYS( iCSP, User::Panic( KGSNameOfClass,
+                         EGSCallDivertPluginPanicNullPtr ) );
+        TInt err = KErrNone;
+        err = iCSP->IsCFSupported( result );
+        //CSP modifies result value even if something goes wrong
+        //CSP will return KErrNotSupported (-5) in cases when
+        //it is not possible to read CSP values from SIM card
+        //Call Barring should be still displayed in this case
+        if ( err != KErrNone )
+            {
+            result = ETrue;
+            }
+        }
+    else
+        {
+        result = EFalse;
+        }
+    return result;
+    }
+
+// -----------------------------------------------------------------------------
+// CGSCallDivertPlugin::CreateIconL()
+//
+//
+// -----------------------------------------------------------------------------
+//
+CGulIcon* CGSCallDivertPlugin::CreateIconL( const TUid aIconType )
+    {
+    //EMbm<Mbm_file_name><Bitmap_name>
+    CGulIcon* icon;
+    TParse* fp = new( ELeave ) TParse();
+    CleanupStack::PushL( fp );
+    fp->Set( KGSCallDivertPluginIconDirAndName, &KDC_BITMAP_DIR, NULL );
+
+    if( aIconType == KGSIconTypeLbxItem )
+        {
+        icon = AknsUtils::CreateGulIconL(
+        AknsUtils::SkinInstance(),
+        KAknsIIDQgnPropSetDivSub,
+        fp->FullName(),
+        EMbmGscalldivertpluginQgn_prop_set_div_sub,
+        EMbmGscalldivertpluginQgn_prop_set_div_sub_mask );
+        }
+    else
+        {
+        icon = CGSPluginInterface::CreateIconL( aIconType );
+        }
+
+    CleanupStack::PopAndDestroy( fp );
+
+    return icon;
+    }
+
+// ---------------------------------------------------------------------------
+// CGSCallDivertPlugin::HandleNotifyPSL
+//
+// Handling PS keys change
+// ---------------------------------------------------------------------------
+//
+void CGSCallDivertPlugin::HandleNotifyPSL( const TUid aUid, const TInt& aKey,
+                                          const TRequestStatus& /* aStatus */ )
+    {
+    if ( aUid == KPSUidBluetoothSapConnectionState &&
+         aKey == KBTSapConnectionState )
+        {
+        Visible();
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CGSCallDivertPlugin::SetCSPActiveL
+//
+// Set Customer Service Profile active
+// ----------------------------------------------------------------------------
+//
+void CGSCallDivertPlugin::SetCSPActiveL( TBool aValue )
+    {
+    if ( aValue )
+        {
+        iCSP = CPsetCustomerServiceProfile::NewL();
+        User::LeaveIfError( iCSP->OpenCSProfileL() );
+        }
+    else
+        {
+        delete iCSP;
+        iCSP = NULL;
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// CGSCallDivertPlugin::DynInitMenuPaneL()
+//
+// Display the dynamic menu
+// ----------------------------------------------------------------------------
+void CGSCallDivertPlugin::DynInitMenuPaneL( TInt aResourceId,
+                                            CEikMenuPane* aMenuPane )
+    {
+    // show or hide the 'help' menu item when supported
+    if( aResourceId == R_GS_MENU_ITEM_HELP )
+        {
+        User::LeaveIfNull( aMenuPane );
+
+        if ( FeatureManager::FeatureSupported( KFeatureIdHelp ) )
+            {
+            aMenuPane->SetItemDimmed( EAknCmdHelp, EFalse );
+            }
+        else
+            {
+            aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue );
+            }
+        }
+    }
+
+// End of File