phoneclientserver/CallUI/Src/CaUiEngine/CaUiDialogs.cpp
changeset 0 ff3b6d0fd310
child 3 a4a774cb6ea7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneclientserver/CallUI/Src/CaUiEngine/CaUiDialogs.cpp	Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,658 @@
+/*
+* Copyright (c) 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:  Implementation of CallUIEngine.
+*
+*/
+
+
+// INCLUDES
+
+#include <e32base.h>
+#include <e32cmn.h>
+#include <featmgr.h>
+#include <StringLoader.h>
+#include <CallUI.rsg>                // Resources.
+#include <aknmessagequerydialog.h>
+#include <aknnotewrappers.h>
+#include <AknGlobalListQuery.h>
+#include <AknGlobalNote.h>
+#include <mcauireconnectqueryobserver.h>
+#include "CaUiDialogs.h"
+#include "CaUiLogger.h"
+#include "CaUiQuery.h"
+#include "CaUiEngine.h"
+#include "CPhCntMatcher.h"
+#include "CaUiActiveObject.h"
+
+// CLASS DECLARATION
+
+/**
+*  Container for informatioin needed in Reconnection query.
+*
+*  @lib CaUiEngine.lib
+*  @since 2.6
+*/
+NONSHARABLE_CLASS( CCaUiReConQueryInformation ) 
+    : public CBase
+    {
+    public:  // Constructors and destructor
+        
+        /**
+        * C++ constructor.
+        * 
+        * @see CCaUiEngApi::LaunchNoteAndReconConfQueryL().
+        */
+        CCaUiReConQueryInformation(
+            MCaUiReconnectQueryObserver& aObserver,
+            CPhCntMatcher* aPhCntMatcher,
+            const TPtrC aPhoneNumber,
+            const TBool aIncludeVideoCallOption,
+            const TPtrC aNoteText );
+        
+        /**
+        * Destructor.
+        */
+        ~CCaUiReConQueryInformation();
+
+
+    public:    // Data
+
+        // Observer storage.
+        MCaUiReconnectQueryObserver&    iObserver;
+
+        // Matcher storage.
+        CPhCntMatcher*                  iPhCntMatcher;
+
+        // Phone number storage.
+        const TPtrC                     iPhoneNumber;
+
+        // Video call option storage.
+        const TBool                     iIncludeVideoCallOption;
+    
+        // The name corresponding the phone number.
+        const TPtrC                     iAlias;
+
+    };
+
+
+// -----------------------------------------------------------------------------
+// CCaUiReConQueryInformation::CCaUiReConQueryInformation
+// 
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCaUiReConQueryInformation::CCaUiReConQueryInformation(
+    MCaUiReconnectQueryObserver& aObserver,
+    CPhCntMatcher* aPhCntMatcher,
+    const TPtrC aPhoneNumber,
+    const TBool aIncludeVideoCallOption,
+    const TPtrC aAlias )
+    : iObserver( aObserver ),
+      iPhCntMatcher( aPhCntMatcher ),
+      iPhoneNumber( aPhoneNumber ),
+      iIncludeVideoCallOption( aIncludeVideoCallOption ),
+      iAlias( aAlias )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CCaUiReConQueryInformation::~CCaUiReConQueryInformation
+// 
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CCaUiReConQueryInformation::~CCaUiReConQueryInformation()
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaUiDialogs::CCaUiDialogs
+// 
+//
+// -----------------------------------------------------------------------------
+//
+CCaUiDialogs::CCaUiDialogs( CCaUiEngine& aCaUiEngine )
+    : iCaUiEngine( aCaUiEngine )
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaUiDialogs::NewL
+// 
+// 
+// -----------------------------------------------------------------------------
+//
+CCaUiDialogs* CCaUiDialogs::NewL( CCaUiEngine& aCaUiEngine )
+    {
+    CCaUiDialogs* self = new( ELeave ) CCaUiDialogs( aCaUiEngine );
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaUiDialogs::ConstructL
+// 
+// 
+// -----------------------------------------------------------------------------
+//
+void CCaUiDialogs::ConstructL()
+    {
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::ConstructL() Begin");
+    // Create reconnect query, not visible yet.
+    iReconListQuery = CAknGlobalListQuery::NewL();
+    
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::ConstructL() End");
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaUiDialogs::~CCaUiDialogs
+// 
+// 
+// -----------------------------------------------------------------------------
+//
+CCaUiDialogs::~CCaUiDialogs()
+    {
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::~CCaUiDialogs() Begin");
+    // Cancel confirmation query if exists.
+    CancelReconConfQuery();
+    delete iReconListQuery;
+    
+    // Delete reconnection query information.
+    delete iReConQueryInformation;
+    
+    // Cancel and delete note timer if exists.
+    if ( iNoteTimer )
+        {
+        iNoteTimer->Cancel();
+        delete iNoteTimer;
+        }
+
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::~CCaUiDialogs() End");
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaUiDialogs::QueryVideoCallDefaultActionL
+// 
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CCaUiDialogs::QueryVideoCallDefaultActionL()
+    {
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::QueryVideoCallDefaultActionL() Begin");
+    HBufC* vtstring = NULL;
+    HBufC* header = NULL;
+    vtstring = StringLoader::LoadLC( R_CALLUI_VT_SETTING_NOTE );
+    header = StringLoader::LoadLC( R_CALLUI_POPUP_VT_TITLE_SETTING );
+
+    CAknMessageQueryDialog* dlg = CAknMessageQueryDialog::NewL( *vtstring );
+    CleanupStack::PushL( dlg );
+    dlg->SetHeaderTextL( *header );
+    CleanupStack::Pop( dlg );
+
+    // Show query note to user
+    TInt result = dlg->ExecuteLD( R_CALLUI_VT_SETTING_QUERY );
+
+    CleanupStack::PopAndDestroy( 2, vtstring ); // header, vtstring
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::QueryVideoCallDefaultActionL() End");
+    
+    return result;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaUiDialogs::LaunchCreateListQueryL
+// 
+// 
+// -----------------------------------------------------------------------------
+//
+TBool CCaUiDialogs::LaunchCreateListQueryL( TPhCltCallType& aCallType )
+    {
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::LaunchCreateListQueryL() Begin");
+    
+    TInt choice = KErrNotFound;
+
+    CListMappingArray* mappingList = new ( ELeave ) CListMappingArray( 4 );
+    CleanupStack::PushL( mappingList ); 
+
+    // Create query dialog.
+    CCaUiCreateListQuery* dlg = 
+        new ( ELeave ) CCaUiCreateListQuery( &choice );
+    dlg->PrepareLC( R_CALLUI_CREATE_LIST_QUERY );
+    
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::LaunchCreateListQueryL() 1");
+
+    // new clean list item array
+    CDesCArray* textArray = new( ELeave ) CDesCArrayFlat( 4 );
+    CleanupStack::PushL( textArray );
+
+    FillListQueryItemsL( *textArray, *mappingList );
+
+    CleanupStack::Pop( textArray );
+
+    // Dialog takes the ownership of textArray          
+    if( textArray )
+        {
+        dlg->SetOwnershipType( ELbmOwnsItemArray );
+        dlg->SetItemTextArray( textArray );
+        }
+
+    // Highlight preferred item from listbox
+    if( aCallType == EPhCltVideo )
+        {
+        dlg->ListBox()->SetCurrentItemIndex( KCallUiVideoCall );
+        }
+
+    TBool ok = dlg->RunLD();
+    CAUILOGSTRING2("CALLUI: >>>CCaUiDialogs::LaunchCreateListQueryL() ok = %d", ok );
+    CAUILOGSTRING2("CALLUI: >>>CCaUiDialogs::LaunchCreateListQueryL() choice = %d", choice );
+    if ( ok  )
+        {
+        // Check what call type was selected.
+
+        // Dynamic list made because of voip support
+        // take calltype from mappinglist
+        aCallType = mappingList->At( choice ).iCallType;
+        }
+
+    CleanupStack::PopAndDestroy( mappingList );
+
+    return ok;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaUiDialogs::FillListQueryItemsL
+// 
+// 
+// -----------------------------------------------------------------------------
+//
+void CCaUiDialogs::FillListQueryItemsL( 
+    CDesCArray& aTextArray, 
+    CListMappingArray& aMappingList )
+    {
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::FillListQueryItemsL() Begin");
+    
+    // Pointer for strings to be loaded.
+    HBufC* bufPtr = NULL;
+    TInt index = 0;
+    TListMappingItem item;
+
+    // Voice call option.
+    bufPtr = StringLoader::LoadLC( R_CALLUI_CREATE_LIST_VOICE );
+    aTextArray.AppendL( *bufPtr );
+    CleanupStack::PopAndDestroy( bufPtr );  
+    bufPtr = NULL;
+    item.iIndex = index;
+    item.iCallType = EPhCltVoice;
+    aMappingList.AppendL( item );
+    index++;
+    
+     // Video call option.
+    if ( FeatureManager::FeatureSupported( KFeatureIdCsVideoTelephony ) )
+        {
+        CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::FillListQueryItemsL() Adding video call option");
+        bufPtr = StringLoader::LoadLC( R_CALLUI_CREATE_LIST_VIDEO );
+        aTextArray.AppendL( *bufPtr );
+        CleanupStack::PopAndDestroy( bufPtr );
+        bufPtr = NULL;
+        item.iIndex = index;
+        item.iCallType = EPhCltVideo;
+        aMappingList.AppendL( item );
+        index++;
+        }
+    // Internet call option is shown if dynamic voip is set on
+    // and there are VoIP profiles defined
+    if( iCaUiEngine.IsVoIPProfiles() )
+        {
+        // Internet call option.
+        CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::FillListQueryItemsL() Adding internet call option");
+        bufPtr = StringLoader::LoadLC( R_CALLUI_CREATE_LIST_INTERNET );
+        aTextArray.AppendL( *bufPtr );
+        CleanupStack::PopAndDestroy( bufPtr );
+        bufPtr = NULL;
+        item.iIndex = index;
+        item.iCallType = EPhCltCallVoIP;
+        aMappingList.AppendL( item );
+        index++;
+        }
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::FillListQueryItemsL() End");
+    }
+
+
+/** not tested **/
+
+// -----------------------------------------------------------------------------
+// CCaUiDialogs::LaunchNoNetSupNoteL
+// 
+//
+// -----------------------------------------------------------------------------
+//
+void CCaUiDialogs::LaunchNoNetSupNoteL()
+    {
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::LaunchNoNetSupNoteL() Begin");
+    HBufC* string = StringLoader::LoadLC( R_CALLUI_NO_VIDEO_NETWORK );  
+
+    CAknInformationNote* dlg = new ( ELeave ) CAknInformationNote( EFalse );
+    dlg->ExecuteLD( *string );
+    dlg = NULL;
+
+    CleanupStack::PopAndDestroy( string );
+    string = NULL;
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::LaunchNoNetSupNoteL() End");
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CCaUiDialogs::LaunchReconConfQueryL
+// 
+//
+// -----------------------------------------------------------------------------
+//
+void CCaUiDialogs::LaunchReconConfQueryL( 
+    MCaUiReconnectQueryObserver& aObserver,
+    CPhCntMatcher* aPhCntMatcher,
+    const TPtrC aPhoneNumber,
+    const TBool aIncludeVideoCallOption,
+    const TPtrC aAlias )
+    {
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::LaunchReconConfQueryL() Begin ");
+    CDesCArray* textArray = new( ELeave ) CDesCArrayFlat( 4 );
+    CleanupStack::PushL( textArray );
+
+    // Delete the old query if exists.
+    CancelReconConfQuery();
+    
+    // Create new active object to handle query results.
+    iReconActObject = CCaUiGlnActiveObject::NewL( 
+        aObserver,
+        aPhCntMatcher,
+        aPhoneNumber,
+        aAlias );
+
+    CCaUiTIntArray* objectArray = iReconActObject->ReconQueryOptionsArray();
+    
+    // Pointer for strings to be loaded.
+    HBufC* bufPtr = NULL;
+
+    // Voice call option.
+    bufPtr = StringLoader::LoadLC( R_CALLUI_RECONNECT_LIST_ITEM_VOICE );
+    textArray->AppendL( *bufPtr );
+    CleanupStack::PopAndDestroy( bufPtr );
+    bufPtr = NULL;
+    objectArray->AppendL( CCaUiGlnActiveObject::ECaUiVoiceCall );
+
+    // Video call option is included only if it is wanted.
+    if ( aIncludeVideoCallOption )
+        {
+        bufPtr = StringLoader::LoadLC( R_CALLUI_RECONNECT_LIST_ITEM_VIDEO );
+        textArray->AppendL( *bufPtr );
+        CleanupStack::PopAndDestroy( bufPtr );
+        bufPtr = NULL;
+        objectArray->AppendL( CCaUiGlnActiveObject::ECaUiVideoCall );
+        }
+
+#ifndef RD_UNIFIED_EDITOR
+    // MMS option.
+    if (FeatureManager::FeatureSupported(KFeatureIdMMS))
+        {   
+        bufPtr = StringLoader::LoadLC( R_CALLUI_RECONNECT_LIST_ITEM_MMS  );
+        textArray->AppendL( *bufPtr );
+        CleanupStack::PopAndDestroy( bufPtr );
+        bufPtr = NULL;
+        objectArray->AppendL( CCaUiGlnActiveObject::ECaUiMms );
+        }
+
+    // SMS option.
+    bufPtr = StringLoader::LoadLC( R_CALLUI_RECONNECT_LIST_ITEM_SMS  );
+    textArray->AppendL( *bufPtr );
+    CleanupStack::PopAndDestroy( bufPtr );
+    bufPtr = NULL;
+    objectArray->AppendL( CCaUiGlnActiveObject::ECaUiSms );
+
+#else  
+    // Send message option.
+    bufPtr = StringLoader::LoadLC( R_CALLUI_RECONNECT_LIST_ITEM_MESSAGE  );
+    textArray->AppendL( *bufPtr );
+    CleanupStack::PopAndDestroy( bufPtr );
+    bufPtr = NULL;
+    objectArray->AppendL( CCaUiGlnActiveObject::ECaUiMsg );
+#endif // RD_UNIFIED_EDITOR
+
+    // Load query header.
+    bufPtr = StringLoader::LoadLC( R_CALLUI_RECONNECT_QUERY_HEADER  );
+    iReconListQuery->SetHeadingL( *bufPtr ); // Set query heading.
+    CleanupStack::PopAndDestroy( bufPtr );
+    bufPtr = NULL;
+
+    // Show query.
+    iReconActObject->SetActive();
+    iReconListQuery->ShowListQueryL( textArray, iReconActObject->iStatus );
+
+    CleanupStack::PopAndDestroy( textArray );
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::LaunchReconConfQueryL() End ");
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaUiDialogs::CancelReconConfQuery
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CCaUiDialogs::CancelReconConfQuery()
+    {
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::CancelReconConfQuery() Begin ");
+    // Cancel the earlier query if exists.
+    if( iReconListQuery )
+        {
+        iReconListQuery->CancelListQuery();
+        }
+
+    // Cancel the active object.
+    if( iReconActObject )
+        {
+        if ( iReconActObject->IsActive() )
+            {
+            iReconActObject->Cancel();
+            }
+        }
+    iReconfQueryOngoing = EFalse;
+    delete iReconActObject;
+    iReconActObject = NULL;
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::CancelReconConfQuery() End ");
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaUiDialogs::CancelNoteAndReconConfQuery
+// 
+//
+// -----------------------------------------------------------------------------
+//
+void CCaUiDialogs::CancelNoteAndReconConfQuery()
+    {
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::CancelNoteAndReconConfQuery() Begin ");
+    // Delete reconnection query information.
+    delete iReConQueryInformation;
+    iReConQueryInformation = NULL;
+
+    // Cancel Note timer if exists.
+    if ( iNoteTimer )
+        {
+        // Cancel note timer.
+        iNoteTimer->Cancel();
+        }
+
+    // Cancel the reconnect query if exists.
+    if( iReconListQuery )
+        {
+        iReconListQuery->CancelListQuery();
+        }
+
+    // Cancel the active object.
+    if( iReconActObject )
+        {
+        if ( iReconActObject->IsActive() )
+            {
+            iReconActObject->Cancel();
+            }
+        }
+
+    delete iReconActObject;
+    iReconActObject = NULL;
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::CancelNoteAndReconConfQuery() End ");
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CCaUiDialogs::LaunchNoteAndReconConfQueryL
+// 
+//
+// -----------------------------------------------------------------------------
+//
+void CCaUiDialogs::LaunchNoteAndReconConfQueryL( 
+    MCaUiReconnectQueryObserver& aObserver,
+    CPhCntMatcher* aPhCntMatcher,
+    const TPtrC aPhoneNumber,
+    const TBool aIncludeVideoCallOption,
+    const TPtrC aNoteText,
+    const TPtrC aAlias )
+    {
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::LaunchNoteAndReconConfQueryL() Begin ");
+    iReconfQueryOngoing = ETrue;
+    delete iReConQueryInformation;
+    iReConQueryInformation = NULL;
+    iReConQueryInformation = new ( ELeave ) CCaUiReConQueryInformation(
+        aObserver,
+        aPhCntMatcher,
+        aPhoneNumber,
+        aIncludeVideoCallOption,
+        aAlias );
+
+    HBufC* string = NULL;
+    TInt noteTextLength = aNoteText.Length();
+
+    // Use either given note string or the qtn.tel.no.video.network string.
+    if ( noteTextLength )
+        {
+        string = HBufC::NewLC( noteTextLength );
+        string->Des() = aNoteText;
+        }
+    else
+        {
+        string = StringLoader::LoadLC( R_CALLUI_NO_VIDEO_NETWORK );
+        }
+
+    if ( !iInfoNote )
+        {
+        iInfoNote = new ( ELeave ) CAknInformationNote( EFalse );
+        iInfoNote->SetTimeout( CAknNoteDialog::ELongTimeout );
+        iInfoNote->ExecuteLD( *string );
+        }
+    
+    // Start note wait timer.
+    if ( !iNoteTimer )
+        {
+        iNoteTimer = CPeriodic::NewL( CActive::EPriorityStandard );
+        }
+    iNoteTimer->Cancel();
+    iNoteTimer->Start(
+        KCaUiEngNoteTimeout, 
+        KCaUiEngNoteTimeout,
+        TCallBack( DoPerformNoteLaunchCallBackL, this ) );
+
+    CleanupStack::PopAndDestroy( string );
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::LaunchNoteAndReconConfQueryL() End");
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CCaUiDialogs::DoPerformNoteLaunchCallBackL
+// 
+//
+// -----------------------------------------------------------------------------
+//
+TInt CCaUiDialogs::DoPerformNoteLaunchCallBackL( TAny* aAny )
+    {
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::DPNoteLaunchCallBackL() Begin");
+
+    CCaUiDialogs* self = static_cast< CCaUiDialogs* >( aAny );
+
+    if ( self )
+        {
+        if ( self->iNoteTimer )
+            {
+            // Cancel note timer.
+            self->iNoteTimer->Cancel();
+            }
+
+        if ( self->iInfoNote )
+            {
+            // Information note still displayed
+            return KErrNone;
+            }
+
+        if ( self->iReConQueryInformation && self->IsReconfQueryOngoing() )
+            {
+            // Launch reconnect query.
+            self->LaunchReconConfQueryL(
+                self->iReConQueryInformation->iObserver,
+                self->iReConQueryInformation->iPhCntMatcher,
+                self->iReConQueryInformation->iPhoneNumber,
+                self->iReConQueryInformation->iIncludeVideoCallOption,
+                self->iReConQueryInformation->iAlias );
+            }
+
+        delete self->iReConQueryInformation;
+        self->iReConQueryInformation = NULL;
+        }
+    CAUILOGSTRING("CALLUI: >>>CCaUiDialogs::DPNoteLaunchCallBackL() end");
+    return KErrNone;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaUiEngine::IsReconfQueryOngoing
+// 
+//
+// -----------------------------------------------------------------------------
+//
+TBool CCaUiDialogs::IsReconfQueryOngoing()
+    {
+    return iReconfQueryOngoing;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCaUiEngine::IsReconfQueryOngoing
+// 
+//
+// -----------------------------------------------------------------------------
+//
+void CCaUiDialogs::SetReconfQueryOngoing( const TBool aOngoing )
+    {
+    iReconfQueryOngoing = aOngoing;
+    }