Commit ade27582 authored by Wei Lee's avatar Wei Lee Committed by Commit Bot

CCA: Replace chrome.system.display API

Since we are about to migrate CCA to SWA, we should avoid using chrome.*
API so that we can have it work on SWA as well. Therefore, replacing
chrome.system.display API by our own mojo API.

Bug: 1114967, 980846
Test: Launch CCA without showing error messages
Change-Id: I89aaf3f2700adfade8dd8eae32554ac095bb0ded
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2354109Reviewed-by: default avatarShik Chen <shik@chromium.org>
Reviewed-by: default avatarRobert Sesek <rsesek@chromium.org>
Reviewed-by: default avatarAhmed Fakhry <afakhry@chromium.org>
Reviewed-by: default avatarKuo Jen Wei <inker@chromium.org>
Commit-Queue: Ahmed Fakhry <afakhry@chromium.org>
Auto-Submit: Wei Lee <wtlee@chromium.org>
Cr-Commit-Position: refs/heads/master@{#799360}
parent d84146cc
...@@ -5,5 +5,6 @@ include_rules = [ ...@@ -5,5 +5,6 @@ include_rules = [
"+content/public/browser", "+content/public/browser",
"+media/capture/video/chromeos", "+media/capture/video/chromeos",
"+ui/aura", "+ui/aura",
"+ui/display",
"+ui/webui", "+ui/webui",
] ]
...@@ -30,6 +30,14 @@ interface ScreenStateMonitor { ...@@ -30,6 +30,14 @@ interface ScreenStateMonitor {
Update(ScreenState state); Update(ScreenState state);
}; };
// Interface for monitoring the existence of external screen. The state is
// detected from Chrome browser process and is notified to Chrome Camera App in
// renderer process.
interface ExternalScreenMonitor {
// Updates when the existence of external screen got changed.
Update(bool has_external_screen);
};
// Interface for communication between Chrome Camera App (Remote) and Chrome // Interface for communication between Chrome Camera App (Remote) and Chrome
// (Receiver). // (Receiver).
interface CameraAppHelper { interface CameraAppHelper {
...@@ -65,4 +73,10 @@ interface CameraAppHelper { ...@@ -65,4 +73,10 @@ interface CameraAppHelper {
// Checks if the logging consent option is enabled. It is only usable for SWA // Checks if the logging consent option is enabled. It is only usable for SWA
// version. For platform app version, we use Chrome MetricsPrivate API. // version. For platform app version, we use Chrome MetricsPrivate API.
IsMetricsAndCrashReportingEnabled() => (bool is_enabled); IsMetricsAndCrashReportingEnabled() => (bool is_enabled);
// Registers a ExternalScreenMonitor instance and returns the initial state of
// the existence of external screen. Calling the Update() whenever the screen
// state changes.
SetExternalScreenMonitor(pending_remote<ExternalScreenMonitor> monitor)
=> (bool has_external_screen);
}; };
...@@ -27,6 +27,15 @@ mojom::ScreenState ToMojoScreenState(ash::ScreenState s) { ...@@ -27,6 +27,15 @@ mojom::ScreenState ToMojoScreenState(ash::ScreenState s) {
} }
} }
bool HasExternalScreen() {
for (const auto& display : display::Screen::GetScreen()->GetAllDisplays()) {
if (!display.IsInternal()) {
return true;
}
}
return false;
}
} // namespace } // namespace
CameraAppHelperImpl::CameraAppHelperImpl( CameraAppHelperImpl::CameraAppHelperImpl(
...@@ -34,16 +43,19 @@ CameraAppHelperImpl::CameraAppHelperImpl( ...@@ -34,16 +43,19 @@ CameraAppHelperImpl::CameraAppHelperImpl(
CameraResultCallback camera_result_callback, CameraResultCallback camera_result_callback,
aura::Window* window) aura::Window* window)
: camera_app_ui_(camera_app_ui), : camera_app_ui_(camera_app_ui),
camera_result_callback_(std::move(camera_result_callback)) { camera_result_callback_(std::move(camera_result_callback)),
has_external_screen_(HasExternalScreen()) {
DCHECK(window); DCHECK(window);
window->SetProperty(ash::kCanConsumeSystemKeysKey, true); window->SetProperty(ash::kCanConsumeSystemKeysKey, true);
ash::TabletMode::Get()->AddObserver(this); ash::TabletMode::Get()->AddObserver(this);
ash::ScreenBacklight::Get()->AddObserver(this); ash::ScreenBacklight::Get()->AddObserver(this);
display::Screen::GetScreen()->AddObserver(this);
} }
CameraAppHelperImpl::~CameraAppHelperImpl() { CameraAppHelperImpl::~CameraAppHelperImpl() {
ash::TabletMode::Get()->RemoveObserver(this); ash::TabletMode::Get()->RemoveObserver(this);
ash::ScreenBacklight::Get()->RemoveObserver(this); ash::ScreenBacklight::Get()->RemoveObserver(this);
display::Screen::GetScreen()->RemoveObserver(this);
} }
void CameraAppHelperImpl::Bind( void CameraAppHelperImpl::Bind(
...@@ -95,6 +107,23 @@ void CameraAppHelperImpl::IsMetricsAndCrashReportingEnabled( ...@@ -95,6 +107,23 @@ void CameraAppHelperImpl::IsMetricsAndCrashReportingEnabled(
camera_app_ui_->delegate()->IsMetricsAndCrashReportingEnabled()); camera_app_ui_->delegate()->IsMetricsAndCrashReportingEnabled());
} }
void CameraAppHelperImpl::SetExternalScreenMonitor(
mojo::PendingRemote<ExternalScreenMonitor> monitor,
SetExternalScreenMonitorCallback callback) {
external_screen_monitor_ =
mojo::Remote<ExternalScreenMonitor>(std::move(monitor));
std::move(callback).Run(has_external_screen_);
}
void CameraAppHelperImpl::CheckExternalScreenState() {
if (has_external_screen_ == HasExternalScreen())
return;
has_external_screen_ = !has_external_screen_;
if (external_screen_monitor_.is_bound())
external_screen_monitor_->Update(has_external_screen_);
}
void CameraAppHelperImpl::OnTabletModeStarted() { void CameraAppHelperImpl::OnTabletModeStarted() {
if (tablet_monitor_.is_bound()) if (tablet_monitor_.is_bound())
tablet_monitor_->Update(true); tablet_monitor_->Update(true);
...@@ -110,4 +139,13 @@ void CameraAppHelperImpl::OnScreenStateChanged(ash::ScreenState screen_state) { ...@@ -110,4 +139,13 @@ void CameraAppHelperImpl::OnScreenStateChanged(ash::ScreenState screen_state) {
screen_state_monitor_->Update(ToMojoScreenState(screen_state)); screen_state_monitor_->Update(ToMojoScreenState(screen_state));
} }
void CameraAppHelperImpl::OnDisplayAdded(const display::Display& new_display) {
CheckExternalScreenState();
}
void CameraAppHelperImpl::OnDisplayRemoved(
const display::Display& old_display) {
CheckExternalScreenState();
}
} // namespace chromeos_camera } // namespace chromeos_camera
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
#include "chromeos/components/camera_app_ui/camera_app_helper.mojom.h" #include "chromeos/components/camera_app_ui/camera_app_helper.mojom.h"
#include "chromeos/components/camera_app_ui/camera_app_ui.h" #include "chromeos/components/camera_app_ui/camera_app_ui.h"
#include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/remote.h"
#include "ui/display/display_observer.h"
#include "ui/display/screen.h"
namespace aura { namespace aura {
class Window; class Window;
...@@ -22,6 +24,7 @@ namespace chromeos_camera { ...@@ -22,6 +24,7 @@ namespace chromeos_camera {
class CameraAppHelperImpl : public ash::TabletModeObserver, class CameraAppHelperImpl : public ash::TabletModeObserver,
public ash::ScreenBacklightObserver, public ash::ScreenBacklightObserver,
public display::DisplayObserver,
public mojom::CameraAppHelper { public mojom::CameraAppHelper {
public: public:
using CameraResultCallback = using CameraResultCallback =
...@@ -31,6 +34,7 @@ class CameraAppHelperImpl : public ash::TabletModeObserver, ...@@ -31,6 +34,7 @@ class CameraAppHelperImpl : public ash::TabletModeObserver,
HandleCameraResultCallback)>; HandleCameraResultCallback)>;
using TabletModeMonitor = mojom::TabletModeMonitor; using TabletModeMonitor = mojom::TabletModeMonitor;
using ScreenStateMonitor = mojom::ScreenStateMonitor; using ScreenStateMonitor = mojom::ScreenStateMonitor;
using ExternalScreenMonitor = mojom::ExternalScreenMonitor;
CameraAppHelperImpl(chromeos::CameraAppUI* camera_app_ui, CameraAppHelperImpl(chromeos::CameraAppUI* camera_app_ui,
CameraResultCallback camera_result_callback, CameraResultCallback camera_result_callback,
...@@ -52,8 +56,13 @@ class CameraAppHelperImpl : public ash::TabletModeObserver, ...@@ -52,8 +56,13 @@ class CameraAppHelperImpl : public ash::TabletModeObserver,
SetScreenStateMonitorCallback callback) override; SetScreenStateMonitorCallback callback) override;
void IsMetricsAndCrashReportingEnabled( void IsMetricsAndCrashReportingEnabled(
IsMetricsAndCrashReportingEnabledCallback callback) override; IsMetricsAndCrashReportingEnabledCallback callback) override;
void SetExternalScreenMonitor(
mojo::PendingRemote<ExternalScreenMonitor> monitor,
SetExternalScreenMonitorCallback callback) override;
private: private:
void CheckExternalScreenState();
// ash::TabletModeObserver overrides; // ash::TabletModeObserver overrides;
void OnTabletModeStarted() override; void OnTabletModeStarted() override;
void OnTabletModeEnded() override; void OnTabletModeEnded() override;
...@@ -61,6 +70,10 @@ class CameraAppHelperImpl : public ash::TabletModeObserver, ...@@ -61,6 +70,10 @@ class CameraAppHelperImpl : public ash::TabletModeObserver,
// ash::ScreenBacklightObserver overrides; // ash::ScreenBacklightObserver overrides;
void OnScreenStateChanged(ash::ScreenState screen_state) override; void OnScreenStateChanged(ash::ScreenState screen_state) override;
// display::DisplayObserver overrides;
void OnDisplayAdded(const display::Display& new_display) override;
void OnDisplayRemoved(const display::Display& old_display) override;
// For platform app, we set |camera_app_ui_| to nullptr and should not use // For platform app, we set |camera_app_ui_| to nullptr and should not use
// it. For SWA, since CameraAppUI owns CameraAppHelperImpl, it is safe to // it. For SWA, since CameraAppUI owns CameraAppHelperImpl, it is safe to
// assume that the |camera_app_ui_| is always valid during the whole lifetime // assume that the |camera_app_ui_| is always valid during the whole lifetime
...@@ -69,8 +82,11 @@ class CameraAppHelperImpl : public ash::TabletModeObserver, ...@@ -69,8 +82,11 @@ class CameraAppHelperImpl : public ash::TabletModeObserver,
CameraResultCallback camera_result_callback_; CameraResultCallback camera_result_callback_;
bool has_external_screen_;
mojo::Remote<TabletModeMonitor> tablet_monitor_; mojo::Remote<TabletModeMonitor> tablet_monitor_;
mojo::Remote<ScreenStateMonitor> screen_state_monitor_; mojo::Remote<ScreenStateMonitor> screen_state_monitor_;
mojo::Remote<ExternalScreenMonitor> external_screen_monitor_;
mojo::Receiver<chromeos_camera::mojom::CameraAppHelper> receiver_{this}; mojo::Receiver<chromeos_camera::mojom::CameraAppHelper> receiver_{this};
......
...@@ -60,6 +60,22 @@ export class ChromeHelper { ...@@ -60,6 +60,22 @@ export class ChromeHelper {
.initialState; .initialState;
} }
/**
* Starts monitor monitoring the existence of external screens.
* @param {function(boolean)} onChange Callback called when the existence of
* external screens changes.
* @return {!Promise<boolean>} Resolved to the initial state.
*/
async initExternalScreenMonitor(onChange) {
const monitorCallbackRouter =
new chromeosCamera.mojom.ExternalScreenMonitorCallbackRouter();
monitorCallbackRouter.update.addListener(onChange);
return (await this.remote_.setExternalScreenMonitor(
monitorCallbackRouter.$.bindNewPipeAndPassRemote()))
.hasExternalScreen;
}
/** /**
* Checks if the device is under tablet mode currently. * Checks if the device is under tablet mode currently.
* @return {!Promise<boolean>} * @return {!Promise<boolean>}
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
// found in the LICENSE file. // found in the LICENSE file.
import {browserProxy} from '../browser_proxy/browser_proxy.js'; import {browserProxy} from '../browser_proxy/browser_proxy.js';
import {assert, assertInstanceof, promisify} from '../chrome_util.js'; import {assert, assertInstanceof} from '../chrome_util.js';
import { import {
PhotoConstraintsPreferrer, // eslint-disable-line no-unused-vars PhotoConstraintsPreferrer, // eslint-disable-line no-unused-vars
VideoConstraintsPreferrer, // eslint-disable-line no-unused-vars VideoConstraintsPreferrer, // eslint-disable-line no-unused-vars
...@@ -277,14 +277,12 @@ export class Camera extends View { ...@@ -277,14 +277,12 @@ export class Camera extends View {
const screenState = await helper.initScreenStateMonitor(setScreenOffAuto); const screenState = await helper.initScreenStateMonitor(setScreenOffAuto);
setScreenOffAuto(screenState); setScreenOffAuto(screenState);
const updateExternalScreen = async () => { const updateExternalScreen = (hasExternalScreen) => {
const allInfo = await promisify(chrome.system.display.getInfo)(
{singleUnified: false});
const hasExternalScreen = allInfo.some(({isInternal}) => !isInternal);
state.set(state.State.HAS_EXTERNAL_SCREEN, hasExternalScreen); state.set(state.State.HAS_EXTERNAL_SCREEN, hasExternalScreen);
}; };
await updateExternalScreen(); const hasExternalScreen =
chrome.system.display.onDisplayChanged.addListener(updateExternalScreen); await helper.initExternalScreenMonitor(updateExternalScreen);
updateExternalScreen(hasExternalScreen);
const checkScreenOff = () => { const checkScreenOff = () => {
if (this.screenOff_) { if (this.screenOff_) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment