--- a/gssettingsuis/Gs/GSCallDivertPlugin/Src/GSCallDivertView.cpp Tue Feb 02 00:22:03 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1361 +0,0 @@
-/*
-* Copyright (c) 2002-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 "GSCallDivertContainer.h"
-#include "GSCallDivertModel.h"
-#include "GSCallDivertQuery.h"
-#include "GSCallDivertView.h"
-#include "GsLogger.h"
-#include "GSPhoneSettingConstants.h"
-#include "GSRestrictedDivertContainer.h"
-#include "LocalViewId.h"
-
-
-#include <AiwContactSelectionDataTypes.h>
-#include <AiwGenericParam.h>
-#include <aknnotewrappers.h> //for AknErrorNote
-#include <AknUtils.h>
-#include <aknViewAppUi.h>
-#include <CPbk2SortOrderManager.h>
-#include <CPbk2StoreConfiguration.h>
-#include <CPbkContactItem.h>
-#include <CPbkSingleItemFetchDlg.h>
-#include <CVPbkContactLinkArray.h>
-#include <CVPbkContactManager.h>
-#include <featmgr.h>
-#include <gscommon.hrh>
-#include <gsfwviewuids.h> // for restricted call forward
-#include <GSCallDivertPluginRsc.rsg>
-#include <MPbk2ContactNameFormatter.h>
-#include <MVPbkContactFieldData.h>
-#include <MVPbkContactFieldTextData.h>
-#include <MVPbkContactLink.h>
-#include <MVPbkContactOperationBase.h>
-#include <MVPbkContactStoreList.h>
-#include <MVPbkStoreContact.h>
-#include <NumberGrouping.h> // for Number Grouping
-#include <Pbk2ContactNameFormatterFactory.h>
-#include <PsetCallDiverting.h>
-#include <PsuiConstants.h>
-#include <RPbkViewResourceFile.h>
-#include <AiwServiceHandler.h>
-#include <coeaui.h>
-#include <CVPbkContactStoreUriArray.h>
-#include <CVPbkFieldTypeSelector.h>
-#include <hlplch.h> // for Help Launcher
-#include <hlplch.h> // For HlpLauncher
-#include <RVPbkContactFieldDefaultPriorities.h>
-#include <StringLoader.h>
-#include <VPbkContactViewFilterBuilder.h>
-#include <voicemailboxdomaincrkeys.h>
-#include <centralrepository.h>
-
-using namespace AiwContactAssign;
-
-// LOCAL CONSTANTS
-_LIT( KGSDivertClassName, "CGSCallDivertView" );
-
-
-// ========================= MEMBER FUNCTIONS ================================
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::CGSCallDivertView
-//
-// C++ constructor.
-// ---------------------------------------------------------------------------
-CGSCallDivertView::CGSCallDivertView( CGSCallDivertModel* aModel )
- : iModel( aModel )
- {
- }
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::ConstructL
-//
-// Symbian OS two-phased constructor.
-// ---------------------------------------------------------------------------
-void CGSCallDivertView::ConstructL()
- {
- if( FeatureManager::FeatureSupported( KFeatureIdRestrictedCallDivert ) )
- {
- iModel->SetDivertServiceGroup( EGSSettIdVoiceDivert );
- }
- iModel->SetDivertView( this );
-
- iStoresOpened = EFalse;
- iNumberFetchedAsynchronously = EFalse;
-
- BaseConstructL( R_CF_DIV_VIEW );
-
- iTitles = iCoeEnv->ReadDesCArrayResourceL( R_TITLE_ARRAY );
- iRockerPress = EFalse;
-
- //Check video mailbox suppport from cenrep
- //Since it is static feature, needs to be checked only once
- CRepository* videoMailboxRepository =
- CRepository::NewLC( KCRUidVideoMailbox );
- videoMailboxRepository->Get( KVideoMbxSupport, iVideoMailboxSupported );
- CleanupStack::PopAndDestroy( videoMailboxRepository );
-
- // AIW for pbk2 contact selection functionality. Construct contact manager
- // with the same store configuration as in Phonebook currently.
- iServiceHandler = CAiwServiceHandler::NewL();
- iServiceHandler->AttachL( R_CALL_DIVERT_CONTACT_SELECTION_INTEREST );
- CPbk2StoreConfiguration* configuration = CPbk2StoreConfiguration::NewL();
- CleanupStack::PushL( configuration );
- CVPbkContactStoreUriArray* uriArray = configuration->CurrentConfigurationL();
- CleanupStack::PushL( uriArray );
- iContactManager = CVPbkContactManager::NewL( *uriArray );
- iContactManager->ContactStoresL().OpenAllL( *this );
- CleanupStack::PopAndDestroy( uriArray );
- CleanupStack::PopAndDestroy( configuration );
- }
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::~CGSCallDivertView
-//
-// Destructor.
-// ---------------------------------------------------------------------------
-CGSCallDivertView::~CGSCallDivertView()
- {
- if ( iTitles )
- {
- delete iTitles;
- }
- if( iRetrieveOperation )
- {
- delete iRetrieveOperation;
- iRetrieveOperation = NULL;
- }
- if( iContactLinks )
- {
- delete iContactLinks;
- iContactLinks = NULL;
- }
-
- TRAP_IGNORE
- (
- if( iContactManager )
- {
- iContactManager->ContactStoresL().CloseAll( *this );
- iStoresOpened = EFalse;
- delete iContactManager;
- }
- );
- delete iServiceHandler;
-
-
- if( iContextMenuItems )
- {
- delete iContextMenuItems;
- iContextMenuItems = NULL;
- }
- }
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::NewLC
-//
-// 1st phase constructor.
-// ---------------------------------------------------------------------------
-CGSCallDivertView* CGSCallDivertView::NewLC( CGSCallDivertModel* aModel )
- {
- CGSCallDivertView* self;
- self = new ( ELeave ) CGSCallDivertView( aModel );
- CleanupStack::PushL( self );
- self->ConstructL();
- return self;
- }
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::NewContainerL
-//
-// Creates new iContainer.
-// ---------------------------------------------------------------------------
-void CGSCallDivertView::NewContainerL()
- {
- if( FeatureManager::FeatureSupported( KFeatureIdRestrictedCallDivert ) )
- {
- iContainer = new (ELeave) CGSRestrictedDivertContainer();
- }
- else
- {
- iContainer = new (ELeave) CGSCallDivertContainer(
- iModel->DivertServiceGroup() );
- }
- }
-
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::Id
-//
-// implementation of the frameworks virtual function, closely related with view
-// architecture and has little or no relevance here
-// ---------------------------------------------------------------------------
-TUid CGSCallDivertView::Id() const
- {
- if( FeatureManager::FeatureSupported( KFeatureIdRestrictedCallDivert ) )
- {
- return KCallDivertPluginId;
- }
- else
- {
- return KCallDivertViewId;
- }
- }
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::HandleCommandL
-//
-// Handles the received commands
-// ---------------------------------------------------------------------------
-void CGSCallDivertView::HandleCommandL( TInt aCommand )
- {
- iVoiceMailboxDivert = EFalse;
- TBool sendRequest = EFalse;
- RMobilePhone::TMobilePhoneServiceAction info =
- RMobilePhone::EServiceActionRegister;
- TCallDivertSetting divertRequest;
-
- if ( aCommand != ECFCmdCancelAll && iContainer )
- {
- if( FeatureManager::FeatureSupported( KFeatureIdRestrictedCallDivert ) )
- {
- CGSRestrictedDivertContainer& container =
- *static_cast<CGSRestrictedDivertContainer*>( iContainer );
- iCurrentItem = container.CurrentFeatureId();
- }
- else
- {
- CGSCallDivertContainer& container =
- *static_cast<CGSCallDivertContainer*>( iContainer );
- iCurrentItem = container.CurrentFeatureId();
- }
- __GSLOGSTRING1("[CGSCallDivertView::HandleCommandL] iCurrentItem: %d", iCurrentItem);
-
- __ASSERT_ALWAYS( iCurrentItem != KErrNotFound, Panic( KGSDivertClassName,
- EInvalidCurrentItem ) );
- }
-
- switch ( aCommand )
- {
- case EGSCmdAppChange:
- iRockerPress = EFalse;
- if ( iContainer )
- {
- HandleListBoxEventL( iContainer->iListBox, EEventEnterKeyPressed );
- }
- break;
- case EAknSoftkeyBack:
- if( FeatureManager::FeatureSupported( KFeatureIdRestrictedCallDivert ) )
- {
- iAppUi->ActivateLocalViewL( KGSTelPluginUid );
- }
- else
- {
- iAppUi->ActivateLocalViewL( KCallDivertPluginId );
- }
- break;
- case EAknSoftkeyExit:
- AppUi()->HandleCommandL( EEikCmdExit );
- break;
- case ECFCmdActivate:
- divertRequest.iSetting = EActivateDiverting;
- info = RMobilePhone::EServiceActionRegister;
-
- // Activate depends on the selected call type (voice/data/fax)
- switch( iModel->DivertServiceGroup() )
- {
- case EGSSettIdVoiceDivert:
- // Handle voice divert. Fetch used numbers and show it in query.
- ExecuteDivertQueryL(
- divertRequest.iNumber,
- iTitles->MdcaPoint( iCurrentItem ),
- iVoiceMailboxDivert );
- sendRequest = ETrue;
- break;
- case EGSSettIdVideoDivert:
- if( iVideoMailboxSupported )
- {
- // Fetch used data divert number and show it in query.
- ExecuteDivertQueryL(
- divertRequest.iNumber,
- iTitles->MdcaPoint( iCurrentItem ),
- iVoiceMailboxDivert );
- sendRequest = ETrue;
- }
- else
- {
- DisplayDataCallDivertNumberQueryL( divertRequest.iNumber );
- sendRequest = ETrue;
- }
- break;
- default:
- User::Panic( KGSDivertClassName, KErrArgument );
- break;
- }
- break;
- case ECFCmdCancel:
- if( FeatureManager::FeatureSupported( KFeatureIdRestrictedCallDivert ) )
- {
- sendRequest = EFalse;
- iModel->CancelRestrictedCallDivertL();
- }
- else
- {
- sendRequest = ETrue;
- divertRequest.iSetting = ECancelDiverting;
- info = RMobilePhone::EServiceActionErase;
- }
- break;
- case ECFCmdCheckStatus:
- if( FeatureManager::FeatureSupported( KFeatureIdRestrictedCallDivert ) )
- {
- sendRequest = EFalse;
- iModel->CheckStatusRestrictedCallDivertL();
- }
- else
- {
- sendRequest = ETrue;
- divertRequest.iSetting = ECheckStatus;
- info = RMobilePhone::EServiceActionUnspecified;
- }
- break;
- case ECFCmdCancelAll:
- sendRequest = ETrue;
- divertRequest.iSetting = EEraseDiverting;
- info = RMobilePhone::EServiceActionErase;
- break;
- case EAknCmdHelp:
- {
- if( FeatureManager::FeatureSupported( KFeatureIdHelp ) )
- {
- HlpLauncher::LaunchHelpApplicationL(
- iEikonEnv->WsSession(), iAppUi->AppHelpContextL() );
- }
- break;
- }
- default:
- iAppUi->HandleCommandL( aCommand );
- break;
- }
-
- // If a request needs to be sent.
- if ( sendRequest )
- {
- // will not divert in case empty number
- iModel->SendCallDivertRequestL( divertRequest,
- info,
- iVoiceMailboxDivert,
- aCommand,
- (TGSCallDivertServices) iCurrentItem );
- }
- }
-
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::HandleListBoxSelectionL
-//
-// Handles List box selection
-// ---------------------------------------------------------------------------
-void CGSCallDivertView::HandleListBoxSelectionL()
- {
- iRockerPress = ETrue;
- CEikMenuBar* menuBar = MenuBar();
- if ( iRockerPress )
- {
- menuBar->SetMenuTitleResourceId( R_CF_MENUBAR_OPTIONS_VIEW );
- menuBar->SetMenuType( CEikMenuBar::EMenuContext );
- }
- else
- {
- menuBar->SetMenuTitleResourceId( R_CF_MENUBAR_DIV_VIEW );
- menuBar->SetMenuType( CEikMenuBar::EMenuOptions );
- }
-
- // Display menu bar.
- menuBar->TryDisplayMenuBarL();
-
- // Reset menu type to original default (EMenuOptions).
- menuBar->SetMenuType( CEikMenuBar::EMenuOptions );
-
- iRockerPress = EFalse;
- }
-
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::ExecuteDivertQueryL
-//
-// --> voice calls -> all voice calls -> activate -> this popup.
-// OR
-// --> video calls -> all video calls -> activate -> this popup.
-//
-// ---Example---
-// All [voice/]video calls:
-// To [voice/]video mailbox
-// [050512345678]
-// [543454545435]
-// [342343242343]
-// To other number
-// ---------------------------------------------------------------------------
-//
-void CGSCallDivertView::ExecuteDivertQueryL( TTelNumber& aTelNumber,
- const TPtrC& aTitle,
- TBool& aVmbxValidNumber )
- {
- __GSLOGSTRING("[CGSCallDivertView::ExecuteDivertQueryL]");
-
- CAknSinglePopupMenuStyleListBox* list =
- new ( ELeave ) CAknSinglePopupMenuStyleListBox;
- CleanupStack::PushL( list );
-
- CDesC16ArrayFlat* defNumbers =
- new ( ELeave ) CDesC16ArrayFlat( KCFDefaultNumbers );
- CleanupStack::PushL( defNumbers );
-
- CAknPopupList* divertPopup =
- CAknPopupList::NewL( list, R_AVKON_SOFTKEYS_OK_CANCEL__OK );
- CleanupStack::PushL( divertPopup );
-
- list->ConstructL( divertPopup,CEikListBox::ELeftDownInViewRect );
- list->CreateScrollBarFrameL( ETrue );
- list->ScrollBarFrame()->SetScrollBarVisibilityL(
- CEikScrollBarFrame::EOff,
- CEikScrollBarFrame::EAuto );
- divertPopup->SetTitleL( aTitle );
- if( iContextMenuItems )
- {
- delete iContextMenuItems;
- iContextMenuItems = NULL;
- }
- iContextMenuItems = new ( ELeave ) CDesCArrayFlat( KCFMaxNrOfTargets );
- if( iModel->DivertServiceGroup() == EGSSettIdVoiceDivert )
- {
- CreateVoiceDivertItemsL( *iContextMenuItems, *defNumbers );
- }
- else
- {
- CreateVideoDivertItemsL( *iContextMenuItems );
- }
- __GSLOGSTRING2( "[CGSCallDivertView::ExecuteDivertQueryL] ItemCount: %d, defNumCount: %d",
- iContextMenuItems->Count(),
- defNumbers->Count() );
- CTextListBoxModel* model = list->Model();
- model->SetItemTextArray( iContextMenuItems );
- model->SetOwnershipType( ELbmDoesNotOwnItemArray );
-
- // Executeld handles the events in the list
- TBool modified = divertPopup->ExecuteLD();
- __GSLOGSTRING1("[CGSCallDivertView::ExecuteDivertQueryL] modified: %d", modified);
- CleanupStack::Pop(); //voiceDivertPopup
-
- if ( modified )
- {
- if( iModel->DivertServiceGroup() == EGSSettIdVoiceDivert )
- {
- aTelNumber = HandleVoiceDivertSelectionL( *list,
- *defNumbers,
- aVmbxValidNumber );
- }
- else
- {
- aTelNumber = HandleVideoDivertSelectionL( *list );
- }
- }
- __GSLOGSTRING1( "[CGSCallDivertView::ExecuteVoiceDivertQueryL] aTelNumber: %S",
- &aTelNumber);
- CleanupStack::PopAndDestroy( 2 ); //defNumbers, list
- __GSLOGSTRING( "[CGSCallDivertView::ExecuteVoiceDivertQueryL] End." );
- }
-
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::HandleVoiceDivertSelectionL
-//
-// Handles user's choice in the Target list.
-// ---------------------------------------------------------------------------
-TTelNumber CGSCallDivertView::HandleVoiceDivertSelectionL(
- CAknSinglePopupMenuStyleListBox& aList,
- CDesC16ArrayFlat& aDefNumbers,
- TBool& aVmbxDivert )
- {
- __GSLOGSTRING("[CGSCallDivertView::HandleVoiceDivertSelectionL] Start...");
- TTelNumber telNumber;
- telNumber.Zero();
- TInt index = aList.CurrentItemIndex();
- __GSLOGSTRING1("[CGSCallDivertView::HandleVoiceDivertSelectionL] index: %d", index);
-
- if ( index == KCFDivertToMailBox )
- {
- if ( iModel->VoiceMailActivationL( telNumber ) == KErrNone )
- {
- if ( telNumber == KNullDesC )
- {
- ShowErrorNoteL();
- }
- aVmbxDivert = ETrue;
- }
- }
- //To other number - make a dataquery
- else if ( index == ( aList.Model()->NumberOfItems() - 1 ) )
- {
- ExecuteDivertNumberQueryL( telNumber, R_TEXT_PRMPT_NUMBER );
- __GSLOGSTRING1("[CGSCallDivertView::HandleVoiceDivertSelectionL] telNumber: %S", &telNumber);
-
- UpdateDefaultVoiceDivertNumbersL( telNumber );
- }
- //To pre-defined default number
- else
- {
- telNumber = aDefNumbers.MdcaPoint( index - 1 );
- iModel->DivertHandler()->SwapDefaultNumberL( index );
- }
- __GSLOGSTRING("[CGSCallDivertView::HandleVoiceDivertSelectionL] End.");
- return telNumber;
- }
-
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::HandleVideoDivertSelectionL
-//
-// Handles user's choice in the video Target list.
-// ---------------------------------------------------------------------------
-TTelNumber CGSCallDivertView::HandleVideoDivertSelectionL(
- CAknSinglePopupMenuStyleListBox& aList )
- {
- __GSLOGSTRING("[GSCallDivertView::HandleVideoDivertSelectionL] Start");
- TTelNumber telNumber( 0 );
- TInt index = aList.CurrentItemIndex();
- if ( index == KCFDivertToMailBox )
- {
- if ( iModel->VideoMailActivationL( telNumber ) == KErrNone )
- {
- if ( telNumber == KNullDesC )
- {
- ShowErrorNoteL();
- }
- }
- }
- else if( index == ( aList.Model()->NumberOfItems() - 1 ) )
- { // To other number - make a dataquery (Last item in list)
- DisplayDataCallDivertNumberQueryL( telNumber );
- __GSLOGSTRING1("[GSCallDivertView::HandleVideoDivertSelectionL] telNumber: %S", &telNumber );
- }
- __GSLOGSTRING("[GSCallDivertView::HandleVideoDivertSelectionL] Finished");
- return telNumber;
- }
-
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::DisplayDataCallDivertNumberQueryL
-//
-// Displays data call number query and sets call divert
-// ---------------------------------------------------------------------------
-void CGSCallDivertView::DisplayDataCallDivertNumberQueryL( TTelNumber& aTelNumber )
- {
- aTelNumber = *iModel->DivertHandler()->GetUsedDataNumberLC();
- ExecuteDivertNumberQueryL( aTelNumber, R_TEXT_PRMPT_DATA_NUMBER );
- if( aTelNumber != KNullDesC )
- {
- iModel->DivertHandler()->SetUsedDataNumberL( aTelNumber );
- }
- CleanupStack::PopAndDestroy(); // aTelNumber from GetUsedDataNumberLC()
- }
-
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::ExecuteDivertNumberQueryL
-//
-// Executes general number query dialog used by all diverts (voice/data/fax)
-// ---------------------------------------------------------------------------
-//
-void CGSCallDivertView::ExecuteDivertNumberQueryL( TDes& aValue, TInt aType )
- {
- TBool accepted = EFalse;
- while ( !accepted )
- {
- if ( aValue.Length() > KGSMaxDataLength )
- {
- //Chop the first extra digits and keep the last KGSMaxDataLength
- //digits intact. This is according to the spec.
- aValue.Delete( 0, aValue.Length() - KGSMaxDataLength );
- }
-
- __GSLOGSTRING1("[CGSCallDivertView] ExecuteDivertNumberQueryL: aValue: %S", &aValue);
-
- if( AknTextUtils::DigitModeQuery( AknTextUtils::EDigitModeEditorDefault ) )
- {
- AknTextUtils::DisplayTextLanguageSpecificNumberConversion( aValue );
- }
- CGSCallDivertQuery* query = CGSCallDivertQuery::NewL( aValue,
- CAknQueryDialog::ENoTone,
- R_AVKON_SOFTKEYS_OK_CANCEL__OK, R_CF_SOFTKEYS_SEARCH_CANCEL );
- CleanupStack::PushL( query );
- SetPromptToQueryL( *query, aType );
- TInt queryAction = query->ExecuteLD( R_DATA_QUERY );
- CleanupStack::Pop( query );
- AknTextUtils::ConvertDigitsTo( aValue, EDigitTypeWestern );
- switch ( queryAction )
- {
- case EAknSoftkeySearch:
- if( iStoresOpened )
- {
- // Reset the number selection because 'search' is selected.
- aValue.Zero();
- StartAsyncPhoneNumberFetchL();
- accepted = ETrue;// Change to asynchronous mode
- }
- break;
- case EAknSoftkeyOk:
- accepted = ETrue;
- if ( ValidatePhoneNumberL( aValue ) > KCFValidPhoneNumber ||
- aValue.Length() == 0 )
- {
- accepted = EFalse;
- }
- if ( iNumberFetchedAsynchronously )
- {
- switch( iModel->DivertServiceGroup() )
- {
- case EGSSettIdVoiceDivert:
- UpdateDefaultVoiceDivertNumbersL( aValue );
- break;
- case EGSSettIdVideoDivert:
- {
- TTelNumber dataNumber( aValue );// Convert to TTelNumber
- iModel->DivertHandler()->SetUsedDataNumberL( dataNumber );
- break;
- }
- default:
- break;
- }
- iNumberFetchedAsynchronously = EFalse;
- }
- break;
- case EAknSoftkeyBack:
- case EAknSoftkeyCancel:
- default:
- accepted = ETrue;
- aValue.Zero();
- break;
- }
- }
- }
-
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::StartAsyncPhoneNumberFetchL
-//
-// Fetches values from phonebook ASYNCHRONOUSLY (pbk2 requirement).
-// ---------------------------------------------------------------------------
-//
-void CGSCallDivertView::StartAsyncPhoneNumberFetchL()
- {
- TUint fetchFlags = 0;
-
- // Construct empty filter
- CVPbkFieldTypeSelector* contactViewFilter =
- CVPbkFieldTypeSelector::NewL(iContactManager->FieldTypes());
- CleanupStack::PushL(contactViewFilter);
-
- // Append the filter object with suitable criteria (only contacts with
- // phone number shown)
- VPbkContactViewFilterBuilder::BuildContactViewFilterL(*contactViewFilter,
- EVPbkContactViewFilterPhoneNumber, *iContactManager);
- RVPbkContactFieldDefaultPriorities array;
- CleanupClosePushL(array);
-
- TAiwSingleItemSelectionDataV3 data = TAiwSingleItemSelectionDataV3();
- // Details selection shows only phone numbers
- data.SetAddressSelectType(EAiwPhoneNumberSelect);
- data.SetDefaultPriorities(array);
- // Contact list shows only contacts that have phone number(s)
- data.SetFetchFilter(contactViewFilter);
- data.SetFlags(fetchFlags);
-
- CAiwGenericParamList& inParamList = iServiceHandler->InParamListL();
- TAiwGenericParam param(EGenericParamContactSelectionData,
- TAiwVariant(TAiwSingleItemSelectionDataV3Pckg(data)));
- inParamList.AppendL(param);
-
- iServiceHandler->ExecuteServiceCmdL(
- KAiwCmdSelect,
- inParamList,
- iServiceHandler->OutParamListL(),
- 0,
- this);
-
- CleanupStack::PopAndDestroy(); // array
- CleanupStack::PopAndDestroy( contactViewFilter );
- }
-
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::ValidatePhoneNumberL
-//
-// Puts a single resource string into a list.
-// ---------------------------------------------------------------------------
-TInt CGSCallDivertView::ValidatePhoneNumberL( const TDesC& aDivertTo )
- {
- TInt enteredNumber = KErrNone;
- TInt noOfInvalidChars = KCFInvalidChars().Length();
-
- // Plus is a special case, as it is accepted as first character.
- // FindPlus returns KCFErrIllegalNumber(1) if the number is not
- // acceptable.
- enteredNumber += FindPlus( aDivertTo );
- for ( TInt index = 0; index < noOfInvalidChars; index++ )
- {
- enteredNumber += aDivertTo.Find(
- KCFInvalidChars().Mid( index, 1 ) );
- }
- // Find returns KErrNotFound(-1), if character(s) is not found.
- // Therefore, after four searches for special characters in the
- // number, all results that have greater than -5 as result are not
- // acceptable.
- if ( enteredNumber > KCFValidPhoneNumber )
- {
- ShowErrorNoteL();
- __GSLOGSTRING( "[CGSCallDivertView::ValidatePhoneNumberL] Invalid phone number. " );
- }
- return enteredNumber;
- }
-
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::AppendDelayItemL
-//
-// Appends items to delay time list.
-// ---------------------------------------------------------------------------
-void CGSCallDivertView::AppendDelayItemL( CDesCArrayFlat& aArrayToAppend,
- TInt aIndex )
- {
- //Delay times are defined as 5,10,15,20,25,30.
- //Append each of these to a list.
- TInt delaySeconds = KCFDelayStep * ( aIndex + 1);
- HBufC* string = StringLoader::LoadLC( R_TEXT_SLIST_SECONDS, delaySeconds );
-
- TPtr bufPtr = string->Des();
- if( AknTextUtils::DigitModeQuery( AknTextUtils::EDigitModeShownToUser ) )
- {
- AknTextUtils::LanguageSpecificNumberConversion( bufPtr );
- }
- aArrayToAppend.AppendL( *string );
- CleanupStack::PopAndDestroy( string );
- }
-
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::CreateVoiceDivertItemsL
-//
-// Creates items for the targert list.
-// ---------------------------------------------------------------------------
-void CGSCallDivertView::CreateVoiceDivertItemsL(
- CDesCArray& aItems,
- CDesC16ArrayFlat& aDefaultNumbers )
- {
- HBufC* item = StringLoader::LoadLC( R_TEXT_DIVERT_TO_VOICE_MAIL );
- aItems.AppendL( *item );
- CleanupStack::PopAndDestroy( item );
- ReadDefaultVoiceDivertNumbersL( aItems, aDefaultNumbers );
- HBufC* string = StringLoader::LoadLC( R_TEXT_DIVERT_TO_NUMBER );
- aItems.AppendL( *string );
- CleanupStack::PopAndDestroy( string );
- }
-
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::CreateVideoDivertItemsL
-//
-// Creates items for the data target list.
-// ---------------------------------------------------------------------------
-void CGSCallDivertView::CreateVideoDivertItemsL( CDesCArray& aItems )
- {
- HBufC* item = StringLoader::LoadLC( R_QTN_SS_DIVERT_TO_VIDEO_MAILBOX );
- aItems.AppendL( *item );
- CleanupStack::PopAndDestroy( item );
- HBufC* string = StringLoader::LoadLC( R_QTN_SS_DIVERT_VCALL_TO_OTHER_NUMBER );
- aItems.AppendL( *string );
- CleanupStack::PopAndDestroy( string );
- }
-
-
-// ---------------------------------------------------------------------------
-//
-// Seeks '+' from given number. If '+' is first character, it is ignored.
-//
-// ---------------------------------------------------------------------------
-TInt CGSCallDivertView::FindPlus( const TDesC& aDivertTo )
- {
- TInt seekPlus = aDivertTo.Find( KCFPlusSign );
- if ( seekPlus == KErrNotFound )
- {
- //no '+' in the number
- return KErrNone;
- }
- //first char '+', but there can additional '+'s
- if ( seekPlus == 0 )
- {
- //ignore first '+'
- TPtrC concat = aDivertTo.Right( aDivertTo.Length() - 1 );
- seekPlus = concat.Find( KCFPlusSign );
- if ( seekPlus != KErrNotFound )
- {
- return KCFErrIllegalNumber; //two '+'s in number
- }
- return KErrNone;
- }
- //'+' in number, but not first char
- else
- {
- return KCFErrIllegalNumber;
- }
- }
-
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::SetPromptToQueryL
-// Sets prompt to a query.
-//
-// ---------------------------------------------------------------------------
-void CGSCallDivertView::SetPromptToQueryL( CGSCallDivertQuery& aQuery,
- const TInt& aType )
- {
- HBufC* title = StringLoader::LoadLC( aType );
- aQuery.SetPromptL( *title );
- CleanupStack::PopAndDestroy( title );
- }
-
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::CreateDelayTimeItemsL
-// Creates items for delay time list.
-//
-// ---------------------------------------------------------------------------
-//
-void CGSCallDivertView::CreateDelayTimeItemsL( CDesCArrayFlat& aItems)
- {
- for ( TInt index = 0; index < KGSNrOfDelays; index++ )
- {
- AppendDelayItemL( aItems, index );
- }
- }
-
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::CreateRestrictedCallDivertDelayTimeItemsL
-// Creates items for Delay time list for restricted call divert.
-//
-// ---------------------------------------------------------------------------
-//
-void CGSCallDivertView::CreateRestrictedCallDivertDelayTimeItemsL(
- CDesCArrayFlat& aItems )
- {
- // first item is 0 seconds
- AppendDelayItemL( aItems, -1);
- for ( TInt index = 0; index < KGSNrOfDelays; index++ )
- {
- AppendDelayItemL( aItems, index );
- }
- AppendDelayItemL( aItems, ( 60 / KCFDelayStep ) - 1);
- AppendDelayItemL( aItems, ( 90 / KCFDelayStep ) - 1);
- AppendDelayItemL( aItems, ( 120 / KCFDelayStep ) - 1);
- }
-
-// -----------------------------------------------------------------------------
-// CGSCallDivertView::ProcessCommandL
-// -----------------------------------------------------------------------------
-void CGSCallDivertView::ProcessCommandL( TInt aCommand )
- {
- MenuBar()->SetContextMenuTitleResourceId( R_CALL_DIVERT_MSK_CONTEXTMENUBAR );
- // Call base class
- CAknView::ProcessCommandL( aCommand );
- }
-
-
-// ---------------------------------------------------------------------------
-//
-// Before showing a options menu, delete options key specific settings if
-// rocker key has been pressed.
-// ---------------------------------------------------------------------------
-//
-void CGSCallDivertView::DynInitMenuPaneL( TInt aResourceId,
- CEikMenuPane* aMenuPane )
- {
- TInt currentItem;
- CEikMenuBar* menuBar = MenuBar();
- if( FeatureManager::FeatureSupported( KFeatureIdRestrictedCallDivert ) )
- {
- CGSRestrictedDivertContainer &container =
- *static_cast<CGSRestrictedDivertContainer*>( iContainer );
- currentItem = container.CurrentFeatureId();
- }
- else
- {
- CGSCallDivertContainer& container =
- *static_cast<CGSCallDivertContainer*>( iContainer );
- currentItem = container.CurrentFeatureId();
- }
-
- if ( aResourceId == R_CF_DIV_VIEW_MENU )
- {
- if (!menuBar->ItemSpecificCommandsEnabled() && menuBar->GetMenuType() == CEikMenuBar::EMenuOptions)
- {
- aMenuPane->SetItemDimmed( ECFCmdActivate, ETrue );
- aMenuPane->SetItemDimmed( ECFCmdCancel, ETrue );
- aMenuPane->SetItemDimmed( ECFCmdCheckStatus, ETrue );
- }
- //remove help, if not supported from the main divert view
- //in this step, help is added to context menu too, which
- //is deleted in the next conditional stmt
- if ( FeatureManager::FeatureSupported ( KFeatureIdHelp ) )
- {
- aMenuPane->SetItemDimmed( EAknCmdHelp, EFalse );
- }
- else
- {
- aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue );
- }
-
- if ( iRockerPress )
- {
- //remove Exit & Help from the menu
- aMenuPane->SetItemDimmed( EAknCmdExit, ETrue );
- aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue );
- }
- else
- {
- iRockerPress = EFalse;
- }
- }
-
- if ( aResourceId == R_CF_MSK_DIV_VIEW_MENU ||
- aResourceId == R_CF_DIV_VIEW_MENU )
- {
- // when not available does not have check status
- if ( currentItem == ECFDivertWhenNotAvailable )
- {
- aMenuPane->SetItemDimmed( ECFCmdCheckStatus, ETrue );
- }
- }
- }
-
-// ---------------------------------------------------------
-// CGSCallDivertView::ShowErrorNote
-//
-// ---------------------------------------------------------
-void CGSCallDivertView::ShowErrorNoteL()
- {
- HBufC* string = StringLoader::LoadLC( R_INVALID_NUMBER );
- CAknErrorNote* note = new ( ELeave ) CAknErrorNote ( ETrue );
- note->ExecuteLD( *string );
- CleanupStack::PopAndDestroy( string );
- }
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::ReadDefaultVoiceDivertNumbersL
-//
-// Creates defcault items for the target list.
-// ---------------------------------------------------------------------------
-void CGSCallDivertView::ReadDefaultVoiceDivertNumbersL(
- CDesCArray& aItems,
- CDesC16ArrayFlat& aDefaultNumbers )
- {
- TInt amount = KErrNone;
-
- // this is for fetching name to a number from phonebook
- HBufC* defaultName = NULL;
-
- //Default numbers are fetched from shared data
- amount = iModel->DivertHandler()->GetDefaultNumbersL( aDefaultNumbers );
- __ASSERT_ALWAYS( amount == aDefaultNumbers.MdcaCount(),
- Panic( KGSDivertClassName, ECFDefaultNumberCountError ) );
-
- for ( TInt i = 0; i < amount; i++ )
- {
- //Default numbers should be checked, if there is a contact name associated
- // with it.
- defaultName = NULL;
- defaultName = iModel->MatchNumberToContactLC( aDefaultNumbers.MdcaPoint( i ) );
- __GSLOGSTRING1("[CGSCallDivertView] ReadDefaultVoiceDivertNumbersL: defaultName: %S", &defaultName);
- if ( defaultName )
- {
- aItems.AppendL( *defaultName );
- }
- else
- {
- TTelNumber string;
- if ( iModel->NumberGroupingSupportedL() )
- {
- CPNGNumberGrouping* numberGrouping = CPNGNumberGrouping::NewL(
- KPSUIMaxPSUIItemLength );
- CleanupStack::PushL( numberGrouping );
-
- if ( aDefaultNumbers.MdcaPoint( i ).Length() <=
- numberGrouping->MaxDisplayLength() )
- {
- numberGrouping->Set( aDefaultNumbers.MdcaPoint( i ) );
- string = numberGrouping->FormattedNumber();
- }
- CleanupStack::PopAndDestroy( numberGrouping );
- }
- if ( !string.Length() )
- {
- string = aDefaultNumbers.MdcaPoint(i);
- }
- AknTextUtils::DisplayTextLanguageSpecificNumberConversion( string );
- aItems.AppendL( string );
- __GSLOGSTRING1("[CGSCallDivertView] ReadDefaultVoiceDivertNumbersL: string: %S", &string);
- }
- CleanupStack::PopAndDestroy(); //defaultName
- }
- }
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::UpdateDefaultVoiceDivertNumbersL
-//
-// Updates most recently used numbers to cenrep
-// ---------------------------------------------------------------------------
-void CGSCallDivertView::UpdateDefaultVoiceDivertNumbersL( TDes& aNumber )
-
- {
- if ( aNumber != KNullDesC && iContextMenuItems )
- {
- //If activation is done to already existing default number,
- //but using the "Other number" selection, this must be verified.
- HBufC* contactName = iModel->MatchNumberToContactLC( aNumber );
-
- TInt found = KErrNone;
- TInt loc = KErrNotFound;
-
- if ( contactName )
- {
- found = iContextMenuItems->Find( *contactName, loc );
- }
- else
- {
- found = iContextMenuItems->Find( aNumber, loc );
- }
- CleanupStack::PopAndDestroy(); //contactName
-
- if ( found > 0 ) //number is not part of current def.numbers
- {
- iModel->DivertHandler()->SetNewDefaultNumberL( aNumber );
- }
- else
- {
- iModel->DivertHandler()->SwapDefaultNumberL( loc );
- }
- }
- else
- {
- __GSLOGSTRING( "[CGSCallDivertView::UpdateDefaultVoiceDivertNumbersL] iContextMenuItems == NULL!!" );
- }
-
- }
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::HandleNotifyL
-//
-// AIW callback function.
-// ---------------------------------------------------------------------------
-TInt CGSCallDivertView::HandleNotifyL(
- TInt aCmdId,
- TInt aEventId,
- CAiwGenericParamList& aEventParamList,
- const CAiwGenericParamList& /*aInParamList*/ )
- {
- TInt err = KErrNone;
- if( ( aCmdId == KAiwCmdSelect ) || ( aCmdId == KAiwCmdAssign ) )
- {
- if( aEventId == KAiwEventCompleted )
- {
- TInt index = 0;
- iNumberFetchedAsynchronously = ETrue;
- const TAiwGenericParam* param = aEventParamList.FindFirst(
- index, EGenericParamContactLinkArray );
-
- if( param && iStoresOpened )
- {
- if( iContactLinks )
- {
- delete iContactLinks;
- iContactLinks = NULL;
- }
- TPtrC8 contactLinks = param->Value().AsData();
-
- CVPbkContactLinkArray* localContactLinks =
- CVPbkContactLinkArray::NewLC(
- contactLinks,
- iContactManager->ContactStoresL() );
-
- CleanupStack::Pop( localContactLinks );
- iContactLinks = localContactLinks;
-
- if( iContactLinks->Count() > 0 )
- {
- iRetrieveOperation = iContactManager->RetrieveContactL( iContactLinks->At( 0 ), *this );
- }
- }
- }
- else if (aEventId == KAiwEventCanceled)
- {
- // Do nothing.
- }
- else if (aEventId == KAiwEventOutParamCheck)
- {
- // This is needed as PBK2 mysteriously crashes if check is not
- // acccepted. There's no actual need to check anything but to go
- // ahead here so setting to ETrue.
- err = ETrue;
- }
- else if (aEventId == KAiwEventQueryExit)
- {
- err = ETrue;
- }
- }
- return err;
- }
-
-
-// --------------------------------------------------------------------------
-// CGSCallDivertView::VPbkSingleContactOperationComplete
-// --------------------------------------------------------------------------
-//
-void CGSCallDivertView::VPbkSingleContactOperationComplete(
- MVPbkContactOperationBase& /*aOperation*/,
- MVPbkStoreContact* aContact )
- {
- if( iRetrieveOperation )
- {
- delete iRetrieveOperation;
- iRetrieveOperation = NULL;
- }
- TRAP_IGNORE
- (
- MVPbkStoreContactField* field = aContact->Fields().RetrieveField( iContactLinks->At( 0 ) );
- if ( field && field->FieldData().DataType() == EVPbkFieldStorageTypeText )
- {
- // aContact has selected phone number from Pbk2 dialog. Set this as
- // a text for ExecuteDivertNumberQueryL.
- TCallDivertSetting setting;
- setting.iSetting = EActivateDiverting;
- setting.iNumber = MVPbkContactFieldTextData::Cast( field->FieldData() ).Text();
-
- //Ask for user input.
- ExecuteDivertNumberQueryL( setting.iNumber, R_TEXT_PRMPT_NUMBER );
-
- // ExecuteDivertNumberQueryL() will set setting.iNumber to KNullDesC if user
- // selected 'search'. In this case program execution is moved to
- // pbk2 asynchronous dialog and this function can exit without
- // sending call divert request.
- if( setting.iNumber != KNullDesC )
- {
- // Send divert request.
- iModel->SendCallDivertRequestL( setting,
- RMobilePhone::EServiceActionRegister,
- iVoiceMailboxDivert,
- ECFCmdActivate,
- (TGSCallDivertServices) iCurrentItem );
- }
- }
- );
- delete aContact;// Ownership is taken by this
- }
-
-
-// --------------------------------------------------------------------------
-// CGSCallDivertView::VPbkSingleContactOperationFailed
-// --------------------------------------------------------------------------
-//
-void CGSCallDivertView::VPbkSingleContactOperationFailed(
- MVPbkContactOperationBase& /*aOperation*/,
- TInt /*aError*/)
- {
- if( iRetrieveOperation )
- {
- delete iRetrieveOperation;
- iRetrieveOperation = NULL;
- }
-
- }
-
-// --------------------------------------------------------------------------
-// CGSCallDivertView::OpenComplete
-// --------------------------------------------------------------------------
-//
-void CGSCallDivertView::OpenComplete()
- {
- iStoresOpened = ETrue;
- }
-
-// --------------------------------------------------------------------------
-// CGSCallDivertView::StoreReady
-// --------------------------------------------------------------------------
-//
-void CGSCallDivertView::StoreReady( MVPbkContactStore& /*aContactStore*/ )
- {
- // Do nothing
- }
-
-// --------------------------------------------------------------------------
-// CGSCallDivertView::StoreUnavailable
-// --------------------------------------------------------------------------
-//
-void CGSCallDivertView::StoreUnavailable
- ( MVPbkContactStore& /*aContactStore*/, TInt /*aReason*/ )
- {
- // Do nothing
- }
-
-// --------------------------------------------------------------------------
-// CGSCallDivertView::HandleStoreEventL
-// --------------------------------------------------------------------------
-//
-void CGSCallDivertView::HandleStoreEventL( MVPbkContactStore& /*aContactStore*/,
- TVPbkContactStoreEvent /*aStoreEvent*/ )
- {
- // Do nothing
- }
-
-
-
-// ---------------------------------------------------------------------------
-// CGSCallDivertView::CreateTimeListL
-//
-// Activates this view's popup list in order to change time-setting.
-// ---------------------------------------------------------------------------
-TInt CGSCallDivertView::CreateTimeListL()
- {
- CAknSinglePopupMenuStyleListBox* list =
- new ( ELeave ) CAknSinglePopupMenuStyleListBox;
- CleanupStack::PushL( list );
-
- CAknPopupList* popupList =
- CAknPopupList::NewL( list, R_AVKON_SOFTKEYS_OK_CANCEL__OK );
- CleanupStack::PushL( popupList );
-
- HBufC* title = StringLoader::LoadLC( R_TEXT_DELAY_HEADER );
- popupList->SetTitleL( *title );
- CleanupStack::PopAndDestroy( title );
-
- list->ConstructL( popupList,CEikListBox::ELeftDownInViewRect );
- list->CreateScrollBarFrameL( ETrue );
- list->ScrollBarFrame()->SetScrollBarVisibilityL(
- CEikScrollBarFrame::EOff,
- CEikScrollBarFrame::EAuto );
-
- CDesCArrayFlat* items;
- if( FeatureManager::FeatureSupported( KFeatureIdRestrictedCallDivert ) )
- {
- items = new ( ELeave ) CDesCArrayFlat( KGSNrOfDelays + 4 );
- CleanupStack::PushL( items );
- CreateRestrictedCallDivertDelayTimeItemsL( *items );
- }
- else
- {
- items = new ( ELeave ) CDesCArrayFlat( KGSNrOfDelays );
- CleanupStack::PushL( items );
- CreateDelayTimeItemsL( *items );
- }
- CTextListBoxModel* model = list->Model();
- model->SetItemTextArray( items );
- model->SetOwnershipType( ELbmOwnsItemArray );
- CleanupStack::Pop(); //items
- list->HandleItemAdditionL();
-
- //set focus according to file read by phonesettings
- //set delay timer field value
- TInt currIndex = KErrNone;
- if( FeatureManager::FeatureSupported( KFeatureIdRestrictedCallDivert ) )
- {
- TInt itemCount = items->Count();
- if (( iModel->DivertHandler()->GetTimerValueL() / KCFDelayStep ) > ( itemCount - 4))
- {
- // Within 60, 90, 120 range
- switch ( iModel->DivertHandler()->GetTimerValueL() )
- {
- case 60:
- currIndex = itemCount - 3;
- break;
- case 90:
- currIndex = itemCount - 2;
- break;
- case 120:
- currIndex = itemCount - 1;
- break;
- }
- }
- else
- {
- currIndex = iModel->DivertHandler()->GetTimerValueL() / KCFDelayStep;
- }
- }
- else
- {
- currIndex = ( iModel->DivertHandler()->GetTimerValueL() / KCFDelayStep ) - 1;
- }
- __GSLOGSTRING1( "[CGSCallDivertView::CreateTimeListL] currIndex: %d", currIndex );
-
- list->SetCurrentItemIndex( currIndex );
- //if possible show topmost item
- list->SetTopItemIndex(0);
-
- TInt keyPress = popupList->ExecuteLD();
- CleanupStack::Pop( popupList );
- if ( keyPress )
- {
- TInt index = list->CurrentItemIndex();
- __GSLOGSTRING1( "[CGSCallDivertView::CreateTimeListL] index: %d", index );
-
- if( FeatureManager::FeatureSupported( KFeatureIdRestrictedCallDivert ) )
- {
- TInt itemCount = items->Count();
- if ( index > ( itemCount - 4))
- {
- // Within 60, 90, 120 range
- if ( index == itemCount - 3)
- {
- iModel->DivertHandler()->SetTimerValueL( 60 );
- }
- else if ( index == itemCount - 2 )
- {
- iModel->DivertHandler()->SetTimerValueL( 90 );
- }
- else if ( index == itemCount - 1 )
- {
- iModel->DivertHandler()->SetTimerValueL( 120 );
- }
- }
- else
- {
- // first entry is 0 seconds
- currIndex = iModel->DivertHandler()->SetTimerValueL( index * KCFDelayStep );
- }
- }
- else
- {
- //save to file the correct value calculated from index
- iModel->DivertHandler()->SetTimerValueL( ( index + 1 ) * KCFDelayStep );
- }
- }
- CleanupStack::PopAndDestroy( list );
- return keyPress;
- }
-
-
-// End of File