fixed EXT-2884 Initiation of a voice call should not bring text chat (p2p, ad-hoc, group)
Added flag to an LLIMSession which indicated whether it has been created for a voice call. --HG-- branch : product-engine
parent
734f37816e
commit
9dd2b29031
|
|
@ -211,11 +211,9 @@ void LLAvatarActions::startCall(const LLUUID& id)
|
|||
|
||||
std::string name;
|
||||
gCacheName->getFullName(id, name);
|
||||
LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id);
|
||||
LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id, true);
|
||||
if (session_id != LLUUID::null)
|
||||
{
|
||||
// always open IM window when connecting to voice
|
||||
LLIMFloater::show(session_id);
|
||||
gIMMgr->startCall(session_id);
|
||||
}
|
||||
make_ui_sound("UISndStartIM");
|
||||
|
|
@ -239,15 +237,12 @@ void LLAvatarActions::startAdhocCall(const std::vector<LLUUID>& ids)
|
|||
// create the new ad hoc voice session
|
||||
const std::string title = LLTrans::getString("conference-title");
|
||||
LLUUID session_id = gIMMgr->addSession(title, IM_SESSION_CONFERENCE_START,
|
||||
ids[0], id_array);
|
||||
ids[0], id_array, true);
|
||||
if (session_id == LLUUID::null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// always open IM window when connecting to voice
|
||||
LLIMFloater::show(session_id);
|
||||
|
||||
// start the call once the session has fully initialized
|
||||
gIMMgr->autoStartCallOnStartup(session_id);
|
||||
|
||||
|
|
|
|||
|
|
@ -78,6 +78,9 @@ LLBottomTray::LLBottomTray(const LLSD&)
|
|||
LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraPresets, _2));
|
||||
LLIMMgr::getInstance()->addSessionObserver(this);
|
||||
|
||||
//managing chiclets for voice calls
|
||||
LLIMModel::getInstance()->addNewMsgCallback(boost::bind(&LLBottomTray::onNewIM, this, _1));
|
||||
|
||||
//this is to fix a crash that occurs because LLBottomTray is a singleton
|
||||
//and thus is deleted at the end of the viewers lifetime, but to be cleanly
|
||||
//destroyed LLBottomTray requires some subsystems that are long gone
|
||||
|
|
@ -143,25 +146,22 @@ LLIMChiclet* LLBottomTray::createIMChiclet(const LLUUID& session_id)
|
|||
//virtual
|
||||
void LLBottomTray::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
|
||||
{
|
||||
if(getChicletPanel())
|
||||
{
|
||||
if(getChicletPanel()->findChiclet<LLChiclet>(session_id))
|
||||
{
|
||||
if (!getChicletPanel()) return;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
LLIMChiclet* chiclet = createIMChiclet(session_id);
|
||||
if(chiclet)
|
||||
{
|
||||
chiclet->setIMSessionName(name);
|
||||
chiclet->setOtherParticipantId(other_participant_id);
|
||||
}
|
||||
else
|
||||
{
|
||||
llerrs << "Could not create chiclet" << llendl;
|
||||
}
|
||||
}
|
||||
if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return;
|
||||
|
||||
// For im sessions started as voice call chiclet gets created on the first incoming message
|
||||
if (gIMMgr->isVoiceCall(session_id)) return;
|
||||
|
||||
LLIMChiclet* chiclet = createIMChiclet(session_id);
|
||||
if(chiclet)
|
||||
{
|
||||
chiclet->setIMSessionName(name);
|
||||
chiclet->setOtherParticipantId(other_participant_id);
|
||||
}
|
||||
else
|
||||
{
|
||||
llerrs << "Could not create chiclet" << llendl;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -194,6 +194,28 @@ void LLBottomTray::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID&
|
|||
}
|
||||
}
|
||||
|
||||
void LLBottomTray::onNewIM(const LLSD& data)
|
||||
{
|
||||
LLUUID from_id = data["from_id"];
|
||||
if (from_id.isNull() || gAgentID == from_id) return;
|
||||
|
||||
LLUUID session_id = data["session_id"];
|
||||
if (session_id.isNull()) return;
|
||||
|
||||
if (!gIMMgr->isVoiceCall(session_id)) return;
|
||||
|
||||
if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return;
|
||||
|
||||
//first real message, time to create chiclet
|
||||
LLIMChiclet* chiclet = createIMChiclet(session_id);
|
||||
if(chiclet)
|
||||
{
|
||||
chiclet->setIMSessionName(LLIMModel::getInstance()->getName(session_id));
|
||||
chiclet->setOtherParticipantId(LLIMModel::getInstance()->getOtherParticipantID(session_id));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// virtual
|
||||
void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, bool proximal)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -75,6 +75,8 @@ public:
|
|||
virtual void sessionRemoved(const LLUUID& session_id);
|
||||
void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
|
||||
|
||||
void onNewIM(const LLSD& data);
|
||||
|
||||
virtual void reshape(S32 width, S32 height, BOOL called_from_parent);
|
||||
|
||||
virtual void onFocusLost();
|
||||
|
|
|
|||
|
|
@ -153,7 +153,7 @@ LLIMModel::LLIMModel()
|
|||
addNewMsgCallback(toast_callback);
|
||||
}
|
||||
|
||||
LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
|
||||
LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice)
|
||||
: mSessionID(session_id),
|
||||
mName(name),
|
||||
mType(type),
|
||||
|
|
@ -167,7 +167,8 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
|
|||
mCallBackEnabled(true),
|
||||
mTextIMPossible(true),
|
||||
mOtherParticipantIsAvatar(true),
|
||||
mStartCallOnInitialize(false)
|
||||
mStartCallOnInitialize(false),
|
||||
mStartedAsIMCall(voice)
|
||||
{
|
||||
// set P2P type by default
|
||||
mSessionType = P2P_SESSION;
|
||||
|
|
@ -250,10 +251,10 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
|
|||
switch(new_state)
|
||||
{
|
||||
case LLVoiceChannel::STATE_CALL_STARTED :
|
||||
LLIMModel::getInstance()->addMessage(mSessionID, other_avatar_name, mOtherParticipantID, "Started a voice call");
|
||||
LLIMModel::getInstance()->addMessageSilently(mSessionID, other_avatar_name, mOtherParticipantID, "Started a voice call");
|
||||
break;
|
||||
case LLVoiceChannel::STATE_CONNECTED :
|
||||
LLIMModel::getInstance()->addMessage(mSessionID, "You", gAgent.getID(), "Joined the voice call");
|
||||
LLIMModel::getInstance()->addMessageSilently(mSessionID, "You", gAgent.getID(), "Joined the voice call");
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -263,10 +264,10 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
|
|||
switch(new_state)
|
||||
{
|
||||
case LLVoiceChannel::STATE_CALL_STARTED :
|
||||
LLIMModel::getInstance()->addMessage(mSessionID, "You", gAgent.getID(), "Started a voice call");
|
||||
LLIMModel::getInstance()->addMessageSilently(mSessionID, "You", gAgent.getID(), "Started a voice call");
|
||||
break;
|
||||
case LLVoiceChannel::STATE_CONNECTED :
|
||||
LLIMModel::getInstance()->addMessage(mSessionID, other_avatar_name, mOtherParticipantID, "Joined the voice call");
|
||||
LLIMModel::getInstance()->addMessageSilently(mSessionID, other_avatar_name, mOtherParticipantID, "Joined the voice call");
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -452,7 +453,7 @@ void LLIMModel::testMessages()
|
|||
|
||||
//session name should not be empty
|
||||
bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type,
|
||||
const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
|
||||
const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice)
|
||||
{
|
||||
if (name.empty())
|
||||
{
|
||||
|
|
@ -466,7 +467,7 @@ bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, co
|
|||
return false;
|
||||
}
|
||||
|
||||
LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids);
|
||||
LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids, voice);
|
||||
mId2SessionMap[session_id] = session;
|
||||
|
||||
LLIMMgr::getInstance()->notifyObserverSessionAdded(session_id, name, other_participant_id);
|
||||
|
|
@ -475,6 +476,12 @@ bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, co
|
|||
|
||||
}
|
||||
|
||||
bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, bool voice)
|
||||
{
|
||||
std::vector<LLUUID> no_ids;
|
||||
return newSession(session_id, name, type, other_participant_id, no_ids, voice);
|
||||
}
|
||||
|
||||
bool LLIMModel::clearSession(const LLUUID& session_id)
|
||||
{
|
||||
if (mId2SessionMap.find(session_id) == mId2SessionMap.end()) return false;
|
||||
|
|
@ -574,25 +581,9 @@ bool LLIMModel::proccessOnlineOfflineNotification(
|
|||
|
||||
bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,
|
||||
const std::string& utf8_text, bool log2file /* = true */) {
|
||||
LLIMSession* session = findIMSession(session_id);
|
||||
|
||||
if (!session)
|
||||
{
|
||||
llwarns << "session " << session_id << "does not exist " << llendl;
|
||||
return false;
|
||||
}
|
||||
|
||||
addToHistory(session_id, from, from_id, utf8_text);
|
||||
if (log2file) logToFile(session_id, from, from_id, utf8_text);
|
||||
|
||||
session->mNumUnread++;
|
||||
|
||||
//update count of unread messages from real participant
|
||||
if (!(from_id.isNull() || from_id == gAgentID || SYSTEM_FROM == from))
|
||||
{
|
||||
++(session->mParticipantUnreadMessageCount);
|
||||
}
|
||||
|
||||
LLIMSession* session = addMessageSilently(session_id, from, from_id, utf8_text, log2file);
|
||||
if (!session) return false;
|
||||
|
||||
// notify listeners
|
||||
LLSD arg;
|
||||
|
|
@ -608,6 +599,31 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co
|
|||
return true;
|
||||
}
|
||||
|
||||
LLIMModel::LLIMSession* LLIMModel::addMessageSilently(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,
|
||||
const std::string& utf8_text, bool log2file /* = true */)
|
||||
{
|
||||
LLIMSession* session = findIMSession(session_id);
|
||||
|
||||
if (!session)
|
||||
{
|
||||
llwarns << "session " << session_id << "does not exist " << llendl;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
addToHistory(session_id, from, from_id, utf8_text);
|
||||
if (log2file) logToFile(session_id, from, from_id, utf8_text);
|
||||
|
||||
session->mNumUnread++;
|
||||
|
||||
//update count of unread messages from real participant
|
||||
if (!(from_id.isNull() || from_id == gAgentID || SYSTEM_FROM == from))
|
||||
{
|
||||
++(session->mParticipantUnreadMessageCount);
|
||||
}
|
||||
|
||||
return session;
|
||||
}
|
||||
|
||||
|
||||
const std::string& LLIMModel::getName(const LLUUID& session_id) const
|
||||
{
|
||||
|
|
@ -1056,8 +1072,8 @@ public:
|
|||
|| mInvitiationType == LLIMMgr::INVITATION_TYPE_IMMEDIATE)
|
||||
&& LLIMModel::getInstance()->findIMSession(mSessionID))
|
||||
{
|
||||
// always open IM window when connecting to voice
|
||||
LLIMFloater::show(mSessionID);
|
||||
// TODO remove in 2010, for voice calls we do not open an IM window
|
||||
//LLIMFloater::show(mSessionID);
|
||||
}
|
||||
|
||||
gIMMgr->clearPendingAgentListUpdates(mSessionID);
|
||||
|
|
@ -1582,11 +1598,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
|
|||
|
||||
if (voice)
|
||||
{
|
||||
if (gIMMgr->startCall(session_id, LLVoiceChannel::INCOMING_CALL))
|
||||
{
|
||||
// always open IM window when connecting to voice
|
||||
LLIMFloater::show(session_id);
|
||||
}
|
||||
gIMMgr->startCall(session_id, LLVoiceChannel::INCOMING_CALL);
|
||||
}
|
||||
|
||||
gIMMgr->clearPendingAgentListUpdates(session_id);
|
||||
|
|
@ -1625,11 +1637,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
|
|||
}
|
||||
}
|
||||
|
||||
LLUUID new_session_id = gIMMgr->addSession(correct_session_name, type, session_id);
|
||||
if (new_session_id != LLUUID::null)
|
||||
{
|
||||
LLIMFloater::show(new_session_id);
|
||||
}
|
||||
LLUUID new_session_id = gIMMgr->addSession(correct_session_name, type, session_id, true);
|
||||
|
||||
std::string url = gAgent.getRegion()->getCapability(
|
||||
"ChatSessionRequest");
|
||||
|
|
@ -1705,11 +1713,7 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response)
|
|||
payload["session_handle"].asString(),
|
||||
payload["session_uri"].asString());
|
||||
|
||||
if (gIMMgr->startCall(session_id))
|
||||
{
|
||||
// always open IM window when connecting to voice
|
||||
LLIMFloater::show(session_id);
|
||||
}
|
||||
gIMMgr->startCall(session_id);
|
||||
|
||||
gIMMgr->clearPendingAgentListUpdates(session_id);
|
||||
gIMMgr->clearPendingInvitation(session_id);
|
||||
|
|
@ -1719,11 +1723,7 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response)
|
|||
LLUUID new_session_id = gIMMgr->addSession(
|
||||
payload["session_name"].asString(),
|
||||
type,
|
||||
session_id);
|
||||
if (new_session_id != LLUUID::null)
|
||||
{
|
||||
LLIMFloater::show(new_session_id);
|
||||
}
|
||||
session_id, true);
|
||||
|
||||
std::string url = gAgent.getRegion()->getCapability(
|
||||
"ChatSessionRequest");
|
||||
|
|
@ -2018,11 +2018,7 @@ LLUUID LLIMMgr::addP2PSession(const std::string& name,
|
|||
const std::string& voice_session_handle,
|
||||
const std::string& caller_uri)
|
||||
{
|
||||
LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id);
|
||||
if (session_id != LLUUID::null)
|
||||
{
|
||||
LLIMFloater::show(session_id);
|
||||
}
|
||||
LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id, true);
|
||||
|
||||
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
|
||||
if (speaker_mgr)
|
||||
|
|
@ -2043,11 +2039,11 @@ LLUUID LLIMMgr::addP2PSession(const std::string& name,
|
|||
LLUUID LLIMMgr::addSession(
|
||||
const std::string& name,
|
||||
EInstantMessage dialog,
|
||||
const LLUUID& other_participant_id)
|
||||
const LLUUID& other_participant_id, bool voice)
|
||||
{
|
||||
LLDynamicArray<LLUUID> ids;
|
||||
ids.put(other_participant_id);
|
||||
return addSession(name, dialog, other_participant_id, ids);
|
||||
return addSession(name, dialog, other_participant_id, ids, voice);
|
||||
}
|
||||
|
||||
// Adds a session using the given session_id. If the session already exists
|
||||
|
|
@ -2056,7 +2052,7 @@ LLUUID LLIMMgr::addSession(
|
|||
const std::string& name,
|
||||
EInstantMessage dialog,
|
||||
const LLUUID& other_participant_id,
|
||||
const LLDynamicArray<LLUUID>& ids)
|
||||
const LLDynamicArray<LLUUID>& ids, bool voice)
|
||||
{
|
||||
if (0 == ids.getLength())
|
||||
{
|
||||
|
|
@ -2075,7 +2071,7 @@ LLUUID LLIMMgr::addSession(
|
|||
|
||||
if (new_session)
|
||||
{
|
||||
LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids);
|
||||
LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids, voice);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -2454,6 +2450,14 @@ bool LLIMMgr::endCall(const LLUUID& session_id)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool LLIMMgr::isVoiceCall(const LLUUID& session_id)
|
||||
{
|
||||
LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id);
|
||||
if (!im_session) return false;
|
||||
|
||||
return im_session->mStartedAsIMCall;
|
||||
}
|
||||
|
||||
// create a floater and update internal representation for
|
||||
// consistency. Returns the pointer, caller (the class instance since
|
||||
// it is a private method) is not responsible for deleting the
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ public:
|
|||
} SType;
|
||||
|
||||
LLIMSession(const LLUUID& session_id, const std::string& name,
|
||||
const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids);
|
||||
const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice);
|
||||
virtual ~LLIMSession();
|
||||
|
||||
void sessionInitReplyReceived(const LLUUID& new_session_id);
|
||||
|
|
@ -104,6 +104,9 @@ public:
|
|||
bool mTextIMPossible;
|
||||
bool mOtherParticipantIsAvatar;
|
||||
bool mStartCallOnInitialize;
|
||||
|
||||
//if IM session is created for a voice call
|
||||
bool mStartedAsIMCall;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -143,7 +146,10 @@ public:
|
|||
* @param name session name should not be empty, will return false if empty
|
||||
*/
|
||||
bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id,
|
||||
const std::vector<LLUUID>& ids = std::vector<LLUUID>());
|
||||
const std::vector<LLUUID>& ids, bool voice = false);
|
||||
|
||||
bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type,
|
||||
const LLUUID& other_participant_id, bool voice = false);
|
||||
|
||||
/**
|
||||
* Remove all session data associated with a session specified by session_id
|
||||
|
|
@ -162,6 +168,12 @@ public:
|
|||
*/
|
||||
bool addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& other_participant_id, const std::string& utf8_text, bool log2file = true);
|
||||
|
||||
/**
|
||||
* Similar to addMessage(...) above but won't send a signal about a new message added
|
||||
*/
|
||||
LLIMModel::LLIMSession* addMessageSilently(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,
|
||||
const std::string& utf8_text, bool log2file = true);
|
||||
|
||||
/**
|
||||
* Add a system message to an IM Model
|
||||
*/
|
||||
|
|
@ -284,14 +296,14 @@ public:
|
|||
// session.
|
||||
LLUUID addSession(const std::string& name,
|
||||
EInstantMessage dialog,
|
||||
const LLUUID& other_participant_id);
|
||||
const LLUUID& other_participant_id, bool voice = false);
|
||||
|
||||
// Adds a session using a specific group of starting agents
|
||||
// the dialog type is assumed correct. Returns the uuid of the session.
|
||||
LLUUID addSession(const std::string& name,
|
||||
EInstantMessage dialog,
|
||||
const LLUUID& other_participant_id,
|
||||
const LLDynamicArray<LLUUID>& ids);
|
||||
const LLDynamicArray<LLUUID>& ids, bool voice = false);
|
||||
|
||||
/**
|
||||
* Creates a P2P session with the requisite handle for responding to voice calls.
|
||||
|
|
@ -391,6 +403,8 @@ public:
|
|||
**/
|
||||
bool endCall(const LLUUID& session_id);
|
||||
|
||||
bool isVoiceCall(const LLUUID& session_id);
|
||||
|
||||
private:
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -709,15 +709,15 @@ BOOL LLIMWellWindow::postBuild()
|
|||
void LLIMWellWindow::sessionAdded(const LLUUID& session_id,
|
||||
const std::string& name, const LLUUID& other_participant_id)
|
||||
{
|
||||
if (mMessageList->getItemByValue(session_id) == NULL)
|
||||
{
|
||||
S32 chicletCounter = LLIMModel::getInstance()->getNumUnread(session_id);
|
||||
if (chicletCounter > -1)
|
||||
{
|
||||
addIMRow(session_id, chicletCounter, name, other_participant_id);
|
||||
reshapeWindow();
|
||||
}
|
||||
}
|
||||
if (!mMessageList->getItemByValue(session_id)) return;
|
||||
|
||||
// For im sessions started as voice call chiclet gets created on the first incoming message
|
||||
if (gIMMgr->isVoiceCall(session_id)) return;
|
||||
|
||||
if (!gIMMgr->hasSession(session_id)) return;
|
||||
|
||||
addIMRow(session_id, 0, name, other_participant_id);
|
||||
reshapeWindow();
|
||||
}
|
||||
|
||||
//virtual
|
||||
|
|
|
|||
Loading…
Reference in New Issue