From 39ab2fb3fee460cc62b444a9f7bb589b735e7a80 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Sun, 8 May 2022 13:31:50 +0300 Subject: [PATCH 1/2] SL-16937 Replace sendAvatarPropertiesUpdate with profile cap in preferences To avoid data loss, old api trims profile descriptions --- indra/newview/llavatarpropertiesprocessor.cpp | 2 +- indra/newview/llfloaterpreference.cpp | 106 +++++++++--------- indra/newview/llfloaterpreference.h | 5 +- 3 files changed, 54 insertions(+), 59 deletions(-) diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp index 20bdccfe63..4b37c00967 100644 --- a/indra/newview/llavatarpropertiesprocessor.cpp +++ b/indra/newview/llavatarpropertiesprocessor.cpp @@ -236,7 +236,7 @@ void LLAvatarPropertiesProcessor::sendAvatarPropertiesUpdate(const LLAvatarData* return; } - LL_INFOS() << "Sending avatarinfo update" << LL_ENDL; + LL_WARNS() << "Sending avatarinfo update. This trims profile descriptions!!!" << LL_ENDL; // This value is required by sendAvatarPropertiesUpdate method. //A profile should never be mature. (From the original code) diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 7bc16293a5..9844ac324d 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -333,63 +333,59 @@ void LLFloaterPreference::processProperties( void* pData, EAvatarProcessorType t const LLAvatarData* pAvatarData = static_cast( pData ); if (pAvatarData && (gAgent.getID() == pAvatarData->avatar_id) && (pAvatarData->avatar_id != LLUUID::null)) { - storeAvatarProperties( pAvatarData ); - processProfileProperties( pAvatarData ); + mAllowPublish = (bool)(pAvatarData->flags & AVATAR_ALLOW_PUBLISH); + mAvatarDataInitialized = true; + getChild("online_searchresults")->setValue(mAllowPublish); } } } -void LLFloaterPreference::storeAvatarProperties( const LLAvatarData* pAvatarData ) -{ - if (LLStartUp::getStartupState() == STATE_STARTED) - { - mAvatarProperties.avatar_id = pAvatarData->avatar_id; - mAvatarProperties.image_id = pAvatarData->image_id; - mAvatarProperties.fl_image_id = pAvatarData->fl_image_id; - mAvatarProperties.about_text = pAvatarData->about_text; - mAvatarProperties.fl_about_text = pAvatarData->fl_about_text; - mAvatarProperties.profile_url = pAvatarData->profile_url; - mAvatarProperties.flags = pAvatarData->flags; - mAvatarProperties.allow_publish = pAvatarData->flags & AVATAR_ALLOW_PUBLISH; - - mAvatarDataInitialized = true; - } -} - -void LLFloaterPreference::processProfileProperties(const LLAvatarData* pAvatarData ) -{ - getChild("online_searchresults")->setValue( (bool)(pAvatarData->flags & AVATAR_ALLOW_PUBLISH) ); -} - void LLFloaterPreference::saveAvatarProperties( void ) { - const BOOL allowPublish = getChild("online_searchresults")->getValue(); + const bool allowPublish = getChild("online_searchresults")->getValue(); - if (allowPublish) - { - mAvatarProperties.flags |= AVATAR_ALLOW_PUBLISH; - } + if ((LLStartUp::getStartupState() == STATE_STARTED) + && mAvatarDataInitialized + && (allowPublish != mAllowPublish)) + { + std::string cap_url = gAgent.getRegionCapability("AgentProfile"); + if (!cap_url.empty()) + { + mAllowPublish = allowPublish; - // - // NOTE: We really don't want to send the avatar properties unless we absolutely - // need to so we can avoid the accidental profile reset bug, so, if we're - // logged in, the avatar data has been initialized and we have a state change - // for the "allow publish" flag, then set the flag to its new value and send - // the properties update. - // - // NOTE: The only reason we can not remove this update altogether is because of the - // "allow publish" flag, the last remaining profile setting in the viewer - // that doesn't exist in the web profile. - // + LLCoros::instance().launch("requestAgentUserInfoCoro", + boost::bind(saveAvatarPropertiesCoro, cap_url, allowPublish)); + } + } +} - if ((LLStartUp::getStartupState() == STATE_STARTED) && mAvatarDataInitialized && (allowPublish != mAvatarProperties.allow_publish)) - { - mAvatarProperties.allow_publish = allowPublish; +void LLFloaterPreference::saveAvatarPropertiesCoro(const std::string cap_url, bool allow_publish) +{ + LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t + httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("put_avatar_properties_coro", httpPolicy)); + LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + LLCore::HttpHeaders::ptr_t httpHeaders; - // TODO!!!: replace with an AgentProfile cap, once allow_publish works correctly - // otherwise this will trim long descritions/reset profile - LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate( &mAvatarProperties ); - } + LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + httpOpts->setFollowRedirects(true); + + std::string finalUrl = cap_url + "/" + gAgentID.asString(); + LLSD data; + data["allow_publish"] = allow_publish; + + LLSD result = httpAdapter->putAndSuspend(httpRequest, finalUrl, data, httpOpts, httpHeaders); + + LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; + LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); + + if (!status) + { + LL_WARNS("Preferences") << "Failed to put agent information " << data << " for id " << gAgentID << LL_ENDL; + return; + } + + LL_DEBUGS("Preferences") << "Agent id: " << gAgentID << " Data: " << data << " Result: " << httpResults << LL_ENDL; } BOOL LLFloaterPreference::postBuild() @@ -941,7 +937,7 @@ void LLFloaterPreference::onBtnOK(const LLSD& userdata) else { // Show beep, pop up dialog, etc. - LL_INFOS() << "Can't close preferences!" << LL_ENDL; + LL_INFOS("Preferences") << "Can't close preferences!" << LL_ENDL; } LLPanelLogin::updateLocationSelectorsVisibility(); @@ -1849,13 +1845,13 @@ bool LLFloaterPreference::loadFromFilename(const std::string& filename, std::map if (!LLXMLNode::parseFile(filename, root, NULL)) { - LL_WARNS() << "Unable to parse file " << filename << LL_ENDL; + LL_WARNS("Preferences") << "Unable to parse file " << filename << LL_ENDL; return false; } if (!root->hasName("labels")) { - LL_WARNS() << filename << " is not a valid definition file" << LL_ENDL; + LL_WARNS("Preferences") << filename << " is not a valid definition file" << LL_ENDL; return false; } @@ -1875,7 +1871,7 @@ bool LLFloaterPreference::loadFromFilename(const std::string& filename, std::map } else { - LL_WARNS() << filename << " failed to load" << LL_ENDL; + LL_WARNS("Preferences") << filename << " failed to load" << LL_ENDL; return false; } @@ -2781,7 +2777,7 @@ bool LLPanelPreferenceControls::addControlTableColumns(const std::string &filena LLScrollListCtrl::Contents contents; if (!LLUICtrlFactory::getLayeredXMLNode(filename, xmlNode)) { - LL_WARNS() << "Failed to load " << filename << LL_ENDL; + LL_WARNS("Preferences") << "Failed to load " << filename << LL_ENDL; return false; } LLXUIParser parser; @@ -2808,7 +2804,7 @@ bool LLPanelPreferenceControls::addControlTableRows(const std::string &filename) LLScrollListCtrl::Contents contents; if (!LLUICtrlFactory::getLayeredXMLNode(filename, xmlNode)) { - LL_WARNS() << "Failed to load " << filename << LL_ENDL; + LL_WARNS("Preferences") << "Failed to load " << filename << LL_ENDL; return false; } LLXUIParser parser; @@ -2914,7 +2910,7 @@ void LLPanelPreferenceControls::populateControlTable() { // Either unknown mode or MODE_SAVED_SETTINGS // It doesn't have UI or actual settings yet - LL_WARNS() << "Unimplemented mode" << LL_ENDL; + LL_WARNS("Preferences") << "Unimplemented mode" << LL_ENDL; // Searchable columns were removed, mark searchables for an update LLFloaterPreference* instance = LLFloaterReg::findTypedInstance("preferences"); @@ -2954,7 +2950,7 @@ void LLPanelPreferenceControls::populateControlTable() } else { - LL_WARNS() << "Unimplemented mode" << LL_ENDL; + LL_WARNS("Preferences") << "Unimplemented mode" << LL_ENDL; } // explicit update to make sure table is ready for llsearchableui diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 5ef2ca68d3..542df18ddb 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -100,9 +100,8 @@ public: static void updateShowFavoritesCheckbox(bool val); void processProperties( void* pData, EAvatarProcessorType type ); - void processProfileProperties(const LLAvatarData* pAvatarData ); - void storeAvatarProperties( const LLAvatarData* pAvatarData ); void saveAvatarProperties( void ); + static void saveAvatarPropertiesCoro(const std::string url, bool allow_publish); void selectPrivacyPanel(); void selectChatPanel(); void getControlNames(std::vector& names); @@ -213,7 +212,7 @@ private: bool mOriginalHideOnlineStatus; std::string mDirectoryVisibility; - LLAvatarData mAvatarProperties; + bool mAllowPublish; // Allow showing agent in search std::string mSavedCameraPreset; std::string mSavedGraphicsPreset; LOG_CLASS(LLFloaterPreference); From 76beebae685d859d4afbff6db3ae6d7785b204da Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 9 May 2022 20:53:21 +0300 Subject: [PATCH 2/2] SL-15312 Fixed picks tabs being too thin --- indra/newview/llpanelprofile.cpp | 15 ++++++++++++-- indra/newview/llpanelprofile.h | 6 ++++++ indra/newview/llpanelprofileclassifieds.cpp | 6 +++--- indra/newview/llpanelprofilepicks.cpp | 4 ++-- .../default/xui/en/panel_profile_pick.xml | 20 +++++++++---------- .../default/xui/en/panel_profile_picks.xml | 1 + .../xui/en/panel_profile_secondlife.xml | 2 +- 7 files changed, 36 insertions(+), 18 deletions(-) diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index bb6fdc1757..031c1db7e2 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -258,6 +258,10 @@ void request_avatar_properties_coro(std::string cap_url, LLUUID agent_id) { panel_notes->processProperties(&avatar_notes); } + if (panel_sl) + { + panel_sl->processNotesProperties(&avatar_notes); + } } //TODO: changes take two minutes to propagate! @@ -818,6 +822,7 @@ BOOL LLPanelProfileSecondLife::postBuild() mSecondLifePic = getChild("2nd_life_pic"); mSecondLifePicLayout = getChild("image_stack"); mDescriptionEdit = getChild("sl_description_edit"); + mNotesSnippet = getChild("notes_snippet"); mAgentActionMenuButton = getChild("agent_actions_menu"); mSaveDescriptionChanges = getChild("save_description_changes"); mDiscardDescriptionChanges = getChild("discard_description_changes"); @@ -965,6 +970,11 @@ void LLPanelProfileSecondLife::processGroupProperties(const LLAvatarGroups* avat mGroupList->setGroups(mGroups); } +void LLPanelProfileSecondLife::processNotesProperties(LLAvatarNotes* avatar_notes) +{ + mNotesSnippet->setValue(avatar_notes->notes); +} + void LLPanelProfileSecondLife::openGroupProfile() { LLUUID group_id = mGroupList->getSelectedUUID(); @@ -1532,14 +1542,15 @@ void LLPanelProfileSecondLife::onSetDescriptionDirty() void LLPanelProfileSecondLife::onShowInSearchCallback() { - if (mAllowPublish == mShowInSearchCombo->getValue().asBoolean()) + S32 value = mShowInSearchCombo->getValue().asInteger(); + if (mAllowPublish == (bool)value) { return; } std::string cap_url = gAgent.getRegionCapability(PROFILE_PROPERTIES_CAP); if (!cap_url.empty()) { - mAllowPublish = mShowInSearchCombo->getValue().asBoolean(); + mAllowPublish = value; LLSD data; data["allow_publish"] = mAllowPublish; LLCoros::instance().launch("putAgentUserInfoCoro", diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h index c4b48979ea..fa98e6fd1b 100644 --- a/indra/newview/llpanelprofile.h +++ b/indra/newview/llpanelprofile.h @@ -115,6 +115,11 @@ protected: */ void processGroupProperties(const LLAvatarGroups* avatar_groups); + /** + * Processes notes related data received from server. + */ + void processNotesProperties(LLAvatarNotes* avatar_notes); + /** * Fills common for Avatar profile and My Profile fields. */ @@ -182,6 +187,7 @@ private: LLIconCtrl* mSecondLifePic; LLPanel* mSecondLifePicLayout; LLTextEditor* mDescriptionEdit; + LLTextEditor* mNotesSnippet; LLMenuButton* mAgentActionMenuButton; LLButton* mSaveDescriptionChanges; LLButton* mDiscardDescriptionChanges; diff --git a/indra/newview/llpanelprofileclassifieds.cpp b/indra/newview/llpanelprofileclassifieds.cpp index 9cd7ca8160..56f9a387a1 100644 --- a/indra/newview/llpanelprofileclassifieds.cpp +++ b/indra/newview/llpanelprofileclassifieds.cpp @@ -203,7 +203,7 @@ LLPanelProfileClassifieds::~LLPanelProfileClassifieds() void LLPanelProfileClassifieds::onOpen(const LLSD& key) { - LLPanelProfileTab::onOpen(key); + LLPanelProfilePropertiesProcessorTab::onOpen(key); resetData(); @@ -592,7 +592,7 @@ void LLPanelProfileClassified::onOpen(const LLSD& key) if(is_new) { - LLPanelProfileTab::setAvatarId(gAgent.getID()); + LLPanelProfilePropertiesProcessorTab::setAvatarId(gAgent.getID()); setPosGlobal(gAgent.getPositionGlobal()); @@ -634,7 +634,7 @@ void LLPanelProfileClassified::onOpen(const LLSD& key) { return; } - LLPanelProfileTab::setAvatarId(avatar_id); + LLPanelProfilePropertiesProcessorTab::setAvatarId(avatar_id); setClassifiedId(key["classified_id"]); setClassifiedName(key["classified_name"]); diff --git a/indra/newview/llpanelprofilepicks.cpp b/indra/newview/llpanelprofilepicks.cpp index b3109e7da2..c452fb5abd 100644 --- a/indra/newview/llpanelprofilepicks.cpp +++ b/indra/newview/llpanelprofilepicks.cpp @@ -131,7 +131,7 @@ LLPanelProfilePicks::~LLPanelProfilePicks() void LLPanelProfilePicks::onOpen(const LLSD& key) { - LLPanelProfileTab::onOpen(key); + LLPanelProfilePropertiesProcessorTab::onOpen(key); resetData(); @@ -405,7 +405,7 @@ void LLPanelProfilePick::setAvatarId(const LLUUID& avatar_id) { return; } - LLPanelProfileTab::setAvatarId(avatar_id); + LLPanelProfilePropertiesProcessorTab::setAvatarId(avatar_id); // creating new Pick if (getPickId().isNull() && getSelfProfile()) diff --git a/indra/newview/skins/default/xui/en/panel_profile_pick.xml b/indra/newview/skins/default/xui/en/panel_profile_pick.xml index 0417df43c9..b5e5f593a7 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_pick.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_pick.xml @@ -18,8 +18,8 @@ name="pick_snapshot" top="10" left="10" - height="180" - width="290" + height="161" + width="260" follows="left|top" layout="topleft" fallback_image="default_land_picture.j2c" @@ -41,7 +41,7 @@ enabled="false" top_pad="8" left="10" - height="70" + height="102" width="290" follows="all" layout="topleft" @@ -68,10 +68,10 @@