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