CHUI-120 WIP Notifications about added chat participants should be sent to the conference when those participants actually join.

- Removed notifying existing P2P participants about ad hoc conference staring in a new window. Now the notifications should arrive in that new window.
- Fixed "Cancel" button which had no effect in adding P2P participants notification.
meow-7.2.2
Seth ProductEngine 2012-08-16 04:55:48 +03:00
parent f744fe8b54
commit effccb9448
3 changed files with 94 additions and 48 deletions

View File

@ -127,14 +127,13 @@ void LLIMFloater::refresh()
// virtual
void LLIMFloater::onClickCloseBtn()
{
LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(
mSessionID);
LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(mSessionID);
if (session == NULL)
{
llwarns << "Empty session." << llendl;
return;
}
}
bool is_call_with_chat = session->isGroupSessionType()
|| session->isAdHocSessionType() || session->isP2PSessionType();
@ -228,7 +227,7 @@ void LLIMFloater::sendMsg(const std::string& msg)
if (mSessionInitialized)
{
LLIMModel::sendMessage(utf8_text, mSessionID, mOtherParticipantUUID, mDialog);
LLIMModel::sendMessage(utf8_text, mSessionID, mOtherParticipantUUID, mDialog);
}
else
{
@ -261,7 +260,7 @@ void LLIMFloater::initIMSession(const LLUUID& session_id)
mSession = LLIMModel::getInstance()->findIMSession(mSessionID);
if (mSession)
{
{
mIsP2PChat = mSession->isP2PSessionType();
mSessionInitialized = mSession->mSessionInitialized;
@ -411,7 +410,7 @@ bool LLIMFloater::canAddSelectedToChat(const uuid_vec_t& uuids)
if (speaker_mgr)
{
speaker_mgr->getSpeakerList(&speaker_list, true);
}
}
for (uuid_vec_t::const_iterator id = uuids.begin();
id != uuids.end(); ++id)
@ -439,19 +438,24 @@ void LLIMFloater::addSessionParticipants(const uuid_vec_t& uuids)
LLSD args;
LLNotificationsUtil::add("ConfirmAddingChatParticipants", args, payload,
boost::bind(&LLIMFloater::addP2PSessionParticipants, this, uuids));
boost::bind(&LLIMFloater::addP2PSessionParticipants, this, _1, _2, uuids));
}
else
{
sendParticipantsAddedNotification(uuids);
// remember whom we have invited, to notify others later, when the invited ones actually join
mInvitedParticipants.insert(mInvitedParticipants.end(), uuids.begin(), uuids.end());
inviteToSession(uuids);
}
}
void LLIMFloater::addP2PSessionParticipants(const uuid_vec_t& uuids)
void LLIMFloater::addP2PSessionParticipants(const LLSD& notification, const LLSD& response, const uuid_vec_t& uuids)
{
sendParticipantsAddedNotification(uuids);
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if (option != 0)
{
return;
}
mStartConferenceInSameFloater = true;
@ -469,6 +473,12 @@ void LLIMFloater::addP2PSessionParticipants(const uuid_vec_t& uuids)
// then we can close the current session
onClose(false);
// we start a new session so reset the initialization flag
mSessionInitialized = false;
// remember whom we have invited, to notify others later, when the invited ones actually join
mInvitedParticipants.insert(mInvitedParticipants.end(), uuids.begin(), uuids.end());
// Start a new ad hoc voice call if we invite new participants to a P2P call,
// or start a text chat otherwise.
if (is_voice_call)
@ -487,7 +497,6 @@ void LLIMFloater::sendParticipantsAddedNotification(const uuid_vec_t& uuids)
build_names_string(uuids, names_string);
LLStringUtil::format_map_t args;
args["[NAME]"] = names_string;
args["[NEW_WINDOW]"] = mIsP2PChat ? getString("new_window") : LLStringUtil::null;
sendMsg(getString(uuids.size() > 1 ? "multiple_participants_added" : "participant_added", args));
}
@ -865,18 +874,20 @@ void LLIMFloater::sessionInitReplyReceived(const LLUUID& im_session_id)
//*TODO here we should remove "starting session..." warning message if we added it in postBuild() (IB)
//need to send delayed messaged collected while waiting for session initialization
//need to send delayed messages collected while waiting for session initialization
if (mQueuedMsgsForInit.size())
{
LLSD::array_iterator iter;
for ( iter = mQueuedMsgsForInit.beginArray();
iter != mQueuedMsgsForInit.endArray(); ++iter)
{
LLIMModel::sendMessage(iter->asString(), mSessionID,
mOtherParticipantUUID, mDialog);
LLSD::array_iterator iter;
for ( iter = mQueuedMsgsForInit.beginArray();
iter != mQueuedMsgsForInit.endArray(); ++iter)
{
LLIMModel::sendMessage(iter->asString(), mSessionID,
mOtherParticipantUUID, mDialog);
}
mQueuedMsgsForInit.clear();
}
}
}
void LLIMFloater::appendMessage(const LLChat& chat, const LLSD &args)
{
@ -1044,19 +1055,18 @@ void LLIMFloater::setTyping(bool typing)
{
LLIMModel::instance().sendTypingState(mSessionID,
mOtherParticipantUUID, mMeTyping);
mShouldSendTypingState = false;
}
mShouldSendTypingState = false;
}
}
if (!mIsNearbyChat)
{
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if (speaker_mgr)
{
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
if (speaker_mgr)
{
speaker_mgr->setSpeakerTyping(gAgent.getID(), FALSE);
speaker_mgr->setSpeakerTyping(gAgent.getID(), FALSE);
}
}
}
}
void LLIMFloater::processIMTyping(const LLIMInfo* im_info, BOOL typing)
@ -1075,29 +1085,66 @@ void LLIMFloater::processIMTyping(const LLIMInfo* im_info, BOOL typing)
void LLIMFloater::processAgentListUpdates(const LLSD& body)
{
uuid_vec_t joined_uuids;
if (body.isMap() && body.has("agent_updates") && body["agent_updates"].isMap())
{
LLSD agent_data = body["agent_updates"].get(gAgentID.asString());
if (agent_data.isMap() && agent_data.has("info"))
LLSD::map_const_iterator update_it;
for(update_it = body["agent_updates"].beginMap();
update_it != body["agent_updates"].endMap();
++update_it)
{
LLSD agent_info = agent_data["info"];
LLUUID agent_id(update_it->first);
LLSD agent_data = update_it->second;
if (agent_info.has("mutes"))
if (agent_data.isMap())
{
BOOL moderator_muted_text = agent_info["mutes"]["text"].asBoolean();
mInputEditor->setEnabled(!moderator_muted_text);
std::string label;
if (moderator_muted_text)
label = LLTrans::getString("IM_muted_text_label");
else
label = LLTrans::getString("IM_to_label") + " " + LLIMModel::instance().getName(mSessionID);
mInputEditor->setLabel(label);
// store the new participants in joined_uuids
if (agent_data.has("transition") && agent_data["transition"].asString() == "ENTER")
{
joined_uuids.push_back(agent_id);
}
if (moderator_muted_text)
LLNotificationsUtil::add("TextChatIsMutedByModerator");
// process the moderator mutes
if (agent_id == gAgentID && agent_data.has("info") && agent_data["info"].has("mutes"))
{
BOOL moderator_muted_text = agent_data["info"]["mutes"]["text"].asBoolean();
mInputEditor->setEnabled(!moderator_muted_text);
std::string label;
if (moderator_muted_text)
label = LLTrans::getString("IM_muted_text_label");
else
label = LLTrans::getString("IM_to_label") + " " + LLIMModel::instance().getName(mSessionID);
mInputEditor->setLabel(label);
if (moderator_muted_text)
LLNotificationsUtil::add("TextChatIsMutedByModerator");
}
}
}
}
// the vectors need to be sorted for computing the intersection and difference
std::sort(mInvitedParticipants.begin(), mInvitedParticipants.end());
std::sort(joined_uuids.begin(), joined_uuids.end());
uuid_vec_t intersection; // uuids of invited residents who have joined the conversation
std::set_intersection(mInvitedParticipants.begin(), mInvitedParticipants.end(),
joined_uuids.begin(), joined_uuids.end(),
std::back_inserter(intersection));
if (intersection.size() > 0)
{
sendParticipantsAddedNotification(intersection);
}
// Remove all joined participants from invited array.
// The difference between the two vectors (the elements in mInvitedParticipants which are not in joined_uuids)
// is placed at the beginning of mInvitedParticipants, then all other elements are erased.
mInvitedParticipants.erase(std::set_difference(mInvitedParticipants.begin(), mInvitedParticipants.end(),
joined_uuids.begin(), joined_uuids.end(),
mInvitedParticipants.begin()),
mInvitedParticipants.end());
}
void LLIMFloater::processSessionUpdate(const LLSD& session_update)

View File

@ -162,7 +162,7 @@ private:
void setTyping(bool typing);
void onAddButtonClicked();
void addSessionParticipants(const uuid_vec_t& uuids);
void addP2PSessionParticipants(const uuid_vec_t& uuids);
void addP2PSessionParticipants(const LLSD& notification, const LLSD& response, const uuid_vec_t& uuids);
void sendParticipantsAddedNotification(const uuid_vec_t& uuids);
bool canAddSelectedToChat(const uuid_vec_t& uuids);
@ -204,6 +204,8 @@ private:
bool mStartConferenceInSameFloater;
uuid_vec_t mInvitedParticipants;
// connection to voice channel state change signal
boost::signals2::connection mVoiceChannelStateChangeConnection;

View File

@ -36,13 +36,10 @@
value="Conv_toolbar_arrow_sw"/>
<floater.string
name="participant_added"
value="[NAME] was invited to the conversation.[NEW_WINDOW]"/>
value="[NAME] was invited to the conversation."/>
<floater.string
name="multiple_participants_added"
value="[NAME] were invited to the conversation.[NEW_WINDOW]"/>
<floater.string
name="new_window"
value=" The conversation will be started in a new window."/>
value="[NAME] were invited to the conversation."/>
<view
follows="all"
layout="topleft"