// 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.

module apps.mojom;

import "mojo/public/mojom/base/time.mojom";
import "ui/gfx/image/mojo/image.mojom";

// Information about an app. See chrome/services/app_service/README.md.
struct App {
  AppType app_type;
  string app_id;

  // The fields above are mandatory. Everything else below is optional.

  Readiness readiness;
  string? name;
  string? short_name;
  IconKey? icon_key;
  mojo_base.mojom.Time? last_launch_time;
  mojo_base.mojom.Time? install_time;

  // This vector must be treated atomically, if there is a permission
  // change, the publisher must send through the entire list of permissions.
  // Should contain no duplicate IDs.
  // If empty during updates, Subscriber can assume no changes.
  // There is no guarantee that this is sorted by any criteria.
  array<Permission> permissions;

  // Whether the app was installed by sync, policy or as a default app.
  OptionalBool installed_internally;

  // Whether the app is an extensions::Extensions where is_platform_app()
  // returns true.
  OptionalBool is_platform_app;

  // TODO(nigeltao): be more principled, instead of ad hoc show_in_xxx and
  // show_in_yyy fields?
  OptionalBool show_in_launcher;
  OptionalBool show_in_search;

  // When adding new fields, also update the Merge method and other helpers in
  // chrome/services/app_service/public/cpp/app_update.*
};

struct Permission {
  // An AppType-specific value, opaque to the App Service.
  // Different publishers (with different AppType's) can
  // re-use the same numerical value to mean different things.
  uint32 permission_id;
  PermissionValueType value_type;
  // The semantics of value depends on the value_type.
  uint32 value;
};

// The types of apps available in the registry.
enum AppType {
  kUnknown = 0,
  kArc,        // Android app.
  kBuiltIn,    // Built-in app.
  kCrostini,   // Linux app.
  kExtension,  // Extension-backed app.
  kWeb,        // Web app.
};

// Whether an app is ready to launch, i.e. installed.
enum Readiness {
  kUnknown = 0,
  kReady,                // Installed and launchable.
  kDisabledByBlacklist,  // Disabled by SafeBrowsing.
  kDisabledByPolicy,     // Disabled by admin policy.
  kDisabledByUser,       // Disabled by explicit user action.
  kTerminated,           // Renderer process crashed.
  kUninstalledByUser,
};

// Augments a bool to include an 'unknown' value.
enum OptionalBool {
  kUnknown = 0,
  kFalse,
  kTrue,
};

enum IconType {
  kUnknown,
  kArc,
  kCrostini,
  kExtension,
  kResource,
};

struct IconKey {
  IconType icon_type;
  // The semantics of u_key and s_key depend on the icon_type.
  uint64 u_key;
  string s_key;
};

enum IconCompression {
  kUnknown,
  kUncompressed,
  kCompressed,
};

struct IconValue {
  IconCompression icon_compression;
  gfx.mojom.ImageSkia? uncompressed;
  array<uint8>? compressed;
};

enum LaunchSource {
  kUnknown,
  kFromAppListGrid,              // Grid of apps, not the search box.
  kFromAppListGridContextMenu,   // Grid of apps; context menu.
  kFromAppListQuery,             // Query-dependent results (larger icons).
  kFromAppListQueryContextMenu,  // Query-dependent results; context menu.
  kFromAppListRecommendation,    // Query-less recommendations (smaller icons).
};

enum TriState {
  kAllow,
  kBlock,
  kAsk,
};

enum PermissionValueType {
  kBool,                       // Permission.value is a Bool (either 0 or 1).
  kTriState,                   // Permission.value is a TriState.
};
