Commit 31b56eca authored by Jason Lin's avatar Jason Lin

Connect VmCameraMicManager with camera service for PluginVM

The camera notification/indicator is shown when PluginVM accesses camera
now. Note that flags pluginvm-show-camera-permissions and
vm-camera-mic-indicators-and-notifications need to be turned on.

Bug: b/167491603
Change-Id: Ib2e3f7bc85531313811d2525ecac394aadee6e17
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2557122Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Reviewed-by: default avatarJoel Hockey <joelhockey@chromium.org>
Cr-Commit-Position: refs/heads/master@{#832576}
parent c04ecede
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "base/feature_list.h" #include "base/feature_list.h"
#include "base/notreached.h" #include "base/notreached.h"
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "base/system/sys_info.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "chrome/app/vector_icons/vector_icons.h" #include "chrome/app/vector_icons/vector_icons.h"
#include "chrome/browser/chromeos/camera_mic/vm_camera_mic_manager_factory.h" #include "chrome/browser/chromeos/camera_mic/vm_camera_mic_manager_factory.h"
...@@ -25,6 +26,9 @@ ...@@ -25,6 +26,9 @@
#include "chrome/grit/generated_resources.h" #include "chrome/grit/generated_resources.h"
#include "chromeos/constants/chromeos_features.h" #include "chromeos/constants/chromeos_features.h"
#include "components/vector_icons/vector_icons.h" #include "components/vector_icons/vector_icons.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "media/capture/video/chromeos/mojom/cros_camera_service.mojom-shared.h"
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
#include "ui/message_center/public/cpp/message_center_constants.h" #include "ui/message_center/public/cpp/message_center_constants.h"
#include "ui/message_center/public/cpp/notification.h" #include "ui/message_center/public/cpp/notification.h"
...@@ -101,11 +105,21 @@ VmCameraMicManager::VmCameraMicManager(Profile* profile) ...@@ -101,11 +105,21 @@ VmCameraMicManager::VmCameraMicManager(Profile* profile)
active_map_[std::make_pair(vm, device)] = false; active_map_[std::make_pair(vm, device)] = false;
} }
} }
// Camera service does not behave in non ChromeOS environment (e.g. testing,
// linux chromeos).
if (base::SysInfo::IsRunningOnChromeOS()) {
// OnActiveClientChange() will be called automatically after the
// subscription, so there is no need to get the current status here.
camera_observation_.Observe(media::CameraHalDispatcherImpl::GetInstance());
}
} }
VmCameraMicManager::~VmCameraMicManager() = default; VmCameraMicManager::~VmCameraMicManager() = default;
void VmCameraMicManager::SetActive(VmType vm, DeviceType device, bool active) { void VmCameraMicManager::SetActive(VmType vm, DeviceType device, bool active) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
auto active_it = active_map_.find(std::make_pair(vm, device)); auto active_it = active_map_.find(std::make_pair(vm, device));
CHECK(active_it != active_map_.end()); CHECK(active_it != active_map_.end());
if (active_it->second != active) { if (active_it->second != active) {
...@@ -136,6 +150,20 @@ bool VmCameraMicManager::GetDeviceActive(DeviceType device) const { ...@@ -136,6 +150,20 @@ bool VmCameraMicManager::GetDeviceActive(DeviceType device) const {
return false; return false;
} }
void VmCameraMicManager::OnActiveClientChange(
cros::mojom::CameraClientType type,
bool is_active) {
// TODO(b/167491603): UNKNOWN means PluginVM for now. We should switch to
// `PLUGINVM` once the API work on b/173677647 is done.
if (type == cros::mojom::CameraClientType::UNKNOWN) {
content::GetUIThreadTaskRunner({})->PostTask(
FROM_HERE,
base::BindOnce(&VmCameraMicManager::SetActive,
weak_ptr_factory_.GetWeakPtr(), VmType::kPluginVm,
DeviceType::kCamera, is_active));
}
}
void VmCameraMicManager::AddObserver(Observer* observer) { void VmCameraMicManager::AddObserver(Observer* observer) {
observers_.AddObserver(observer); observers_.AddObserver(observer);
} }
......
...@@ -11,8 +11,10 @@ ...@@ -11,8 +11,10 @@
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "base/observer_list.h" #include "base/observer_list.h"
#include "base/observer_list_types.h" #include "base/observer_list_types.h"
#include "base/scoped_observation.h"
#include "base/timer/timer.h" #include "base/timer/timer.h"
#include "components/keyed_service/core/keyed_service.h" #include "components/keyed_service/core/keyed_service.h"
#include "media/capture/video/chromeos/camera_hal_dispatcher_impl.h"
#include "ui/message_center/public/cpp/notification.h" #include "ui/message_center/public/cpp/notification.h"
#include "ui/message_center/public/cpp/notification_delegate.h" #include "ui/message_center/public/cpp/notification_delegate.h"
...@@ -25,7 +27,8 @@ namespace chromeos { ...@@ -25,7 +27,8 @@ namespace chromeos {
// the primary and non-incognito profile. We might need to change this if we // the primary and non-incognito profile. We might need to change this if we
// extend this class to support the browser, in which case we will also need to // extend this class to support the browser, in which case we will also need to
// make the notification ids different for different profiles. // make the notification ids different for different profiles.
class VmCameraMicManager : public KeyedService { class VmCameraMicManager : public KeyedService,
public media::CameraActiveClientObserver {
public: public:
enum class VmType { kCrostiniVm, kPluginVm }; enum class VmType { kCrostiniVm, kPluginVm };
...@@ -51,11 +54,17 @@ class VmCameraMicManager : public KeyedService { ...@@ -51,11 +54,17 @@ class VmCameraMicManager : public KeyedService {
void AddObserver(Observer* observer); void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer); void RemoveObserver(Observer* observer);
// TODO(b/167491603): Make `SetActive()` private after we implement audio
// service observer.
void SetActive(VmType vm, DeviceType device, bool active); void SetActive(VmType vm, DeviceType device, bool active);
bool GetActive(VmType vm, DeviceType device) const; bool GetActive(VmType vm, DeviceType device) const;
// Return true if any of the VMs is using the device. // Return true if any of the VMs is using the device.
bool GetDeviceActive(DeviceType device) const; bool GetDeviceActive(DeviceType device) const;
// media::CameraActiveClientObserver
void OnActiveClientChange(cros::mojom::CameraClientType type,
bool is_active) override;
private: private:
using ActiveMap = base::flat_map<std::pair<VmType, DeviceType>, bool>; using ActiveMap = base::flat_map<std::pair<VmType, DeviceType>, bool>;
...@@ -91,6 +100,15 @@ class VmCameraMicManager : public KeyedService { ...@@ -91,6 +100,15 @@ class VmCameraMicManager : public KeyedService {
base::RetainingOneShotTimer observer_timer_; base::RetainingOneShotTimer observer_timer_;
base::ObserverList<Observer> observers_; base::ObserverList<Observer> observers_;
base::ScopedObservation<
media::CameraHalDispatcherImpl,
media::CameraActiveClientObserver,
&media::CameraHalDispatcherImpl::AddActiveClientObserver,
&media::CameraHalDispatcherImpl::RemoveActiveClientObserver>
camera_observation_{this};
base::WeakPtrFactory<VmCameraMicManager> weak_ptr_factory_{this};
}; };
} // namespace chromeos } // namespace chromeos
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part_chromeos.h" #include "chrome/browser/browser_process_platform_part_chromeos.h"
#include "chrome/browser/chromeos/arc/session/arc_service_launcher.h" #include "chrome/browser/chromeos/arc/session/arc_service_launcher.h"
#include "chrome/browser/chromeos/camera_mic/vm_camera_mic_manager_factory.h"
#include "chrome/browser/chromeos/child_accounts/child_status_reporting_service_factory.h" #include "chrome/browser/chromeos/child_accounts/child_status_reporting_service_factory.h"
#include "chrome/browser/chromeos/child_accounts/child_user_service_factory.h" #include "chrome/browser/chromeos/child_accounts/child_user_service_factory.h"
#include "chrome/browser/chromeos/child_accounts/family_user_metrics_service_factory.h" #include "chrome/browser/chromeos/child_accounts/family_user_metrics_service_factory.h"
...@@ -210,6 +211,8 @@ void UserSessionInitializer::OnUserSessionStarted(bool is_primary_user) { ...@@ -210,6 +211,8 @@ void UserSessionInitializer::OnUserSessionStarted(bool is_primary_user) {
plugin_vm::PluginVmManagerFactory::GetForProfile(primary_profile_); plugin_vm::PluginVmManagerFactory::GetForProfile(primary_profile_);
if (plugin_vm_manager) if (plugin_vm_manager)
plugin_vm_manager->OnPrimaryUserSessionStarted(); plugin_vm_manager->OnPrimaryUserSessionStarted();
VmCameraMicManagerFactory::GetForProfile(primary_profile_);
} }
} }
......
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