1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file.
4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#ifndef CHROME_BROWSER_MEDIA_DESKTOP_MEDIA_PICKER_MODEL_H_
6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define CHROME_BROWSER_MEDIA_DESKTOP_MEDIA_PICKER_MODEL_H_
7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/basictypes.h"
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/memory/weak_ptr.h"
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/sequenced_task_runner.h"
124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "content/public/common/desktop_media_id.h"
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/gfx/image/image_skia.h"
14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace webrtc {
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class ScreenCapturer;
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class WindowCapturer;
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// DesktopMediaPickerModel provides the list of desktop media source (screens,
21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// windows, tabs), and their thumbnails, to the desktop media picker dialog. It
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// transparently updates the list in the background, and notifies the desktop
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// media picker when something changes.
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class DesktopMediaPickerModel {
25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Interface implemented by the picker dialog to receive notifications when
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // the model's contents change.
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  class Observer {
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)   public:
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    virtual ~Observer() {}
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    virtual void OnSourceAdded(int index) = 0;
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    virtual void OnSourceRemoved(int index) = 0;
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    virtual void OnSourceNameChanged(int index) = 0;
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    virtual void OnSourceThumbnailChanged(int index) = 0;
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  };
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Struct used to represent each entry in the model.
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  struct Source {
404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    Source(content::DesktopMediaID id, const string16& name);
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Id of the source.
434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    content::DesktopMediaID id;
44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Name of the source that should be shown to the user.
46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    string16 name;
47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // The thumbnail for the source.
49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    gfx::ImageSkia thumbnail;
50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  };
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DesktopMediaPickerModel();
53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual ~DesktopMediaPickerModel();
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Sets screen/window capturer implementations to use (e.g. for tests). Caller
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // may pass NULL for either of the arguments in case when only some types of
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // sources the model should be populated with (e.g. it will only contain
58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // windows, if |screen_capturer| is NULL). Must be called before
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // StartUpdating().
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void SetCapturers(scoped_ptr<webrtc::ScreenCapturer> screen_capturer,
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                    scoped_ptr<webrtc::WindowCapturer> window_capturer);
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Sets time interval between updates. By default list of sources and their
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // thumbnail are updated once per second. If called after StartUpdating() then
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // it will take effect only after the next update.
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void SetUpdatePeriod(base::TimeDelta period);
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Sets size to which the thumbnails should be scaled. If called after
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // StartUpdating() then some thumbnails may be still scaled to the old size
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // until they are updated.
71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void SetThumbnailSize(const gfx::Size& thumbnail_size);
72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Starts updating the model. The model is initially empty, so OnSourceAdded()
74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // notifications will be generated for each existing source as it is
75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // enumerated. After the initial enumeration the model will be refreshed based
76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // on the update period, and notifications generated only for changes in the
77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // model.
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void StartUpdating(Observer* observer);
79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  int source_count() const { return sources_.size(); }
81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const Source& source(int index) const { return sources_.at(index); }
82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  class Worker;
85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  friend class Worker;
86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Struct used to represent sources list the model gets from the Worker.
88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  struct SourceDescription {
894311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    SourceDescription(content::DesktopMediaID id, const string16& name);
90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    content::DesktopMediaID id;
92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    string16 name;
93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  };
94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Order comparator for sources. Used to sort list of sources.
96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  static bool CompareSources(const SourceDescription& a,
97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                             const SourceDescription& b);
98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Post a task for the |worker_| to update list of windows and get thumbnails.
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void Refresh();
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Called by |worker_| to refresh the model. First it posts tasks for
103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // OnSourcesList() with the fresh list of sources, then follows with
104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // OnSourceThumbnail() for each changed thumbnail and then calls
105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // OnRefreshFinished() at the end.
106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void OnSourcesList(const std::vector<SourceDescription>& sources);
107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void OnSourceThumbnail(int index, const gfx::ImageSkia& thumbnail);
108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void OnRefreshFinished();
109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Flags passed to the constructor.
111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  int flags_;
112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Capturers specified in SetCapturers() and passed to the |worker_| later.
114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<webrtc::ScreenCapturer> screen_capturer_;
115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<webrtc::WindowCapturer> window_capturer_;
116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Time interval between mode updates.
118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::TimeDelta update_period_;
119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Size of thumbnails generated by the model.
121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  gfx::Size thumbnail_size_;
122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // The observer passed to StartUpdating().
124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  Observer* observer_;
125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Task runner used for the |worker_|.
127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> capture_task_runner_;
128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // An object that does all the work of getting list of sources on a background
130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // thread (see |capture_task_runner_|). Destroyed on |capture_task_runner_|
131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // after the model is destroyed.
132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<Worker> worker_;
133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Current list of sources.
135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<Source> sources_;
136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
137a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::WeakPtrFactory<DesktopMediaPickerModel> weak_factory_;
138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DesktopMediaPickerModel);
140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif  // CHROME_BROWSER_MEDIA_DESKTOP_MEDIA_PICKER_MODEL_H_
143