chromium/chrome/browser/apps/app_service/app_notifications.h

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_APPS_APP_SERVICE_APP_NOTIFICATIONS_H_
#define CHROME_BROWSER_APPS_APP_SERVICE_APP_NOTIFICATIONS_H_

#include <map>
#include <set>
#include <string>
#include <utility>

#include "components/services/app_service/public/cpp/app.h"
#include "components/services/app_service/public/cpp/app_types.h"

namespace apps {

// AppNotifications records the notification id for each app.
class AppNotifications {
 public:
  AppNotifications();
  ~AppNotifications();

  AppNotifications(const AppNotifications&) = delete;
  AppNotifications& operator=(const AppNotifications&) = delete;

  // Records that |app_id| has a new notification identified by
  // |notification_id|.
  void AddNotification(const std::string& app_id,
                       const std::string& notification_id);

  // Removes the notification for the given |notification_id|.
  void RemoveNotification(const std::string& notification_id);

  // Removes notifications for the given |app_id|.
  void RemoveNotificationsForApp(const std::string& app_id);

  // Returns true, if the app has notifications. Otherwise, returns false.
  bool HasNotification(const std::string& app_id);

  // Returns the set of app ids for the given |notification_id|, if
  // |notification_id| exists in |notification_id_to_app_id_|. Otherwise, return
  // an empty set.
  std::set<std::string> GetAppIdsForNotification(
      const std::string& notification_id);

  AppPtr CreateAppWithHasBadgeStatus(AppType app_type,
                                     const std::string& app_id);

 private:
  // Maps one app id to a set of all matching notification ids.
  std::map<std::string, std::set<std::string>> app_id_to_notification_ids_;

  // Maps one notification id to a set of app ids. When the notification has
  // been delivered, the MessageCenter has already deleted the notification, so
  // we can't fetch the corresponding app id when the notification is removed.
  // So we need a record of this notification, and erase it from both
  // |app_id_to_notification_id_| and |notification_id_to_app_id_|.
  std::map<std::string, std::set<std::string>> notification_id_to_app_ids_;
};

}  // namespace apps

#endif  // CHROME_BROWSER_APPS_APP_SERVICE_APP_NOTIFICATIONS_H_