// Copyright 2015 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.
//
// Next MinVersion: 9

module arc.mojom;

import "bitmap.mojom";

// These values must be matched with the NOTIFICATION_EVENT_* constants in
// com.android.server.ArcNotificationListenerService.
enum ArcNotificationEvent {
  BODY_CLICKED = 0,
  CLOSED = 1,
  // Five buttons at maximum (message_center::kNotificationMaximumItems = 5).
  BUTTON_1_CLICKED = 2,
  BUTTON_2_CLICKED = 3,
  BUTTON_3_CLICKED = 4,
  BUTTON_4_CLICKED = 5,
  BUTTON_5_CLICKED = 6,
};

// These values must be matched with the NOTIFICATION_TYPE_* constants in
// com.android.server.ArcNotificationListenerService.
enum ArcNotificationType {
  BASIC = 0,
  IMAGE = 1,
  PROGRESS = 2,
  LIST = 3,
};

struct ArcNotificationButton {
  // Title
  string label;
};

struct ArcNotificationData {
  // Identifier of notification
  string key;
  // Type of notification
  ArcNotificationType type;
  // Body message of notification
  string message;
  // Title of notification
  string title;
  // Mimetype of |icon_data|
  string icon_mimetype;
  // Binary data of the icon
  array<uint8> icon_data;
  // Priority of notification, must be [2,-2]
  int32 priority;
  // Timestamp related to the notification
  int64 time;
  // The current value of progress, must be [0, progress_max].
  int32 progress_current;
  // The maximum value of progress.
  int32 progress_max;
  // Action buttons
  array<ArcNotificationButton> buttons;
  // Flag if the notification has FLAG_NO_CLEAR.
  [MinVersion=1]
  bool no_clear;
  // Flag if the notification has FLAG_ONGOING_EVENT.
  [MinVersion=1]
  bool ongoing_event;
  // Subtexts for list notifications.
  [MinVersion=3]
  array<string>? texts;
  // Image for image notifications.
  [MinVersion=3]
  ArcBitmap? big_picture;
  // Flag if a notification is a custom notification backed by a notification
  // surface. Note the flag is only used on creation. Change of the flag
  // on notification update is ignored.
  [MinVersion=5]
  bool use_custom_notification;
  [MinVersion=6]
  ArcBitmap? small_icon;
  // A snapshot image to show before the notification window is created.
  [MinVersion=7]
  ArcBitmap? snapshot_image;
  [MinVersion=7]
  float snapshot_image_scale;
  // Accessibility text
  [MinVersion=8]
  string? accessible_name;
};

[MinVersion=2]
struct ArcToastData {
  // Unique identifier
  string id;
  // Toast text.
  string? text;
  // Toast duration in milliseconds. If -1, the toast will be displayed until
  // the dismiss button is clicked.
  int32 duration;
  // Toast dismiss button label, if set. Otherwise, default label is used for
  // the dismiss button.
  [MinVersion=4]
  string? dismiss_text;
};

interface NotificationsHost {
  // Tells the Chrome that a notification is posted (created or updated) on
  // Android.
  // |notification_data| is the data of notification (id, texts, icon and ...).
  OnNotificationPosted@0(ArcNotificationData notification_data);

  // Notifies that a notification is removed on Android.
  // |key| is the identifier of the notification.
  OnNotificationRemoved@1(string key);

  [MinVersion=2]
  // Shows a toast, or queues it if another toast is visible.
  OnToastPosted@2(ArcToastData data);

  [MinVersion=2]
  // Hides the visible toast immediately, or cancels the scheduled one.
  OnToastCancelled@3(ArcToastData data);
};

// TODO(lhchavez): Migrate all request/response messages to Mojo.
interface NotificationsInstance {
  // Establishes full-duplex communication with the host.
  Init@0(NotificationsHost host_ptr);

  // Sends an event from Chrome notification UI to Android.
  // |event| is a type of occured event.
  SendNotificationEventToAndroid@1(string key, ArcNotificationEvent event);

  // Requests to Android side to create the notification window.
  [MinVersion=7]
  CreateNotificationWindow@2(string key);

  // Requests to Android side to close the notification window.
  [MinVersion=7]
  CloseNotificationWindow@3(string key);
};
