// Copyright 2013 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 CHROME_BROWSER_MEDIA_DESKTOP_MEDIA_PICKER_MODEL_H_ #define CHROME_BROWSER_MEDIA_DESKTOP_MEDIA_PICKER_MODEL_H_ #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/sequenced_task_runner.h" #include "content/public/common/desktop_media_id.h" #include "ui/gfx/image/image_skia.h" namespace webrtc { class ScreenCapturer; class WindowCapturer; } // DesktopMediaPickerModel provides the list of desktop media source (screens, // windows, tabs), and their thumbnails, to the desktop media picker dialog. It // transparently updates the list in the background, and notifies the desktop // media picker when something changes. class DesktopMediaPickerModel { public: // Interface implemented by the picker dialog to receive notifications when // the model's contents change. class Observer { public: virtual ~Observer() {} virtual void OnSourceAdded(int index) = 0; virtual void OnSourceRemoved(int index) = 0; virtual void OnSourceNameChanged(int index) = 0; virtual void OnSourceThumbnailChanged(int index) = 0; }; // Struct used to represent each entry in the model. struct Source { Source(content::DesktopMediaID id, const string16& name); // Id of the source. content::DesktopMediaID id; // Name of the source that should be shown to the user. string16 name; // The thumbnail for the source. gfx::ImageSkia thumbnail; }; virtual ~DesktopMediaPickerModel() {} // Sets time interval between updates. By default list of sources and their // thumbnail are updated once per second. If called after StartUpdating() then // it will take effect only after the next update. virtual void SetUpdatePeriod(base::TimeDelta period) = 0; // Sets size to which the thumbnails should be scaled. If called after // StartUpdating() then some thumbnails may be still scaled to the old size // until they are updated. virtual void SetThumbnailSize(const gfx::Size& thumbnail_size) = 0; // Sets ID of the hosting desktop picker dialog. The window with this ID will // be filtered out from the list of sources. virtual void SetViewDialogWindowId(content::DesktopMediaID::Id dialog_id) = 0; // Starts updating the model. The model is initially empty, so OnSourceAdded() // notifications will be generated for each existing source as it is // enumerated. After the initial enumeration the model will be refreshed based // on the update period, and notifications generated only for changes in the // model. virtual void StartUpdating(Observer* observer) = 0; virtual int source_count() const = 0; virtual const Source& source(int index) const = 0; }; class DesktopMediaPickerModelImpl : public DesktopMediaPickerModel { public: // Caller may pass NULL for either of the arguments in case when only some // types of sources the model should be populated with (e.g. it will only // contain windows, if |screen_capturer| is NULL). DesktopMediaPickerModelImpl( scoped_ptr<webrtc::ScreenCapturer> screen_capturer, scoped_ptr<webrtc::WindowCapturer> window_capturer); virtual ~DesktopMediaPickerModelImpl(); // DesktopMediaPickerModel interface. virtual void SetUpdatePeriod(base::TimeDelta period) OVERRIDE; virtual void SetThumbnailSize(const gfx::Size& thumbnail_size) OVERRIDE; virtual void StartUpdating(Observer* observer) OVERRIDE; virtual int source_count() const OVERRIDE; virtual const Source& source(int index) const OVERRIDE; virtual void SetViewDialogWindowId( content::DesktopMediaID::Id dialog_id) OVERRIDE; private: class Worker; friend class Worker; // Struct used to represent sources list the model gets from the Worker. struct SourceDescription { SourceDescription(content::DesktopMediaID id, const string16& name); content::DesktopMediaID id; string16 name; }; // Order comparator for sources. Used to sort list of sources. static bool CompareSources(const SourceDescription& a, const SourceDescription& b); // Post a task for the |worker_| to update list of windows and get thumbnails. void Refresh(); // Called by |worker_| to refresh the model. First it posts tasks for // OnSourcesList() with the fresh list of sources, then follows with // OnSourceThumbnail() for each changed thumbnail and then calls // OnRefreshFinished() at the end. void OnSourcesList(const std::vector<SourceDescription>& sources); void OnSourceThumbnail(int index, const gfx::ImageSkia& thumbnail); void OnRefreshFinished(); // Capturers specified in SetCapturers() and passed to the |worker_| later. scoped_ptr<webrtc::ScreenCapturer> screen_capturer_; scoped_ptr<webrtc::WindowCapturer> window_capturer_; // Time interval between mode updates. base::TimeDelta update_period_; // Size of thumbnails generated by the model. gfx::Size thumbnail_size_; // ID of the hosting dialog. content::DesktopMediaID::Id view_dialog_id_; // The observer passed to StartUpdating(). Observer* observer_; // Task runner used for the |worker_|. scoped_refptr<base::SequencedTaskRunner> capture_task_runner_; // An object that does all the work of getting list of sources on a background // thread (see |capture_task_runner_|). Destroyed on |capture_task_runner_| // after the model is destroyed. scoped_ptr<Worker> worker_; // Current list of sources. std::vector<Source> sources_; base::WeakPtrFactory<DesktopMediaPickerModelImpl> weak_factory_; DISALLOW_COPY_AND_ASSIGN(DesktopMediaPickerModelImpl); }; #endif // CHROME_BROWSER_MEDIA_DESKTOP_MEDIA_PICKER_MODEL_H_