diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 5f90a7627f3727fef031b12fa58d868a4050dd96..33dc7ee2c8f8cbb0b94a6760b57d75ebb02ab314 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -61,6 +61,7 @@ #include "llviewerregion.h" #include "llimfloater.h" #include "lltrans.h" +#include "llcallingcard.h" // static void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::string& name) @@ -265,6 +266,24 @@ bool LLAvatarActions::isCalling(const LLUUID &id) return (LLIMModel::getInstance()->findIMSession(session_id) != NULL); } +//static +bool LLAvatarActions::canCall(const LLUUID &id) +{ + if(isFriend(id)) + { + return LLAvatarTracker::instance().isBuddyOnline(id) && LLVoiceClient::voiceEnabled(); + } + else + { + // don't need to check online/offline status because "usual resident" (resident that is not a friend) + // can be only ONLINE. There is no way to see "usual resident" in OFFLINE status. If we see "usual + // resident" it automatically means that the resident is ONLINE. So to make a call to the "usual resident" + // we need to check only that "our" voice is enabled. + return LLVoiceClient::voiceEnabled(); + } + +} + // static void LLAvatarActions::startConference(const std::vector<LLUUID>& ids) { diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h index 2dd2a4c4b12b3fcc0dba969cce1040e6d3d1ded6..01c18d42285e5b8b6decfea1b4d6b144cd13bc60 100644 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -128,6 +128,11 @@ class LLAvatarActions */ static bool isCalling(const LLUUID &id); + /** + * @return true if call to the resident can be made (resident is online and voice is enabled) + */ + + static bool canCall(const LLUUID &id); /** * Invite avatar to a group. */ diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index b9f422ca6f6fae0878e7e3a11476fd9ad5dc5a0b..ffe7f5716766a1e82511812abf4085263819b745 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -396,7 +396,7 @@ void LLPanelProfileTab::updateButtons() && gAgent.isGodlike() || is_agent_mappable(getAvatarId()); childSetEnabled("show_on_map_btn", enable_map_btn); - childSetEnabled("call", LLVoiceClient::voiceEnabled()); + childSetEnabled("call", LLAvatarActions::canCall(getAvatarId())); } ////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 79a593a8c90b50c3b75a34d2b45f9af179a8b879..e1348401533c804ccadff662eab9645c31c7e139 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -776,7 +776,7 @@ void LLPanelPeople::updateButtons() buttonSetEnabled("teleport_btn", friends_tab_active && item_selected && isFriendOnline(selected_uuids.front())); buttonSetEnabled("view_profile_btn", item_selected); buttonSetEnabled("im_btn", multiple_selected); // allow starting the friends conference for multiple selection - buttonSetEnabled("call_btn", multiple_selected && LLVoiceClient::voiceEnabled()); + buttonSetEnabled("call_btn", multiple_selected && canCall()); buttonSetEnabled("share_btn", item_selected); // not implemented yet bool none_group_selected = item_selected && selected_id.isNull(); @@ -784,6 +784,29 @@ void LLPanelPeople::updateButtons() buttonSetEnabled("chat_btn", !none_group_selected); } +bool LLPanelPeople::canCall() +{ + std::vector<LLUUID> selected_uuids; + getCurrentItemIDs(selected_uuids); + + bool result = false; + + std::vector<LLUUID>::const_iterator + id = selected_uuids.begin(), + uuids_end = selected_uuids.end(); + + for (;id != uuids_end; ++id) + { + if (LLAvatarActions::canCall(*id)) + { + result = true; + break; + } + } + + return result; +} + std::string LLPanelPeople::getActiveTabName() const { return mTabContainer->getCurrentPanel()->getName(); diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index 750d3b573f5019f05cf4b4ae3502a801084d8e1a..f5cdc0935c3db29c7397cd402bd43842b97b2440 100644 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -73,6 +73,7 @@ class LLPanelPeople : public LLPanel bool isFriendOnline(const LLUUID& id); bool isItemsFreeOfFriends(const std::vector<LLUUID>& uuids); + bool canCall(); void updateButtons(); std::string getActiveTabName() const; diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp index 573de1e51cece472b2604efc26d90c5ce14be1a8..0314642d9eb9cf0847e44d1ff2da526f1b107d89 100644 --- a/indra/newview/llpanelpeoplemenus.cpp +++ b/indra/newview/llpanelpeoplemenus.cpp @@ -181,7 +181,25 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata) const LLUUID& id = mUUIDs.front(); return LLAvatarActions::isFriend(id); } + else if (item == std::string("can_call")) + { + bool result = false; + int size = mUUIDs.size(); + std::cout << size << std::endl; + std::vector<LLUUID>::const_iterator + id = mUUIDs.begin(), + uuids_end = mUUIDs.end(); + for (;id != uuids_end; ++id) + { + if (LLAvatarActions::canCall(*id)) + { + result = true; + break; + } + } + return result; + } return false; } diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml index 39469f7101c061d6abf29c5039b41f8d7f1fe9e5..5f2e6e0f6c6b76c263a58bf727097967949f11d9 100644 --- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml @@ -32,6 +32,9 @@ name="Call"> <menu_item_call.on_click function="Avatar.Call" /> + <menu_item_call.on_enable + function="Avatar.EnableItem" + parameter="can_call" /> </menu_item_call> <menu_item_call label="Share" diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml index df74d2dcd4bb30849de221ca280ff8a14656fa03..0d3dd3366d4b91e84a9162458650986a4fc95c0f 100644 --- a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml @@ -27,6 +27,9 @@ name="Call"> <on_click function="Avatar.Call" /> + <on_enable + function="Avatar.EnableItem" + parameter="can_call" /> </menu_item_call> <menu_item_call enabled="false"