phonebookui/Phonebook2/USIMExtension/src/CPsu2FixedDialingInfoView.cpp
changeset 0 e686773b3f54
child 68 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/USIMExtension/src/CPsu2FixedDialingInfoView.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,555 @@
+/*
+* Copyright (c) 2005-2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Phonebook 2 USIM UI Extension FDN contact info view.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPsu2FixedDialingInfoView.h"
+
+// Phonebook 2
+#include "CPsu2ViewManager.h"
+#include "CPsu2FixedDialingCall.h"
+#include "CPsu2SecUi.h"
+#include <CPbk2UIExtensionView.h>
+#include <MPbk2ViewActivationTransaction.h>
+#include <CPbk2AppUiBase.h>
+#include <MPbk2ViewExplorer.h>
+#include <Pbk2USimUIRes.rsg>
+#include <CPbk2ViewState.h>
+#include <MPbk2ContactUiControl.h>
+#include <Pbk2UIControls.rsg>
+#include <MPbk2CommandHandler.h>
+#include <MPbk2ApplicationServices.h>
+#include <TPbk2ContactEditorParams.h>
+#include <CPbk2ContactEditorDlg.h>
+#include <Pbk2UID.h>
+#include <csxhelp/phob.hlp.hrh>
+#include <CPbk2PresentationContact.h>
+#include <CPbk2FieldPropertyArray.h>
+#include <CPbk2PresentationContactFieldCollection.h>
+#include <MPbk2PointerEventInspector.h>
+
+// Virtual Phonebook
+#include <MVPbkSimPhone.h>
+#include <MVPbkBaseContact.h>
+#include <MVPbkContactLink.h>
+#include <MVPbkStoreContact.h>
+#include <CVPbkContactManager.h>
+#include <MVPbkContactOperationBase.h>
+
+// System includes
+#include <StringLoader.h>
+#include <AknUtils.h>
+#include <AiwCommon.hrh>
+
+// Debugging headers
+#include <Pbk2Debug.h>
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::CPsu2FixedDialingInfoView
+// --------------------------------------------------------------------------
+//
+CPsu2FixedDialingInfoView::CPsu2FixedDialingInfoView
+        ( CPbk2UIExtensionView& aExtensionView,
+          CPsu2ViewManager& aViewManager ) :
+            CPsu2InfoViewBase( aExtensionView, aViewManager )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::~CPsu2FixedDialingInfoView
+// --------------------------------------------------------------------------
+//
+CPsu2FixedDialingInfoView::~CPsu2FixedDialingInfoView()
+    {
+    delete iFdnCall;
+    delete iContactLink;
+    delete iContact;
+    delete iContactRetriever;
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::NewL
+// --------------------------------------------------------------------------
+//
+CPsu2FixedDialingInfoView* CPsu2FixedDialingInfoView::NewL
+        ( CPbk2UIExtensionView& aExtensionView,
+          CPsu2ViewManager& aViewManager )
+    {
+    CPsu2FixedDialingInfoView* self =
+        new ( ELeave ) CPsu2FixedDialingInfoView
+            ( aExtensionView, aViewManager );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::ConstructL
+// --------------------------------------------------------------------------
+//
+void CPsu2FixedDialingInfoView::ConstructL()
+    {
+    BaseConstructL();
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::DoActivateL
+// --------------------------------------------------------------------------
+//
+void CPsu2FixedDialingInfoView::DoActivateL
+        ( const TVwsViewId& aPrevViewId, TUid aCustomMessageId,
+          const TDesC8& aCustomMessage)
+    {
+    // Set up view
+    delete iViewActivationTransaction;
+    iViewActivationTransaction = NULL;
+    iViewActivationTransaction =
+        Phonebook2::Pbk2AppUi()->Pbk2ViewExplorer()->
+            HandleViewActivationLC( iExtensionView.Id(), aPrevViewId,
+                NULL, NULL, Phonebook2::EUpdateNaviPane );
+    CleanupStack::Pop(); //iViewActivationTransaction
+
+    // Call base class
+    CPsu2InfoViewBase::DoActivateL
+        ( aPrevViewId, aCustomMessageId, aCustomMessage );
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::DoDeactivate
+// --------------------------------------------------------------------------
+//
+void CPsu2FixedDialingInfoView::DoDeactivate()
+    {
+    CPsu2InfoViewBase::DoDeactivate();
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::HandleCommandKeyL
+// --------------------------------------------------------------------------
+//
+TBool CPsu2FixedDialingInfoView::HandleCommandKeyL
+        ( const TKeyEvent& aKeyEvent, TEventCode aType )
+    {
+    TBool ret = EFalse;
+
+    if ( aType == EEventKey )
+        {
+        if( aKeyEvent.iCode == EKeyPhoneSend )
+            {
+            CreateCallL( EPbk2CmdCall );
+            ret = ETrue;
+            }
+        else if( aKeyEvent.iCode == EKeyBackspace )
+            {
+            HandleCommandL( EPbk2CmdDeleteMe );
+            ret = ETrue;
+            }
+        else
+            {
+            if ( aKeyEvent.iScanCode == EStdKeyNo )
+                {
+                // 'Red' button pressed, clear PIN2 query info
+                iViewManager.SecUi().Reset();
+                }
+            }            
+        }
+    else
+        {
+        ret = CPsu2InfoViewBase::HandleCommandKeyL( aKeyEvent, aType );        
+        }
+
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::HandleCommandL
+// --------------------------------------------------------------------------
+//
+void CPsu2FixedDialingInfoView::HandleCommandL( TInt aCommand )
+    {
+    if ( Phonebook2::Pbk2AppUi()->ApplicationServices().CommandHandlerL()->
+            ServiceCmdByMenuCmd( aCommand ) == KAiwCmdCall )
+        {
+        if ( iViewManager.StoreAvailableL() )
+            {
+            CreateCallL( aCommand );
+            }
+        }
+    else
+        {
+        switch( aCommand )
+            {
+            case EPbk2CmdEditMe:
+                {
+                if ( iViewManager.SecUi().ConfirmPin2L() )
+                    {     
+                    delete iContactLink;
+                    iContactLink = NULL;               
+                    iContactLink = iControl->FocusedContactL()->CreateLinkLC();
+                    CleanupStack::Pop();
+                    iContactRetriever = 
+                        Phonebook2::Pbk2AppUi()->ApplicationServices().
+                            ContactManager().RetrieveContactL(
+                                *iContactLink, *this );
+                    }
+                break;
+                }
+            case EPbk2CmdDeleteMe:
+                {
+                if ( iViewManager.SecUi().ConfirmPin2L() )
+                    {
+                    CPsu2InfoViewBase::HandleCommandL( aCommand );
+                    }
+                break;
+                }
+            case EPbk2CmdExit:
+            case EAknCmdHideInBackground:
+                {
+                if ( aCommand == EAknCmdHideInBackground && iDlgEliminator )
+                    {
+                    iDlgEliminator->RequestExitL( EKeyEscape );
+                    }
+
+                // Clear PIN2 query info
+                iViewManager.SecUi().Reset();
+                CPsu2InfoViewBase::HandleCommandL( aCommand );
+                break;
+                }
+            default:
+                {
+                CPsu2InfoViewBase::HandleCommandL( aCommand );
+                break;
+                }
+            };
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::DynInitMenuPaneL
+// --------------------------------------------------------------------------
+//
+void CPsu2FixedDialingInfoView::DynInitMenuPaneL(
+        TInt aResourceId,
+        CEikMenuPane* aMenuPane )
+    {
+    switch( aResourceId )
+        {
+        case R_PSU2_FIXED_DIALING_INFO_COPY_MENUPANE:
+            {
+            break;
+            }
+        case R_PSU2_FIXED_DIALING_INFO_MENUPANE:
+            {
+            break;
+            }
+        default:
+            {
+            CPsu2InfoViewBase::DynInitMenuPaneL( aResourceId, aMenuPane );
+            break;
+            }
+        }
+    }
+
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::NameListControlResourceId
+// --------------------------------------------------------------------------
+//
+TInt CPsu2FixedDialingInfoView::NameListControlResourceId() const
+    {
+    return 0;
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::NaviPaneLabelL
+// --------------------------------------------------------------------------
+//
+HBufC* CPsu2FixedDialingInfoView::NaviPaneLabelL() const
+    {
+    HBufC* text = NULL;
+    if ( iViewManager.SecUi().IsFDNActive() )
+        {
+        text = StringLoader::LoadLC( R_QTN_FDN_ACTIVE );
+        }
+    else
+        {
+        text = StringLoader::LoadLC( R_QTN_FDN_DEACTIVE );
+        }
+
+    CleanupStack::Pop(); // text
+    return text;
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::UpdateCbasL
+// --------------------------------------------------------------------------
+//
+void CPsu2FixedDialingInfoView::UpdateCbasL()
+    {
+    // Set cba command set "Options - Context Menu - Back"
+    iExtensionView.Cba()->SetCommandSetL
+        ( R_PBK2_SOFTKEYS_OPTIONS_BACK_CONTEXT );
+    iExtensionView.Cba()->DrawDeferred();
+    // Set context menu
+    iExtensionView.MenuBar()->SetContextMenuTitleResourceId
+        ( R_PSU2_FIXED_DIALING_INFO_CONTEXT_MENUBAR );
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::VPbkSingleContactOperationComplete
+// --------------------------------------------------------------------------
+//    
+void CPsu2FixedDialingInfoView::VPbkSingleContactOperationComplete(
+        MVPbkContactOperationBase& aOperation,
+        MVPbkStoreContact* aContact )
+    {
+    
+    if ( iContactRetriever == &aOperation && aContact)
+        {
+        delete iContactRetriever;
+        iContactRetriever = NULL;
+        
+        delete iContact;    
+        iContact = aContact;     
+               
+        TRAPD( error, iContact->LockL(*this) );
+        if ( error != KErrNone )
+            {
+            CCoeEnv::Static()->HandleError(error);
+            } 
+        }      
+    }
+        
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::VPbkSingleContactOperationFailed
+// --------------------------------------------------------------------------
+//        
+void CPsu2FixedDialingInfoView::VPbkSingleContactOperationFailed(
+        MVPbkContactOperationBase& aOperation, 
+        TInt aError )
+    {
+    if ( iContactRetriever == &aOperation )
+        {
+        delete iContactRetriever;
+        iContactRetriever = NULL;
+        
+        CCoeEnv::Static()->HandleError(aError);
+        }    
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::ContactEditingCompletebasL
+// --------------------------------------------------------------------------
+//
+void CPsu2FixedDialingInfoView::ContactEditingComplete(
+        MVPbkStoreContact* aEditedContact )
+    {  
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPsu2FixedDialingInfoView(%x)::ContactEditingComplete()"), 
+        this);
+        
+    iContact = aEditedContact;                      
+    }
+    
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::ContactEditingDeletedContact
+// --------------------------------------------------------------------------
+//        
+void CPsu2FixedDialingInfoView::ContactEditingDeletedContact(
+        MVPbkStoreContact* aEditedContact )
+    {
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPsu2FixedDialingInfoView(%x)::ContactEditingDeletedContact()"), 
+        this);
+    
+    delete aEditedContact; // not needed anymore
+    }
+    
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::ContactEditingAborted
+// --------------------------------------------------------------------------
+//        
+void CPsu2FixedDialingInfoView::ContactEditingAborted()
+    {
+    // Do nothing
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::ContactOperationCompleted
+// --------------------------------------------------------------------------
+//     
+void CPsu2FixedDialingInfoView::ContactOperationCompleted(
+        TContactOpResult /*aResult*/ )
+    {
+    TRAPD(result, EditFdnContactL());
+        
+    if (result != KErrNone)
+        {
+        CCoeEnv::Static()->HandleError(result);
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::ContactOperationFailed
+// --------------------------------------------------------------------------
+//     
+void CPsu2FixedDialingInfoView::ContactOperationFailed(
+        TContactOp /*aOpCode*/, 
+        TInt aErrorCode, 
+        TBool /*aErrorNotified*/ )
+    {
+    CCoeEnv::Static()->HandleError(aErrorCode);
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::CreateCallL
+// --------------------------------------------------------------------------
+//
+void CPsu2FixedDialingInfoView::CreateCallL( TInt aCommand )
+    {
+    if ( !iFdnCall )
+        {
+        iFdnCall = CPsu2FixedDialingCall::NewL
+            ( Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager(),
+              *Phonebook2::Pbk2AppUi()->ApplicationServices().
+                CommandHandlerL(),
+              iExtensionView );
+        }
+
+    MVPbkContactLink* contactLink =
+        iControl->FocusedContactL()->CreateLinkLC();
+    CleanupStack::Pop(); // CreateCallL takes contactLink
+    iFdnCall->CreateCallL( contactLink, aCommand );
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::EditFdnContactL
+// --------------------------------------------------------------------------
+//    
+void CPsu2FixedDialingInfoView::EditFdnContactL()
+    {
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPsu2FixedDialingInfoView(%x)::EditFdnContactL()"), this);
+         
+    // adjust focus
+    TInt focusedFieldIndex = KErrNotFound;
+    if (iControl)
+        {
+        focusedFieldIndex = iControl->FocusedFieldIndex();
+        }
+        
+    TPbk2ContactEditorParams params;
+    if ( focusedFieldIndex != KErrNotFound )
+        {
+        params.iFocusedContactField = 
+            FocusedFieldLC( *iContact );
+        }
+
+    TCoeHelpContext helpContext;
+    helpContext.iMajor.iUid = KPbk2UID3;
+    helpContext.iContext = KFDN_HLP_FDN_NUM_EDIT_VIEW;
+    params.iHelpContext = &helpContext;
+        
+    // create and execute editing dialog
+    CPbk2ContactEditorDlg* dlg =
+        CPbk2ContactEditorDlg::NewL( params, iContact, *this );
+    iContact = NULL; // ownership went to editor
+    iDlgEliminator = dlg;
+    dlg->ExecuteLD();
+    iDlgEliminator = NULL;
+    
+    // clean after dialog execution
+    if ( focusedFieldIndex != KErrNotFound )
+        {
+        CleanupStack::PopAndDestroy(); //params.iFocusedContactField
+        }    
+    
+    if ( iControl )
+        {        
+        // If editing has been aborted we don't set focused contact.
+        if ( iContact )
+            {
+            // It is possible that the contact got changed while in edit
+            iControl->SetFocusedFieldIndex( params.iFocusedIndex );
+            iControl->SetFocusedContactL( *iContact );
+            delete iContact;
+            iContact = NULL;
+            }
+
+        // If contact got deleted in the editor, this call ensures
+        // that the contact info view is switched to the names list
+        iControl->UpdateAfterCommandExecution();        
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::FocusedFieldLC
+// --------------------------------------------------------------------------
+//    
+MVPbkStoreContactField* CPsu2FixedDialingInfoView::FocusedFieldLC( 
+        MVPbkStoreContact& aStoreContact )
+    {
+    CPbk2PresentationContact* presentationContact = 
+      CPbk2PresentationContact::NewL( aStoreContact, 
+        Phonebook2::Pbk2AppUi()->ApplicationServices().FieldProperties() );
+    CleanupStack::PushL( presentationContact );
+
+    TInt index = KErrNotFound;
+    if (iControl)
+        {
+        index = presentationContact->PresentationFields().StoreIndexOfField( 
+                iControl->FocusedFieldIndex() );
+        }
+
+    CleanupStack::PopAndDestroy( presentationContact );
+    
+    if ( index != KErrNotFound )
+        {
+        // Use FieldAtLC to avoid the unvalidity of the field after new
+        // FieldAt call.        
+        return aStoreContact.Fields().FieldAtLC( index );
+        }
+    return NULL;
+    }     
+
+// --------------------------------------------------------------------------
+// CPsu2FixedDialingInfoView::HandleControlEventL
+// --------------------------------------------------------------------------
+//    
+void CPsu2FixedDialingInfoView::HandleControlEventL(
+        MPbk2ContactUiControl& aControl,
+        const TPbk2ControlEvent& aEvent )
+    {
+    switch ( aEvent.iEventType )
+        {
+        case TPbk2ControlEvent::EContactTapped:
+        case TPbk2ControlEvent::EContactDoubleTapped:
+        case TPbk2ControlEvent::EControlEnterKeyPressed:
+            {
+            HandleCommandL( EPbk2CmdEditMe );
+            break;
+            }
+        default:
+            {
+            CPsu2InfoViewBase::HandleControlEventL( aControl, aEvent );
+            break;
+            }
+        }
+    }
+
+// End of File