1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef EXTENSIONS_BROWSER_API_SYSTEM_DISPLAY_DISPLAY_INFO_PROVIDER_H_
6#define EXTENSIONS_BROWSER_API_SYSTEM_DISPLAY_DISPLAY_INFO_PROVIDER_H_
7
8#include <string>
9#include <vector>
10
11#include "base/macros.h"
12#include "base/memory/linked_ptr.h"
13
14namespace gfx {
15class Display;
16class Screen;
17}
18
19namespace extensions {
20
21namespace core_api {
22namespace system_display {
23struct DisplayProperties;
24struct DisplayUnitInfo;
25}
26}
27
28typedef std::vector<linked_ptr<core_api::system_display::DisplayUnitInfo> >
29    DisplayInfo;
30
31class DisplayInfoProvider {
32 public:
33  virtual ~DisplayInfoProvider();
34
35  // Returns a pointer to DisplayInfoProvider or NULL if Create()
36  // or InitializeForTesting() or not called yet.
37  static DisplayInfoProvider* Get();
38
39  // This is for tests that run in its own process (e.g. browser_tests).
40  // Using this in other tests (e.g. unit_tests) will result in DCHECK failure.
41  static void InitializeForTesting(DisplayInfoProvider* display_info_provider);
42
43  // Updates the display with |display_id| according to |info|. Returns whether
44  // the display was successfully updated. On failure, no display parameters
45  // should be changed, and |error| should be set to the error string.
46  virtual bool SetInfo(const std::string& display_id,
47                       const core_api::system_display::DisplayProperties& info,
48                       std::string* error) = 0;
49
50  // Get the screen that is always active, which will be used for monitoring
51  // display changes events.
52  virtual gfx::Screen* GetActiveScreen() = 0;
53
54  DisplayInfo GetAllDisplaysInfo();
55
56 protected:
57  DisplayInfoProvider();
58
59 private:
60  static DisplayInfoProvider* Create();
61
62  // Update the content of the |unit| obtained for |display| using
63  // platform specific method.
64  virtual void UpdateDisplayUnitInfoForPlatform(
65      const gfx::Display& display,
66      core_api::system_display::DisplayUnitInfo* unit) = 0;
67
68  DISALLOW_COPY_AND_ASSIGN(DisplayInfoProvider);
69};
70
71}  // namespace extensions
72
73#endif  // EXTENSIONS_BROWSER_API_SYSTEM_DISPLAY_DISPLAY_INFO_PROVIDER_H_
74