phonebookui/Speeddial/src/SpdiaView.cpp
branchRCL_3
changeset 20 f4a778e096c2
child 21 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Speeddial/src/SpdiaView.cpp	Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,1039 @@
+/*
+* 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 <bldvariant.hrh>
+#include <aknViewAppUi.h>
+#include <avkon.hrh>
+#include <akntitle.h>
+#include <aknlists.h>
+#include <eikmenub.h>
+
+#include <SpeedDial.rsg>
+#include <featmgr.h>
+#include <AiwCommon.hrh>    //KAiwCmdCall
+#include <aiwdialdataext.h>
+#include <StringLoader.h>
+#include <aknnotedialog.h>
+#include  "speeddial.hrh"
+#include "SpdiaControl.hrh"
+#include  "speeddialprivate.h"
+
+#include  "SpdiaView.h"
+#include  "SpdiaContainer.h"
+#include "SpdiaAppUi.h"
+#include <aknlayoutscalable_apps.cdl.h>
+#include <layoutmetadata.cdl.h>
+#include <vmnumber.h>
+#include <voicemailboxdomaincrkeys.h>
+#include <MVPbkContactLink.h>
+#include <telvmbxsettingscrkeys.h>
+
+#include <settingsinternalcrkeys.h>
+#include <SpeeddialPrivateCRKeys.h>
+#include "SpdCtrl.rsg"
+
+
+#include <CMessageData.h>
+#include <txtrich.h>
+#include <SendUiConsts.h>
+#include <Sendnorm.rsg>
+#include <MVPbkContactFieldTextData.h>
+
+_LIT( KSpace, " " );
+
+// ================= 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;	 
+        
+        // If the view note displays when switching speeddial to background.
+        // Making the note pops up again.
+        if ( iSpeedPrivate->UpdateFlag() && iContainer->GetViewDialogStatus() )
+            {
+            CmdViewNumberL();
+            iSpeedPrivate->SetUpdateFlag( 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 );
+    TBuf<1>space( KSpace );
+    while( number.Length() > 0 && number.Find( space ) != KErrNotFound )
+    	{
+    	number.Delete( number.Find( space ), 1 );
+    	}
+    
+    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, 
+                                          EFalse,
+                                          ETrue );
+    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<TUid>* servicesToDim = new(ELeave) CArrayFixFlat<TUid>(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