EXT-7706 FIXED Implemented delayed friends cards synchronization and filling People/Friends tab with data until it is visible to user first time.

* Moved location of synchronization of the Friends/All inventory folder with friends list from startup to first requesting of data.
* Also updated "update Friends list" logic to be really trigged only when Friends tab is visible to user.

NOTE:
 * Friends List/All is filled with some delay on first opening.

TODO: refactoring is needed to switch code of updating People/nearby list to use the same approach as for Friends.

Reviewed by Vadim Savchuk at https://codereview.productengine.com/secondlife/r/805/

--HG--
branch : product-engine
master
Mike Antipov 2010-07-29 15:52:36 +03:00
parent e730c67749
commit e51c91a8fc
3 changed files with 38 additions and 12 deletions

View File

@ -299,6 +299,17 @@ void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBud
{
folderBuddiesMap.clear();
static bool syncronize_friends_folders = true;
if (syncronize_friends_folders)
{
// Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" folder,
// fetches their contents if needed and synchronizes it with buddies list.
// If the folders are not found they are created.
LLFriendCardsManager::instance().syncFriendCardsFolders();
syncronize_friends_folders = false;
}
LLInventoryModel::cat_array_t* listFolders;
LLInventoryModel::item_array_t* items;

View File

@ -272,6 +272,7 @@ public:
friend class LLInventoryFriendCardObserver;
LLFriendListUpdater(callback_t cb)
: LLAvatarListUpdater(cb, FRIEND_LIST_UPDATE_TIMEOUT)
, mIsActive(false)
{
LLAvatarTracker::instance().addObserver(this);
@ -290,9 +291,12 @@ public:
/*virtual*/ void changed(U32 mask)
{
// events can arrive quickly in bulk - we need not process EVERY one of them -
// so we wait a short while to let others pile-in, and process them in aggregate.
mEventTimer.start();
if (mIsActive)
{
// events can arrive quickly in bulk - we need not process EVERY one of them -
// so we wait a short while to let others pile-in, and process them in aggregate.
mEventTimer.start();
}
// save-up all the mask-bits which have come-in
mMask |= mask;
@ -301,8 +305,12 @@ public:
/*virtual*/ BOOL tick()
{
if (!mIsActive) return FALSE;
if (mMask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::ONLINE))
{
updateList();
}
// Stop updates.
mEventTimer.stop();
@ -311,9 +319,20 @@ public:
return FALSE;
}
// virtual
void setActive(bool active)
{
mIsActive = active;
if (active)
{
tick();
}
}
private:
U32 mMask;
LLInventoryFriendCardObserver* mInvObserver;
bool mIsActive;
/**
* This class is intended for updating Friend List when Inventory Friend Card is added/removed.
@ -504,8 +523,11 @@ BOOL LLPanelPeople::postBuild()
mTabContainer = getChild<LLTabContainer>("tabs");
mTabContainer->setCommitCallback(boost::bind(&LLPanelPeople::onTabSelected, this, _2));
mOnlineFriendList = getChild<LLPanel>(FRIENDS_TAB_NAME)->getChild<LLAvatarList>("avatars_online");
mAllFriendList = getChild<LLPanel>(FRIENDS_TAB_NAME)->getChild<LLAvatarList>("avatars_all");
LLPanel* friends_tab = getChild<LLPanel>(FRIENDS_TAB_NAME);
// updater is active only if panel is visible to user.
friends_tab->setVisibleCallback(boost::bind(&Updater::setActive, mFriendListUpdater, _2));
mOnlineFriendList = friends_tab->getChild<LLAvatarList>("avatars_online");
mAllFriendList = friends_tab->getChild<LLAvatarList>("avatars_all");
mOnlineFriendList->setNoItemsCommentText(getString("no_friends_online"));
mOnlineFriendList->setShowIcons("FriendsListShowIcons");
mAllFriendList->setNoItemsCommentText(getString("no_friends"));

View File

@ -118,7 +118,6 @@
#include "llinventorybridge.h"
#include "llinventorymodel.h"
#include "llinventorymodelbackgroundfetch.h"
#include "llfriendcard.h"
#include "llkeyboard.h"
#include "llloginhandler.h" // gLoginHandler, SLURL support
#include "lllogininstance.h" // Host the login module.
@ -1645,12 +1644,6 @@ bool idle_startup()
//all categories loaded. lets create "My Favorites" category
gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE,true);
// Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" folder,
// fetches their contents if needed and synchronizes it with buddies list.
// If the folders are not found they are created.
LLFriendCardsManager::instance().syncFriendCardsFolders();
// set up callbacks
llinfos << "Registering Callbacks" << llendl;
LLMessageSystem* msg = gMessageSystem;