--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/gssettingsuis/Gs/GSCallPlugin/src/GSCallPlugin.cpp Wed Sep 01 12:20:44 2010 +0100
@@ -0,0 +1,2177 @@
+/*
+* Copyright (c) 2002-2007 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: Call submenu in General Settings.
+*
+*/
+
+
+// INCLUDE FILES
+#include "GSCallPlugin.h" //for CGSCallPlugin
+#include "GSCallPluginContainer.h" //for CGSCallPluginContainer
+#include "GsLogger.h"
+#include "GSCallPlugin.h" //for pluginUID
+#include <akntitle.h> // for title pane
+#include <coeaui.h>
+#include <hlplch.h> // For HlpLauncher
+#include <aknnotewrappers.h> //for Note Wrappers
+#include <aknradiobuttonsettingpage.h> //for Radiobutton pages
+#include <akntextsettingpage.h> //for TextSettings pages
+#include <aknmessagequerydialog.h> //for Message Query Dialog
+#include <aknViewAppUi.h>
+#include <aknnotedialog.h>
+#include <AknWaitDialog.h>
+#include <gscommon.hrh>
+
+// headers for still image
+#include <imageconversion.h>
+#include <MGFetch.h> // Image selection
+#include <DRMCommon.h>
+
+#include <eikmenup.h> //for menu bar
+#include <PsetContainer.h> //for container
+#include <PsuiContainer.h> //for CPsuiContainer
+#include <featmgr.h>
+#include <secuisecurityhandler.h> //for PIN2 query
+#include <secui.h> //for TSecUi
+#include <secuisecuritysettings.h> //for CSecuritySettings
+#include <gscallpluginrsc.rsg> //for resource IDs
+#include <gscallplugin.mbg>
+#include <gsfwviewuids.h>
+#include <gslistbox.h> //for CGSListBoxItemTextArray
+
+#include <settingsinternalcrkeys.h>
+#include <ctsydomainpskeys.h>
+#include <gsprivatepluginproviderids.h>
+
+// LOCAL CONSTANTS
+_LIT( KGSNameOfClass, "GSCallPlugin" );
+_LIT( KGSVTStillImgPath, "" );
+//Use default values for external calls.
+const TInt KGSUseDefault = 0;
+//Call Prefix setting page items
+const TInt KGSSettingItemOff = 1;
+const TInt KGSSettingItemOn = 0;
+//Lines in setting page.
+const TInt KGSFirstLine = 0;
+const TInt KGSSecondLine = 1;
+// Middle Softkey control ID.
+const TInt KGSMSKControlID = 3;
+
+// VT still image values. Basically everything above 0 should be considered as
+// 'On' value so do not compare with 1
+const TInt KGSVTStillImageOff = 0;
+
+
+// ========================= MEMBER FUNCTIONS ================================
+// ---------------------------------------------------------------------------
+//
+// Constructor.
+//
+// ---------------------------------------------------------------------------
+CGSCallPlugin::CGSCallPlugin()
+ :iMskCommandFlag( ETrue )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Symbian OS two-phased constructor (second phase)
+//
+// ---------------------------------------------------------------------------
+void CGSCallPlugin::ConstructL()
+ {
+ __GSLOGSTRING("[GSCallPlugin]--> CGSCallPlugin::ConstructL");
+ OpenLocalizedResourceFileL( KGSCallPluginResourceFileName,
+ iResourceLoader );
+
+ BaseConstructL( R_GS_CALL_VIEW );
+
+ iModel = CGSCallPluginModel::NewL();
+ iRestrictedClir = iModel->RestrictedSendCallerIdSupportedL();
+ iSecureClir = iModel->SecureSendCallerIdSupportedL();
+ __GSLOGSTRING("[GSCallPlugin]--> ConstructL - Model created");
+ iSettings = CPsetContainer::NewL();
+ __GSLOGSTRING("[GSCallPlugin]--> ConstructL - PSetContainer created");
+ iObsContainer = CPsuiContainer::NewL();
+ __GSLOGSTRING("[GSCallPlugin]--> ConstructL - PsuiContainer created");
+ iCwObserver = iObsContainer->CreateCWObsL();
+ __GSLOGSTRING("[GSCallPlugin]--> ConstructL - CreateCWObsL done");
+ iWaiting = iSettings->CreateCWObjectL( *iCwObserver );
+ __GSLOGSTRING("[GSCallPlugin]--> ConstructL - CreateCWObjectL done");
+ iSsSettings = new (ELeave) RSSSettings;
+ __GSLOGSTRING("[GSCallPlugin]--> ConstructL - SSSettings created");
+
+ User::LeaveIfError( iSsSettings->Open() );
+ User::LeaveIfError( iSsSettings->RegisterAll( *this ) );
+ __GSLOGSTRING("[GSCallPlugin]--> ConstructL - SSSettings opening successful");
+
+#ifndef __WINS__
+ iSsSettings->Get( ESSSettingsAls, iAls );
+ iSsSettings->Get( ESSSettingsAlsBlocking, iAlsBlock );
+#endif //__WINS__
+
+ iVTImageSelectionOngoing = EFalse;
+
+ __GSLOGSTRING("[GSCallPlugin] <--CGSCallPlugin::ConstructL");
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Symbian OS two-phased constructor (first phase)
+//
+// ---------------------------------------------------------------------------
+CGSCallPlugin* CGSCallPlugin::NewLC()
+ {
+ CGSCallPlugin* self = new ( ELeave ) CGSCallPlugin;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CGSCallPlugin::NewL()
+// Static constructor
+//
+// ---------------------------------------------------------------------------
+//
+CGSCallPlugin* CGSCallPlugin::NewL( TAny* /*aInitParams*/ )
+ {
+ CGSCallPlugin* self = new(ELeave) CGSCallPlugin();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Destructor
+//
+// ---------------------------------------------------------------------------
+CGSCallPlugin::~CGSCallPlugin()
+ {
+ __GSLOGSTRING("[GSCallPlugin] ~CGSCallPlugin()|->");
+
+ delete iObsContainer;
+ delete iCwObserver;
+ if ( iWaiting )
+ {
+ delete iWaiting;
+ }
+ delete iSettings;
+
+ if ( iSsSettings )
+ {
+ iSsSettings->CancelAll( *this );
+ iSsSettings->Close();
+ delete iSsSettings;
+ }
+
+ if( iModel )
+ {
+ delete iModel;
+ }
+
+ if( iImageHandler )
+ {
+ delete iImageHandler;
+ }
+
+ __GSLOGSTRING("[GSCallPlugin] ~CGSCallPlugin()-|");
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Returns Id of the Call submenu
+//
+// ---------------------------------------------------------------------------
+TUid CGSCallPlugin::Id() const
+ {
+ return KCallPluginUID;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Handles user inputs in Options menu
+//
+// ---------------------------------------------------------------------------
+void CGSCallPlugin::HandleCommandL( TInt aCommand )
+ {
+ __GSLOGSTRING1("[GSCallPlugin] HandleCommandL(%d)|->", aCommand );
+ switch ( aCommand )
+ {
+ case EGSMSKCmdAppChange:
+ HandleListBoxSelectionL();
+ break;
+ // Command Obtained from Context Options
+ // set in ProcessCommandL()
+ case ECFCmdActivate:
+ case EGSCmdCallWaitActivate:
+ iWaiting->SetCallWaitingL( MPsetCallWaiting::EActivateCallWaiting,
+ EAllTeleAndBearer );
+ break;
+ // Command Obtained from Context Options
+ // set in ProcessCommandL()
+ case ECFCmdCheckStatus:
+ case EGSCmdCallWaitInquiry:
+ iWaiting->GetCallWaitingStatusL();
+ break;
+ // Command Obtained from Context Options
+ // set in ProcessCommandL()
+ case ECFCmdCancel:
+ case EGSCmdCallWaitDeactivate:
+ iWaiting->SetCallWaitingL( MPsetCallWaiting::EDeactivateCallWaiting,
+ EAllTeleAndBearer );
+ break;
+ case EAppCmdCreatePopupList:
+ {
+ const TInt currentFeatureId = Container()->CurrentFeatureId();
+ HandleCreatePopupL( currentFeatureId );
+ }
+ break;
+ case EAknSoftkeyBack:
+ iAppUi->ActivateLocalViewL( KGSTelPluginUid );
+ break;
+ case EAknCmdHelp:
+ {
+ if( FeatureManager::FeatureSupported( KFeatureIdHelp ) )
+ {
+ HlpLauncher::LaunchHelpApplicationL(
+ iEikonEnv->WsSession(), iAppUi->AppHelpContextL() );
+ }
+ break;
+ }
+ default:
+ iAppUi->HandleCommandL( aCommand );
+ break;
+ }
+ __GSLOGSTRING("[CGSCallPlugin] HandleCommandL()-|");
+ }
+
+
+// ---------------------------------------------------------------------------
+//
+// Handles user inputs in Options menu
+//
+// ---------------------------------------------------------------------------
+void CGSCallPlugin::ProcessCommandL( TInt aCommand )
+ {
+ MenuBar()->SetContextMenuTitleResourceId( R_CALL_DIVERT_MSK_CONTEXTMENUBAR );
+ // Call base class
+ CAknView::ProcessCommandL( aCommand );
+ }
+// ---------------------------------------------------------------------------
+//
+// Activates the view
+//
+// ---------------------------------------------------------------------------
+void CGSCallPlugin::DoActivateL( const TVwsViewId& aPrevViewId ,
+ TUid aCustomMessageId,
+ const TDesC8& aCustomMessage )
+ {
+ __GSLOGSTRING( "[GSCallPlugin] DoActivateL()|->" );
+ CGSBaseView::DoActivateL( aPrevViewId, aCustomMessageId, aCustomMessage );
+ Container()->SetMiddleSoftkeyObserver( this );
+ SetMiddleSoftKeyLabelL( R_CALL_MSK_CHANGE, EGSMSKCmdAppChange );
+ // This way we set which command is set for MSK
+ iMskCommandFlag = ETrue;
+// iContainer->iListBox->SetTopItemIndex( iTopItemIndex );
+
+// if ( iCurrentItem >= 0 &&
+// iCurrentItem < iContainer->iListBox->Model()->NumberOfItems() )
+// {
+// iContainer->iListBox->SetCurrentItemIndexAndDraw( iCurrentItem );
+// }
+ CheckMiddleSoftkeyLabelL();
+
+ // If AppUid is different or placeholderview is used, this view has been launched from outside GS
+ if ( iPrevViewId.iAppUid != KUidGS || iPrevViewId.iViewUid == TUid::Uid(0x0DEADBED ) )
+ {
+ CEikButtonGroupContainer* cbaGroup = Cba();
+ if( cbaGroup )
+ {
+ HBufC* rightSKText = StringLoader::LoadLC ( R_GS_CBA_EXIT );
+ TPtr rskPtr = rightSKText->Des();
+ cbaGroup->SetCommandL( 2, EAknSoftkeyExit, *rightSKText );
+ CleanupStack::PopAndDestroy( rightSKText );
+ }
+ }
+
+ __GSLOGSTRING( "[GSCallPlugin] DoActivateL()-|" );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Deactivates the view
+//
+// ---------------------------------------------------------------------------
+void CGSCallPlugin::DoDeactivate()
+ {
+ __GSLOGSTRING("[GSCallPlugin]--> DoDeactivate");
+ if ( iContainer )
+ {
+ if ( iContainer->iListBox && iContainer->iListBox->View() )
+ {
+ iTopItemIndex = iContainer->iListBox->TopItemIndex();
+ iCurrentItem = iContainer->iListBox->CurrentItemIndex();
+ }
+ CGSBaseView::DoDeactivate();
+ }
+ __GSLOGSTRING("[GSCallPlugin] <--DoDeactivate");
+ }
+
+
+
+// ---------------------------------------------------------------------------
+//
+// Handle status pane size changed
+//
+// ---------------------------------------------------------------------------
+void CGSCallPlugin::HandleStatusPaneSizeChange()
+ {
+ if ( Container() )
+ Container()->SetRect( ClientRect());
+ }
+
+
+// ---------------------------------------------------------------------------
+//
+// Shows setting page - for ON/OFF setting items
+//
+// ---------------------------------------------------------------------------
+void CGSCallPlugin::ShowSettingPageL( TGSCallItemIds aPage )
+ {
+ __GSLOGSTRING("[GSCallPlugin]--> CGSCallPlugin::ShowSettingPageL");
+
+ CDesCArrayFlat* items =
+ new ( ELeave ) CDesCArrayFlat( KGSCallPopupMenuItems );
+ CleanupStack::PushL( items );
+
+ TInt titleID = 0;
+ TInt currentSettingItem = KErrNone;
+ TCallSettId keyName = EGSNotSet;
+
+ switch ( aPage )
+ {
+ case EGSOpeningSlideAnswerCallItemId:
+ keyName = EGSOpeningSlideAnswerCall;
+ titleID = R_CP_SETTING_TITLE_OPENING_SLIDE;
+ AppendItemL( *items, R_CP_SETTING_OPENING_SLIDE_ANSWER );
+ AppendItemL( *items, R_CP_SETTING_OPENING_SLIDE_NOT_ANSWER );
+ break;
+ case EGSClosingSlideEndCallItemId:
+ keyName = EGSClosingSlideEndCall;
+ titleID = R_CP_SETTING_TITLE_CLOSING_SLIDE;
+ AppendItemL( *items, R_CP_SETTING_CLOSING_SLIDE_END );
+ AppendItemL( *items, R_CP_SETTING_CLOSING_SLIDE_NOT_END );
+ break;
+ case EGSICSendIntCallIdItemId:
+ titleID = R_SET_IC_CLIR;
+ AppendItemL( *items, R_SET_IC_CLIR_ON );
+ AppendItemL( *items, R_SET_IC_CLIR_OFF );
+ break;
+ case EGSICWaitingItemId:
+ titleID = R_SET_IC_WAITING;
+ AppendItemL( *items, R_SET_IC_WAITING_ACTIVE );
+ AppendItemL( *items, R_SET_IC_WAITING_NOT_ACTIVE );
+ break;
+ case EGSICPreferredTelephonyId:
+ titleID = R_SET_IC_PREFERRED_TELEPHONE;
+ AppendItemL( *items, R_SET_IC_PREFERRED_TELEPHONE_CS );
+ AppendItemL( *items, R_SET_IC_PREFERRED_TELEPHONE_PS );
+ break;
+ case EGSDndItemId:
+ titleID = R_SET_IC_DND;
+ AppendItemL( *items, R_SET_IC_DND_ACTIVE );
+ AppendItemL( *items, R_SET_IC_DND_NOT_ACTIVE );
+ break;
+ case EGSCliItemId:
+ titleID = R_OWN_NUMBER_SENDING_HEADING;
+
+ // Restrict the default option if necessary
+ if ( !iRestrictedClir )
+ {
+ AppendItemL( *items, R_CLI_SENDING_DEFAULT );
+ }
+
+ AppendItemL( *items, R_CLI_SENDING_ON );
+ AppendItemL( *items, R_CLI_SENDING_OFF );
+ break;
+ case EGSSummaryAfterCallItemId:
+ keyName = EGSSummaryAfterCall;
+ titleID = R_CTERM_SETTING;
+ AppendItemL( *items, R_CALL_TERMINATION_NOTE_ON );
+ AppendItemL( *items, R_CALL_TERMINATION_NOTE_OFF );
+ break;
+ default:
+ Panic( KGSNameOfClass, EInvalidIndex );
+ break;
+ }
+
+ if ( aPage == EGSICSendIntCallIdItemId ||
+ aPage == EGSICWaitingItemId ||
+ aPage == EGSICPreferredTelephonyId ||
+ aPage == EGSDndItemId )
+ {
+ currentSettingItem = GetLineForSelectedVoipSetting( aPage );
+ }
+ // CLI item does not have a keyName and/or literal, hence
+ // this additional checking for CLI item.
+ else if ( aPage != EGSCliItemId && keyName != EGSNotSet )
+ {
+ iModel->GetCallSettingValue( keyName, currentSettingItem );
+ __GSLOGSTRING1("[GSCallPlugin] ShowSettingPageL: currentSettingItem: %d", currentSettingItem);
+ // switch value to settings page value
+ SwitchValue( currentSettingItem );
+ }
+ else
+ {
+ TInt err = iSsSettings->Get( ESSSettingsClir, currentSettingItem );
+ __GSLOGSTRING1("[GSCallPlugin] ShowSettingPageL: currentSettingItem1: %d", currentSettingItem);
+ if ( err == KErrNone )
+ {
+ CliConvertValue( currentSettingItem );
+
+ if ( iRestrictedClir )
+ {
+ // For indexing listbox which does not include KGSCliDefault
+ currentSettingItem--;
+ }
+ }
+ }
+
+ HBufC* buffer = NULL;
+
+ buffer = HBufC::NewLC( KGSMaxStringLength );
+ TPtr str = buffer->Des();
+ StringLoader::Load( str, titleID );
+
+ TPtr string = buffer->Des();
+ const TInt oldSettingItem = currentSettingItem;
+ CAknRadioButtonSettingPage* dlg = new ( ELeave )
+ CAknRadioButtonSettingPage(
+ &string,
+ EAknSettingPageNoOrdinalDisplayed,
+ KGSUseDefault,
+ KGSUseDefault,
+ R_SETTING_PAGE,
+ currentSettingItem,
+ items );
+
+ if ( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) )
+ {
+ const TBool settingItemChanged = oldSettingItem != currentSettingItem;
+
+ if ( aPage == EGSICSendIntCallIdItemId ||
+ aPage == EGSICWaitingItemId ||
+ aPage == EGSICPreferredTelephonyId ||
+ aPage == EGSDndItemId )
+ {
+ // Change new VoIP setting based selected line.
+ SetVoipSettingBasedSelectedLine( aPage, currentSettingItem );
+ }
+ else
+ {
+ if ( aPage != EGSCliItemId && keyName != EGSNotSet )
+ {
+ // switch settings page value to shared data value
+ SwitchValue( currentSettingItem );
+ iModel->SetCallSettingValue( keyName, currentSettingItem );
+ __GSLOGSTRING1("[GSCallPlugin] ShowSettingPageL: currentSettingItem2: %d", currentSettingItem);
+ }
+ else
+ {
+ if ( iRestrictedClir )
+ {
+ // For indexing listbox which does not include KGSCliDefault
+ currentSettingItem++;
+ }
+
+ CliConvertValue( currentSettingItem );
+
+ // Secure setting of Send Caller Id if required
+ if ( !iSecureClir )
+ {
+ iSsSettings->Set( ESSSettingsClir, currentSettingItem );
+ }
+ else
+ {
+ if ( settingItemChanged && MakeSecCodeQueryL() )
+ {
+ iSsSettings->Set( ESSSettingsClir, currentSettingItem );
+ }
+ }
+ __GSLOGSTRING1("[GSCallPlugin] ShowSettingPageL: currentSettingItem3: %d", currentSettingItem);
+ }
+ }
+
+ UpdateListBoxL( aPage, currentSettingItem );
+ }
+
+ CleanupStack::PopAndDestroy( buffer );
+ CleanupStack::PopAndDestroy( items );
+ __GSLOGSTRING("[GSCallPlugin] <--CGSCallPlugin::ShowSettingPageL");
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Shows ALS setting page - either line blocking or line selected
+//
+// ---------------------------------------------------------------------------
+void CGSCallPlugin::ShowAlsSettingPageL( TGSCallItemIds aPage )
+ {
+ __GSLOGSTRING("[GSCallPlugin]--> CGSCallPlugin::ShowAlsSettingPageL");
+ CDesCArrayFlat* items = new ( ELeave ) CDesCArrayFlat( KGSCallPopupMenuItems );
+ CleanupStack::PushL( items );
+
+ TInt currentItem = 0;
+
+ switch ( aPage )
+ {
+ case EGSLineChangeItemId:
+ //causes PIN2 query to launch, if necessary
+ if ( iAlsBlock == ESSSettingsAlsBlockingOn )
+ {
+ TInt pin = MakePin2QueryL();
+ if ( pin != KGSPinQueryOk )
+ {
+ CleanupStack::PopAndDestroy( items );
+ return; //User failed in Pin2 Query
+ }
+ }
+ AppendItemL( *items, R_ALS_LINE1 );
+ AppendItemL( *items, R_ALS_LINE2 );
+ currentItem = iAls - 1;
+ break;
+ case EGSALSBlockItemId:
+ {
+ TInt pin = MakePin2QueryL();
+ if ( pin != KGSPinQueryOk )
+ {
+ CleanupStack::PopAndDestroy( items );
+ return; //User failed in Pin2 Query
+ }
+ AppendItemL( *items, R_ALS_LINE_BLOCKING_ON );
+ AppendItemL( *items, R_ALS_LINE_BLOCKING_OFF );
+ if ( iAlsBlock == ESSSettingsAlsBlockingOn )
+ {
+ currentItem = KGSAlsBlockOn;
+ }
+ else
+ {
+ currentItem = KGSAlsBlockOff;
+ }
+ break;
+ }
+ default:
+ Panic( KGSNameOfClass, EInvalidIndex );
+ break;
+ }
+ HBufC* buffer =
+ HBufC::NewLC( KGSMaxStringLength );
+ TPtr string( buffer->Des() );
+ StringLoader::Load(
+ string,
+ ( aPage == EGSLineChangeItemId ) ?
+ R_ALS_LINE_SELECTION_MODE :
+ R_ALS_PHONELINE_BLOCK_MODE );
+
+ CAknRadioButtonSettingPage* dlg = new ( ELeave )
+ CAknRadioButtonSettingPage(
+ &string,
+ EAknSettingPageNoOrdinalDisplayed,
+ KGSUseDefault,
+ KGSUseDefault,
+ R_SETTING_PAGE,
+ currentItem,
+ items );
+
+ // handle als and blocking separately...
+ if ( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) )
+ {
+ if ( aPage == EGSALSBlockItemId )
+ {
+ AlsBlockConvertValue( currentItem );
+ iSsSettings->Set( ESSSettingsAlsBlocking, iAlsBlock );
+ }
+ else if ( aPage == EGSLineChangeItemId )
+ {
+ iAls = currentItem + 1;
+ iSsSettings->Set( ESSSettingsAls, iAls );
+ }
+ }
+ CleanupStack::PopAndDestroy( 2 ); // items, string
+ __GSLOGSTRING("[GSCallPlugin] <--CGSCallPlugin::ShowAlsSettingPageL");
+ }
+
+
+// ---------------------------------------------------------------------------
+//
+// Changes value from 0 to 1 and vice versa
+// Used when Central Repository is enabled
+//
+// ---------------------------------------------------------------------------
+void CGSCallPlugin::SwitchOnOffSetting( TCallSettId aSetting )
+ {
+ TInt value = KGSSettingOff;
+ // Reads a value and switches value (0 -> 1, 1 -> 0).
+ iModel->GetCallSettingValue( aSetting, value );
+ SwitchValue( value );
+ iModel->SetCallSettingValue( aSetting, value );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Appends given item to given list
+//
+// ---------------------------------------------------------------------------
+void CGSCallPlugin::AppendItemL( CDesCArrayFlat& aList, TInt aItem )
+ {
+ HBufC* string = StringLoader::LoadLC( aItem );
+ aList.AppendL( *string );
+ CleanupStack::PopAndDestroy( string );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Selects what kind of menu is created
+//
+// ---------------------------------------------------------------------------
+void CGSCallPlugin::HandleCreatePopupL( TInt aIndex )
+ {
+ __GSLOGSTRING("[GSCallPlugin]--> CGSCallPlugin::HandleCreatePopupL");
+ switch ( aIndex )
+ {
+ case EGSCallWaitingItemId:
+ break;
+ case EGSLineChangeItemId:
+ ShowAlsSettingPageL( EGSLineChangeItemId );
+ break;
+ case EGSALSBlockItemId:
+ ShowAlsSettingPageL( EGSALSBlockItemId );
+ break;
+ case EGSSoftRejectTextItemId:
+ ShowSoftRejectSettingPageL();
+ UpdateListBoxL( EGSSoftRejectTextItemId, KGSNotUsed );
+ break;
+ case EGSStillImageItemId:
+ if ( FeatureManager::FeatureSupported(
+ KFeatureIdCsVideoTelephony ) )
+ {
+ ShowVTStillImageSettingPageL();
+ }
+ break;
+ case EGSOwnImageVtCallItemId:
+ if ( FeatureManager::FeatureSupported(
+ KFeatureIdCsVideoTelephony ) )
+ {
+ ShowOwnImageVtCallSettingPageL();
+ }
+ break;
+ case EGSReplacePrefixItemId:
+ if ( FeatureManager::FeatureSupported( KFeatureIdJapanPrefixChange ) )
+ {
+ ChangePrefixSettingL( ETrue );
+ UpdateListBoxL( EGSReplacePrefixItemId, KGSNotUsed );
+ }
+ break;
+ case EGSShowCallDurationItemId:
+ ChangeCallDurationSettingL( ETrue );
+ UpdateListBoxL( EGSShowCallDurationItemId, KGSNotUsed );
+ break;
+ case EGSLongPressCallKeyItemId:
+ #ifdef RD_VT_LONG_SEND_KEY
+ ChangeLongPressCallKeySettingL( ETrue );
+ #endif
+ break;
+ default:
+ ShowSettingPageL( static_cast<TGSCallItemIds> ( aIndex ) );
+ break;
+ }
+ __GSLOGSTRING("[GSCallPlugin] <--CGSCallPlugin::HandleCreatePopupL");
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Sets title text to a setting page
+//
+// ---------------------------------------------------------------------------
+void CGSCallPlugin::SetTitleToSettingL( CAknRadioButtonSettingPage& aDlg,
+ TInt aTitleID )
+ {
+ HBufC* title = StringLoader::LoadLC ( aTitleID );
+ aDlg.SetSettingTextL( *title );
+ CleanupStack::PopAndDestroy( title );
+ }
+
+
+/*// ---------------------------------------------------------------------------
+//
+// Sets title text to a status pane
+//
+// ---------------------------------------------------------------------------
+void CGSCallPlugin::SetTitleL( TInt aTitleID )
+ {
+ CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane();
+ CleanupStack::PushL(statusPane);
+ CAknTitlePane* titlePane = (CAknTitlePane*) statusPane->ControlL(TUid::Uid(
+ EEikStatusPaneUidTitle));
+ CleanupStack::PushL( titlePane );
+
+ TResourceReader reader;
+ iCoeEnv->CreateResourceReaderLC( reader, aTitleID );
+ titlePane->SetFromResourceL( reader );
+
+ CleanupStack::PopAndDestroy();//reader
+
+ CleanupStack::Pop(titlePane);
+ CleanupStack::Pop(statusPane);
+ }
+*/
+
+// ---------------------------------------------------------------------------
+//
+// Switches value between setting page and shared data.
+// Values in shared data do not map nicely to values in setting menu,
+// therefore sharedData:SettingOn(1) => settingPage:IndexOn(0).
+// ---------------------------------------------------------------------------
+TInt CGSCallPlugin::SwitchValue( TInt& aValue )
+ {
+ if ( aValue == KGSSettingOn )
+ {
+ aValue = KGSIndexOn;
+ }
+ else if ( aValue == KGSSettingOff )
+ {
+ aValue = KGSIndexOff;
+ }
+ return aValue;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Observes changes to ALS, ALS Block and CLIR values.
+//
+// ---------------------------------------------------------------------------
+void CGSCallPlugin::PhoneSettingChanged( TSSSettingsSetting aSetting,
+ TInt aNewValue )
+ {
+ __GSLOGSTRING("[GSCallPlugin]--> CGSCallPlugin::PhoneSettingChanged");
+ TInt updateMe = KErrNone;
+ switch( aSetting )
+ {
+ case ESSSettingsClir:
+ iClir = aNewValue;
+ updateMe = EGSCliItemId;
+ break;
+ case ESSSettingsAls:
+ iAls = aNewValue;
+ updateMe = EGSLineChangeItemId;
+ break;
+ case ESSSettingsAlsBlocking:
+ iAlsBlock = aNewValue;
+ updateMe = EGSALSBlockItemId;
+ TRAP_IGNORE( ShowAlsBlockNoteL() );
+ break;
+ default:
+ break;
+ }
+ __GSLOGSTRING1("[GSCallPlugin] PhoneSettingChanged: aNewValue: %d", aNewValue);
+ if ( ( iContainer ) && ( updateMe != KErrNone ) )
+ {
+ TRAP_IGNORE( UpdateListBoxL( updateMe, aNewValue ) );
+ }
+ __GSLOGSTRING("[GSCallPlugin] <--CGSCallPlugin::PhoneSettingChanged");
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Shows notes when Als Block value has been changed.
+//
+// ---------------------------------------------------------------------------
+void CGSCallPlugin::ShowAlsBlockNoteL()
+ {
+ TInt noteText;
+ if ( iAlsBlock == ESSSettingsAlsBlockingOn )
+ {
+ noteText = R_ALS_LINE_BLOCKING_ON_SEL;
+ }
+ else
+ {
+ noteText = R_ALS_LINE_BLOCKING_OFF_SEL;
+ }
+
+ HBufC* string = StringLoader::LoadLC( noteText );
+ CAknInformationNote* note = new ( ELeave ) CAknInformationNote();
+ note->ExecuteLD( *string );
+ CleanupStack::PopAndDestroy( string );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Creates new iContainer.
+//
+// ---------------------------------------------------------------------------
+void CGSCallPlugin::NewContainerL()
+ {
+ __GSLOGSTRING("[GSCallPlugin]--> NewContainerL");
+ iContainer = new (ELeave) CGSCallPluginContainer;
+ __GSLOGSTRING("[GSCallPlugin] <--NewContainerL");
+ }
+
+// ---------------------------------------------------------------------------
+// CGSCallPlugin::HandleListBoxSelectionL
+//
+// Handle user selection in the listbox to perform an associated action
+// ---------------------------------------------------------------------------
+void CGSCallPlugin::HandleListBoxSelectionL()
+ {
+ TBool updateValue = EFalse;
+ TInt value( KErrNone );
+ CEikMenuBar* menuBar = this->MenuBar();
+
+ const TInt currentFeatureId = Container()->CurrentFeatureId();
+
+ TBool featureVoipSupported = iModel->VoIPSupported();
+
+ switch ( currentFeatureId )
+ {
+ case EGSOpeningSlideAnswerCallItemId:
+ SwitchOnOffSetting( EGSOpeningSlideAnswerCall );
+ updateValue = ETrue;
+ break;
+ case EGSClosingSlideEndCallItemId:
+ SwitchOnOffSetting( EGSClosingSlideEndCall );
+ updateValue = ETrue;
+ break;
+ case EGSCliItemId:
+ ShowSettingPageL( EGSCliItemId );
+ break;
+ case EGSCallWaitingItemId:
+ iRockerPress = ETrue;
+ menuBar->SetMenuType(CEikMenuBar::EMenuContext);
+ menuBar->TryDisplayMenuBarL();
+ menuBar->SetMenuType(CEikMenuBar::EMenuOptions);
+ iRockerPress = EFalse;
+ break;
+ case EGSICSendIntCallIdItemId: // Send my Internet call id.
+ if ( featureVoipSupported )
+ {
+ iModel->GetVoIPCallSettingValue( EGSVoIPSendIntCallId, value );
+
+ if ( value == EGSSendIntCallIdOff )
+ {
+ iModel->SetVoIPCallSettingValue(
+ EGSVoIPSendIntCallId, EGSSendIntCallIdOn );
+ }
+ else
+ {
+ iModel->SetVoIPCallSettingValue(
+ EGSVoIPSendIntCallId, EGSSendIntCallIdOff );
+
+ TInt status( KErrNone );
+ iModel->GetSCCPStatus( status );
+
+ if ( status == 1 )
+ {
+ HBufC* prompt = StringLoader::
+ LoadLC( R_QTN_VOIP_SCCP_NO_CLIR );
+ CAknInformationNote* note =
+ new(ELeave) CAknInformationNote( ETrue );
+ note->ExecuteLD( *prompt );
+ CleanupStack::PopAndDestroy( prompt );
+ }
+ }
+ updateValue = ETrue;
+ }
+ break;
+ case EGSICWaitingItemId: // Internet call waiting item.
+ if ( featureVoipSupported )
+ {
+ iModel->GetVoIPCallSettingValue( EGSVoIPCW, value );
+
+ if ( value == EGSCSCallWaitingOff )
+ {
+ iModel->SetVoIPCallSettingValue(
+ EGSVoIPCW, EGSCSCallWaitingOn );
+ }
+ else
+ {
+ iModel->SetVoIPCallSettingValue(
+ EGSVoIPCW, EGSCSCallWaitingOff );
+ }
+ updateValue = ETrue;
+ }
+ break;
+ case EGSICPreferredTelephonyId: // Preferred call type.
+ if ( featureVoipSupported )
+ {
+ iModel->GetVoIPCallSettingValue( EGSVoIPPreType, value );
+
+ if ( value == EGSPreferredCS )
+ {
+ iModel->SetVoIPCallSettingValue(
+ EGSVoIPPreType, EGSPreferredPS );
+
+ // Show message query dialog if preferred call
+ // setting was changed to the Int. Telephone.
+ ShowPreferredTelephonyNoteL();
+ }
+ else
+ {
+ iModel->SetVoIPCallSettingValue(
+ EGSVoIPPreType, EGSPreferredCS );
+ }
+ updateValue = ETrue;
+ }
+ break;
+ case EGSDndItemId: // Do not disturb.
+ if ( featureVoipSupported )
+ {
+ iModel->GetVoIPCallSettingValue( EGSVoIPDnd, value );
+
+ if ( value == EGSCSCallDndOff )
+ {
+ iModel->SetVoIPCallSettingValue(
+ EGSVoIPDnd, EGSCSCallDndOn );
+ }
+ else
+ {
+ iModel->SetVoIPCallSettingValue(
+ EGSVoIPDnd, EGSCSCallDndOff );
+ }
+ updateValue = ETrue;
+ }
+ break;
+ case EGSSoftRejectTextItemId:
+ ShowSoftRejectSettingPageL();
+ updateValue = ETrue;
+ break;
+ case EGSSummaryAfterCallItemId:
+ SwitchOnOffSetting( EGSSummaryAfterCall );
+ updateValue = ETrue;
+ break;
+ case EGSLineChangeItemId:
+ SwitchAlsSettingL();
+ break;
+ case EGSALSBlockItemId:
+ ShowAlsSettingPageL( EGSALSBlockItemId );
+ break;
+ //Still image listbox creating
+ case EGSStillImageItemId:
+ if ( FeatureManager::FeatureSupported(
+ KFeatureIdCsVideoTelephony ) &&
+ !iVTImageSelectionOngoing )
+ {
+ //Locking listbox selection so user cannot click
+ //VT still image item twice
+ iVTImageSelectionOngoing = ETrue;
+
+ //This takes some time
+ ShowVTStillImageSettingPageL();
+
+ //Releasing lock
+ iVTImageSelectionOngoing = EFalse;
+ }
+ break;
+ case EGSOwnImageVtCallItemId:
+ if ( FeatureManager::FeatureSupported(
+ KFeatureIdCsVideoTelephony ) )
+ {
+ ShowOwnImageVtCallSettingPageL();
+ }
+ break;
+ case EGSReplacePrefixItemId:
+ if ( FeatureManager::FeatureSupported( KFeatureIdJapanPrefixChange ) )
+ {
+ ChangePrefixSettingL( EFalse );
+ updateValue = ETrue;
+ }
+ break;
+ case EGSShowCallDurationItemId:
+ ChangeCallDurationSettingL( EFalse );
+ updateValue = ETrue;
+ break;
+ case EGSLongPressCallKeyItemId:
+ #ifdef RD_VT_LONG_SEND_KEY
+ ChangeLongPressCallKeySettingL( EFalse );
+ #endif
+ break;
+ default:
+ break;
+ }
+ if ( updateValue )
+ {
+ UpdateListBoxL( currentFeatureId, KGSNotUsed );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Converts value from setting page to SsSettings:
+// settin page: line change disabled(0) => ESSSettingsAlsBlockingOn(2)
+// settin page: line change enabled(1) => ESSSettingsAlsBlockingOff(1)
+// ---------------------------------------------------------------------------
+//
+void CGSCallPlugin::AlsBlockConvertValue( TInt& aValue )
+ {
+ __GSLOGSTRING("[GSCallPlugin]--> CGSCallPlugin::AlsBlockConvertValue");
+ __GSLOGSTRING1("[GSCallPlugin] AlsBlockConvertValue: aValue: %d", aValue);
+ if ( aValue == KGSAlsBlockOn )
+ {
+ iAlsBlock = ESSSettingsAlsBlockingOn;
+ }
+ else
+ {
+ iAlsBlock = ESSSettingsAlsBlockingOff;
+ }
+ __GSLOGSTRING1("[GSCallPlugin] AlsBlockConvertValue: aValue: %d", aValue);
+ __GSLOGSTRING("[GSCallPlugin] <--CGSCallPlugin::AlsBlockConvertValue");
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Converts value from setting page to SsSettings:
+// settin page: own number sending default(0) =>
+// SsSettings: ESSSettingsClirNetworkDefault(0)
+// settin page: own number sending on (1) =>
+// SsSettings: ESSSettingsClirExplicitSuppress(2)
+// settin page: own number sending off (2) =>
+// SsSettings: ESSSettingsClirExplicitInvoke(1)
+// ---------------------------------------------------------------------------
+//
+void CGSCallPlugin::CliConvertValue( TInt& aValue )
+ {
+ switch ( aValue )
+ {
+ case KGSCliDefault:
+ aValue = ESSSettingsClirNetworkDefault;
+ break;
+ case KGSCliOn:
+ aValue = ESSSettingsClirExplicitSuppress;
+ break;
+ case KGSCliOff:
+ aValue = ESSSettingsClirExplicitInvoke;
+ break;
+ default:
+ //error, return to-be converted value w/o changes
+ break;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Updates specific value to container.
+//
+// ---------------------------------------------------------------------------
+//
+void CGSCallPlugin::UpdateListBoxL( const TInt& aListItem,
+ TInt aNewValue )
+ {
+ /*if ( aListItem == EGSStillImageItemId )
+ {
+ TRAP_IGNORE( iAvkonAppUi->StatusPane()->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL ) );
+ SetTitleL( R_GS_CALL_VIEW_TITLE );
+ TRAP_IGNORE( iAvkonAppUi->StatusPane()->DrawNow() );
+ }*/
+ if ( Container() )
+ {
+ Container()->UpdateListBoxL( aListItem, aNewValue );
+ }
+ CheckMiddleSoftkeyLabelL();
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Before showing a options menu
+//
+// ---------------------------------------------------------------------------
+//
+void CGSCallPlugin::DynInitMenuPaneL( TInt aResourceId,
+ CEikMenuPane* aMenuPane )
+ {
+ __GSLOGSTRING("[GSCallPlugin]--> DynInitMenuPaneL");
+ const TInt currentFeatureId = Container()->CurrentFeatureId();
+ CEikMenuBar* menuBar = this->MenuBar();
+ if ( aResourceId == R_GS_CALL_VIEW_MENU )
+ {
+ if ( currentFeatureId == EGSCallWaitingItemId )
+ {
+ //add CW menu
+ if (MenuBar()->ItemSpecificCommandsEnabled() || MenuBar()->GetMenuType() == CEikMenuBar::EMenuContext)
+ {
+ aMenuPane->AddMenuItemsL( R_GS_CALL_WAIT_VIEW_MENU,EAppCmdCreatePopupList );
+ }
+
+ //hide Change if call waiting is selected
+ aMenuPane->SetItemDimmed( EAppCmdCreatePopupList, ETrue );
+
+ if ( iRockerPress )
+ {
+ aMenuPane->SetItemDimmed( EAknCmdExit, ETrue );
+ }
+
+ if ( FeatureManager::FeatureSupported( KFeatureIdHelp )
+ && !iRockerPress )
+ {
+ aMenuPane->SetItemDimmed( EAknCmdHelp, EFalse );
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue );
+ }
+ }
+ else
+ {
+ //for other items than call waiting
+ if ( FeatureManager::FeatureSupported( KFeatureIdHelp ) )
+ {
+ aMenuPane->SetItemDimmed( EAknCmdHelp, EFalse );
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue );
+ }
+ }
+ }
+
+ __GSLOGSTRING("[GSCallPlugin] <--DynInitMenuPaneL");
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Requests user to enter PIN2
+//
+// ---------------------------------------------------------------------------
+//
+TInt CGSCallPlugin::MakePin2QueryL()
+ {
+ TInt retValue = KErrNone;
+ TSecUi::InitializeLibL();
+
+ CSecuritySettings* settings = CSecuritySettings::NewL();
+ CleanupStack::PushL( settings );
+
+ if ( settings->AskPin2L() )
+ {
+ retValue = KGSPinQueryOk;
+ }
+
+ CleanupStack::PopAndDestroy( settings );
+ TSecUi::UnInitializeLib();
+
+ return retValue;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Requests user to enter security code
+//
+// ---------------------------------------------------------------------------
+//
+TInt CGSCallPlugin::MakeSecCodeQueryL()
+ {
+ TBool retValue = EFalse;
+ TSecUi::InitializeLibL();
+
+ CSecuritySettings* settings = CSecuritySettings::NewL();
+ CleanupStack::PushL( settings );
+
+ retValue = settings->AskSecCodeL();
+
+ CleanupStack::PopAndDestroy( settings );
+ TSecUi::UnInitializeLib();
+
+ return retValue;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Changes value in shared data for Als
+//
+// ---------------------------------------------------------------------------
+//
+void CGSCallPlugin::SwitchAlsSettingL()
+ {
+ __GSLOGSTRING("[GSCallPlugin]--> CGSCallPlugin::SwitchAlsSettingL");
+ //causes PIN2 query to launch, if necessary
+ if ( iAlsBlock == ESSSettingsAlsBlockingOn )
+ {
+ TInt pin = MakePin2QueryL();
+ if ( pin != KGSPinQueryOk )
+ {
+ __GSLOGSTRING("[GSCallPlugin] SwitchAlsSettingL: User failed in Pin2 Query");
+ return; //User failed in Pin2 Query
+ }
+ }
+ iSsSettings->Get( ESSSettingsAls, iAls );
+ if ( iAls == ESSSettingsAlsPrimary )
+ {
+ iAls = ESSSettingsAlsAlternate;
+ }
+ else
+ {
+ iAls = ESSSettingsAlsPrimary;
+ }
+ iSsSettings->Set( ESSSettingsAls, iAls );
+ __GSLOGSTRING("[GSCallPlugin] <--CGSCallPlugin::SwitchAlsSettingL");
+ }
+
+
+// ---------------------------------------------------------------------------
+//
+// Show Soft Reject Text setting page
+//
+// ---------------------------------------------------------------------------
+//
+void CGSCallPlugin::ShowSoftRejectSettingPageL()
+ {
+ __GSLOGSTRING("[GSCallPlugin]--> ShowSoftRejectSettingPageL");
+ HBufC* dynamicText = HBufC::NewLC( KGSSMSTxtEditorLength );
+ TPtr string( dynamicText->Des() );
+
+ Container()->GetSoftRejectTextL( string );
+
+ HBufC* title = Container()->ReadFromResourceL( R_SOFT_REJECT_TXT_TITLE );
+ CleanupStack::PushL( title );
+
+ // Open resource file, to get the resource texts for setting page.
+ // Find the resource file
+ RConeResourceLoader loader( *iCoeEnv );
+ TParse parse;
+ parse.Set( KGSSoftRejectResource, &KDC_RESOURCE_FILES_DIR, NULL );
+ TFileName fileName( parse.FullName() );
+
+ // Get language of resource file
+ BaflUtils::NearestLanguageFile( iCoeEnv->FsSession(), fileName );
+
+ // Open resource file
+ TInt err = loader.Open( fileName );
+ if ( err == KErrNotFound )
+ {
+ User::Leave( KErrGeneral );
+ }
+ CleanupClosePushL( loader );
+
+ CAknSettingPage* dlg = new( ELeave )CAknTextSettingPage(
+ title,
+ EAknSettingPageNoOrdinalDisplayed,
+ KGSUseDefault,
+ KGSUseDefault,
+ R_TEXT_SETTING_PAGE,
+ string,
+ CAknTextSettingPage::EZeroLengthAllowed |
+ CAknTextSettingPage::EPredictiveTextEntryPermitted );
+
+ if ( dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) )
+ {
+ TInt value = KGSSettingOn;
+ iModel->SetCallSettingValue( EGSSoftRejectDefault, value );
+ AknTextUtils::StripCharacters( string, KAknStripTabs );
+ iModel->SetSoftRejectText( string );
+ }
+
+ CleanupStack::PopAndDestroy( 3 ); //title, dynamicText, loader
+ __GSLOGSTRING("[GSCallPlugin] <--ShowSoftRejectSettingPageL");
+ }
+
+
+// ---------------------------------------------------------------------------
+//
+// Show Replace Prefix setting page
+//
+// ---------------------------------------------------------------------------
+//
+TBool CGSCallPlugin::ShowPrefixSettingPageL( TInt& aCurrentValue )
+ {
+ __GSLOGSTRING("[GSCallPlugin]--> ShowPrefixSettingPageL");
+ CDesCArrayFlat* items =
+ iCoeEnv->ReadDesC16ArrayResourceL( R_GS_REPLACE_PREFIX_SETTING_PAGE_LBX );
+ CleanupStack::PushL( items );
+
+ CAknRadioButtonSettingPage* dlg =
+ new (ELeave) CAknRadioButtonSettingPage( R_GS_REPLACE_PREFIX_SETTING_PAGE,
+ aCurrentValue, items );
+
+ TBool ret = dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged );
+ CleanupStack::PopAndDestroy( items );
+
+ __GSLOGSTRING1("[GSCallPlugin] ShowPrefixSettingPageL: aCurrentValue: %d", aCurrentValue);
+ __GSLOGSTRING("[GSCallPlugin] <--ShowPrefixSettingPageL");
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CGSCallPlugin::ChangePrefixSettingL
+//
+// Change replace prefix setting.
+// ---------------------------------------------------------------------------
+//
+void CGSCallPlugin::ChangePrefixSettingL( TBool aSettingPage )
+ {
+ __GSLOGSTRING("[GSCallPlugin]--> ChangePrefixSettingL");
+
+ TInt changeMode = iModel->PrefixChangeModeL();
+ TInt prevChangeMode = changeMode;
+ TBool updateValue = ETrue;
+ TBool rockerPress = EFalse;
+
+ __GSLOGSTRING1("[GSCallPlugin] ChangePrefixSettingL: prevChangeMode: %d", prevChangeMode);
+ if ( aSettingPage )
+ {
+ updateValue = ShowPrefixSettingPageL( changeMode );
+ }
+ else
+ {
+ rockerPress = ETrue;
+ if( changeMode == KGSSettingItemOff )
+ {
+ changeMode = KGSSettingItemOn;
+ }
+ else
+ {
+ changeMode = KGSSettingItemOff;
+ }
+ }
+
+ __GSLOGSTRING1("[GSCallPlugin] ChangePrefixSettingL: changeMode: %d", changeMode);
+ if ( updateValue )
+ {
+ //if the value is changed and is set to ON, display the query dialog
+ if ( changeMode == KGSSettingItemOn )
+ {
+ HBufC* replacePrefix = HBufC::NewLC( KGSReplacePrefixTextLength );
+ TPtr string( replacePrefix->Des() );
+ string.Zero();
+
+ iModel->PrefixChangeDataL( string );
+
+ CAknTextQueryDialog* dlg = new( ELeave ) CAknTextQueryDialog( string );
+
+ TBool ret = dlg->ExecuteLD( R_REPLACE_PREFIX_DATA_QUERY );
+ if( ret )
+ {
+ rockerPress = ETrue;
+ iModel->SetPrefixChangeDataL( string );
+ }
+ else
+ {
+ rockerPress = EFalse;
+ }
+ CleanupStack::PopAndDestroy( replacePrefix );
+
+ }
+ else
+ {
+ rockerPress = ETrue;
+ }
+ }
+
+ if ( prevChangeMode != changeMode && rockerPress )
+ {
+ iModel->SetPrefixChangeModeL( changeMode );
+ }
+
+ __GSLOGSTRING("[GSCallPlugin] <--ChangePrefixSettingL");
+ }
+
+
+// ---------------------------------------------------------------------------
+// CGSCallPlugin::SetVoipSettingBasedSelectedLine
+//
+// Set the new changes to VOIP variables.
+// ---------------------------------------------------------------------------
+//
+void CGSCallPlugin::SetVoipSettingBasedSelectedLine(
+ const TGSCallItemIds aPage, TInt aCurrentSetting )
+ {
+ switch ( aPage )
+ {
+ case EGSICSendIntCallIdItemId:
+ if ( aCurrentSetting == KGSFirstLine )
+ {
+ iModel->SetVoIPCallSettingValue(
+ EGSVoIPSendIntCallId, EGSSendIntCallIdOn );
+ }
+ else
+ {
+ iModel->SetVoIPCallSettingValue(
+ EGSVoIPSendIntCallId, EGSSendIntCallIdOff );
+ }
+ break;
+ case EGSICWaitingItemId:
+ if ( aCurrentSetting == KGSFirstLine )
+ {
+ iModel->SetVoIPCallSettingValue(
+ EGSVoIPCW, EGSCSCallWaitingOn );
+ }
+ else
+ {
+ iModel->SetVoIPCallSettingValue(
+ EGSVoIPCW, EGSCSCallWaitingOff );
+ }
+ break;
+ case EGSICPreferredTelephonyId:
+ if ( aCurrentSetting == KGSFirstLine )
+ {
+ iModel->SetVoIPCallSettingValue(
+ EGSVoIPPreType, EGSPreferredCS );
+ }
+ else
+ {
+ iModel->SetVoIPCallSettingValue(
+ EGSVoIPPreType, EGSPreferredPS );
+
+ // Show message query dialog if preferred call
+ // setting was changed to the Int. Telephone.
+ TRAP_IGNORE( ShowPreferredTelephonyNoteL() );
+ }
+ break;
+ case EGSDndItemId:
+ if ( aCurrentSetting == KGSFirstLine )
+ {
+ iModel->SetVoIPCallSettingValue(
+ EGSVoIPDnd, EGSCSCallDndOn );
+ }
+ else
+ {
+ iModel->SetVoIPCallSettingValue(
+ EGSVoIPDnd, EGSCSCallDndOff );
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CGSCallPlugin::Container
+//
+// Returns call container item
+// ---------------------------------------------------------------------------
+//
+CGSCallPluginContainer* CGSCallPlugin::Container()
+ {
+ return static_cast <CGSCallPluginContainer*> ( iContainer );
+ }
+
+// ---------------------------------------------------------------------------
+// CGSCallPlugin::GetLineForSelectedVoipSetting
+//
+// Returns selected line based on setting value.
+// ---------------------------------------------------------------------------
+//
+TInt CGSCallPlugin::GetLineForSelectedVoipSetting(
+ const TGSCallItemIds aPage )
+ {
+ if ( !iModel->VoIPSupported() )
+ {
+ return KErrNone;
+ }
+
+ TInt value( KErrNone );
+
+ // Get value based from setting page.
+ switch ( aPage )
+ {
+ case EGSICSendIntCallIdItemId: // No swap.
+ iModel->GetVoIPCallSettingValue( EGSVoIPSendIntCallId, value );
+ break;
+ case EGSICWaitingItemId:
+ iModel->GetVoIPCallSettingValue( EGSVoIPCW, value );
+ break;
+ case EGSICPreferredTelephonyId: // No swap.
+ iModel->GetVoIPCallSettingValue( EGSVoIPPreType, value );
+ break;
+ case EGSDndItemId:
+ iModel->GetVoIPCallSettingValue( EGSVoIPDnd, value );
+ break;
+ default:
+ break;
+ }
+
+ // Swap items.
+ if ( aPage != EGSICPreferredTelephonyId &&
+ aPage != EGSICSendIntCallIdItemId )
+ {
+ if ( value == KGSSecondLine )
+ {
+ value = KGSFirstLine;
+ }
+ else
+ {
+ value = KGSSecondLine;
+ }
+ }
+
+ return value;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CGSCallPlugin::ShowVTStillImageSettingPageL
+//
+// Display Video Telephony Still Image setting page.
+// ---------------------------------------------------------------------------
+//
+void CGSCallPlugin::ShowVTStillImageSettingPageL()
+ {
+ iVtStillImage = iModel->VTStillImageL();
+ // Store previous in case something goes wrong.
+ iPreviousVtStillImage = iVtStillImage;
+
+ CDesCArrayFlat* items = iCoeEnv->ReadDesC16ArrayResourceL(
+ R_GS_STILL_IMAGE_SETTING_PAGE_LBX );
+ CleanupStack::PushL( items );
+
+ // Map CenRep value to lbx items:
+ TInt dialogSelection = EGSVtStillImageNotInUse;
+ if ( iVtStillImage != KGSVTStillImageOff ) dialogSelection = EGSVtStillImageInUse;
+
+ CAknRadioButtonSettingPage* dlg =
+ new( ELeave ) CAknRadioButtonSettingPage( R_GS_STILL_IMAGE_SETTING_PAGE,
+ dialogSelection, items );
+
+ TBool ret = dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged );
+
+ if ( ret )
+ {
+ if ( dialogSelection == EGSVtStillImageNotInUse )
+ {
+ // Still image not used
+ iModel->SetVTStillImageL( KGSVTStillImageOff );
+ }
+ else
+ {
+ // User decided to update still image
+ ShowStillImageListL();
+ }
+
+ // Update VT item in CGSCallPlugin listbox. iVtStillImage value is
+ // irrelevant as UpdateListBoxL actually reads the new value from
+ // CenRep and converts it to lbx item value correctly (Off/On).
+ UpdateListBoxL( EGSStillImageItemId, iVtStillImage );
+ }
+ CleanupStack::PopAndDestroy( items );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CGSCallPlugin::ShowStillImageListL()
+//
+// Display background image list from media gallery.
+// ---------------------------------------------------------------------------
+//
+void CGSCallPlugin::ShowStillImageListL()
+ {
+ CDesCArray* selectedFiles = new ( ELeave ) CDesCArrayFlat( 1 );
+ CleanupStack::PushL( selectedFiles );
+
+ TBool ret = MGFetch::RunL( *selectedFiles, EImageFile, EFalse, this );
+
+ if ( ret && selectedFiles->MdcaCount() == 1 )
+ {
+ iImageHandler = CGSAsyncImageHandling::NewL( iCoeEnv->FsSession(),
+ this, KGSVTStillImgPath );
+
+ TPtrC imagePath = selectedFiles->MdcaPoint( 0 );
+
+ TRAPD( error, iModel->iBackgroundApi->SetVTStillImagePathL( imagePath,
+ *iImageHandler ) );
+ if ( error == KErrNone )
+ {
+ // Show wait note
+ ShowImageLoadWaitNoteL();
+ }
+ else
+ {
+ HandleImageErrorsL( error );
+ }
+ }
+ CleanupStack::PopAndDestroy( selectedFiles );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CGSCallPlugin::ImageHandlingComplete()
+//
+// Method derived from MGSSyncImageHandlingObserver
+// Run when the asynchronous image converting is complete
+// ---------------------------------------------------------------------------
+//
+void CGSCallPlugin::ImageHandlingCompleteL( TInt aError )
+ {
+ if ( aError != KErrNone )
+ {
+ HandleImageErrorsL( aError );
+ }
+ else
+ {
+ // Needs to increment iVtStillImage value so CenRep will send
+ // notificatios to VT (only changing value will fire notification).
+ iModel->SetVTStillImageL( ++iVtStillImage );
+ UpdateListBoxL( EGSStillImageItemId, EGSVtStillImageInUse );
+ }
+
+ HideImageLoadWaitNoteL();
+
+ delete iImageHandler;
+ iImageHandler = NULL;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CGSCallPlugin::ShowImageLoadWaitNoteL()
+//
+// Display image load wait note dialog.
+// ---------------------------------------------------------------------------
+//
+void CGSCallPlugin::ShowImageLoadWaitNoteL()
+ {
+ if ( !iWaitDialog )
+ {
+ iWaitDialog = new( ELeave ) CAknWaitDialog(
+ ( REINTERPRET_CAST(CEikDialog**,
+ &iWaitDialog ) ), ETrue );
+
+ iWaitDialog->ExecuteDlgLD( CAknNoteDialog::ENoTone,
+ R_IMAGE_LOAD_WAIT_NOTE );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CGSCallPlugin::HideImageLoadWaitNoteL()
+//
+// Hide image load wait note dialog.
+// ---------------------------------------------------------------------------
+//
+void CGSCallPlugin::HideImageLoadWaitNoteL()
+ {
+ if ( iWaitDialog )
+ {
+ iWaitDialog->ProcessFinishedL(); // deletes the dialog
+ iWaitDialog = NULL;
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CGSCallPlugin::HandleImageErrorsL
+//
+// Prompt image related errors to the user
+// ---------------------------------------------------------------------------
+//
+void CGSCallPlugin::HandleImageErrorsL( TInt aError )
+ {
+ TInt resourceId;
+ switch( aError )
+ {
+ case KErrNotSupported:
+ case KErrUnderflow:
+ // Image is corrupted or in wrong format
+ resourceId = R_GS_IMAGE_CORRUPTED;
+ break;
+ case KErrDiskFull:
+ case KErrNoMemory:
+ // Image is too large
+ resourceId = R_GS_IMAGE_TOO_LARGE;
+ break;
+ default:
+ // Better to give some error message than result in CONE5 panic:
+ resourceId = R_GS_IMAGE_CORRUPTED;
+ break;
+ }
+ // Show information note
+ HBufC* prompt = iCoeEnv->AllocReadResourceLC( resourceId );
+ CAknInformationNote* note = new( ELeave ) CAknInformationNote( ETrue );
+ note->ExecuteLD( *prompt );
+
+ // Setting previous VT still image value (rollback)
+ iModel->SetVTStillImageL( iPreviousVtStillImage );
+ UpdateListBoxL( EGSStillImageItemId, iPreviousVtStillImage );
+ CleanupStack::PopAndDestroy( prompt );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CGSCallPlugin::VerifySelectionL()
+//
+// An overloaded method from MMGFetchVerifier interface class
+// ---------------------------------------------------------------------------
+//
+TBool CGSCallPlugin::VerifySelectionL( const MDesCArray* aSelectedFiles )
+ {
+ const TBool KGSDrmProtectedContent = ETrue;
+
+ TBool ret = ETrue;
+ //
+ if ( aSelectedFiles->MdcaCount() == 1 )
+ {
+ const TPtrC fileName( aSelectedFiles->MdcaPoint( 0 ) );
+
+ // First, check if the selected file is DRM protected
+ if ( ret && CheckDRMProtectionL( fileName ) ==
+ KGSDrmProtectedContent )
+ {
+ // display the note to user
+ // Show information note
+ HBufC* prompt = iCoeEnv->AllocReadResourceLC(
+ R_GS_DRM_NOT_ALLOWED );
+
+ CAknInformationNote* note =
+ new( ELeave ) CAknInformationNote( ETrue );
+ note->ExecuteLD( *prompt );
+
+ CleanupStack::PopAndDestroy( prompt );
+ ret = EFalse;
+ }
+
+ // Next, check whether the image header is valid
+ if ( ret )
+ {
+ CImageDecoder* imageDecoder = NULL;
+ TRAPD( err, imageDecoder = CImageDecoder::FileNewL(
+ iCoeEnv->FsSession(), fileName, ContentAccess::EPeek ) );
+
+ if ( err != KErrNone )
+ {
+ // Show information note
+ HBufC* prompt = iCoeEnv->AllocReadResourceLC(
+ R_GS_IMAGE_CORRUPTED );
+ CAknInformationNote* note =
+ new( ELeave ) CAknInformationNote( ETrue );
+ note->ExecuteLD(*prompt);
+ CleanupStack::PopAndDestroy( prompt );
+
+ ret = EFalse;
+ }
+ delete imageDecoder;
+ }
+ }
+
+ return ret;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CGSCallPlugin::CheckDRMProtectionL
+//
+// Check if the selected image file is DRM protected.
+// ---------------------------------------------------------------------------
+//
+TBool CGSCallPlugin::CheckDRMProtectionL( const TDesC& aOriginalFileName )
+ {
+ TBool isProtected( EFalse );
+ DRMCommon* drmClient = DRMCommon::NewL();
+ CleanupStack::PushL( drmClient );
+ TInt error = drmClient->Connect();
+ if ( error != DRMCommon::EOk )
+ {
+ User::Leave( KErrCorrupt );
+ }
+
+ if ( aOriginalFileName != KNullDesC )
+ {
+ error = drmClient->IsProtectedFile( aOriginalFileName, isProtected );
+ if ( error != DRMCommon::EOk )
+ {
+ User::Leave( KErrCorrupt );
+ }
+ }
+
+ CleanupStack::PopAndDestroy( drmClient );
+ return isProtected;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Show Call Duration setting page
+//
+// ---------------------------------------------------------------------------
+//
+TBool CGSCallPlugin::ShowCallDurationSettingPageL( TInt& aCurrentValue )
+ {
+ __GSLOGSTRING("[GSCallPlugin]--> ShowCallDurationSettingPageL");
+ CDesCArrayFlat* items = iCoeEnv->ReadDesC16ArrayResourceL(
+ R_GS_SHOW_CALL_DURATION_SETTING_PAGE_LBX );
+ CleanupStack::PushL( items );
+
+ CAknRadioButtonSettingPage* dlg = new (ELeave) CAknRadioButtonSettingPage(
+ R_GS_SHOW_CALL_DURATION_SETTING_PAGE,
+ aCurrentValue, items );
+
+ TBool ret = dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged );
+ CleanupStack::PopAndDestroy( items );
+
+ __GSLOGSTRING("[GSCallPlugin] <--ShowCallDurationSettingPageL");
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CGSCallPlugin::ChangeCallDurationSettingL
+//
+// Change Call Duration setting.
+// ---------------------------------------------------------------------------
+//
+void CGSCallPlugin::ChangeCallDurationSettingL( TBool aSettingPage )
+ {
+ __GSLOGSTRING("[GSCallPlugin]--> ChangeCallDurationSettingL");
+
+ TInt callState = CheckCallStateL();
+
+ // Get information of whether there are open connections or not
+ if ( callState != EPSCTsyCallStateUninitialized &&
+ callState != EPSCTsyCallStateNone )
+ {
+ HBufC* prompt = iCoeEnv->AllocReadResourceLC( R_TEXT_ACTIVE_CALL );
+
+ CAknInformationNote* note =
+ new( ELeave ) CAknInformationNote( ETrue );
+
+ note->ExecuteLD( *prompt );
+
+ CleanupStack::PopAndDestroy( prompt );
+
+ return;
+ }
+
+ TInt duration = iModel->CallDurationL();
+ TBool updateValue = ETrue;
+
+ if ( aSettingPage )
+ {
+ updateValue = ShowCallDurationSettingPageL( duration );
+ }
+ else
+ {
+ if( duration == KGSSettingItemOff )
+ {
+ duration = KGSSettingItemOn;
+ }
+ else
+ {
+ duration = KGSSettingItemOff;
+ }
+ }
+
+ if ( updateValue )
+ {
+ iModel->SetCallDurationL( duration );
+ UpdateListBoxL( EGSShowCallDurationItemId, KGSNotUsed );
+ }
+
+ __GSLOGSTRING("[GSCallPlugin] <--ChangePrefixSettingL");
+ }
+
+
+// ---------------------------------------------------------------------------
+// CGSCallPlugin::CheckCallStateL
+//
+// Check call state using PubSub or SA
+// ---------------------------------------------------------------------------
+//
+TInt CGSCallPlugin::CheckCallStateL()
+ {
+ TInt callState = KErrNone;
+ //here are open connections or not
+ RProperty::Get( KPSUidCtsyCallInformation,
+ KCTsyCallState,
+ callState );
+ return callState;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CGSCallPlugin::ShowPreferredTelephonyNoteL
+//
+// Shows note if preferred call setting was changed to the Int. Telephone.
+// ---------------------------------------------------------------------------
+//
+void CGSCallPlugin::ShowPreferredTelephonyNoteL()
+ {
+ // Create message query dialog.
+ HBufC* text = StringLoader::LoadLC( R_IC_PREFERRED_TELEPHONE_QUERY_TEXT );
+ CAknMessageQueryDialog* query = CAknMessageQueryDialog::NewL( *text );
+ query->SetMessageTextL( text->Des() );
+
+ // Show message query dialog.
+ query->ExecuteLD( R_IC_PREFERRED_TELEPHONE_QUERY );
+
+ CleanupStack::PopAndDestroy( text );
+ }
+
+
+// -----------------------------------------------------------------------------
+// When this method is called, view checks based on highlight focus, if the MSK
+// label is correct.
+// -----------------------------------------------------------------------------
+//
+void CGSCallPlugin::CheckMiddleSoftkeyLabelL()
+ {
+ const TInt currentFeatureId = Container()->CurrentFeatureId();
+ RemoveCommandFromMSK( iMskCommandFlag );
+ if ( currentFeatureId == EGSCallWaitingItemId )
+ {
+ // First remove any prevous commands.
+ SetMiddleSoftKeyLabelL( R_CALL_SOFTKEY_OPTION,
+ EAknSoftkeyContextOptions );
+ // This way we set which command is set for MSK
+ iMskCommandFlag = EFalse;
+ }
+ else
+ {
+ //Set middle softkey as Change.
+ SetMiddleSoftKeyLabelL( R_CALL_MSK_CHANGE,
+ EGSMSKCmdAppChange );
+ // This way we set which command is set for MSK
+ iMskCommandFlag = ETrue;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// Remove unnecessary commands from Middle softkey.
+// @flag = ETrue means presently MSK value is "Change" so we remove that
+// @flag = EFalse means presently MSK value is "Context Options" so we remove that
+// -----------------------------------------------------------------------------
+//
+void CGSCallPlugin::RemoveCommandFromMSK(const TBool flag )
+ {
+ CEikButtonGroupContainer* cbaGroup = Cba();
+ if ( cbaGroup )
+ {
+ if ( flag )
+ {
+ cbaGroup->RemoveCommandFromStack(
+ KGSMSKControlID, EGSMSKCmdAppChange );
+ }
+ else
+ {
+ cbaGroup->RemoveCommandFromStack(
+ KGSMSKControlID, EAknSoftkeyContextOptions );
+ }
+ }
+ }
+// ---------------------------------------------------------------------------
+// Sets middle softkey label.
+// ---------------------------------------------------------------------------
+//
+void CGSCallPlugin::SetMiddleSoftKeyLabelL(
+ const TInt aResourceId, const TInt aCommandId )
+ {
+ CEikButtonGroupContainer* cbaGroup = Cba();
+ if ( cbaGroup )
+ {
+ HBufC* middleSKText = StringLoader::LoadLC( aResourceId );
+ TPtr mskPtr = middleSKText->Des();
+ cbaGroup->AddCommandToStackL(
+ KGSMSKControlID,
+ aCommandId,
+ mskPtr );
+ CleanupStack::PopAndDestroy( middleSKText );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CGSCallPlugin::HandleClientRectChange
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CGSCallPlugin::HandleClientRectChange()
+ {
+ if ( iContainer )
+ {
+ iContainer->SetRect( ClientRect() );
+ }
+ }
+
+// ========================= From CGSPluginInterface ==================
+
+// -----------------------------------------------------------------------------
+// CGSCallPlugin::GetCaptionL
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CGSCallPlugin::GetCaptionL( TDes& aCaption ) const
+ {
+ HBufC* result = StringLoader::LoadL( R_GS_CALL_PLUGIN_CAPTION );
+ aCaption.Copy( *result );
+ delete result;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSCallPlugin::PluginProviderCategory
+//
+//
+// -----------------------------------------------------------------------------
+//
+TInt CGSCallPlugin::PluginProviderCategory() const
+ {
+ //This plugin is created by 3rd party.
+ return KGSPluginProviderInternal;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSCallPlugin::CreateIconL()
+//
+//
+// -----------------------------------------------------------------------------
+//
+CGulIcon* CGSCallPlugin::CreateIconL( const TUid aIconType )
+ {
+ //EMbm<Mbm_file_name><Bitmap_name>
+ CGulIcon* icon;
+ TParse* fp = new( ELeave ) TParse();
+ CleanupStack::PushL( fp );
+ fp->Set( KGSCallPluginIconDirAndName, &KDC_BITMAP_DIR, NULL );
+
+ if( aIconType == KGSIconTypeLbxItem )
+ {
+ icon = AknsUtils::CreateGulIconL(
+ AknsUtils::SkinInstance(),
+ KAknsIIDQgnPropSetCallSub,
+ fp->FullName(),
+ EMbmGscallpluginQgn_prop_set_call_sub,
+ EMbmGscallpluginQgn_prop_set_call_sub_mask );
+ }
+ else
+ {
+ icon = CGSPluginInterface::CreateIconL( aIconType );
+ }
+
+ CleanupStack::PopAndDestroy( fp );
+
+ return icon;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CGSCallPlugin::ChangeLongPressCallKeySettingL
+//
+// Change Long Press Call Key setting.
+// values: 0,1 --> Inactive (Default Value is 1 and when RFS default value is 0)
+// 2 --> Video call
+// ---------------------------------------------------------------------------
+//
+void CGSCallPlugin::ChangeLongPressCallKeySettingL( const TBool aShowSettingPage )
+ {
+ __GSLOGSTRING("[GSCallPlugin]--> ChangeLongPressCallKeySettingL");
+ TInt statusLongPressCallKey = iModel->LongPressCallKeyL();
+ TBool updateValue = ETrue;
+
+ if ( aShowSettingPage )
+ {
+ // If the status of Long Key is not active then we decrement to
+ // the value of statusLongPressCallKey so that the values are
+ // then tuned to launch the setting page normally with two setting
+ // items InActive and Video Call
+ // Refer to GSCallPlugin.hrh file for more info for the description
+ iModel->MapLongPressKeyCallKeyValue( statusLongPressCallKey );
+ updateValue = ShowLongPressCallKeySettingPageL(
+ statusLongPressCallKey );
+
+ // Here if the selected index is 1 it means Video Call from the setting page
+ // we then again map this value back to 2 which is EGSLongPressCallKeyVideoCall
+ // Refer to GSCallPlugin.hrh for more details
+ if ( statusLongPressCallKey == EGSLongPressCallKeyVoiceCall )
+ {
+ statusLongPressCallKey = EGSLongPressCallKeyVideoCall;
+ }
+ else // If selected index in setting page is InActive ( 0) we map
+ // this to EGSLongPressCallKeyVoiceCall which is 1
+ {
+ statusLongPressCallKey = EGSLongPressCallKeyVoiceCall;
+ }
+ }
+ else // switch the value
+ {
+ if ( statusLongPressCallKey == EGSLongPressCallKeyNotSet ||
+ statusLongPressCallKey == EGSLongPressCallKeyVoiceCall )
+ {
+ statusLongPressCallKey = EGSLongPressCallKeyVideoCall;
+ }
+ else
+ {
+ statusLongPressCallKey = EGSLongPressCallKeyVoiceCall;
+ }
+ }
+ if ( updateValue )
+ {
+ iModel->SetLongPressCallKeyL( statusLongPressCallKey );
+ UpdateListBoxL( EGSLongPressCallKeyItemId, KGSNotUsed );
+ }
+
+ __GSLOGSTRING("[GSCallPlugin] <--ChangeLongPressCallKeySettingL");
+ }
+
+// ---------------------------------------------------------------------------
+//
+// Launching Long Press Key setting page
+//
+// ---------------------------------------------------------------------------
+//
+TBool CGSCallPlugin::ShowLongPressCallKeySettingPageL( TInt& aCurrentValue )
+ {
+ __GSLOGSTRING("[GSCallPlugin]--> ShowLongPressCallKeySettingPageL");
+ CDesCArrayFlat* items = iCoeEnv->ReadDesC16ArrayResourceL(
+ R_GS_LONG_PRESS_CALL_SETTING_PAGE_LBX );
+ CleanupStack::PushL( items );
+
+ CAknRadioButtonSettingPage* dlg = new (ELeave) CAknRadioButtonSettingPage(
+ R_GS_LONG_PRESS_CALL_SETTING_PAGE,
+ aCurrentValue, items );
+
+ TBool ret = dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged );
+ CleanupStack::PopAndDestroy( items );
+
+ __GSLOGSTRING("[GSCallPlugin] <--ShowLongPressCallKeySettingPageL");
+ return ret;
+ }
+
+
+// ----------------------------------------------------------------------------
+// CGSCallPlugin::ShowOwnImageVtCallSettingPageL
+//
+// Displaying settings page for Own Image during video call setting
+// ----------------------------------------------------------------------------
+//
+void CGSCallPlugin::ShowOwnImageVtCallSettingPageL()
+ {
+ __GSLOGSTRING("[GSCallPlugin]--> ShowOwnImageVtCallSettingPageL");
+ TInt currentValue = iModel->OwnImageVtCallStatusL();
+ CDesCArrayFlat* items = iCoeEnv->ReadDesC16ArrayResourceL(
+ R_GS_OWN_IMAGE_VT_CALL_SETTING_PAGE_LBX );
+ CleanupStack::PushL( items );
+
+ CAknRadioButtonSettingPage* dlg = new (ELeave) CAknRadioButtonSettingPage(
+ R_GS_OWN_IMAGE_VT_CALL_SETTING_PAGE,
+ currentValue, items );
+
+ TBool ret = dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged );
+
+ if( ret )
+ {
+ iModel->SetOwnImageVtCallStatusL( currentValue );
+ UpdateListBoxL( EGSOwnImageVtCallItemId, currentValue );
+ }
+
+ CleanupStack::PopAndDestroy( items );
+
+ __GSLOGSTRING("[GSCallPlugin] <--ShowOwnImageVtCallSettingPageL");
+ }
+
+//End of File