diff -r 000000000000 -r e686773b3f54 phonebookui/Speeddial/src/SpdiaView.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Speeddial/src/SpdiaView.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,1021 @@ +/* +* Copyright (c) 2002-2005 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: Declares view for application. +* +*/ + + + + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include + +#include +#include +#include //KAiwCmdCall +#include +#include +#include +#include "speeddial.hrh" +#include "SpdiaControl.hrh" +#include "speeddialprivate.h" + +#include "SpdiaView.h" +#include "SpdiaContainer.h" +#include "SpdiaAppUi.h" +#include +#include +#include +#include +#include +#include + +#include +#include +#include "Spdctrl.rsg" + + +#include +#include +#include +#include +#include + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CSpdiaView::NewLC +// +// --------------------------------------------------------- +CSpdiaView* CSpdiaView::NewLC(CSpeedDialPrivate* aSpeedPrivate) + { + CSpdiaView* self = new( ELeave ) CSpdiaView; + CleanupStack::PushL( self ); + self->ConstructL(aSpeedPrivate); + return self; + } + +// --------------------------------------------------------- +// CSpdiaView::ConstructL +// Symbian two-phased constructor +// --------------------------------------------------------- +void CSpdiaView::ConstructL(CSpeedDialPrivate* aSpeedPrivate) + { + BaseConstructL( R_SPDIA_VIEW ); + CSpdiaBaseView::ConstructL(); + + iSpeedPrivate = aSpeedPrivate; + + iCbaID = R_SPDIA_MENUBAR_VIEW_VOICE; + + // Attach the AIW CallUI menus with to speeddial menus. + // This is used for CallUI menus that we want attach + // into our owm menus. + + iServiceHandler = CAiwServiceHandler::NewL(); + iServiceHandler->AttachMenuL( R_SPDIA_VIEW_MENU, R_SPDIAL_APP_INTEREST ); + iServiceHandler->AttachMenuL( R_SPDIA_VIEW_MENU_OK_CALL, R_SPDIAL_APP_INTEREST ); + iServiceHandler->AttachMenuL( R_SPDIA_VIEW_MENU_OK_CALL_VIDEO, R_SPDIAL_APP_INTEREST ); + + // Attach the AIW CallUI query menus to speeddial . + // This is used for CallUI list query menu (i.e menu that + // is not attached to any of speeddial own menus). + + iServiceHandler->AttachL( R_SPDIAL_APP_INTEREST ); + iReleasenumberFlag = EFalse; + iClientRectChanged = EFalse; + //CEikonEnv::Static()->AppUiFactory()->StatusPane()->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_EMPTY ); + + iSendUi = CSendUi::NewL(); + iAIWRunFlag = EFalse; + iAssignCompletedFlag = ETrue; + iIsShowVmbxDlg = EFalse; + } + +// --------------------------------------------------------- +// CSpdiaView::~CSpdiaView +// ?implementation_description +// --------------------------------------------------------- +CSpdiaView::~CSpdiaView() + { + delete iContainer; + delete iServiceHandler; + delete iSendUi; + } + +// --------------------------------------------------------- +// CSpdiaView::LoadCbaL +// Loads relevant CBA key +// --------------------------------------------------------- +// +void CSpdiaView::LoadCba(TInt aResourceID) + { + if ( iCbaID != aResourceID ) + { + MenuBar()->SetMenuTitleResourceId( aResourceID ); + iCbaID = aResourceID; + } + } + +// --------------------------------------------------------- +// CSpdiaView::Id +// --------------------------------------------------------- +TUid CSpdiaView::Id() const + { + return KViewId; + } + +// --------------------------------------------------------------------------- +// CSpdiaView::NumberCallL +// Call Phone client +// Function used when send key is pressed. +// --------------------------------------------------------------------------- +void CSpdiaView::NumberCallL( const TDesC& aNumber, + TInt& aNumberType, TBool aVmbx ) + { + // Set type to EAIWForcedCS if calltype is Vmbx. + CAiwDialData::TCallType callType + = aVmbx ? CAiwDialData::EAIWForcedCS : CAiwDialData::EAIWVoice; + + + switch( aNumberType ) + { + case ESpDialPbkFieldIdPhoneNumberVideo: + callType = CAiwDialData::EAIWForcedVideo; + break; + + case ESpDialPbkFieldIdVOIP: + if ( FeatureManager::FeatureSupported(KFeatureIdCommonVoip) ) + { + callType = CAiwDialData::EAIWVoiP; + } + break; + default: + break; + + } + CmdNumberCallL( KAiwCmdCall, ETrue, aNumber, callType ); + + +#ifdef COMMENTED //Start of Comment -Existing Code + + if ( aNumberType == ESpDialPbkFieldIdPhoneNumberVideo ) // change + { + callType = EAiwForcedVideo; + CmdNumberCallL( KAiwCmdCall, ETrue, aNumber, callType ); + } + // If field Id is ESpDialPbkFieldIdVOIP, set call type to VoIP. + else if ( aNumberType == ESpDialPbkFieldIdVOIP ) + && FeatureManager::FeatureSupported(KFeatureIdCommonVoip)) + { + callType = EAiwVoIPCall; + CmdNumberCallL(KAiwCmdCall, ETrue, aNumber, callType ); + } + else + { + CmdNumberCallL( KAiwCmdCall, ETrue, aNumber, callType ); + } + #endif //End of Comment - Existing code + } + +// --------------------------------------------------------- +// CSpdiaView::HandleCommandL +// ?implementation_description +// --------------------------------------------------------- +void CSpdiaView::HandleCommandL(TInt aCommand) + { + if(iSpeedPrivate->GetWait()->IsStarted()) + return; + + if ( !iAssignCompletedFlag ) + { + return; + } + + switch ( aCommand ) + { + case ESpdiaCmdNumberCall: + { + CmdNumberCallL(KAiwCmdCall, ETrue ); //KAiwCmdCall: CallUI shows list query if necessary + break; + } + case EAknSoftkeyExit: + { + AppUi()->Exit(); + break; + } + case EAknCmdExit: + { + AppUi()->ProcessCommandL( EAknCmdExit ); + break; + } + case ESpdiaCmdChange: + case ESpdiaCmdAssign: + { + CmdAssignNumberL(); + break; + } + case ESpdiaCmdClear: + { + CmdReleaseNumberL(); + break; + } + case ESpdiaCmdView: + { + CmdViewNumberL(); + break; + } + + case ESpdiaCmdMessage: + { + CmdSendMessageL(); + break; + } + + //for help + case EAknCmdHelp: + { + AppUi()->HandleCommandL(aCommand); + break; + } + case EAknCmdTaskSwapper: + { + //do nothing + break; + } + default: + { + CmdNumberCallL( aCommand, EFalse ); + break; + } + } + } + +// --------------------------------------------------------- +// CSpdiaView::HandleClientRectChange +// +// --------------------------------------------------------- +void CSpdiaView::HandleClientRectChange() + { + if ( iContainer && !iClientRectChanged ) + { + iClientRectChanged = ETrue; + iContainer->SetRect( ClientRect() ); + iClientRectChanged = EFalse; + } + } + +// --------------------------------------------------------- +// CSpdiaView::HandleStatusPaneSizeChange +// +// --------------------------------------------------------- +void CSpdiaView::HandleStatusPaneSizeChange() + { + HandleClientRectChange(); + } + +// --------------------------------------------------------- +// CSpdiaView::CmdAssignNumberL +// Command handle : Assign +// --------------------------------------------------------- +TBool CSpdiaView::CmdAssignNumberL() + { + if ( ( iContainer->IsVoiceMailBox() ) || ( iContainer->IsVdoMailBox() ) ) + { + return EFalse; + } + // Return EFalse if speeddial does not finish assigning. + if ( CSpeedDialPrivate::STATE_IDLE != iSpeedPrivate->State() ) + { + return EFalse; + } + TInt error( KErrNone ); + TInt result( KErrNone ); + CSpeedDialPrivate& control = iContainer->Control(); + + // A display state will be restored supposing it is an error. + TInt index( iContainer->CurGridPosition() ); + result = control.CheckingIfPopUpNeededL(); + control.MakeVisible( EFalse ); + + if ( result ) + { + result = PopUpEnableSpDiaDlgL(); + if ( result != ESpdCmdEnableYes && + result != ESpdCmdEnableNo && + result != EEikBidOk ) + { + return EFalse; + } + } + + MVPbkContactLink *assignContact = NULL; + + // set the update flag + iAssignNumberFlag = EFalse; + index = index + 1; + + // launches the ContactFetchView of the Phonebook + iAssignCompletedFlag = EFalse; + result = control.ShowAssign( index, assignContact ); + iAssignCompletedFlag = ETrue; + index = index - 1; + delete assignContact; + + if ( result == KErrNone ) + { + // If contact is selected sucessfully + iAssignNumberFlag = EFalse; + } + else + { + // If ConatactFetchView is canceled + iAssignNumberFlag = ETrue; + } + + control.MakeVisible( ETrue ); + UndoLayoutAndLeaveL( error ); + // Control pane is not updated quickly after canceling "Change" from options menu + iContainer->MiddleSoftKeyL(); + + TRect mainPaneRect ; + TRect statusPaneRect; + TPoint oldPosition; + oldPosition.iX = 0; + oldPosition.iY = 0; + + // Set the layout after assingning the contact + iContainer->SetStatusPaneL(); + + // Update the whole grid + TRAP( error, iContainer->UpdatePhoneNumberL( -1 ) ); + + UndoLayoutAndLeaveL( error ); + + // After assigning the contact,set the state as STATE_IDLE + iSpeedPrivate->SetState( CSpeedDialPrivate::STATE_IDLE ); + + // Handle Msk + iContainer->MiddleSoftKeyL(); + + // To exit from FSW + if ( result == KLeaveExit ) + { + AppUi()->Exit(); + } + + // return ETrue if assignment operation success, else return EFalse. + if ( KErrNone == result ) + { + return ETrue; + } + return EFalse; + } + +// --------------------------------------------------------- +// CSpdiaView::DoActivateL +// ?implementation_description +// --------------------------------------------------------- +void CSpdiaView::DoActivateL( + const TVwsViewId& /*aPrevViewId*/, + TUid /*aCustomMessageId*/, + const TDesC8& /*aCustomMessage*/) + { + if ( !iContainer ) + { + iContainer = new(ELeave) CSpdiaContainer( iSpeedPrivate ); + iContainer->SetMopParent( this ); + iContainer->ConstructL( this ); + } + else + { + iContainer->ActivateL(); + } + AppUi()->AddToStackL( *this, iContainer ); + iContainer->MiddleSoftKeyL(); + } + +// --------------------------------------------------------- +// CSpdiaView::DoDeactivate +// ?implementation_description +// --------------------------------------------------------- +void CSpdiaView::DoDeactivate() + { + if ( iContainer ) + { + AppUi()->RemoveFromStack( iContainer ); + delete iContainer; + iContainer=NULL; + } + } + +// --------------------------------------------------------- +// CSpdiaView::HandleForegroundEventL(...) +// Foreground and background events. +// @param aForeGround ETrue : come to the foreground +// EFalse: removed to the foreground +// --------------------------------------------------------- +void CSpdiaView::HandleForegroundEventL(TBool aForeground) + { + if ( iSpeedPrivate == NULL ) + { + return; + } + + if ( aForeground ) + { + // We had gone to idle mode using active application.. + // We are coming back..Restore the GridStatus.. + if ( iSpeedPrivate->State() == CSpeedDialPrivate::STATE_IDLE && + iSpeedPrivate->GridStatus() == CSpeedDialPrivate::EGridNoUse ) + { + iSpeedPrivate->SetGridStatus( CSpeedDialPrivate::EGridUse ); + } + + // The cba resource should be updated when go back to speeddial. + iContainer->MiddleSoftKeyL(); + LoadCba( iContainer->MenuResourceID() ); + + iAIWRunFlag = EFalse; + } + else + { + // We are going out of use by active application.. + // We are no longer using the Grid..Update GridStatus.. + if ( iSpeedPrivate->State() == CSpeedDialPrivate::STATE_IDLE && + iSpeedPrivate->GridStatus() == CSpeedDialPrivate::EGridUse ) + { + iSpeedPrivate->SetGridStatus( CSpeedDialPrivate::EGridNoUse ); + } + } + + // For updation of the grid view while coming from the Phonebook view + if ( iReleasenumberFlag || iAssignNumberFlag ) + { + // Refresh and draw the grid + iAssignNumberFlag = EFalse; + } + + // On skin change create the speeddial grid and draw the new icons. + if ( ( aForeground && ( STATIC_CAST( CSpdiaAppUi*, AppUi() )->IsSkinChanged() ) ) ) + { + iContainer->HandleResourceChange( KAknsMessageSkinChange ); + iContainer->DrawNow(); + } + } + +// --------------------------------------------------------- +// CSpdiaView::CmdNumberCallL +// Command handle : Call +// --------------------------------------------------------- +void CSpdiaView::CmdNumberCallL ( TInt aCommand, + TBool aShowQuery //True: Let CallUI to show query to user + //False:Speed Dial menu already shown to user + ) + { + CSpeedDialPrivate& control = iContainer->Control();/////////////////need 2 change + TPhCltTelephoneNumber number; + TBool call( EFalse ); + TInt index( iContainer->CurGridPosition() ); + + number = control.PhoneNumber( index ); + int type = control.NumberType( index ); + if ( ( iContainer->IsVoiceMailBox()) || ( iContainer->IsVdoMailBox() ) ) + { + TInt numberType( ESpDialPbkFieldIdNone ); + CRepository* vmbxkey2 = CRepository::NewL( KCRUidTelVideoMailbox ); + vmbxkey2->Get( KTelVideoMbxKey, vmbxsupported ); + delete vmbxkey2; + vmbxkey2 = NULL; + iAIWRunFlag = ETrue; + if ( vmbxsupported == 2 ) + { + if ( iContainer->IsVoiceMailBox() ) + { + call = control.ExVoiceMailL( number ); + } + else if ( iContainer->IsVdoMailBox() ) + { + call = control.ExVideoMailL( number ); + } + } + else + { + iStatusPane->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL ); + iStatusPane->MakeVisible( ETrue ); + iStatusPane->DrawNow(); + // When Vmbx dialog need to showing, set the flag to ETrue. + iIsShowVmbxDlg = ETrue; + if ( iContainer->IsVoiceMailBox() || iContainer->IsVdoMailBox() ) + { + call = control.VoiceMailL( number ); + } + iIsShowVmbxDlg = EFalse; + iContainer->VoiceMailDialogLaunched( EFalse ); + iContainer->SetStatusPaneL(); + } + iAIWRunFlag = EFalse; + if ( call ) + { + TInt vmbxType = control.VoiceMailType(); + if( vmbxType == EVmbxIP ) + { + numberType = ESpDialPbkFieldIdVOIP; + } + else if( vmbxType == EVmbxVideo ) + { + numberType = ESpDialPbkFieldIdPhoneNumberVideo; + } + // Vmbx call, set ETrue to set EAIWForcedCS type. + NumberCallL( number, numberType, ETrue ); + } + } + else if ( control.Contact(index ) != NULL ) + { + //Set default call type (however this may be changed by CallUI).If event or + //call type is video number type, we provie video call option as default + CAiwDialData::TCallType callType = CAiwDialData::EAIWVoice; + + if ( type == ESpDialPbkFieldIdPhoneNumberVideo ) + { + callType = CAiwDialData::EAIWForcedVideo; + } + // If field Id is ESpDialPbkFieldIdVOIP, set call type to VoIP. + else if ( type == ESpDialPbkFieldIdVOIP && FeatureManager::FeatureSupported(KFeatureIdCommonVoip) ) + { + callType = CAiwDialData::EAIWVoiP; + } + CmdNumberCallL( aCommand, aShowQuery, number, callType ); + } + } + + +// --------------------------------------------------------- +// CSpdiaView::CmdNumberCallL +// Command handle : Call +// --------------------------------------------------------- + +void CSpdiaView::CmdNumberCallL ( TInt aCommandId, + TBool aShowQuery, + TPtrC aNumber, + CAiwDialData::TCallType aCallType ) + { + if( !aNumber.Length() ) + { + return; + } + + // We have phone number, so let's set the dial data + CAiwDialDataExt* dialData = CAiwDialDataExt::NewLC(); + dialData->SetCallType( aCallType ); + + MVPbkStoreContact* contact = iSpeedPrivate->Contact( iContainer->CurGridPosition() ); + if ( contact ) + { + HBufC* nameBuffer( NULL ); + nameBuffer = iSpeedPrivate->ContactTitleL( contact, ETrue ); + CleanupStack::PushL( nameBuffer ); + if ( nameBuffer->Length() > AIWDialDataExt::KMaximumNameLength ) + { + TPtrC namePtr = nameBuffer->Left( AIWDialDataExt::KMaximumNameLength ); + dialData->SetNameL( namePtr ); + } + else + { + dialData->SetNameL( *nameBuffer ); + } + CleanupStack::PopAndDestroy( nameBuffer ); + } + + dialData->SetPhoneNumberL( aNumber ); + dialData->SetWindowGroup( AIWDialData::KAiwGoToIdle ); + CAiwGenericParamList& paramList = iServiceHandler->InParamListL(); + dialData->FillInParamListL( paramList ); + CleanupStack::PopAndDestroy( dialData ); + + // Set the flag to ETrue, it means the aiw will be called in a fast time. + iAIWRunFlag = ETrue; + if ( aShowQuery ) + { + // Execute direct command (we use CallUI's list query) + iServiceHandler->ExecuteServiceCmdL( aCommandId, + paramList, + iServiceHandler->OutParamListL(), + 0, + this ); //Callback is NULL as no dial results wanted. + } + else + { + // Execute Menu based command (we have already shown speeddial-AIW menu to user) + iServiceHandler->ExecuteMenuCmdL( aCommandId, + paramList, + iServiceHandler->OutParamListL(), + 0, + this ); //Callback is NULL as no dial results wanted. + } + } + +// --------------------------------------------------------- +// CSpdiaView::CmdReleaseNumberL +// Command handle: Release +// --------------------------------------------------------- +void CSpdiaView::CmdReleaseNumberL() + { + TInt index(iContainer->CurGridPosition()); + + iReleasenumberFlag = ETrue; + if ( iContainer->Control().ShowRemove( index ) ) + { + iContainer->UpdatePhoneNumberL( index ); + iContainer->Grid()->DrawDeferred(); + } + iReleasenumberFlag = EFalse; + iContainer->MiddleSoftKeyL(); + + iSpeedPrivate->SetState(CSpeedDialPrivate::STATE_IDLE); + } + +// --------------------------------------------------------- +// CSpdiaView::CmdViewNumberL +// Command handle: ViewNumber +// --------------------------------------------------------- +void CSpdiaView::CmdViewNumberL() + { + iContainer->ShowViewNumberL(); + } + +// --------------------------------------------------------- +// CSpdiaView::UndoLayoutAndLeaveL +// ?implementation_description +// --------------------------------------------------------- +void CSpdiaView::UndoLayoutAndLeaveL(TInt aError, TBool aUpdateSp) + { + if ( aError != KErrNone ) + { + iContainer->MakeVisible( ETrue ); + if (aUpdateSp) + { + iStatusPane->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_EMPTY ); + } + User::Leave( aError ); + } + } + +// --------------------------------------------------------- +// CSpdiaView::MakeInvisibleCallBack +// --------------------------------------------------------- +TInt CSpdiaView::MakeInvisibleCallBack(TAny* aContainer) + { + STATIC_CAST( CSpdiaContainer*, aContainer )->MakeVisible( EFalse ); + return FALSE; + } + +// --------------------------------------------------------- +// CSpdiaView::DynInitMenuPaneL +// Remove menu item for help application +// when feature is not supported. +// --------------------------------------------------------- +void CSpdiaView::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane) + { + + //AIW knows its own submenu hooks, so we can return from here if AIW handled this. + if ( iServiceHandler->HandleSubmenuL( *aMenuPane ) ) + { + return; + } + + TInt index; + + switch( aResourceId ) + { + case R_SENDUI_MENU: + index = 2; + iSendUi->AddSendMenuItemL( *aMenuPane, index, ESpdiaCmdMessage, KCapabilitiesForAllServices ); + break; + + case R_SPDIA_VIEW_MENU: + case R_SPDIA_VIEW_MENU_VOICE: + case R_SPDIA_VIEW_MENU_ASSIGN: + case R_SPDIA_VIEW_MENU_OK_CALL: + case R_SPDIA_VIEW_MENU_OK_CALL_VIDEO: + { + // Check if help feature is available + if ( !FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + if ( ( aResourceId != R_SPDIA_VIEW_MENU_OK_CALL ) && + ( aResourceId != R_SPDIA_VIEW_MENU_OK_CALL_VIDEO ) ) + { + aMenuPane->DeleteMenuItem( EAknCmdHelp ); + } + } + DynInitAiwMenuPaneL( aResourceId, aMenuPane, ETrue ); + break; + } + default: + { + break; + } + } + } + +void CSpdiaView::DynInitAiwMenuPaneL( TInt aResourceId, + CEikMenuPane* aMenuPane, + TBool aVideo ) + { + CAiwGenericParamList& paramList = iServiceHandler->InParamListL(); + + // Get number type for commands. + TInt numberType = 0; + + if ( FeatureManager::FeatureSupported(KFeatureIdCommonVoip) ) + { + numberType = iContainer->Control().NumberType( iContainer->CurGridPosition() );//////need2 change + if ( numberType == ESpDialPbkFieldIdVOIP ) + { + TAiwVariant variant; + TAiwGenericParam param( EGenericParamSIPAddress, variant ); + paramList.AppendL( param ); + } + } + else if ( !aVideo ) + { + TAiwVariant variant; + TAiwGenericParam param( EGenericParamPhoneNumber, variant ); + paramList.AppendL( param ); + } + + iServiceHandler->InitializeMenuPaneL( *aMenuPane, + aResourceId, + ESpdiaCmdLast, + paramList ); + if ( aMenuPane->NumberOfItemsInPane() == KErrNone ) + { + User::Leave( KErrNotFound ); + } + } + + +// --------------------------------------------------------- +// CSpdiaView::SetCba +// Only in 5.0, used for changing cba buttons dynamically +// --------------------------------------------------------- +void CSpdiaView::SetCba( TInt aResourceId ) + { + if ( Cba() ) + { + TRAP_IGNORE(Cba()->SetCommandSetL(aResourceId)); + } + Cba()->DrawDeferred(); + } + +// --------------------------------------------------------- +// CSpdiaView::CmdSendMessageL +// Command handle: Send Message +// --------------------------------------------------------- +void CSpdiaView::CmdSendMessageL() + { + CArrayFixFlat* servicesToDim = new(ELeave) CArrayFixFlat(1); + CleanupStack::PushL( servicesToDim ); + + servicesToDim->AppendL( KSenduiMtmBtUid ); + servicesToDim->AppendL( KSenduiMtmIrUid ); + servicesToDim->AppendL( KSenduiMtmPostcardUid ); + + + TUid serviceUid = iSendUi->ShowTypedQueryL(CSendUi::EWriteMenu,NULL ,KCapabilitiesForAllServices,servicesToDim,KNullDesC); + CleanupStack::PopAndDestroy(); //servicesToDim + + if ( serviceUid.iUid == 0 ) + return; + + TSendingCapabilities capabilities; + iSendUi->ServiceCapabilitiesL( serviceUid, capabilities ); + + CMessageData *messageData = CMessageData::NewL(); + CleanupStack::PushL( messageData ); + + // Gets current tile pane and saves it to operatorName + TBuf<20> operatorName; + CAknTitlePane* title = NULL; + CEikStatusPane *sp = CEikonEnv::Static()->AppUiFactory()->StatusPane(); + title = STATIC_CAST( CAknTitlePane*, + sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); + operatorName.Copy( *title->Text() ); + + // send as body + CRichText* text = CRichText::NewL( + iEikonEnv->SystemParaFormatLayerL(), + iEikonEnv->SystemCharFormatLayerL(), CEditableText::EFlatStorage); + CleanupStack::PushL( text ); + text->InsertL( 0, KNullDesC ); + messageData->SetBodyTextL( text ); + + MVPbkStoreContact* contact( iSpeedPrivate->Contact(iContainer->CurGridPosition()) ); + if ( NULL == contact ) + { + return; + } + + // get the phone number + const TDesC& phoneNumber = iSpeedPrivate->PhoneNumber( iContainer->CurGridPosition() ); + TBool unnamedContact( EFalse ); + // get the contact title + HBufC* nameBuffer = iSpeedPrivate->ContactTitleL( contact, EFalse ); + if ( nameBuffer == NULL ) + { + // For unnamed contact, use phonenumber + unnamedContact = ETrue; + nameBuffer = HBufC::NewL( phoneNumber.Length() ); + nameBuffer->Des() = phoneNumber; + } + CleanupStack::PushL( nameBuffer ); + + TUid techTypeUid = iSendUi->TechnologyType( serviceUid ); + + if ( KSenduiMtmSmtpUid == serviceUid || KSenduiTechnologyMailUid == techTypeUid ) + { + HBufC* email = NULL; + email = iSpeedPrivate->EMail( contact ); + CleanupStack::PushL( email ); + + if ( NULL == email ) + { + CleanupStack::PopAndDestroy( email ); //email + CleanupStack::PopAndDestroy( nameBuffer ); // nameBuffer + CleanupStack::PopAndDestroy( 2 ); // text and messageData + return; + } + + // append the to address + if ( !unnamedContact ) + { + // not unnamed contact, use name + messageData->AppendToAddressL( email->Des(), *nameBuffer ); + } + else + { + // unnamed contact, use email + messageData->AppendToAddressL( email->Des(), *email ); + } + + // Create and Send Message + iSendUi->CreateAndSendMessageL( serviceUid /*KSenduiMtmUniMessageUid*/, messageData ); + CleanupStack::PopAndDestroy( email ); //email + } + else + { + // append the to address + messageData->AppendToAddressL( phoneNumber, *nameBuffer ); + + // Create and Send Message + iIsShowMsgDlg = ETrue; + iSendUi->CreateAndSendMessageL(serviceUid /*KSenduiMtmUniMessageUid*/, messageData ); + iIsShowMsgDlg = EFalse; + } + + title->SetTextL( operatorName ); //Sets title pane for operatorName which was save + CleanupStack::PopAndDestroy( nameBuffer ); //nameBuffer + CleanupStack::PopAndDestroy( text ); //text + CleanupStack::PopAndDestroy( messageData ); //messageData + iContainer->SetStatusPaneL(); + } + + +// --------------------------------------------------------- +// CSpdiaView::IsSettingType +// --------------------------------------------------------- +TBool CSpdiaView::IsSettingType( ) + { + return ( ( CSpdiaAppUi* )AppUi() )->IsSettingType(); + } + +// --------------------------------------------------------- +// CSpdiaView::SetSpeedPrivate +// Only invoked by CSpdiaAppUi::~CSpdiaAppUi() +// --------------------------------------------------------- +void CSpdiaView::SetSpeedPrivate( CSpeedDialPrivate* aSpeedPrivate ) + { + iSpeedPrivate = aSpeedPrivate; + } + +// --------------------------------------------------------- +// CSpdiaView::PopUpEnableSpDiaDlgL() +// --------------------------------------------------------- +TInt CSpdiaView::PopUpEnableSpDiaDlgL() + { + TInt result( EKeyPhoneEnd ); + CRepository* repository = CRepository::NewL( KCRUidTelephonySettings ); + + result = ESpdCmdEnableYes; + if ( result == ESpdCmdEnableYes || result == EEikBidOk ) + { + repository->Set( KSettingsOneKeyDialling, 1 ); + } + + delete repository; + return result; + } + +// --------------------------------------------------------- +// CSpdiaView::IsShowMsgDlg +// if msg dialog is showng. +// --------------------------------------------------------- +TBool CSpdiaView::IsShowMsgDlg() + { + return iIsShowMsgDlg; + } + +// --------------------------------------------------------- +// CSpdiaView::IsShowVmbxDlg +// if voice mail box dialog is showng. +// --------------------------------------------------------- +TBool CSpdiaView::IsShowVmbxDlg() + { + return iIsShowVmbxDlg; + } + +// --------------------------------------------------------- +// CSpdiaView::ProcessCommandL +// from CAknView::ProcessCommandL . +// --------------------------------------------------------- +void CSpdiaView::ProcessCommandL(TInt aCommand) + { + if ( !iAssignCompletedFlag ) + { + return; + } + switch( aCommand ) + { + case EAknSoftkeyOptions: + { + if ( iAIWRunFlag || iSpeedPrivate->State() != CSpeedDialPrivate::STATE_IDLE ) + { + } + else + { + CAknView::ProcessCommandL(aCommand); + } + break; + } + default: + { + CAknView::ProcessCommandL(aCommand); + } + } + } + +// --------------------------------------------------------- +// CSpdiaView::HandleNotifyL +// call back funtion of aiw. +// --------------------------------------------------------- +TInt CSpdiaView::HandleNotifyL( + TInt /*aCmdId*/, + TInt aEventId, + CAiwGenericParamList& /*aEventParamList*/, + const CAiwGenericParamList& /*aInParamList*/) + { + TInt result = 0; + // when the aiw is started, it means the service has been used at this moment. + if ( aEventId == KAiwEventStarted ) + { + iAIWRunFlag = EFalse; + } + return result; + } + +// --------------------------------------------------------- +// CSpdiaView::IsAssignCompleted +// return the iAssignCompletedFlag. +// --------------------------------------------------------- +TBool CSpdiaView::IsAssignCompleted() + { + return iAssignCompletedFlag; + } + +// --------------------------------------------------------- +// Check whether there has been a focus when clicking MSK +// @return ETrue for focus exists, or EFalse +// --------------------------------------------------------- +TBool CSpdiaView::IsFocused() + { + return MenuBar()->ItemSpecificCommandsEnabled(); + } +// End of File