From 702e4c7dc1a383f83a0324e97b087efef82e9248 Mon Sep 17 00:00:00 2001
From: Alexander Gavriliuk <alexandrgproductengine@lindenlab.com>
Date: Thu, 19 Oct 2023 18:25:23 +0200
Subject: [PATCH] SL-20163 Rework LLAvatarPropertiesProcessor::sendRequest()

---
 indra/newview/llavatariconctrl.cpp            |   2 +-
 indra/newview/llavatarpropertiesprocessor.cpp | 240 +++++++++---------
 indra/newview/llavatarpropertiesprocessor.h   |  11 +-
 indra/newview/llfloaterbuycurrency.cpp        |   2 +-
 indra/newview/llfloaterpreference.cpp         |   3 +-
 indra/newview/llinspectavatar.cpp             |  17 +-
 indra/newview/llpanelprofile.cpp              |  18 +-
 .../newview/skins/default/xui/en/strings.xml  |   3 +-
 8 files changed, 146 insertions(+), 150 deletions(-)

diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index c131dc641b4..6145a88743b 100644
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -294,7 +294,7 @@ bool LLAvatarIconCtrl::updateFromCache()
 //virtual
 void LLAvatarIconCtrl::processProperties(void* data, EAvatarProcessorType type)
 {
-	if (APT_PROPERTIES == type)
+	if (APT_PROPERTIES_LEGACY == type)
 	{
 		LLAvatarData* avatar_data = static_cast<LLAvatarData*>(data);
 		if (avatar_data)
diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp
index 8be5d370b34..9d3bc7cabee 100644
--- a/indra/newview/llavatarpropertiesprocessor.cpp
+++ b/indra/newview/llavatarpropertiesprocessor.cpp
@@ -114,32 +114,32 @@ void LLAvatarPropertiesProcessor::sendRequest(const LLUUID& avatar_id, EAvatarPr
 		return;
 	}
 
-    std::string cap;
-
-    switch (type)
+    // Try to send HTTP request if cap_url is available
+    if (type == APT_PROPERTIES || type == APT_PICKS || type == APT_GROUPS || type == APT_NOTES)
     {
-    case APT_PROPERTIES:
-        // indicate we're going to make a request
-        sendAvatarPropertiesRequestMessage(avatar_id);
-        // can use getRegionCapability("AgentProfile"), but it is heavy
-        // initAgentProfileCapRequest(avatar_id, cap);
-        break;
-    case APT_PICKS:
-    case APT_GROUPS:
-    case APT_NOTES:
-        if (cap.empty())
+        std::string cap_url(gAgent.getRegionCapability("AgentProfile"));
+        if (!cap_url.empty())
         {
-            // indicate we're going to make a request
-            sendGenericRequest(avatar_id, type, method);
+            initAgentProfileCapRequest(avatar_id, cap_url, type);
+            return;
         }
-        else
+
+        // Don't sent UDP request for APT_PROPERTIES
+        if (type == APT_PROPERTIES)
         {
-            initAgentProfileCapRequest(avatar_id, cap);
+            LL_WARNS() << "No cap_url for APT_PROPERTIES, request is not sent" << LL_ENDL;
+            return;
         }
-        break;
-    default:
+    }
+
+    // Send UDP request
+    if (type == APT_PROPERTIES_LEGACY)
+    {
+        sendAvatarPropertiesRequestMessage(avatar_id);
+    }
+    else
+    {
         sendGenericRequest(avatar_id, type, method);
-        break;
     }
 }
 
@@ -155,7 +155,7 @@ void LLAvatarPropertiesProcessor::sendGenericRequest(const LLUUID& avatar_id, EA
 
 void LLAvatarPropertiesProcessor::sendAvatarPropertiesRequestMessage(const LLUUID& avatar_id)
 {
-    addPendingRequest(avatar_id, APT_PROPERTIES);
+    addPendingRequest(avatar_id, APT_PROPERTIES_LEGACY);
 
     LLMessageSystem *msg = gMessageSystem;
 
@@ -167,19 +167,16 @@ void LLAvatarPropertiesProcessor::sendAvatarPropertiesRequestMessage(const LLUUI
     gAgent.sendReliableMessage();
 }
 
-void LLAvatarPropertiesProcessor::initAgentProfileCapRequest(const LLUUID& avatar_id, const std::string& cap_url)
+void LLAvatarPropertiesProcessor::initAgentProfileCapRequest(const LLUUID& avatar_id, const std::string& cap_url, EAvatarProcessorType type)
 {
-    addPendingRequest(avatar_id, APT_PROPERTIES);
-    addPendingRequest(avatar_id, APT_PICKS);
-    addPendingRequest(avatar_id, APT_GROUPS);
-    addPendingRequest(avatar_id, APT_NOTES);
+    addPendingRequest(avatar_id, type);
     LLCoros::instance().launch("requestAgentUserInfoCoro",
-        boost::bind(requestAvatarPropertiesCoro, cap_url, avatar_id));
+        [cap_url, avatar_id, type]() { requestAvatarPropertiesCoro(cap_url, avatar_id, type); });
 }
 
-void LLAvatarPropertiesProcessor::sendAvatarPropertiesRequest(const LLUUID& avatar_id)
+void LLAvatarPropertiesProcessor::sendAvatarPropertiesRequest(const LLUUID& avatar_id, bool use_cap)
 {
-    sendRequest(avatar_id, APT_PROPERTIES, "AvatarPropertiesRequest");
+    sendRequest(avatar_id, use_cap ? APT_PROPERTIES : APT_PROPERTIES_LEGACY, "AvatarPropertiesRequest");
 }
 
 void LLAvatarPropertiesProcessor::sendAvatarPicksRequest(const LLUUID& avatar_id)
@@ -274,7 +271,7 @@ bool LLAvatarPropertiesProcessor::hasPaymentInfoOnFile(const LLAvatarData* avata
 }
 
 // static
-void LLAvatarPropertiesProcessor::requestAvatarPropertiesCoro(std::string cap_url, LLUUID agent_id)
+void LLAvatarPropertiesProcessor::requestAvatarPropertiesCoro(std::string cap_url, LLUUID agent_id, EAvatarProcessorType type)
 {
     LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
     LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
@@ -289,6 +286,9 @@ void LLAvatarPropertiesProcessor::requestAvatarPropertiesCoro(std::string cap_ur
 
     LLSD result = httpAdapter->getAndSuspend(httpRequest, finalUrl, httpOpts, httpHeaders);
 
+    // Response is being processed, no longer pending is required
+    getInstance()->removePendingRequest(agent_id, type);
+
     LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
     LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
 
@@ -300,114 +300,108 @@ void LLAvatarPropertiesProcessor::requestAvatarPropertiesCoro(std::string cap_ur
             << (!status ? " (no HTTP status)" : !result.has("id") ? " (no result.id)" :
                 std::string(" (result.id=") + result["id"].asUUID().asString() + ")")
             << LL_ENDL;
-        LLAvatarPropertiesProcessor* self = getInstance();
-        self->removePendingRequest(agent_id, APT_PROPERTIES);
-        self->removePendingRequest(agent_id, APT_PICKS);
-        self->removePendingRequest(agent_id, APT_GROUPS);
-        self->removePendingRequest(agent_id, APT_NOTES);
         return;
     }
 
-    // Avatar Data
-
-    LLAvatarData avatar_data;
-    std::string birth_date;
-
-    avatar_data.agent_id = agent_id;
-    avatar_data.avatar_id = agent_id;
-    avatar_data.image_id = result["sl_image_id"].asUUID();
-    avatar_data.fl_image_id = result["fl_image_id"].asUUID();
-    avatar_data.partner_id = result["partner_id"].asUUID();
-    avatar_data.about_text = result["sl_about_text"].asString();
-    avatar_data.fl_about_text = result["fl_about_text"].asString();
-    avatar_data.born_on = result["member_since"].asDate();
-    avatar_data.hide_age = result["hide_age"].asBoolean();
-    avatar_data.profile_url = getProfileURL(agent_id.asString());
-    avatar_data.customer_type = result["customer_type"].asString();
-
-    avatar_data.flags = 0;
-    if (result["online"].asBoolean())
-    {
-        avatar_data.flags |= AVATAR_ONLINE;
-    }
-    if (result["allow_publish"].asBoolean())
+    if (type == APT_PROPERTIES)
     {
-        avatar_data.flags |= AVATAR_ALLOW_PUBLISH;
-    }
-    if (result["identified"].asBoolean())
-    {
-        avatar_data.flags |= AVATAR_IDENTIFIED;
-    }
-    if (result["transacted"].asBoolean())
-    {
-        avatar_data.flags |= AVATAR_TRANSACTED;
-    }
+        LLAvatarData avatar_data;
+
+        std::string birth_date;
+
+        avatar_data.agent_id = agent_id;
+        avatar_data.avatar_id = agent_id;
+        avatar_data.image_id = result["sl_image_id"].asUUID();
+        avatar_data.fl_image_id = result["fl_image_id"].asUUID();
+        avatar_data.partner_id = result["partner_id"].asUUID();
+        avatar_data.about_text = result["sl_about_text"].asString();
+        avatar_data.fl_about_text = result["fl_about_text"].asString();
+        avatar_data.born_on = result["member_since"].asDate();
+        // TODO: SL-20163 Remove the "has" check when SRV-684 is done
+        // and the field "hide_age" is included to the http response
+        avatar_data.hide_age = !result.has("hide_age") || result["hide_age"].asBoolean();
+        avatar_data.profile_url = getProfileURL(agent_id.asString());
+        avatar_data.customer_type = result["customer_type"].asString();
+
+        avatar_data.flags = 0;
+        if (result["online"].asBoolean())
+        {
+            avatar_data.flags |= AVATAR_ONLINE;
+        }
+        if (result["allow_publish"].asBoolean())
+        {
+            avatar_data.flags |= AVATAR_ALLOW_PUBLISH;
+        }
+        if (result["identified"].asBoolean())
+        {
+            avatar_data.flags |= AVATAR_IDENTIFIED;
+        }
+        if (result["transacted"].asBoolean())
+        {
+            avatar_data.flags |= AVATAR_TRANSACTED;
+        }
 
-    avatar_data.caption_index = 0;
-    if (result.has("charter_member")) // won't be present if "caption" is set
-    {
-        avatar_data.caption_index = result["charter_member"].asInteger();
+        avatar_data.caption_index = 0;
+        if (result.has("charter_member")) // won't be present if "caption" is set
+        {
+            avatar_data.caption_index = result["charter_member"].asInteger();
+        }
+        else if (result.has("caption"))
+        {
+            avatar_data.caption_text = result["caption"].asString();
+        }
+
+        getInstance()->notifyObservers(agent_id, &avatar_data, type);
     }
-    else if (result.has("caption"))
+    else if (type == APT_PICKS)
     {
-        avatar_data.caption_text = result["caption"].asString();
-    }
-
-    LLAvatarPropertiesProcessor* self = getInstance();
-    // Request processed, no longer pending
-    self->removePendingRequest(agent_id, APT_PROPERTIES);
-    self->notifyObservers(agent_id, &avatar_data, APT_PROPERTIES);
+        LLAvatarPicks avatar_picks;
 
-    // Picks
+        avatar_picks.agent_id = agent_id; // Not in use?
+        avatar_picks.target_id = agent_id;
 
-    LLSD picks_array = result["picks"];
-    LLAvatarPicks avatar_picks;
-    avatar_picks.agent_id = agent_id; // Not in use?
-    avatar_picks.target_id = agent_id;
+        LLSD picks_array = result["picks"];
+        for (LLSD::array_const_iterator it = picks_array.beginArray(); it != picks_array.endArray(); ++it)
+        {
+            const LLSD& pick_data = *it;
+            avatar_picks.picks_list.emplace_back(pick_data["id"].asUUID(), pick_data["name"].asString());
+        }
 
-    for (LLSD::array_const_iterator it = picks_array.beginArray(); it != picks_array.endArray(); ++it)
-    {
-        const LLSD& pick_data = *it;
-        avatar_picks.picks_list.emplace_back(pick_data["id"].asUUID(), pick_data["name"].asString());
+        getInstance()->notifyObservers(agent_id, &avatar_picks, type);
     }
+    else if (type == APT_GROUPS)
+    {
+        LLAvatarGroups avatar_groups;
 
-    // Request processed, no longer pending
-    self->removePendingRequest(agent_id, APT_PICKS);
-    self->notifyObservers(agent_id, &avatar_picks, APT_PICKS);
-
-    // Groups
+        avatar_groups.agent_id = agent_id; // Not in use?
+        avatar_groups.avatar_id = agent_id; // target_id
 
-    LLSD groups_array = result["groups"];
-    LLAvatarGroups avatar_groups;
-    avatar_groups.agent_id = agent_id; // Not in use?
-    avatar_groups.avatar_id = agent_id; // target_id
+        LLSD groups_array = result["groups"];
+        for (LLSD::array_const_iterator it = groups_array.beginArray(); it != groups_array.endArray(); ++it)
+        {
+            const LLSD& group_info = *it;
+            LLAvatarGroups::LLGroupData group_data;
+            group_data.group_powers = 0; // Not in use?
+            group_data.group_title = group_info["name"].asString(); // Missing data, not in use?
+            group_data.group_id = group_info["id"].asUUID();
+            group_data.group_name = group_info["name"].asString();
+            group_data.group_insignia_id = group_info["image_id"].asUUID();
+
+            avatar_groups.group_list.push_back(group_data);
+        }
 
-    for (LLSD::array_const_iterator it = groups_array.beginArray(); it != groups_array.endArray(); ++it)
-    {
-        const LLSD& group_info = *it;
-        LLAvatarGroups::LLGroupData group_data;
-        group_data.group_powers = 0; // Not in use?
-        group_data.group_title = group_info["name"].asString(); // Missing data, not in use?
-        group_data.group_id = group_info["id"].asUUID();
-        group_data.group_name = group_info["name"].asString();
-        group_data.group_insignia_id = group_info["image_id"].asUUID();
-
-        avatar_groups.group_list.push_back(group_data);
+        getInstance()->notifyObservers(agent_id, &avatar_groups, type);
     }
+    else if (type == APT_NOTES)
+    {
+        LLAvatarNotes avatar_notes;
 
-    self->removePendingRequest(agent_id, APT_GROUPS);
-    self->notifyObservers(agent_id, &avatar_groups, APT_GROUPS);
-
-    // Notes
-    LLAvatarNotes avatar_notes;
-
-    avatar_notes.agent_id = agent_id;
-    avatar_notes.target_id = agent_id;
-    avatar_notes.notes = result["notes"].asString();
+        avatar_notes.agent_id = agent_id;
+        avatar_notes.target_id = agent_id;
+        avatar_notes.notes = result["notes"].asString();
 
-    // Request processed, no longer pending
-    self->removePendingRequest(agent_id, APT_NOTES);
-    self->notifyObservers(agent_id, &avatar_notes, APT_NOTES);
+        getInstance()->notifyObservers(agent_id, &avatar_notes, type);
+    }
 }
 
 void LLAvatarPropertiesProcessor::processAvatarPropertiesReply(LLMessageSystem* msg, void**)
@@ -443,8 +437,8 @@ void LLAvatarPropertiesProcessor::processAvatarPropertiesReply(LLMessageSystem*
 	}
 	LLAvatarPropertiesProcessor* self = getInstance();
 	// Request processed, no longer pending
-	self->removePendingRequest(avatar_data.avatar_id, APT_PROPERTIES);
-	self->notifyObservers(avatar_data.avatar_id, &avatar_data, APT_PROPERTIES);
+	self->removePendingRequest(avatar_data.avatar_id, APT_PROPERTIES_LEGACY);
+	self->notifyObservers(avatar_data.avatar_id, &avatar_data, APT_PROPERTIES_LEGACY);
 }
 
 void LLAvatarPropertiesProcessor::processAvatarInterestsReply(LLMessageSystem* msg, void**)
diff --git a/indra/newview/llavatarpropertiesprocessor.h b/indra/newview/llavatarpropertiesprocessor.h
index 57e492f8107..0dcda5a7486 100644
--- a/indra/newview/llavatarpropertiesprocessor.h
+++ b/indra/newview/llavatarpropertiesprocessor.h
@@ -50,7 +50,8 @@ class LLMessageSystem;
 
 enum EAvatarProcessorType
 {
-	APT_PROPERTIES,
+	APT_PROPERTIES_LEGACY, // APT_PROPERTIES via udp request
+	APT_PROPERTIES,        // APT_PROPERTIES via http request
 	APT_NOTES,
 	APT_GROUPS,
 	APT_PICKS,
@@ -210,7 +211,7 @@ class LLAvatarPropertiesProcessor
 
 	// Request various types of avatar data.  Duplicate requests will be
 	// suppressed while waiting for a response from the network.
-	void sendAvatarPropertiesRequest(const LLUUID& avatar_id);
+	void sendAvatarPropertiesRequest(const LLUUID& avatar_id, bool use_cap = false);
 	void sendAvatarPicksRequest(const LLUUID& avatar_id);
 	void sendAvatarNotesRequest(const LLUUID& avatar_id);
 	void sendAvatarGroupsRequest(const LLUUID& avatar_id);
@@ -247,7 +248,7 @@ class LLAvatarPropertiesProcessor
 
 	static bool hasPaymentInfoOnFile(const LLAvatarData* avatar_data);
 
-    static void requestAvatarPropertiesCoro(std::string cap_url, LLUUID agent_id);
+    static void requestAvatarPropertiesCoro(std::string cap_url, LLUUID agent_id, EAvatarProcessorType type);
 
 	static void processAvatarPropertiesReply(LLMessageSystem* msg, void**);
 
@@ -267,10 +268,10 @@ class LLAvatarPropertiesProcessor
 
 protected:
 
-	void sendRequest(const LLUUID& avatar_id, EAvatarProcessorType type, const std::string &method);
+    void sendRequest(const LLUUID& avatar_id, EAvatarProcessorType type, const std::string &method);
     void sendGenericRequest(const LLUUID& avatar_id, EAvatarProcessorType type, const std::string &method);
     void sendAvatarPropertiesRequestMessage(const LLUUID& avatar_id);
-    void initAgentProfileCapRequest(const LLUUID& avatar_id, const std::string& cap_url);
+    void initAgentProfileCapRequest(const LLUUID& avatar_id, const std::string& cap_url, EAvatarProcessorType type);
 
 	void notifyObservers(const LLUUID& id,void* data, EAvatarProcessorType type);
 
diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp
index 0cfac166c78..b0e63d5844a 100644
--- a/indra/newview/llfloaterbuycurrency.cpp
+++ b/indra/newview/llfloaterbuycurrency.cpp
@@ -354,7 +354,7 @@ LLFetchAvatarPaymentInfo::~LLFetchAvatarPaymentInfo()
 
 void LLFetchAvatarPaymentInfo::processProperties(void* data, EAvatarProcessorType type)
 {
-	if (data && type == APT_PROPERTIES)
+	if (data && type == APT_PROPERTIES_LEGACY)
 	{
 		LLAvatarData* avatar_data = static_cast<LLAvatarData*>(data);
 		LLFloaterBuyCurrency::handleBuyCurrency(LLAvatarPropertiesProcessor::hasPaymentInfoOnFile(avatar_data), mHasTarget, mName, mPrice);
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index e48f989c529..1f5eb5fdff7 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -330,7 +330,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
 
 void LLFloaterPreference::processProperties( void* pData, EAvatarProcessorType type )
 {
-	if ( APT_PROPERTIES == type )
+	if ( APT_PROPERTIES_LEGACY == type )
 	{
 		const LLAvatarData* pAvatarData = static_cast<const LLAvatarData*>( pData );
 		if (pAvatarData && (gAgent.getID() == pAvatarData->avatar_id) && (pAvatarData->avatar_id != LLUUID::null))
@@ -636,7 +636,6 @@ void LLFloaterPreference::cancel()
 
 void LLFloaterPreference::onOpen(const LLSD& key)
 {
-
 	// this variable and if that follows it are used to properly handle do not disturb mode response message
 	static bool initialized = FALSE;
 	// if user is logged in and we haven't initialized do not disturb mode response yet, do it
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index b11c4400150..4d003989fc8 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -124,7 +124,7 @@ class LLFetchAvatarData : public LLAvatarPropertiesObserver
 		processor->addObserver(mAvatarID, this);
 		// send a request (duplicates will be suppressed inside the avatar
 		// properties processor)
-		processor->sendAvatarPropertiesRequest(mAvatarID);
+		processor->sendAvatarPropertiesRequest(mAvatarID, true);
 	}
 	
 	~LLFetchAvatarData()
@@ -261,12 +261,15 @@ void LLInspectAvatar::requestUpdate()
 void LLInspectAvatar::processAvatarData(LLAvatarData* data)
 {
 	LLStringUtil::format_map_t args;
-	{
-		std::string birth_date = LLTrans::getString("AvatarBirthDateFormat");
-		LLStringUtil::format(birth_date, LLSD().with("datetime", (S32) data->born_on.secondsSinceEpoch()));
-		args["[BORN_ON]"] = birth_date;
-	}
-	args["[AGE]"] = LLDateUtil::ageFromDate(data->born_on, LLDate::now());
+
+	std::string birth_date = LLTrans::getString(data->hide_age ?
+		"AvatarBirthDateFormatShort" :
+		"AvatarBirthDateFormatFull");
+	LLStringUtil::format(birth_date, LLSD().with("datetime", (S32)data->born_on.secondsSinceEpoch()));
+	args["[BORN_ON]"] = birth_date;
+	args["[AGE]"] = data->hide_age ?
+		LLStringUtilBase<char>::null :
+		LLDateUtil::ageFromDate(data->born_on, LLDate::now());
 	args["[SL_PROFILE]"] = data->about_text;
 	args["[RW_PROFILE"] = data->fl_about_text;
 	args["[ACCTTYPE]"] = LLAvatarPropertiesProcessor::accountType(data);
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index 6e4bf62dd99..a7a1f05c8a1 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -145,9 +145,7 @@ void request_avatar_properties_coro(std::string cap_url, LLUUID agent_id)
         return;
     }
 
-
     // Avatar Data
-
     LLAvatarData *avatar_data = &panel_profile->mAvatarData;
     std::string birth_date;
 
@@ -191,7 +189,11 @@ void request_avatar_properties_coro(std::string cap_url, LLUUID agent_id)
         avatar_data->caption_text = result["caption"].asString();
     }
 
-    avatar_data->hide_age = result["hide_age"].asBoolean();
+    // TODO: SL-20163 Remove the "has" check when SRV-684 is done
+    // and the field "hide_age" is included to the http response
+    avatar_data->hide_age = result.has("hide_age") ?
+        result["hide_age"].asBoolean() :  // Server option value provided by resident
+        !panel_profile->getSelfProfile(); // Fallback temporary value (to be removed)
 
     panel = floater_profile->findChild<LLPanel>(PANEL_SECONDLIFE, TRUE);
     LLPanelProfileSecondLife *panel_sl = dynamic_cast<LLPanelProfileSecondLife*>(panel);
@@ -215,7 +217,6 @@ void request_avatar_properties_coro(std::string cap_url, LLUUID agent_id)
     }
 
     // Picks
-
     LLSD picks_array = result["picks"];
     LLAvatarPicks avatar_picks;
     avatar_picks.agent_id = agent_id; // Not in use?
@@ -237,7 +238,6 @@ void request_avatar_properties_coro(std::string cap_url, LLUUID agent_id)
     }
 
     // Groups
-
     LLSD groups_array = result["groups"];
     LLAvatarGroups avatar_groups;
     avatar_groups.agent_id = agent_id; // Not in use?
@@ -312,7 +312,6 @@ LLUUID post_profile_image(std::string cap_url, const LLSD &first_data, std::stri
     }
 
     // Upload the image
-
     LLCore::HttpRequest::ptr_t uploaderhttpRequest(new LLCore::HttpRequest);
     LLCore::HttpHeaders::ptr_t uploaderhttpHeaders(new LLCore::HttpHeaders);
     LLCore::HttpOptions::ptr_t uploaderhttpOpts(new LLCore::HttpOptions);
@@ -982,7 +981,7 @@ void LLPanelProfileSecondLife::updateData()
         if (!cap_url.empty())
         {
             LLCoros::instance().launch("requestAgentUserInfoCoro",
-                boost::bind(request_avatar_properties_coro, cap_url, avatar_id));
+                [cap_url, avatar_id]() { request_avatar_properties_coro(cap_url, avatar_id); });
         }
         else
         {
@@ -1058,7 +1057,6 @@ void LLPanelProfileSecondLife::processProfileProperties(const LLAvatarData* avat
 
 void LLPanelProfileSecondLife::processGroupProperties(const LLAvatarGroups* avatar_groups)
 {
-
     LLAvatarGroups::group_list_t::const_iterator it = avatar_groups->group_list.begin();
     const LLAvatarGroups::group_list_t::const_iterator it_end = avatar_groups->group_list.end();
 
@@ -2420,7 +2418,7 @@ void LLPanelProfileNotes::updateData()
         if (!cap_url.empty())
         {
             LLCoros::instance().launch("requestAgentUserInfoCoro",
-                boost::bind(request_avatar_properties_coro, cap_url, avatar_id));
+                [cap_url, avatar_id]() { request_avatar_properties_coro(cap_url, avatar_id); });
         }
     }
 }
@@ -2586,7 +2584,7 @@ void LLPanelProfile::updateData()
         if (!cap_url.empty())
         {
             LLCoros::instance().launch("requestAgentUserInfoCoro",
-                boost::bind(request_avatar_properties_coro, cap_url, avatar_id));
+                [cap_url, avatar_id]() { request_avatar_properties_coro(cap_url, avatar_id); });
         }
     }
 }
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 23053715967..3c72fdf2496 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -3935,7 +3935,8 @@ Abuse Report</string>
   <string name="dance8">dance8</string>
 
   <!-- birth date format shared by avatar inspector and profile panels -->
-  <string name="AvatarBirthDateFormat">[mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]</string>
+  <string name="AvatarBirthDateFormatFull">[mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]</string>
+  <string name="AvatarBirthDateFormatShort">[mthnum,datetime,slt]/[day,datetime,slt]</string>
 
   <string name="DefaultMimeType">none/none</string>
   <string name="texture_load_dimensions_error">Can't load images larger than [WIDTH]*[HEIGHT]</string>
-- 
GitLab