// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ASH_SYSTEM_SCREEN_LAYOUT_OBSERVER_H_
#define ASH_SYSTEM_SCREEN_LAYOUT_OBSERVER_H_

#include <stdint.h>

#include <map>
#include <set>

#include "ash/ash_export.h"
#include "ash/display/window_tree_host_manager.h"
#include "base/macros.h"
#include "base/strings/string16.h"
#include "ui/display/manager/managed_display_info.h"

namespace ash {

// ScreenLayoutObserver is responsible to send notification to users when screen
// resolution changes or screen rotation changes.
class ASH_EXPORT ScreenLayoutObserver : public WindowTreeHostManager::Observer {
 public:
  ScreenLayoutObserver();
  ~ScreenLayoutObserver() override;

  static const char kNotificationId[];

  // WindowTreeHostManager::Observer:
  void OnDisplayConfigurationChanged() override;

  // No notification will be shown only for the next ui scale change for the
  // display with |display_id|. This state will be consumed and subsequent
  // changes won't be affected.
  void SetDisplayChangedFromSettingsUI(int64_t display_id);

  // Notifications are shown in production and are not shown in unit tests.
  // Allow individual unit tests to show notifications.
  void set_show_notifications_for_testing(bool show) {
    show_notifications_for_testing_ = show;
  }

 private:
  FRIEND_TEST_ALL_PREFIXES(ScreenLayoutObserverTestMultiMirroring,
                           DisplayNotifications);
  friend class ScreenLayoutObserverTest;

  using DisplayInfoMap = std::map<int64_t, display::ManagedDisplayInfo>;

  // Scans the current display info and updates |display_info_|. Sets the
  // previous data to |old_info| if it's not NULL.
  void UpdateDisplayInfo(DisplayInfoMap* old_info);

  // Compares the current display settings with |old_info| and determine what
  // message should be shown for notification. Returns true if there's a
  // meaningful change. Note that it's possible to return true and set
  // |out_message| to empty, which means the notification should be removed. It
  // also sets |out_additional_message| which appears in the notification with
  // the |out_message|.
  bool GetDisplayMessageForNotification(
      const DisplayInfoMap& old_info,
      bool should_notify_has_unassociated_display,
      base::string16* out_message,
      base::string16* out_additional_message);

  // Creates or updates the display notification.
  void CreateOrUpdateNotification(const base::string16& message,
                                  const base::string16& additional_message);

  // Returns the notification message that should be shown when mirror display
  // mode is exited.
  bool GetExitMirrorModeMessage(base::string16* out_message,
                                base::string16* out_additional_message);

  DisplayInfoMap display_info_;

  enum class DisplayMode {
    SINGLE,
    EXTENDED_2,       // 2 displays in extended mode.
    EXTENDED_3_PLUS,  // 3+ displays in extended mode.
    MIRRORING,
    UNIFIED,
    DOCKED
  };

  DisplayMode old_display_mode_ = DisplayMode::SINGLE;
  DisplayMode current_display_mode_ = DisplayMode::SINGLE;

  bool has_unassociated_display_ = false;

  // When the UI scale of a display is modified from the Settings UI, we should
  // ignore this change and avoid showing a notification for it.
  std::set<int64_t> displays_changed_from_settings_ui_;

  bool show_notifications_for_testing_ = true;

  DISALLOW_COPY_AND_ASSIGN(ScreenLayoutObserver);
};

}  // namespace ash

#endif  // ASH_SYSTEM_SCREEN_LAYOUT_OBSERVER_H_
