CHUI-499: Loading the DND notifications upon exit from DND mode and after login.

master
William Todd Stinson 2012-12-19 01:48:37 -08:00
parent 6b9ead9145
commit bd6d34d312
5 changed files with 96 additions and 4 deletions

View File

@ -41,6 +41,7 @@
#include "llchannelmanager.h"
#include "llchicletbar.h"
#include "llconsole.h"
#include "lldonotdisturbnotificationstorage.h"
#include "llenvmanager.h"
#include "llfirstuse.h"
#include "llfloatercamera.h"
@ -1389,11 +1390,16 @@ BOOL LLAgent::getAFK() const
//-----------------------------------------------------------------------------
// setDoNotDisturb()
//-----------------------------------------------------------------------------
void LLAgent::setDoNotDisturb(bool pIsDotNotDisturb)
void LLAgent::setDoNotDisturb(bool pIsDoNotDisturb)
{
mIsDoNotDisturb = pIsDotNotDisturb;
sendAnimationRequest(ANIM_AGENT_DO_NOT_DISTURB, (pIsDotNotDisturb ? ANIM_REQUEST_START : ANIM_REQUEST_STOP));
LLNotificationsUI::LLChannelManager::getInstance()->muteAllChannels(pIsDotNotDisturb);
bool isDoNotDisturbSwitchedOff = (mIsDoNotDisturb && !pIsDoNotDisturb);
mIsDoNotDisturb = pIsDoNotDisturb;
sendAnimationRequest(ANIM_AGENT_DO_NOT_DISTURB, (pIsDoNotDisturb ? ANIM_REQUEST_START : ANIM_REQUEST_STOP));
LLNotificationsUI::LLChannelManager::getInstance()->muteAllChannels(pIsDoNotDisturb);
if (isDoNotDisturbSwitchedOff)
{
LLDoNotDisturbNotificationStorage::getInstance()->loadNotifications();
}
}
//-----------------------------------------------------------------------------

View File

@ -139,7 +139,9 @@ void LLChannelManager::onLoginCompleted()
}
LLPersistentNotificationStorage::getInstance()->loadNotifications();
LLDoNotDisturbNotificationStorage::getInstance()->initialize();
LLDoNotDisturbNotificationStorage::getInstance()->loadNotifications();
}
//--------------------------------------------------------------------------

View File

@ -39,6 +39,7 @@
LLCommunicationChannel::LLCommunicationChannel(const std::string& pName, const std::string& pParentName)
: LLNotificationChannel(pName, pParentName, filterByDoNotDisturbStatus)
, mHistory()
{
}
@ -61,6 +62,11 @@ LLCommunicationChannel::history_list_t::const_iterator LLCommunicationChannel::e
return mHistory.end();
}
void LLCommunicationChannel::clearHistory()
{
mHistory.clear();
}
void LLCommunicationChannel::onFilterFail(LLNotificationPtr pNotificationPtr)
{
std::string notificationType = pNotificationPtr->getType();

View File

@ -46,6 +46,8 @@ public:
typedef std::multimap<LLDate, LLNotificationPtr> history_list_t;
history_list_t::const_iterator beginHistory() const;
history_list_t::const_iterator endHistory() const;
void clearHistory();
protected:
virtual void onFilterFail(LLNotificationPtr pNotificationPtr);

View File

@ -29,14 +29,25 @@
#include "lldonotdisturbnotificationstorage.h"
#define XXX_STINSON_HIDE_NOTIFICATIONS_ON_DND_EXIT 0
#if XXX_STINSON_HIDE_NOTIFICATIONS_ON_DND_EXIT
#include "llchannelmanager.h"
#endif // XXX_STINSON_HIDE_NOTIFICATIONS_ON_DND_EXIT
#include "llcommunicationchannel.h"
#include "lldir.h"
#include "llerror.h"
#include "llfasttimer_class.h"
#include "llnotifications.h"
#include "llnotificationhandler.h"
#include "llnotificationstorage.h"
#if XXX_STINSON_HIDE_NOTIFICATIONS_ON_DND_EXIT
#include "llscreenchannel.h"
#endif // XXX_STINSON_HIDE_NOTIFICATIONS_ON_DND_EXIT
#include "llscriptfloater.h"
#include "llsd.h"
#include "llsingleton.h"
#include "lluuid.h"
LLDoNotDisturbNotificationStorage::LLDoNotDisturbNotificationStorage()
: LLSingleton<LLDoNotDisturbNotificationStorage>()
@ -85,6 +96,71 @@ static LLFastTimer::DeclareTimer FTM_LOAD_DND_NOTIFICATIONS("Load DND Notificati
void LLDoNotDisturbNotificationStorage::loadNotifications()
{
LLFastTimer _(FTM_LOAD_DND_NOTIFICATIONS);
LL_INFOS("stinsonDebug") << "STINSON DEBUG: loading notifiations" << LL_ENDL;
LLSD input;
if (!readNotifications(input) ||input.isUndefined())
{
return;
}
LLSD& data = input["data"];
if (data.isUndefined())
{
return;
}
#if XXX_STINSON_HIDE_NOTIFICATIONS_ON_DND_EXIT
LLNotificationsUI::LLScreenChannel* notification_channel =
dynamic_cast<LLNotificationsUI::LLScreenChannel*>(LLNotificationsUI::LLChannelManager::getInstance()->
findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
#endif // XXX_STINSON_HIDE_NOTIFICATIONS_ON_DND_EXIT
LLNotifications& instance = LLNotifications::instance();
for (LLSD::array_const_iterator notification_it = data.beginArray();
notification_it != data.endArray();
++notification_it)
{
LLSD notification_params = *notification_it;
LLNotificationPtr notification(new LLNotification(notification_params));
LL_INFOS("stinsonDebug") << "STINSON DEBUG: loading notification of type '" << notification->getType() << "'" << LL_ENDL;
const LLUUID& notificationID = notification->id();
if (instance.find(notificationID))
{
instance.update(notification);
}
else
{
LLNotificationResponderPtr responder(createResponder(notification_params["name"], notification_params["responder"]));
notification->setResponseFunctor(responder);
instance.add(notification);
}
#if XXX_STINSON_HIDE_NOTIFICATIONS_ON_DND_EXIT
// hide script floaters so they don't confuse the user and don't overlap startup toast
LLScriptFloaterManager::getInstance()->setFloaterVisible(notification->getID(), false);
if(notification_channel)
{
// hide saved toasts so they don't confuse the user
notification_channel->hideToast(notification->getID());
}
#endif // XXX_STINSON_HIDE_NOTIFICATIONS_ON_DND_EXIT
}
// Clear the communication channel history and rewrite the save file to empty it as well
LLNotificationChannelPtr channelPtr = getCommunicationChannel();
LLCommunicationChannel *commChannel = dynamic_cast<LLCommunicationChannel*>(channelPtr.get());
llassert(commChannel != NULL);
commChannel->clearHistory();
saveNotifications();
}
LLNotificationChannelPtr LLDoNotDisturbNotificationStorage::getCommunicationChannel() const