| // Copyright 2018 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/session/arc_container_client_adapter.h" |
| |
| #include <string> |
| #include <utility> |
| |
| #include "base/callback_helpers.h" |
| #include "base/logging.h" |
| #include "base/macros.h" |
| #include "base/notreached.h" |
| #include "base/threading/thread_task_runner_handle.h" |
| #include "chromeos/cryptohome/cryptohome_parameters.h" |
| #include "chromeos/dbus/dbus_method_call_status.h" |
| #include "chromeos/dbus/login_manager/arc.pb.h" |
| #include "chromeos/dbus/session_manager/session_manager_client.h" |
| #include "components/arc/session/arc_session.h" |
| |
| namespace arc { |
| namespace { |
| |
| // Converts PackageCacheMode into login_manager's. |
| login_manager::UpgradeArcContainerRequest_PackageCacheMode |
| ToLoginManagerPackageCacheMode(UpgradeParams::PackageCacheMode mode) { |
| switch (mode) { |
| case UpgradeParams::PackageCacheMode::DEFAULT: |
| return login_manager::UpgradeArcContainerRequest_PackageCacheMode_DEFAULT; |
| case UpgradeParams::PackageCacheMode::COPY_ON_INIT: |
| return login_manager:: |
| UpgradeArcContainerRequest_PackageCacheMode_COPY_ON_INIT; |
| case UpgradeParams::PackageCacheMode::SKIP_SETUP_COPY_ON_INIT: |
| return login_manager:: |
| UpgradeArcContainerRequest_PackageCacheMode_SKIP_SETUP_COPY_ON_INIT; |
| } |
| } |
| |
| // Converts ArcSupervisionTransition into login_manager's. |
| login_manager::UpgradeArcContainerRequest_SupervisionTransition |
| ToLoginManagerSupervisionTransition(ArcSupervisionTransition transition) { |
| switch (transition) { |
| case ArcSupervisionTransition::NO_TRANSITION: |
| return login_manager:: |
| UpgradeArcContainerRequest_SupervisionTransition_NONE; |
| case ArcSupervisionTransition::CHILD_TO_REGULAR: |
| return login_manager:: |
| UpgradeArcContainerRequest_SupervisionTransition_CHILD_TO_REGULAR; |
| case ArcSupervisionTransition::REGULAR_TO_CHILD: |
| return login_manager:: |
| UpgradeArcContainerRequest_SupervisionTransition_REGULAR_TO_CHILD; |
| } |
| } |
| |
| // Converts PlayStoreAutoUpdate into login_manager's. |
| login_manager::StartArcMiniContainerRequest_PlayStoreAutoUpdate |
| ToLoginManagerPlayStoreAutoUpdate(StartParams::PlayStoreAutoUpdate update) { |
| switch (update) { |
| case StartParams::PlayStoreAutoUpdate::AUTO_UPDATE_DEFAULT: |
| return login_manager:: |
| StartArcMiniContainerRequest_PlayStoreAutoUpdate_AUTO_UPDATE_DEFAULT; |
| case StartParams::PlayStoreAutoUpdate::AUTO_UPDATE_ON: |
| return login_manager:: |
| StartArcMiniContainerRequest_PlayStoreAutoUpdate_AUTO_UPDATE_ON; |
| case StartParams::PlayStoreAutoUpdate::AUTO_UPDATE_OFF: |
| return login_manager:: |
| StartArcMiniContainerRequest_PlayStoreAutoUpdate_AUTO_UPDATE_OFF; |
| } |
| } |
| |
| // Converts DalvikMemoryProfile into login_manager's. |
| login_manager::StartArcMiniContainerRequest_DalvikMemoryProfile |
| ToLoginManagerDalvikMemoryProfile( |
| StartParams::DalvikMemoryProfile dalvik_memory_profile) { |
| switch (dalvik_memory_profile) { |
| case StartParams::DalvikMemoryProfile::DEFAULT: |
| return login_manager:: |
| StartArcMiniContainerRequest_DalvikMemoryProfile_MEMORY_PROFILE_DEFAULT; |
| case StartParams::DalvikMemoryProfile::M4G: |
| return login_manager:: |
| StartArcMiniContainerRequest_DalvikMemoryProfile_MEMORY_PROFILE_4G; |
| case StartParams::DalvikMemoryProfile::M8G: |
| return login_manager:: |
| StartArcMiniContainerRequest_DalvikMemoryProfile_MEMORY_PROFILE_8G; |
| case StartParams::DalvikMemoryProfile::M16G: |
| return login_manager:: |
| StartArcMiniContainerRequest_DalvikMemoryProfile_MEMORY_PROFILE_16G; |
| } |
| } |
| |
| } // namespace |
| |
| class ArcContainerClientAdapter |
| : public ArcClientAdapter, |
| public chromeos::SessionManagerClient::Observer { |
| public: |
| ArcContainerClientAdapter() { |
| if (chromeos::SessionManagerClient::Get()) |
| chromeos::SessionManagerClient::Get()->AddObserver(this); |
| } |
| |
| ~ArcContainerClientAdapter() override { |
| if (chromeos::SessionManagerClient::Get()) |
| chromeos::SessionManagerClient::Get()->RemoveObserver(this); |
| } |
| |
| // ArcClientAdapter overrides: |
| void StartMiniArc(StartParams params, |
| chromeos::VoidDBusMethodCallback callback) override { |
| login_manager::StartArcMiniContainerRequest request; |
| request.set_native_bridge_experiment(params.native_bridge_experiment); |
| request.set_lcd_density(params.lcd_density); |
| request.set_arc_file_picker_experiment(params.arc_file_picker_experiment); |
| request.set_play_store_auto_update( |
| ToLoginManagerPlayStoreAutoUpdate(params.play_store_auto_update)); |
| request.set_dalvik_memory_profile( |
| ToLoginManagerDalvikMemoryProfile(params.dalvik_memory_profile)); |
| request.set_arc_custom_tabs_experiment(params.arc_custom_tabs_experiment); |
| request.set_disable_system_default_app( |
| params.arc_disable_system_default_app); |
| request.set_disable_media_store_maintenance( |
| params.disable_media_store_maintenance); |
| request.set_disable_download_provider(params.disable_download_provider); |
| request.set_arc_generate_pai(params.arc_generate_play_auto_install); |
| |
| switch (params.usap_profile) { |
| case StartParams::UsapProfile::DEFAULT: |
| break; |
| case StartParams::UsapProfile::M4G: |
| case StartParams::UsapProfile::M8G: |
| case StartParams::UsapProfile::M16G: |
| VLOG(1) << "USAP profile is not supported for container."; |
| break; |
| } |
| |
| chromeos::SessionManagerClient::Get()->StartArcMiniContainer( |
| request, std::move(callback)); |
| } |
| |
| void UpgradeArc(UpgradeParams params, |
| chromeos::VoidDBusMethodCallback callback) override { |
| login_manager::UpgradeArcContainerRequest request; |
| request.set_account_id(params.account_id); |
| request.set_is_account_managed(params.is_account_managed); |
| request.set_is_managed_adb_sideloading_allowed( |
| params.is_managed_adb_sideloading_allowed); |
| request.set_skip_boot_completed_broadcast( |
| params.skip_boot_completed_broadcast); |
| request.set_packages_cache_mode( |
| ToLoginManagerPackageCacheMode(params.packages_cache_mode)); |
| request.set_skip_gms_core_cache(params.skip_gms_core_cache); |
| request.set_is_demo_session(params.is_demo_session); |
| request.set_demo_session_apps_path(params.demo_session_apps_path.value()); |
| request.set_locale(params.locale); |
| for (const auto& language : params.preferred_languages) |
| request.add_preferred_languages(language); |
| request.set_supervision_transition( |
| ToLoginManagerSupervisionTransition(params.supervision_transition)); |
| |
| chromeos::SessionManagerClient::Get()->UpgradeArcContainer( |
| request, std::move(callback)); |
| } |
| |
| void StopArcInstance(bool on_shutdown, bool should_backup_log) override { |
| // Since we have the ArcInstanceStopped() callback, we don't need to do |
| // anything when StopArcInstance completes. |
| chromeos::SessionManagerClient::Get()->StopArcInstance( |
| cryptohome_id_.id(), should_backup_log, base::DoNothing()); |
| } |
| |
| void SetUserInfo(const cryptohome::Identification& cryptohome_id, |
| const std::string& hash, |
| const std::string& serial_number) override { |
| DCHECK(cryptohome_id_.id().empty()); |
| if (cryptohome_id.id().empty()) |
| LOG(WARNING) << "cryptohome_id is empty"; |
| cryptohome_id_ = cryptohome_id; |
| } |
| |
| // ArcContainerClientAdapter gets the demo session apps path from |
| // UpgradeParams, so it does not use the DemoModeDelegate. |
| void SetDemoModeDelegate(DemoModeDelegate* delegate) override {} |
| |
| // The interface is only for ARCVM. |
| void TrimVmMemory(TrimVmMemoryCallback callback) override { |
| NOTREACHED(); |
| base::ThreadTaskRunnerHandle::Get()->PostTask( |
| FROM_HERE, |
| base::BindOnce(std::move(callback), /*success=*/true, |
| /*failure_reason=*/"ARC container is not supported.")); |
| } |
| |
| // chromeos::SessionManagerClient::Observer overrides: |
| void ArcInstanceStopped() override { |
| for (auto& observer : observer_list_) |
| observer.ArcInstanceStopped(); |
| } |
| |
| private: |
| // A cryptohome ID of the primary profile. |
| cryptohome::Identification cryptohome_id_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ArcContainerClientAdapter); |
| }; |
| |
| std::unique_ptr<ArcClientAdapter> CreateArcContainerClientAdapter() { |
| return std::make_unique<ArcContainerClientAdapter>(); |
| } |
| |
| } // namespace arc |