chromium/ash/calendar/calendar_controller.h

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

#ifndef ASH_CALENDAR_CALENDAR_CONTROLLER_H_
#define ASH_CALENDAR_CALENDAR_CONTROLLER_H_

#include <map>
#include <memory>

#include "ash/ash_export.h"
#include "ash/public/cpp/session/session_observer.h"
#include "components/account_id/account_id.h"

class PrefRegistrySimple;

namespace ash {

class CalendarClient;

// Keeps track of all calendar clients per user account and makes
// sure the current active client belongs to the current active user.
// There is expected to exist at most one instance of this class at a time. In
// production the instance is owned by ash::Shell.
class ASH_EXPORT CalendarController : public SessionObserver {
 public:
  CalendarController();
  CalendarController(const CalendarController& other) = delete;
  CalendarController& operator=(const CalendarController& other) = delete;
  ~CalendarController() override;

  // Registers profile prefs for Calendar client.
  static void RegisterProfilePrefs(PrefRegistrySimple* registry);

  // Adds a client to it's corresponding user account id in a map.
  void RegisterClientForUser(const AccountId& account_id,
                             CalendarClient* client);

  // Gets the currently active calendar client. Returns `nullptr` if the user
  // profile is not registered with the ProfileManager, e.g. before logging in,
  // guest user, etc.
  CalendarClient* GetClient();

  // For testing only, directly assign `active_user_account_id_`.
  void SetActiveUserAccountIdForTesting(const AccountId& account_id);

 private:
  // SessionObserver:
  void OnActiveUserSessionChanged(const AccountId& account_id) override;

  // The currently active user account id.
  AccountId active_user_account_id_;

  std::map<const AccountId, CalendarClient*> clients_by_account_id_;
};

}  // namespace ash

#endif  // ASH_CALENDAR_CALENDAR_CONTROLLER_H_