phonebookui/Phonebook2/Commands/src/CPbk2CallTypeSelector.cpp
changeset 0 e686773b3f54
child 21 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/Commands/src/CPbk2CallTypeSelector.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,398 @@
+/*
+* 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 call type selector.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbk2CallTypeSelector.h"
+
+// Phonebook 2
+#include <MPbk2ContactUiControl.h>
+#include <Pbk2Commands.hrh>
+#include <Pbk2UIControls.rsg>
+#include <TPbk2StoreContactAnalyzer.h>
+
+// Virtual Phonebook
+#include <CVPbkFieldTypeSelector.h>
+#include <MVPbkBaseContactField.h>
+#include <MVPbkStoreContact.h>
+#include <MVPbkFieldType.h>
+#include <CVPbkDefaultAttribute.h>
+#include <CVPbkContactManager.h>
+#include <RVPbkContactFieldDefaultPriorities.h>
+
+// System includes
+#include <coemain.h>
+#include <centralrepository.h>
+#include <AiwServiceHandler.h>
+#include <AiwPoCParameters.hrh>
+#include <featmgr.h>
+
+// --------------------------------------------------------------------------
+// CPbk2CallTypeSelector::CPbk2CallTypeSelector
+// --------------------------------------------------------------------------
+//
+CPbk2CallTypeSelector::CPbk2CallTypeSelector
+        ( CVPbkContactManager& aContactManager ) :
+        iContactManager( aContactManager )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallTypeSelector::~CPbk2CallTypeSelector
+// --------------------------------------------------------------------------
+//
+CPbk2CallTypeSelector::~CPbk2CallTypeSelector()
+    {
+    FeatureManager::UnInitializeLib();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallTypeSelector::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2CallTypeSelector* CPbk2CallTypeSelector::NewL
+        ( CVPbkContactManager& aContactManager )
+    {
+    CPbk2CallTypeSelector* self =
+        new ( ELeave ) CPbk2CallTypeSelector( aContactManager );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallTypeSelector::ConstructL
+// --------------------------------------------------------------------------
+//
+void CPbk2CallTypeSelector::ConstructL()
+    {
+    FeatureManager::InitializeLibL();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallTypeSelector::SelectCallTypeL
+// --------------------------------------------------------------------------
+//
+CAiwDialData::TCallType CPbk2CallTypeSelector::SelectCallTypeL
+        ( const TInt aCommandId, MVPbkStoreContact& aContact,
+          const MVPbkBaseContactField* aFocusedField,
+          const MVPbkBaseContactField& aSelectedField ) const
+    {
+    // Default to voice call
+    CAiwDialData::TCallType ret = CAiwDialData::EAIWVoice;
+
+    // If the command was launched via Call UI menu we do not
+    // need to apply our own logic for call type selection.
+    // But if the command was not launched via menu but via the send key
+    // (which is the case when aCommandId is EPbk2CmdCall), we
+    // need to deduct what kind of a call to launch.
+    if ( aCommandId == EPbk2CmdCall )
+        {
+        if ( !aFocusedField )
+            {
+            // If there was no focused field, the call was
+            // launched from names list
+            ret = SelectCallTypeL( aContact, aSelectedField );
+            }
+        else
+            {
+            // There was a focused field, so the
+            // call was launched from info view
+            ret = SelectCallTypeL( aSelectedField );
+            }
+        }
+
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallTypeSelector::OkToLaunchTelephonyCallL
+// --------------------------------------------------------------------------
+//
+TBool CPbk2CallTypeSelector::OkToLaunchTelephonyCallL
+        ( const MVPbkBaseContactField* aSelectedField ) const
+    {
+    // Default to yes
+    TBool ret = ETrue;
+
+    if ( aSelectedField )
+        {
+        TPbk2StoreContactAnalyzer analyzer( iContactManager, NULL );
+
+        if ( analyzer.IsFieldTypeIncludedL( *aSelectedField,
+                R_PHONEBOOK2_PTT_SELECTOR ) )
+            {
+            // In case of PTT field, a POC call is to be launched
+            ret = EFalse;
+            }
+        }
+
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallTypeSelector::SelectPocCallType
+// --------------------------------------------------------------------------
+//
+TInt CPbk2CallTypeSelector::SelectPocCallType
+        ( const MPbk2ContactUiControl& aControl ) const
+    {
+    TInt ret = 0;
+
+    // Check are we in a contact info field (which has focused field)
+    if ( !aControl.FocusedField() )
+        {
+        ret |= EAiwPoCCmdTalkMany;
+        }
+
+    if ( !aControl.ContactsMarked() )
+        {
+        ret |= EAiwPoCCmdTalk1to1 | EAiwPoCCmdSendCallBackRequest;
+        }
+
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallTypeSelector::SelectPocCallTypeForPocKeyPress
+// --------------------------------------------------------------------------
+//
+TInt CPbk2CallTypeSelector::SelectPocCallTypeForPocKeyPress
+        ( const MPbk2ContactUiControl& aControl ) const
+    {
+    TInt all = SelectPocCallType( aControl );
+    TInt ret = all;
+
+    // There is no specified logic for selecting a type.
+    // So just define some priority for the call types.
+    if ( all & EAiwPoCCmdTalkGroup )
+        {
+        ret = EAiwPoCCmdTalkGroup;
+        }
+    else if (all & EAiwPoCCmdTalk1to1)
+        {
+        ret = EAiwPoCCmdTalk1to1;
+        }
+    else if (all & EAiwPoCCmdTalkMany)
+        {
+        ret = EAiwPoCCmdTalkMany;
+        }
+    else if (all & EAiwPoCCmdSendCallBackRequest)
+        {
+        ret = EAiwPoCCmdSendCallBackRequest;
+        }
+
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallTypeSelector::SetDefaultPrioritiesLC
+// --------------------------------------------------------------------------
+//
+void CPbk2CallTypeSelector::SetDefaultPrioritiesLC
+        ( RVPbkContactFieldDefaultPriorities& aDefaults,
+        MVPbkStoreContact& aContact ) const
+    {
+    CleanupClosePushL( aDefaults );
+
+    if ( HasContactAttributeL( EVPbkDefaultTypePhoneNumber, aContact ) )
+        {
+        // Voice overrides everything else
+        User::LeaveIfError( aDefaults.Append( EVPbkDefaultTypePhoneNumber ) );
+        }
+    else if ( HasContactAttributeL( EVPbkDefaultTypeVoIP, aContact ) )
+        {
+        // VoIP overrides everything but voice
+        User::LeaveIfError( aDefaults.Append( EVPbkDefaultTypeVoIP ) );
+        }
+    else if ( HasContactAttributeL( EVPbkDefaultTypeVideoNumber, aContact ) )
+        {
+        // Video overrides POC
+        User::LeaveIfError( aDefaults.Append( EVPbkDefaultTypeVideoNumber ) );
+        }
+    else if ( HasContactAttributeL( EVPbkDefaultTypePOC, aContact ) )
+        {
+        // Only POC default exists, lets use it
+        User::LeaveIfError( aDefaults.Append( EVPbkDefaultTypePOC ) );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallTypeSelector::SelectCallTypeL
+// Selects call type based on selected field and
+// contacts default information.
+// --------------------------------------------------------------------------
+//
+inline CAiwDialData::TCallType CPbk2CallTypeSelector::SelectCallTypeL
+        ( MVPbkStoreContact& aContact,
+          const MVPbkBaseContactField& aSelectedField ) const
+    {
+    // Default to voice call
+    CAiwDialData::TCallType ret = CAiwDialData::EAIWVoice;
+
+    if ( HasContactAttributeL( EVPbkDefaultTypePhoneNumber, aContact ) )
+        {
+        ret = CAiwDialData::EAIWVoice;
+        }
+    else if ( ( HasContactAttributeL( EVPbkDefaultTypeVoIP, aContact ) ) &&
+                ( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) ) )
+        {
+        ret = CAiwDialData::EAIWVoiP;
+        }
+    else if ( HasContactAttributeL( EVPbkDefaultTypeVideoNumber, aContact ) )
+        {
+        ret = CAiwDialData::EAIWForcedVideo;
+        }
+    else
+        {
+        // No defaults, so select based on selected field type only
+        ret = SelectCallTypeBasedOnFieldTypeL( aSelectedField );
+        }
+
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallTypeSelector::SelectCallTypeL
+// Select call type based on field type, the preferred telephony
+// information setting is taken in consideration also.
+// --------------------------------------------------------------------------
+//
+inline CAiwDialData::TCallType CPbk2CallTypeSelector::SelectCallTypeL
+        ( const MVPbkBaseContactField& aSelectedField ) const
+    {
+    // When there is clearly a selected field, the call type
+    // of course depends on the type of the field
+    return SelectCallTypeBasedOnFieldTypeL( aSelectedField );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallTypeSelector::SelectCallTypeBasedOnFieldTypeL
+// This function selects the call type by the type of passed
+// aSelectedField alone.
+// --------------------------------------------------------------------------
+//
+inline CAiwDialData::TCallType
+    CPbk2CallTypeSelector::SelectCallTypeBasedOnFieldTypeL
+        ( const MVPbkBaseContactField& aSelectedField ) const
+    {
+    // Default to voice call
+    CAiwDialData::TCallType ret = CAiwDialData::EAIWVoice;
+
+    TPbk2StoreContactAnalyzer analyzer( iContactManager, NULL );
+
+    if ( analyzer.IsFieldTypeIncludedL( aSelectedField,
+            R_PHONEBOOK2_SIP_SELECTOR ) )
+        {
+        ret = CAiwDialData::EAIWVoiP;
+        }
+    else if ( analyzer.IsFieldTypeIncludedL( aSelectedField,
+            R_PHONEBOOK2_VIDEO_SELECTOR ) )
+        {
+        ret = CAiwDialData::EAIWForcedVideo;
+        }
+
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallTypeSelector::HasContactAttributeL
+// Checks if aContact has default attribute of given type.
+// --------------------------------------------------------------------------
+//
+TBool CPbk2CallTypeSelector::HasContactAttributeL
+        ( TVPbkDefaultType aType, MVPbkStoreContact& aContact ) const
+    {
+    TBool retval = EFalse;
+
+    CVPbkDefaultAttribute* attr = CVPbkDefaultAttribute::NewL( aType );
+    CleanupStack::PushL( attr );
+    MVPbkContactAttributeManager& attrManager =
+        iContactManager.ContactAttributeManagerL();
+    retval = attrManager.HasContactAttributeL( *attr, aContact );
+    CleanupStack::PopAndDestroy( attr );
+
+    return retval;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallTypeSelector::SetDefaultPrioritiesLC
+// --------------------------------------------------------------------------
+//
+void CPbk2CallTypeSelector::SetDefaultPrioritiesLC
+        ( RVPbkContactFieldDefaultPriorities& aDefaults,
+        MVPbkStoreContact& aContact,
+        VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aSelector ) const
+    {
+    CleanupClosePushL( aDefaults );
+
+    switch( aSelector )
+        {
+        case VPbkFieldTypeSelectorFactory::EVoiceCallSelector :
+            if ( HasContactAttributeL( EVPbkDefaultTypePhoneNumber, aContact ) )
+                {
+                User::LeaveIfError( aDefaults.Append( EVPbkDefaultTypePhoneNumber ) );
+                }
+            break;
+        case VPbkFieldTypeSelectorFactory::EVOIPCallSelector :
+            if ( HasContactAttributeL( EVPbkDefaultTypeVoIP, aContact ) )
+                {
+                User::LeaveIfError( aDefaults.Append( EVPbkDefaultTypeVoIP ) );
+                }
+            break;
+        case VPbkFieldTypeSelectorFactory::EVideoCallSelector :
+            if ( HasContactAttributeL( EVPbkDefaultTypeVideoNumber, aContact ) )
+                {
+                User::LeaveIfError( aDefaults.Append( EVPbkDefaultTypeVideoNumber ) );
+                }
+            break;
+        case VPbkFieldTypeSelectorFactory::EPocSelector :
+            if ( HasContactAttributeL( EVPbkDefaultTypePOC, aContact ) )
+                {
+                User::LeaveIfError( aDefaults.Append( EVPbkDefaultTypePOC ) );
+                }
+            break;
+        default:
+            break;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallTypeSelector::SelectVoipCallTypeL
+// --------------------------------------------------------------------------
+//
+CAiwDialData::TCallType CPbk2CallTypeSelector::SelectVoipCallTypeL(
+        const MVPbkBaseContactField* aSelectedField ) const
+    {
+    // Default to CAiwDialData::EAIWVoiP
+    CAiwDialData::TCallType ret = CAiwDialData::EAIWVoiP;
+
+    TPbk2StoreContactAnalyzer analyzer( iContactManager, NULL );
+    
+    // Call type should be set CAiwDialData::EAIWVoice 
+    // if mobile field (or other CS field) is selected 
+    if ( analyzer.IsFieldTypeIncludedL( *aSelectedField,
+    		R_PHONEBOOK2_VOIP_CALL_OUT_SELECTOR ) )
+        {
+        ret = CAiwDialData::EAIWVoice ;
+        }
+    
+    return ret;
+    }
+        
+// End of File