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