From 209ed601dd6cf9af66eb44d71ab0d28ec94fb81e Mon Sep 17 00:00:00 2001
From: Merov Linden <merov@lindenlab.com>
Date: Fri, 28 Feb 2014 13:54:22 -0800
Subject: ACME-1332 : Update the friends lists in the FB Friends panel when
 friend status (add/remove) changes

---
 indra/newview/llfloaterfacebook.cpp | 48 ++++++++++++++++++-------------------
 indra/newview/llfloaterfacebook.h   |  5 +++-
 2 files changed, 28 insertions(+), 25 deletions(-)

diff --git a/indra/newview/llfloaterfacebook.cpp b/indra/newview/llfloaterfacebook.cpp
index 4e6dd002ed..5acc5260d2 100644
--- a/indra/newview/llfloaterfacebook.cpp
+++ b/indra/newview/llfloaterfacebook.cpp
@@ -757,6 +757,11 @@ mSuggestedFriends(NULL)
 {
 }
 
+LLFacebookFriendsPanel::~LLFacebookFriendsPanel()
+{
+    LLAvatarTracker::instance().removeObserver(this);
+}
+
 BOOL LLFacebookFriendsPanel::postBuild()
 {
 	mSecondLifeFriends = getChild<LLAvatarList>("second_life_friends");
@@ -767,6 +772,8 @@ BOOL LLFacebookFriendsPanel::postBuild()
 	
 	setVisibleCallback(boost::bind(&LLFacebookFriendsPanel::updateFacebookList, this, _2));
 
+    LLAvatarTracker::instance().addObserver(this);
+    
 	return LLPanel::postBuild();
 }
 
@@ -815,42 +822,35 @@ void LLFacebookFriendsPanel::showFriendsAccordionsIfNeeded()
 	// Rearrange accordions
 	LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion");
 	accordion->arrange();
+}
 
-	// *TODO: new no_matched_tabs_text attribute was implemented in accordion (EXT-7368).
-	// this code should be refactored to use it
-	// keep help text in a synchronization with accordions visibility.
-	//updateFriendListHelpText();
+void LLFacebookFriendsPanel::changed(U32 mask)
+{
+	if (mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE))
+	{
+		updateFacebookList(true);
+	}
 }
 
+
 void LLFacebookFriendsPanel::updateFacebookList(bool visible)
 {
 	if (visible)
 	{
-		LLEventPumps::instance().obtain("FacebookConnectContent").stopListening("LLPanelPeople"); // just in case it is already listening
-		LLEventPumps::instance().obtain("FacebookConnectContent").listen("LLPanelPeople", boost::bind(&LLFacebookFriendsPanel::updateSuggestedFriendList, this));
-
-		LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLPanelPeople"); // just in case it is already listening
-		LLEventPumps::instance().obtain("FacebookConnectState").listen("LLPanelPeople", boost::bind(&LLFacebookFriendsPanel::onConnectedToFacebook, this, _1));
-
-		//Connected
-		if (LLFacebookConnect::instance().isConnected())
-		{
-			LLFacebookConnect::instance().loadFacebookFriends();
-		}
-		//Check if connected
+		// Try to connect to Facebook
         if ((LLFacebookConnect::instance().getConnectionState() == LLFacebookConnect::FB_NOT_CONNECTED) ||
             (LLFacebookConnect::instance().getConnectionState() == LLFacebookConnect::FB_CONNECTION_FAILED))
         {
             LLFacebookConnect::instance().checkConnectionToFacebook();
         }
-
+		// Loads FB friends
+		if (LLFacebookConnect::instance().isConnected())
+		{
+			LLFacebookConnect::instance().loadFacebookFriends();
+		}
+        // Sort the FB friends and update the lists
 		updateSuggestedFriendList();
 	}
-	else
-	{
-		LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLPanelPeople");
-		LLEventPumps::instance().obtain("FacebookConnectContent").stopListening("LLPanelPeople");
-	}
 }
 
 bool LLFacebookFriendsPanel::onConnectedToFacebook(const LLSD& data)
@@ -861,10 +861,10 @@ bool LLFacebookFriendsPanel::onConnectedToFacebook(const LLSD& data)
 	{
 		LLFacebookConnect::instance().loadFacebookFriends();
 	}
-	else if(connection_state == LLFacebookConnect::FB_NOT_CONNECTED)
+	else if (connection_state == LLFacebookConnect::FB_NOT_CONNECTED)
 	{
 		updateSuggestedFriendList();
-	};
+	}
 
 	return false;
 }
diff --git a/indra/newview/llfloaterfacebook.h b/indra/newview/llfloaterfacebook.h
index 16c9e97ff0..39264c8bff 100644
--- a/indra/newview/llfloaterfacebook.h
+++ b/indra/newview/llfloaterfacebook.h
@@ -27,6 +27,7 @@
 #ifndef LL_LLFLOATERFACEBOOK_H
 #define LL_LLFLOATERFACEBOOK_H
 
+#include "llcallingcard.h"
 #include "llfloater.h"
 #include "lltextbox.h"
 #include "llviewertexture.h"
@@ -128,11 +129,13 @@ private:
     bool mReloadingMapTexture;
 };
 
-class LLFacebookFriendsPanel : public LLPanel
+class LLFacebookFriendsPanel : public LLPanel, public LLFriendObserver
 {
 public:
 	LLFacebookFriendsPanel();
+	~LLFacebookFriendsPanel();
 	BOOL postBuild();
+	virtual void changed(U32 mask);
 
 private:
 	bool updateSuggestedFriendList();
-- 
cgit v1.2.3