chromium/chrome/browser/ash/borealis/borealis_installer_impl.h

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_INSTALLER_IMPL_H_
#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_INSTALLER_IMPL_H_

#include <memory>

#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "base/types/expected.h"
#include "chrome/browser/ash/borealis/borealis_installer.h"
#include "chrome/browser/ash/borealis/borealis_metrics.h"
#include "chrome/browser/ash/borealis/borealis_types.mojom-forward.h"
#include "chrome/browser/ash/borealis/infra/described.h"

class Profile;

namespace borealis {

// This class is responsible for installing the Borealis VM. Currently
// the only installation requirements for Borealis is to install the
// relevant DLC component. The installer works closely with
// chrome/browser/ui/webui/ash/borealis_installer/
// borealis_installer_page_handler.cc.
class BorealisInstallerImpl : public BorealisInstaller {
 public:
  explicit BorealisInstallerImpl(Profile* profile);
  ~BorealisInstallerImpl() override;

  // Disallow copy and assign.
  BorealisInstallerImpl(const BorealisInstallerImpl&) = delete;
  BorealisInstallerImpl& operator=(const BorealisInstallerImpl&) = delete;

  // Checks if an installation process is already running.
  bool IsProcessing() override;
  // Start the installation process.
  void Start() override;
  // Cancels the installation process.
  void Cancel() override;

  // Removes borealis and all of its associated apps/features from the system.
  void Uninstall(base::OnceCallback<void(BorealisUninstallResult)>
                     on_uninstall_callback) override;

  void AddObserver(Observer* observer) override;
  void RemoveObserver(Observer* observer) override;

 private:
  // Holds information about (un)install operations.
  struct InstallInfo {
    std::string vm_name;
    std::string container_name;
  };

  // Classes which represent the transition between installed and not-installed.
  class Installation;
  class Uninstallation;

  void UpdateProgress(double state_progress);
  void UpdateInstallingState(InstallingState installing_state);

  void OnInstallComplete(
      base::expected<std::unique_ptr<InstallInfo>,
                     Described<mojom::InstallResult>> result_or_error);
  void OnUninstallComplete(
      base::OnceCallback<void(BorealisUninstallResult)> on_uninstall_callback,
      base::expected<std::unique_ptr<InstallInfo>, BorealisUninstallResult>
          result);

  raw_ptr<Profile> profile_;
  base::ObserverList<Observer> observers_;

  InstallingState installing_state_;

  std::unique_ptr<Installation> in_progress_installation_;
  std::unique_ptr<Uninstallation> in_progress_uninstallation_;

  base::WeakPtrFactory<BorealisInstallerImpl> weak_ptr_factory_;
};

}  // namespace borealis

#endif  // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_INSTALLER_IMPL_H_