blob: 9dfebe1573c1e41b806990803619e7ddbb4ebca7 [file] [log] [blame]
// Copyright 2017 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 MEDIA_CAPTURE_VIDEO_CHROMEOS_DISPLAY_ROTATION_OBSERVER_H_
#define MEDIA_CAPTURE_VIDEO_CHROMEOS_DISPLAY_ROTATION_OBSERVER_H_
#include "base/memory/ref_counted.h"
#include "base/single_thread_task_runner.h"
#include "ui/display/display.h"
#include "ui/display/display_observer.h"
#include "ui/display/screen.h"
namespace media {
class DisplayRotationObserver {
public:
virtual void SetDisplayRotation(const display::Display& display) = 0;
};
// Registers itself as an observer at |display::Screen::GetScreen()| and
// forwards rotation change events to the given DisplayRotationObserver on the
// thread where ScreenObserverDelegate was created.
class ScreenObserverDelegate
: public display::DisplayObserver,
public base::RefCountedThreadSafe<ScreenObserverDelegate> {
public:
static scoped_refptr<ScreenObserverDelegate> Create(
DisplayRotationObserver* observer,
scoped_refptr<base::SingleThreadTaskRunner> display_task_runner);
// The user must call RemoveObserver() to drop the reference to |observer_| in
// ScreenObserverDelegate before deleting |observer_|.
void RemoveObserver();
private:
friend class base::RefCountedThreadSafe<ScreenObserverDelegate>;
ScreenObserverDelegate(
DisplayRotationObserver* observer,
scoped_refptr<base::SingleThreadTaskRunner> display_task_runner);
~ScreenObserverDelegate() override;
// DisplayObserver implementations.
void OnDisplayMetricsChanged(const display::Display& display,
uint32_t metrics) override;
void AddObserverOnDisplayThread();
void RemoveObserverOnDisplayThread();
// Post the screen rotation change from the display thread to capture thread
void SendDisplayRotation(const display::Display& display);
void SendDisplayRotationOnCaptureThread(const display::Display& display);
DisplayRotationObserver* observer_;
absl::optional<display::ScopedDisplayObserver> display_observer_;
// The task runner where the calls to display::Display must be serialized on.
const scoped_refptr<base::SingleThreadTaskRunner> display_task_runner_;
// The task runner on which the ScreenObserverDelegate is created.
const scoped_refptr<base::SingleThreadTaskRunner> delegate_task_runner_;
DISALLOW_IMPLICIT_CONSTRUCTORS(ScreenObserverDelegate);
};
} // namespace media
#endif // MEDIA_CAPTURE_VIDEO_CHROMEOS_DISPLAY_ROTATION_OBSERVER_H_