Fix handling of after_get_difference in NotificationManager.

GitOrigin-RevId: ef543b9f3253d4e3da08fe5d7ce0320d2bf9f4f5
This commit is contained in:
levlam 2018-11-23 14:42:34 +03:00
parent 9841b28693
commit 3a126069f2
3 changed files with 44 additions and 15 deletions

View File

@ -5,7 +5,6 @@
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#include "td/telegram/MessagesManager.h"
#include "td/telegram/AnimationsManager.h"
#include "td/telegram/AuthManager.h"
#include "td/telegram/ChatId.h"
@ -17451,7 +17450,8 @@ void MessagesManager::add_new_message_notification(Dialog *d, Message *m, bool f
}
VLOG(notifications) << "Trying to " << (force ? "forcely " : "") << "add new message notification for "
<< m->message_id << " in " << d->dialog_id;
<< m->message_id << " in " << d->dialog_id
<< (m->disable_notification ? " silently" : " with sound");
DialogId settings_dialog_id = d->dialog_id;
Dialog *settings_dialog = d;

View File

@ -38,9 +38,18 @@ void NotificationManager::on_flush_pending_notifications_timeout_callback(void *
}
auto notification_manager = static_cast<NotificationManager *>(notification_manager_ptr);
send_closure_later(notification_manager->actor_id(notification_manager),
&NotificationManager::flush_pending_notifications,
NotificationGroupId(narrow_cast<int32>(group_id_int)));
if (group_id_int > 0) {
send_closure_later(notification_manager->actor_id(notification_manager),
&NotificationManager::flush_pending_notifications,
NotificationGroupId(narrow_cast<int32>(group_id_int)));
} else if (group_id_int == 0) {
send_closure_later(notification_manager->actor_id(notification_manager),
&NotificationManager::after_get_difference_impl);
} else {
send_closure_later(notification_manager->actor_id(notification_manager),
&NotificationManager::after_get_chat_difference_impl,
NotificationGroupId(narrow_cast<int32>(-group_id_int)));
}
}
void NotificationManager::on_flush_pending_updates_timeout_callback(void *notification_manager_ptr,
@ -51,7 +60,7 @@ void NotificationManager::on_flush_pending_updates_timeout_callback(void *notifi
auto notification_manager = static_cast<NotificationManager *>(notification_manager_ptr);
send_closure_later(notification_manager->actor_id(notification_manager), &NotificationManager::flush_pending_updates,
narrow_cast<int32>(group_id_int));
narrow_cast<int32>(group_id_int), "timeout");
}
bool NotificationManager::is_disabled() const {
@ -285,7 +294,7 @@ void NotificationManager::add_update_notification(NotificationGroupId notificati
notification_group_id.get(), std::move(notification_object)));
}
void NotificationManager::flush_pending_updates(int32 group_id) {
void NotificationManager::flush_pending_updates(int32 group_id, const char *source) {
auto it = pending_updates_.find(group_id);
if (it == pending_updates_.end()) {
return;
@ -294,7 +303,11 @@ void NotificationManager::flush_pending_updates(int32 group_id) {
auto updates = std::move(it->second);
pending_updates_.erase(it);
VLOG(notifications) << "Send " << updates.size() << " pending updates in " << NotificationGroupId(group_id);
VLOG(notifications) << "Send " << updates.size() << " pending updates in " << NotificationGroupId(group_id)
<< " from " << source;
for (auto &update : updates) {
VLOG(notifications) << "Have " << as_notification_update(update.get());
}
bool is_changed = true;
while (is_changed) {
@ -534,7 +547,7 @@ void NotificationManager::send_remove_group_update(const NotificationGroupKey &g
if (!removed_notification_ids.empty()) {
add_update_notification_group(td_api::make_object<td_api::updateNotificationGroup>(
group_key.group_id.get(), group_key.dialog_id.get(), group_key.dialog_id.get(), true, 0,
group_key.group_id.get(), group_key.dialog_id.get(), group_key.dialog_id.get(), true, group.total_count,
vector<td_api::object_ptr<td_api::notification>>(), std::move(removed_notification_ids)));
}
}
@ -553,9 +566,9 @@ void NotificationManager::send_add_group_update(const NotificationGroupKey &grou
}
if (!added_notifications.empty()) {
add_update_notification_group(
td_api::make_object<td_api::updateNotificationGroup>(group_key.group_id.get(), group_key.dialog_id.get(), 0,
true, 0, std::move(added_notifications), vector<int32>()));
add_update_notification_group(td_api::make_object<td_api::updateNotificationGroup>(
group_key.group_id.get(), group_key.dialog_id.get(), 0, true, group.total_count, std::move(added_notifications),
vector<int32>()));
}
}
@ -1033,6 +1046,11 @@ void NotificationManager::before_get_difference() {
void NotificationManager::after_get_difference() {
CHECK(running_get_difference_);
running_get_difference_ = false;
flush_pending_notifications_timeout_.set_timeout_in(0, MIN_NOTIFICATION_DELAY_MS);
}
void NotificationManager::after_get_difference_impl() {
VLOG(notifications) << "After get difference";
vector<int32> ready_group_ids;
for (auto &it : pending_updates_) {
if (running_get_chat_difference_.count(it.first) == 0) {
@ -1041,22 +1059,29 @@ void NotificationManager::after_get_difference() {
}
for (auto group_id : ready_group_ids) {
flush_pending_updates_timeout_.cancel_timeout(group_id);
flush_pending_updates(group_id);
flush_pending_updates(group_id, "after_get_difference");
}
}
void NotificationManager::before_get_chat_difference(NotificationGroupId group_id) {
VLOG(notifications) << "Before get chat difference in " << group_id;
CHECK(group_id.is_valid());
bool is_inserted = running_get_chat_difference_.insert(group_id.get()).second;
CHECK(is_inserted);
}
void NotificationManager::after_get_chat_difference(NotificationGroupId group_id) {
CHECK(group_id.is_valid());
flush_pending_notifications_timeout_.set_timeout_in(-group_id.get(), MIN_NOTIFICATION_DELAY_MS);
}
void NotificationManager::after_get_chat_difference_impl(NotificationGroupId group_id) {
VLOG(notifications) << "After get chat difference in " << group_id;
CHECK(group_id.is_valid());
auto erased_count = running_get_chat_difference_.erase(group_id.get());
if (erased_count == 1 && !running_get_difference_ && pending_updates_.count(group_id.get()) == 1) {
flush_pending_updates_timeout_.cancel_timeout(group_id.get());
flush_pending_updates(group_id.get());
flush_pending_updates(group_id.get(), "after_get_chat_difference");
}
}

View File

@ -182,7 +182,7 @@ class NotificationManager : public Actor {
NotificationGroupId group_id,
std::function<bool(const td_api::object_ptr<td_api::notification> &notification)> is_removed);
void flush_pending_updates(int32 group_id);
void flush_pending_updates(int32 group_id, const char *source);
NotificationId current_notification_id_;
NotificationGroupId current_notification_group_id_;
@ -202,6 +202,10 @@ class NotificationManager : public Actor {
std::unordered_map<int32, vector<td_api::object_ptr<td_api::Update>>> pending_updates_;
void after_get_difference_impl();
void after_get_chat_difference_impl(NotificationGroupId group_id);
MultiTimeout flush_pending_notifications_timeout_{"FlushPendingNotificationsTimeout"};
MultiTimeout flush_pending_updates_timeout_{"FlushPendingUpdatesTimeout"};