chromium/ash/webui/projector_app/projector_app_client.h

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

#ifndef ASH_WEBUI_PROJECTOR_APP_PROJECTOR_APP_CLIENT_H_
#define ASH_WEBUI_PROJECTOR_APP_PROJECTOR_APP_CLIENT_H_

#include <set>

#include "ash/webui/projector_app/pending_screencast.h"
#include "ash/webui/projector_app/public/mojom/projector_types.mojom.h"
#include "base/files/file_path.h"
#include "base/functional/callback.h"
#include "base/observer_list_types.h"
#include "base/time/time.h"
#include "base/values.h"

namespace network {
namespace mojom {
class URLLoaderFactory;
}  // namespace mojom
}  // namespace network

namespace signin {
class IdentityManager;
}  // namespace signin

namespace ash {

struct NewScreencastPrecondition;

// Defines interface to access Browser side functionalities for the
// ProjectorApp.
class ProjectorAppClient {
 public:
  // The callback used by the GetVideo() API.
  using OnGetVideoCallback =
      base::OnceCallback<void(projector::mojom::GetVideoResultPtr result)>;

  // Interface for observing events on the ProjectorAppClient.
  class Observer : public base::CheckedObserver {
   public:
    // Used to notify the Projector SWA app on whether it can start a new
    // screencast session.
    virtual void OnNewScreencastPreconditionChanged(
        const NewScreencastPrecondition& precondition) = 0;

    // Observes the pending screencast state change events.
    virtual void OnScreencastsPendingStatusChanged(
        const PendingScreencastContainerSet& pending_screencast_containers) = 0;

    // Notifies the observer the SODA binary and language pack download and
    // installation progress.
    virtual void OnSodaProgress(int combined_progress) = 0;

    // Notifies the observer that an error occurred during installation.
    virtual void OnSodaError() = 0;

    // Notifies the observer that installation of SODA binary and at least one
    // language pack has finished.
    virtual void OnSodaInstalled() = 0;
  };

  ProjectorAppClient(const ProjectorAppClient&) = delete;
  ProjectorAppClient& operator=(const ProjectorAppClient&) = delete;

  static ProjectorAppClient* Get();

  virtual void AddObserver(Observer* observer) = 0;
  virtual void RemoveObserver(Observer* observer) = 0;

  // Returns the IdentityManager for the active user profile.
  virtual signin::IdentityManager* GetIdentityManager() = 0;

  // Returns the URLLoaderFactory for the primary user profile.
  virtual network::mojom::URLLoaderFactory* GetUrlLoaderFactory() = 0;

  // Used to notify the Projector SWA app on whether it can start a new
  // screencast session.
  virtual void OnNewScreencastPreconditionChanged(
      const NewScreencastPrecondition& precondition) = 0;

  // Returns pending screencast uploaded by primary user.
  virtual const PendingScreencastContainerSet& GetPendingScreencasts()
      const = 0;

  // Checks if device is eligible to trigger SODA installer.
  virtual bool ShouldDownloadSoda() const = 0;

  // Triggers the installation of SODA (Speech On-Device API) binary and the
  // corresponding language pack for projector.
  virtual void InstallSoda() = 0;

  // Notifies the client the SODA binary and language pack download and
  // installation progress.
  virtual void OnSodaInstallProgress(int combined_progress) = 0;

  // Notifies the client that an error occurred during installation.
  virtual void OnSodaInstallError() = 0;

  // Notifies the client that installation of SODA binary and at least one
  // language pack has finished.
  virtual void OnSodaInstalled() = 0;

  // Triggers the opening of the Chrome feedback dialog.
  virtual void OpenFeedbackDialog() const = 0;

  // Launches the given DriveFS video file with `video_file_id` into the
  // Projector app. The `resource_key` is an additional security token needed to
  // gain access to link-shared files. Since the `resource_key` is currently
  // only used by Googlers, the `resource_key` might be empty.
  virtual void GetVideo(const std::string& video_file_id,
                        const std::optional<std::string>& resource_key,
                        OnGetVideoCallback callback) const = 0;

  // Called with true by the initiation and false by the destruction of
  // projector trusted UI .
  virtual void NotifyAppUIActive(bool active) = 0;

  // Toggles to suppress/resume the system notification for `screencast_paths`.
  virtual void ToggleFileSyncingNotificationForPaths(
      const std::vector<base::FilePath>& screencast_paths,
      bool suppress) = 0;

  // Triggers reauth dialog for the given `email`.
  virtual void HandleAccountReauth(const std::string& email) = 0;

 protected:
  ProjectorAppClient();
  virtual ~ProjectorAppClient();
};

}  // namespace ash

#endif  // ASH_WEBUI_PROJECTOR_APP_PROJECTOR_APP_CLIENT_H_