chromium/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload.mojom

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

module ash.cloud_upload.mojom;

// The selected action when the user closes the dialog.
enum UserAction {
  kCancel,
  kCancelGoogleDrive,
  kCancelOneDrive,
  kSetUpOneDrive,
  kUploadToGoogleDrive,
  kUploadToOneDrive,
  kConfirmOrUploadToGoogleDrive,
  kConfirmOrUploadToOneDrive,
};

// Used for metrics to represent each individual page of the dialog, and should
// be kept in sync with OfficeSetupPage in enums.xml.  These values are
// persisted to logs. Entries should not be renumbered and numeric values should
// never be reused.
enum MetricsRecordedSetupPage {
  kFileHandlerPage = 0,
  kMoveConfirmationOneDrive = 1,
  kMoveConfirmationGoogleDrive = 2,
  kOneDriveSetupWelcome = 3,
  kOneDriveSetupPWAInstall = 4,
  kOneDriveSetupODFSMount = 5,
  kOneDriveSetupComplete = 6,
};

// Operation used to upload the source file.
enum OperationType {
  kMove,
  kCopy,
};

// A local file task that is displayed in the `kFileHandlerDialog` which the
// user could select to open the files. The `position` is the tasks position
// in a vector with the other `DialogTask`s.
struct DialogTask {
  int32 position;
  string title;
  string app_id;
  string icon_url;
};

struct OneDriveSetupDialogArgs {
  // True if the setup flow should end with setting Microsoft 365 as default
  // handler.
  bool set_office_as_default_handler;
};

struct MoveConfirmationOneDriveDialogArgs {
  // Indicates what operation is used to upload the source file (copy or move).
  OperationType operation_type;
};

struct MoveConfirmationGoogleDriveDialogArgs {
  // Indicates what operation is used to upload the source file (copy or move).
  OperationType operation_type;
};

struct ConnectToOneDriveDialogArgs {};

struct FileHandlerDialogArgs {
  // The local file tasks the user can pick from to open the files. Displayed in
  // the `kFileHandlerDialog` dialog.
  array<DialogTask> local_tasks;

  // Whether Google Workspace should be displayed in the `kFileHandlerDialog`
  // dialog.
  bool show_google_workspace_task;

  // Whether Microsoft 365 should be displayed in the `kFileHandlerDialog`
  // dialog.
  bool show_microsoft_office_task;
};

union DialogSpecificArgs {
  FileHandlerDialogArgs file_handler_dialog_args;
  OneDriveSetupDialogArgs one_drive_setup_dialog_args;
  MoveConfirmationOneDriveDialogArgs move_confirmation_one_drive_dialog_args;
  MoveConfirmationGoogleDriveDialogArgs
    move_confirmation_google_drive_dialog_args;
  ConnectToOneDriveDialogArgs connect_to_one_drive_dialog_args;
};

// Contains the arguments used to set up the dialog.
struct DialogArgs {
  // List of files that will be uploaded on dialog close if the user completes
  // the setup. May be empty if the dialog wasn't initiated from a file handler.
  array<string> file_names;

  // Contains arguments specific to the given dialog.
  DialogSpecificArgs dialog_specific_args;
};

// Lives in the browser process. A renderer uses this to create a page handler
// that enables communication between a renderer and the browser process.
interface PageHandlerFactory {
  // Creates a page handler to enable communication with the browser process.
  CreatePageHandler(pending_receiver<PageHandler> handler);
};

// Lives in the browser process. A renderer uses this to invoke methods that
// are implemented in the browser process.
interface PageHandler {
  // Returns arguments passed to the dialog on creation. Might return nothing if
  // called outside of a normal flow (say, when opening chrome://cloud-upload
  // directly in the browser).
  GetDialogArgs() => (DialogArgs? args);

  // Returns whether or not the Office web app is installed.
  IsOfficeWebAppInstalled() => (bool installed);

  // Attempts to install the Office web app. Returns whether the web app
  // successfully installed or was already installed.
  InstallOfficeWebApp() => (bool installed);

  // Returns whether or not the OneDrive filesystem is mounted.
  IsODFSMounted() => (bool mounted);

  // Starts the OneDrive authentication process.
  SignInToOneDrive() => (bool success);

  // Returns the user selected action and requests the dialog to be closed.
  RespondWithUserActionAndClose(UserAction response);

  // Returns the user selected local file task to launch and requests the
  // dialog to be closed.
  RespondWithLocalTaskAndClose(int32 task_position);

  // Set Office as the default file handler for office files and mark the
  // setup as complete so that it does not need to be started again.
  SetOfficeAsDefaultHandler();

  // Get the preference for whether we should always move office files to
  // Google Drive without asking the user first.
  GetAlwaysMoveOfficeFilesToDrive() => (bool always_move);

  // Set the preference for whether we should always move office files to
  // Google Drive without asking the user first.
  SetAlwaysMoveOfficeFilesToDrive(bool always_move);

  // Get the preference for whether we should always move office files to
  // OneDrive without asking the user first.
  GetAlwaysMoveOfficeFilesToOneDrive() => (bool always_move);

  // Set the preference for whether we should always move office files to
  // OneDrive without asking the user first.
  SetAlwaysMoveOfficeFilesToOneDrive(bool always_move);

  // Get the preference for whether the move to Drive confirmation dialog has
  // been shown before.
  GetOfficeMoveConfirmationShownForDrive() => (bool move_confirmation_shown);

  // Get the preference for whether the move to OneDrive confirmation dialog
  // has been shown before.
  GetOfficeMoveConfirmationShownForOneDrive() => (bool move_confirmation_shown);

  // Records the page at which the setup was cancelled.
  RecordCancel(MetricsRecordedSetupPage page);
};