phoneapp/phoneuiqtviewadapter/src/phonecallheadermanager.cpp
changeset 77 2be0b271d017
child 76 cfea66083b62
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneapp/phoneuiqtviewadapter/src/phonecallheadermanager.cpp	Mon Oct 04 00:16:48 2010 +0300
@@ -0,0 +1,386 @@
+/*!
+* Copyright (c) 2009 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:  Phone UI's symbian adapter for Qt view.
+*
+*/
+
+#include "phonecallheadermanager.h"
+#include "phonecallheaderutil.h"
+#include "phoneuiqtviewif.h"
+#include "phonebubblewrapper.h"
+#include "tphonecmdparaminteger.h"
+#include "tphonecmdparamboolean.h"
+#include "tphonecmdparamaudioavailability.h"
+#include "tphonecmdparamaudiooutput.h"
+#include "tphonecmdparamcallstatedata.h"
+#include "tphonecmdparamcallheaderdata.h"
+#include "tphonecmdparamemergencycallheaderdata.h"
+#include "tphonecmdparamstring.h"
+#include "phonerssbase.h"
+#include "cphonemediatorfactory.h"
+#include "cphonemediatorsender.h"
+#include "phoneviewcommanddefinitions.h"
+
+#include <bubblemanagerif.h>
+#include <pevirtualengine.h>
+#include <mpeengineinfo.h>
+
+
+//CONSTANTS
+
+
+inline Qt::TextElideMode clipToElide(
+    TPhoneCmdParamCallHeaderData::TPhoneTextClippingDirection clip)
+    {
+    return clip == TPhoneCmdParamCallHeaderData::ELeft ? 
+                   Qt::ElideLeft : Qt::ElideRight;
+    }
+
+PhoneCallHeaderManager::PhoneCallHeaderManager(PhoneBubbleWrapper &bubbleWrapper, 
+        PhoneUIQtViewIF &view, QObject *parent) :
+    QObject(parent),
+    m_bubbleWrapper(bubbleWrapper),
+    m_view(view),
+    m_callHeaderUtil(0),
+    m_resourceAdapter(0)
+{
+    
+}
+
+PhoneCallHeaderManager::~PhoneCallHeaderManager ()
+{
+    delete m_callHeaderUtil;
+}
+
+
+
+void PhoneCallHeaderManager::setEngineInfo(MPEEngineInfo* engineInfo)
+{
+    m_engineInfo = engineInfo;
+}
+
+void PhoneCallHeaderManager::createCallHeader(
+    int callId)
+{
+    TPhoneCmdParamCallHeaderData data;
+    
+    if (isIncoming(callId)) {
+        callHeaderUtil()->SetIncomingCallHeaderParams( 
+                callId, 
+                isWaitingCall(callId),
+                isVideoCall(callId),  
+                &data );
+    } else {
+        callHeaderUtil()->SetOutgoingCallHeaderParams(
+                callId,
+                &data);
+    }
+
+    m_bubbleWrapper.bubbleManager().startChanges ();
+
+    if (m_bubbleWrapper.bubbleManager().isConferenceExpanded())
+        {
+        m_bubbleWrapper.bubbleManager().setExpandedConferenceCallHeader(false);
+        }
+
+    int bubble = m_bubbleWrapper.createCallHeader(callId);
+    m_bubbleWrapper.setState(callId, bubble, data.CallState ());        
+    m_bubbleWrapper.setCli(bubble, data.CLIText(), clipToElide(data.CLITextClippingDirection()));
+    m_bubbleWrapper.setServiceId(callId, data.ServiceId());
+    m_bubbleWrapper.setSecondaryCli(bubble, data.CNAPText (), clipToElide(data.CNAPTextClippingDirection()));
+    m_bubbleWrapper.setLabel(bubble, data.LabelText ());
+    m_bubbleWrapper.setCallType(bubble, data.CallType ());
+    m_bubbleWrapper.setDivert(bubble, data.Diverted ());
+    m_bubbleWrapper.setCiphering(bubble, data.CipheringIndicatorAllowed(), data.Ciphering());
+
+    if (data.Picture().Length()) {
+        QString imagePath =
+            QString::fromUtf16(data.Picture().Ptr(),data.Picture().Length());
+        m_bubbleWrapper.bubbleManager().setCallObjectImage(bubble,imagePath);
+    } else {
+        m_bubbleWrapper.bubbleManager().setCallObjectFromTheme(bubble);
+    }
+    m_bubbleWrapper.bubbleManager().endChanges ();
+
+    CPhoneMediatorFactory::Instance()->Sender()->SendEvent(EPhoneViewCreateCallHeader, callId, data);
+}
+
+void PhoneCallHeaderManager::createEmergencyCallHeader(int callId)
+{
+    m_bubbleWrapper.bubbleManager().startChanges ();
+    int bubble = m_bubbleWrapper.createCallHeader (callId);
+    m_bubbleWrapper.setLabel(bubble, callHeaderUtil()->AttemptingEmergencyText());
+    m_bubbleWrapper.setCli (bubble, callHeaderUtil()->EmergencyHeaderText(), Qt::ElideRight);
+    m_bubbleWrapper.setState(callId, bubble, EPEStateDialing);
+    m_bubbleWrapper.setCiphering(bubble, m_engineInfo->SecureSpecified(), m_engineInfo->ServiceId(callId));
+    m_bubbleWrapper.bubbleManager().endChanges ();
+
+}
+
+void PhoneCallHeaderManager::removeCallHeader(int callId)
+{
+    m_bubbleWrapper.bubbleManager().startChanges();
+    int bubble = m_bubbleWrapper.bubbles().value(callId, -1);
+    if ( bubble != -1 ) {
+        m_view.clearBubbleCommands(bubble);
+        m_view.removeExpandAction(bubble);
+        m_bubbleWrapper.removeCallHeader(callId);
+    }
+    m_bubbleWrapper.bubbleManager().endChanges();
+}
+
+void PhoneCallHeaderManager::updateCallHeaderState(int callId)
+{
+
+    int bubble = m_bubbleWrapper.bubbleId(callId);
+    if ( -1 != bubble ) {
+        m_bubbleWrapper.bubbleManager ().startChanges ();
+        m_bubbleWrapper.setState(callId, bubble, callHeaderUtil()->CallState(callId));
+        m_bubbleWrapper.setLabel(bubble, callHeaderUtil()->LabelText(callId));
+        m_bubbleWrapper.setDivert(bubble, m_engineInfo->IncomingCallForwarded(callId));
+        m_bubbleWrapper.bubbleManager().endChanges ();
+    }
+}
+
+void PhoneCallHeaderManager::updateCallHeaderRemoteInfo(int callId)
+{
+
+    TPhoneCmdParamCallHeaderData data;
+
+     int bubble = m_bubbleWrapper.bubbleId(callId);
+     if ( -1 != bubble ) {
+         callHeaderUtil()->UpdateCallHeaderInfo( 
+                 callId, 
+                 isWaitingCall(callId),
+                 isVideoCall(callId),  
+                 &data );
+         
+         m_bubbleWrapper.bubbleManager().startChanges();
+         m_bubbleWrapper.setCli(bubble, data.CLIText(),
+             clipToElide(data.CLITextClippingDirection()));
+         m_bubbleWrapper.setSecondaryCli(bubble, data.CNAPText (),
+             clipToElide(data.CNAPTextClippingDirection()));
+         m_bubbleWrapper.setDivert(bubble, m_engineInfo->IncomingCallForwarded(callId));
+         m_bubbleWrapper.bubbleManager().endChanges ();
+     }
+
+}
+
+void PhoneCallHeaderManager::updateCallHeaderRemoteInfoAndLabel (int callId)
+{
+    TPhoneCmdParamCallHeaderData data;
+
+     int bubble = m_bubbleWrapper.bubbleId(callId);
+     if ( -1 != bubble ) {
+         callHeaderUtil()->UpdateCallHeaderInfo( 
+                 callId, 
+                 isWaitingCall(callId),
+                 isVideoCall(callId),  
+                 &data );
+         
+         m_bubbleWrapper.bubbleManager().startChanges ();
+         m_bubbleWrapper.setCli(bubble, data.CLIText (),
+             clipToElide(data.CLITextClippingDirection()));
+         m_bubbleWrapper.setSecondaryCli(bubble, data.CNAPText (),
+             clipToElide(data.CNAPTextClippingDirection()));
+         m_bubbleWrapper.setLabel(bubble, data.LabelText ());
+         m_bubbleWrapper.setDivert(bubble, data.Diverted ());
+         m_bubbleWrapper.bubbleManager().endChanges ();
+     }
+}
+
+void PhoneCallHeaderManager::handleCipheringInfoChange(int callId)
+{
+    if (callId == KPEConferenceCallID) {
+        bool secure(true);
+        for (int i=0; i<m_bubbleWrapper.conferenceCallList().count(); i++) {
+            if ( false == m_engineInfo->IsSecureCall(m_bubbleWrapper.conferenceCallList().at(i)) ) {
+                secure = false;
+                break;
+            }
+        }
+        m_bubbleWrapper.bubbleManager().startChanges();
+        m_bubbleWrapper.setCiphering(m_bubbleWrapper.bubbleId(callId),
+                                     m_engineInfo->SecureSpecified(),
+                                     secure);
+        m_bubbleWrapper.bubbleManager().endChanges();
+    } else {
+        int bubble = m_bubbleWrapper.bubbleId(callId);        
+        if ( -1 != bubble ) {        
+            m_bubbleWrapper.bubbleManager().startChanges();
+            m_bubbleWrapper.setCiphering(bubble,
+                                         m_engineInfo->SecureSpecified(),
+                                         m_engineInfo->IsSecureCall(callId));
+            m_bubbleWrapper.bubbleManager().endChanges();
+        }
+    }
+}
+
+
+
+
+void PhoneCallHeaderManager::createConferenceBubble(int callId)
+{
+    m_bubbleWrapper.bubbleManager().startChanges();
+    TBuf<KPhoneCallHeaderLabelMaxLength> conferenceText( KNullDesC );
+    callHeaderUtil()->LoadResource(conferenceText, EPhoneCLIConferenceCall);
+    int bubble = m_bubbleWrapper.createConferenceBubble(
+            callId, callHeaderUtil()->CallState(callId), callHeaderUtil()->LabelText(callId), conferenceText);
+    
+    m_bubbleWrapper.setServiceId(callId, m_engineInfo->ServiceId(callId));
+    m_bubbleWrapper.setCiphering(bubble, m_engineInfo->SecureSpecified(), m_engineInfo->IsSecureCall(callId));
+    m_bubbleWrapper.bubbleManager().endChanges();
+}
+
+
+void PhoneCallHeaderManager::removeConferenceBubble()
+{
+    m_bubbleWrapper.bubbleManager().startChanges();
+    m_view.removeExpandAction(m_bubbleWrapper.bubbleId(KConferenceCallId));
+    m_view.clearParticipantListActions();
+    m_bubbleWrapper.removeConferenceBubble();
+    m_bubbleWrapper.bubbleManager().endChanges();
+}
+
+void PhoneCallHeaderManager::removeCallFromConference(int callId)
+{
+    m_bubbleWrapper.bubbleManager().startChanges();
+    m_bubbleWrapper.removeCallFromConference(callId);
+    int bubbleId = m_bubbleWrapper.bubbles().value(callId);
+    m_view.clearBubbleCommands(bubbleId);
+    m_view.removeExpandAction(bubbleId);
+    m_bubbleWrapper.removeCallHeader(callId);
+    m_bubbleWrapper.bubbleManager().endChanges();
+}
+
+
+void PhoneCallHeaderManager::setPrivateFromConference(int callId)
+{
+    m_bubbleWrapper.bubbleManager().startChanges();
+    m_bubbleWrapper.bubbleManager().setExpandedConferenceCallHeader(false);
+    m_bubbleWrapper.removeCallFromConference(callId);
+    m_view.clearBubbleCommands(m_bubbleWrapper.bubbles().value(callId));
+    m_bubbleWrapper.bubbleManager().endChanges();
+}
+
+
+void PhoneCallHeaderManager::setExpandedConferenceCallHeader()
+{
+    int callId = -1;
+
+    if ( 1==m_bubbleWrapper.bubbles().keys().size()
+         || (1<m_bubbleWrapper.bubbles().keys().size()
+         && false == m_bubbleWrapper.callStates().values().contains(EPEStateRinging)
+         && false == m_bubbleWrapper.callStates().values().contains(EPEStateDialing)
+         && false == m_bubbleWrapper.callStates().values().contains(EPEStateConnecting)
+         && false == m_bubbleWrapper.callStates().values().contains(EPEStateHeldConference))) {
+
+        int bubbleId = m_bubbleWrapper.bubbleManager().expandedBubble();
+        callId = m_bubbleWrapper.callIdByBubbleId(bubbleId);
+    }
+
+    m_bubbleWrapper.bubbleManager().startChanges();
+    m_bubbleWrapper.bubbleManager().setExpandedConferenceCallHeader(
+            (KConferenceCallId == callId));
+    m_bubbleWrapper.bubbleManager().endChanges();
+}
+
+
+void PhoneCallHeaderManager::removeAllCallHeaders()
+{
+    if (m_bubbleWrapper.conferenceCallList().size()) {
+        removeConferenceBubble();
+    }
+
+    QList<int> callIds = m_bubbleWrapper.bubbles().keys();
+
+    for (int i=0; i<callIds.size(); ++i) {
+        int callId = callIds.at(i);
+        if (KEmergencyCallId != callId) {
+            m_bubbleWrapper.bubbleManager().startChanges();
+            int bubble = m_bubbleWrapper.bubbles().value(callId);
+            m_view.clearBubbleCommands(bubble);
+            m_view.removeExpandAction(bubble);
+            m_bubbleWrapper.removeCallHeader (callId);
+            m_bubbleWrapper.bubbleManager().endChanges();
+        }
+    }
+}
+
+// ---------------------------------------------------------------------------
+//  PhoneCallHeaderUtil::IsVoiceCall
+// ---------------------------------------------------------------------------
+//
+bool PhoneCallHeaderManager::isVoiceCall(int callId) const
+    {
+    if( callId < 0 )
+        {
+        return ( m_engineInfo->CallTypeCommand()
+                    == EPECallTypeCSVoice ||
+                m_engineInfo->CallTypeCommand()
+                    == EPECallTypeVoIP );  
+        }
+    
+    return ( m_engineInfo->CallType( callId )
+                == EPECallTypeCSVoice ||
+             m_engineInfo->CallType( callId )
+                == EPECallTypeVoIP );
+    }
+
+
+// ---------------------------------------------------------------------------
+//  PhoneCallHeaderUtil::IsVideoCall
+// ---------------------------------------------------------------------------
+//
+bool PhoneCallHeaderManager::isVideoCall(int callId) const
+    {
+    if( callId < 0 )
+        {
+        return ( m_engineInfo->CallTypeCommand()
+            == EPECallTypeVideo );  
+        }
+    return ( m_engineInfo->CallType( callId )
+            == EPECallTypeVideo );
+    }
+
+bool PhoneCallHeaderManager::isIncoming(int callId) const
+    {
+    return callId >= 0 && 
+           m_engineInfo->CallState( callId ) == EPEStateRinging;
+    }
+
+bool PhoneCallHeaderManager::isWaitingCall(int callId) const
+    {
+    bool waiting( EFalse );
+    if ( callId >= 0 && 
+         m_engineInfo->CallState( callId ) == EPEStateRinging )
+        {
+        if( m_bubbleWrapper.activeCallCount() > 0 )
+            {
+            waiting = ETrue;
+            }
+        }
+    return waiting;
+    }
+
+PhoneCallHeaderUtil *PhoneCallHeaderManager::callHeaderUtil()
+{
+    if (!m_callHeaderUtil) {
+        m_callHeaderUtil = new PhoneCallHeaderUtil(*m_engineInfo);
+    }
+
+    return m_callHeaderUtil;
+}
+
+