1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/chromeos/arc/kiosk/arc_kiosk_bridge.h"
6
7 #include <utility>
8
9 #include "base/memory/ptr_util.h"
10 #include "base/memory/singleton.h"
11 #include "chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service.h"
12 #include "chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service_factory.h"
13 #include "components/arc/arc_browser_context_keyed_service_factory_base.h"
14 #include "components/arc/session/arc_bridge_service.h"
15 #include "components/user_manager/user_manager.h"
16
17 namespace arc {
18 namespace {
19
20 // Singleton factory for ArcKioskBridge.
21 class ArcKioskBridgeFactory
22 : public internal::ArcBrowserContextKeyedServiceFactoryBase<
23 ArcKioskBridge,
24 ArcKioskBridgeFactory> {
25 public:
26 // Factory name used by ArcBrowserContextKeyedServiceFactoryBase.
27 static constexpr const char* kName = "ArcKioskBridgeFactory";
28
GetInstance()29 static ArcKioskBridgeFactory* GetInstance() {
30 return base::Singleton<ArcKioskBridgeFactory>::get();
31 }
32
33 private:
34 friend base::DefaultSingletonTraits<ArcKioskBridgeFactory>;
35
ArcKioskBridgeFactory()36 ArcKioskBridgeFactory() {
37 DependsOn(chromeos::ArcKioskAppServiceFactory::GetInstance());
38 }
39 ~ArcKioskBridgeFactory() override = default;
40
41 // BrowserContextKeyedServiceFactory override:
BuildServiceInstanceFor(content::BrowserContext * context) const42 KeyedService* BuildServiceInstanceFor(
43 content::BrowserContext* context) const override {
44 // Kiosk apps should be run only for kiosk sessions.
45 if (!user_manager::UserManager::Get()->IsLoggedInAsArcKioskApp())
46 return nullptr;
47 return ArcBrowserContextKeyedServiceFactoryBase::BuildServiceInstanceFor(
48 context);
49 }
50 };
51
52 } // namespace
53
54 // static
GetForBrowserContext(content::BrowserContext * context)55 ArcKioskBridge* ArcKioskBridge::GetForBrowserContext(
56 content::BrowserContext* context) {
57 return ArcKioskBridgeFactory::GetForBrowserContext(context);
58 }
59
60 // static
CreateForTesting(ArcBridgeService * arc_bridge_service,Delegate * delegate)61 std::unique_ptr<ArcKioskBridge> ArcKioskBridge::CreateForTesting(
62 ArcBridgeService* arc_bridge_service,
63 Delegate* delegate) {
64 // std::make_unique() cannot be used because the ctor is private.
65 return base::WrapUnique(new ArcKioskBridge(arc_bridge_service, delegate));
66 }
67
ArcKioskBridge(content::BrowserContext * context,ArcBridgeService * bridge_service)68 ArcKioskBridge::ArcKioskBridge(content::BrowserContext* context,
69 ArcBridgeService* bridge_service)
70 : ArcKioskBridge(bridge_service,
71 chromeos::ArcKioskAppService::Get(context)) {}
72
ArcKioskBridge(ArcBridgeService * bridge_service,Delegate * delegate)73 ArcKioskBridge::ArcKioskBridge(ArcBridgeService* bridge_service,
74 Delegate* delegate)
75 : arc_bridge_service_(bridge_service), delegate_(delegate) {
76 DCHECK(delegate_);
77 arc_bridge_service_->kiosk()->SetHost(this);
78 }
79
~ArcKioskBridge()80 ArcKioskBridge::~ArcKioskBridge() {
81 arc_bridge_service_->kiosk()->SetHost(nullptr);
82 }
83
OnMaintenanceSessionCreated(int32_t session_id)84 void ArcKioskBridge::OnMaintenanceSessionCreated(int32_t session_id) {
85 session_id_ = session_id;
86 delegate_->OnMaintenanceSessionCreated();
87 // TODO(poromov@) Show appropriate splash screen.
88 }
89
OnMaintenanceSessionFinished(int32_t session_id,bool success)90 void ArcKioskBridge::OnMaintenanceSessionFinished(int32_t session_id,
91 bool success) {
92 // Filter only callbacks for the started kiosk session.
93 if (session_id != session_id_)
94 return;
95 session_id_ = -1;
96 delegate_->OnMaintenanceSessionFinished();
97 }
98
99 } // namespace arc
100