blob: 9def23d0947c344a57adbe4634bf1f3ae541570e [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.
#include "components/arc/lock_screen/arc_lock_screen_bridge.h"
#include "base/bind.h"
#include "base/logging.h"
#include "base/memory/singleton.h"
#include "base/threading/thread_task_runner_handle.h"
#include "components/arc/arc_browser_context_keyed_service_factory_base.h"
#include "components/arc/arc_service_manager.h"
#include "components/arc/session/arc_bridge_service.h"
#include "components/session_manager/core/session_manager.h"
#include "mojo/public/cpp/system/platform_handle.h"
namespace arc {
namespace {
// Singleton factory for ArcLockScreenBridge.
class ArcLockScreenBridgeFactory
: public internal::ArcBrowserContextKeyedServiceFactoryBase<
ArcLockScreenBridge,
ArcLockScreenBridgeFactory> {
public:
// Factory name used by ArcBrowserContextKeyedServiceFactoryBase.
static constexpr const char* kName = "ArcLockScreenBridgeFactory";
static ArcLockScreenBridgeFactory* GetInstance() {
return base::Singleton<ArcLockScreenBridgeFactory>::get();
}
private:
friend base::DefaultSingletonTraits<ArcLockScreenBridgeFactory>;
ArcLockScreenBridgeFactory() = default;
~ArcLockScreenBridgeFactory() override = default;
};
} // namespace
// static
ArcLockScreenBridge* ArcLockScreenBridge::GetForBrowserContext(
content::BrowserContext* context) {
return ArcLockScreenBridgeFactory::GetForBrowserContext(context);
}
ArcLockScreenBridge::ArcLockScreenBridge(content::BrowserContext* context,
ArcBridgeService* bridge_service)
: arc_bridge_service_(bridge_service) {
arc_bridge_service_->lock_screen()->AddObserver(this);
session_manager::SessionManager::Get()->AddObserver(this);
}
ArcLockScreenBridge::~ArcLockScreenBridge() {
arc_bridge_service_->lock_screen()->RemoveObserver(this);
session_manager::SessionManager::Get()->RemoveObserver(this);
}
void ArcLockScreenBridge::OnConnectionReady() {
SendDeviceLockedState();
}
void ArcLockScreenBridge::OnSessionStateChanged() {
SendDeviceLockedState();
}
void ArcLockScreenBridge::SendDeviceLockedState() {
mojom::LockScreenInstance* lock_screen_instance = ARC_GET_INSTANCE_FOR_METHOD(
arc_bridge_service_->lock_screen(), SetDeviceLocked);
if (!lock_screen_instance)
return;
lock_screen_instance->SetDeviceLocked(
session_manager::SessionManager::Get()->IsUserSessionBlocked());
}
} // namespace arc