blob: ff44730b72ea0db77fb3ffa201cebc2b80583424 [file] [log] [blame]
// Copyright 2020 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 "chrome/browser/ash/borealis/borealis_app_launcher.h"
#include "base/bind.h"
#include "chrome/browser/ash/borealis/borealis_context.h"
#include "chrome/browser/ash/borealis/borealis_context_manager.h"
#include "chrome/browser/ash/borealis/borealis_features.h"
#include "chrome/browser/ash/borealis/borealis_service.h"
#include "chrome/browser/ash/borealis/borealis_util.h"
#include "chrome/browser/ash/guest_os/guest_os_registry_service.h"
#include "chrome/browser/ash/guest_os/guest_os_registry_service_factory.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chromeos/dbus/cicerone/cicerone_client.h"
#include "chromeos/dbus/cicerone/cicerone_service.pb.h"
namespace borealis {
void BorealisAppLauncher::Launch(const BorealisContext& ctx,
const std::string& app_id,
OnLaunchedCallback callback) {
Launch(ctx, app_id, {}, std::move(callback));
}
void BorealisAppLauncher::Launch(const BorealisContext& ctx,
const std::string& app_id,
const std::vector<std::string>& args,
OnLaunchedCallback callback) {
// Launching the borealis app is a legacy way of launching its main app
if (app_id == kBorealisAppId) {
Launch(ctx, kBorealisMainAppId, args, std::move(callback));
return;
}
absl::optional<guest_os::GuestOsRegistryService::Registration> reg =
guest_os::GuestOsRegistryServiceFactory::GetForProfile(ctx.profile())
->GetRegistration(app_id);
if (!reg) {
std::move(callback).Run(LaunchResult::kUnknownApp);
return;
}
vm_tools::cicerone::LaunchContainerApplicationRequest request;
request.set_owner_id(
chromeos::ProfileHelper::GetUserIdHashFromProfile(ctx.profile()));
request.set_vm_name(ctx.vm_name());
request.set_container_name(ctx.container_name());
request.set_desktop_file_id(reg->DesktopFileId());
std::copy(
args.begin(), args.end(),
google::protobuf::RepeatedFieldBackInserter(request.mutable_files()));
chromeos::CiceroneClient::Get()->LaunchContainerApplication(
std::move(request),
base::BindOnce(
[](OnLaunchedCallback callback,
absl::optional<
vm_tools::cicerone::LaunchContainerApplicationResponse>
response) {
if (!response) {
LOG(ERROR) << "Failed to launch app: No response from cicerone";
std::move(callback).Run(LaunchResult::kNoResponse);
return;
}
if (!response->success()) {
LOG(ERROR) << "Failed to launch app: "
<< response->failure_reason();
std::move(callback).Run(LaunchResult::kError);
return;
}
std::move(callback).Run(LaunchResult::kSuccess);
},
std::move(callback)));
}
BorealisAppLauncher::BorealisAppLauncher(Profile* profile)
: profile_(profile) {}
void BorealisAppLauncher::Launch(std::string app_id,
OnLaunchedCallback callback) {
Launch(std::move(app_id), {}, std::move(callback));
}
void BorealisAppLauncher::Launch(std::string app_id,
const std::vector<std::string>& args,
OnLaunchedCallback callback) {
DCHECK(BorealisService::GetForProfile(profile_)->Features().IsAllowed());
if (!borealis::BorealisService::GetForProfile(profile_)
->Features()
.IsEnabled()) {
borealis::ShowBorealisInstallerView(profile_);
return;
}
if (!borealis::BorealisService::GetForProfile(profile_)
->ContextManager()
.IsRunning())
borealis::ShowBorealisSplashScreenView(profile_);
BorealisService::GetForProfile(profile_)->ContextManager().StartBorealis(
base::BindOnce(
[](std::string app_id, const std::vector<std::string>& args,
BorealisAppLauncher::OnLaunchedCallback callback,
BorealisContextManager::ContextOrFailure result) {
if (!result) {
LOG(ERROR) << "Failed to launch " << app_id << "(code "
<< result.Error().error()
<< "): " << result.Error().description();
// If splash screen is showing and borealis did not launch
// properly, close it.
borealis::CloseBorealisSplashScreenView();
std::move(callback).Run(LaunchResult::kError);
return;
}
BorealisAppLauncher::Launch(*result.Value(), std::move(app_id),
std::move(args), std::move(callback));
},
std::move(app_id), std::move(args), std::move(callback)));
}
} // namespace borealis