// Copyright 2017 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 ash.mojom;

import "components/arc/common/notifications.mojom";
import "ui/gfx/image/mojo/image.mojom";
import "ui/message_center/public/mojo/notification.mojom";
import "ui/message_center/public/mojo/notifier_id.mojom";
import "mojo/public/mojom/base/string16.mojom";
import "mojo/public/mojom/base/unguessable_token.mojom";

// A struct that contains information for presenting a notifier in a settings
// panel.
struct NotifierUiData {
  // The notifier (e.g. an extension).
  message_center.mojom.NotifierId notifier_id;

  // The user-visible name of the notifier (e.g. an extension's name).
  mojo_base.mojom.String16 name;

  // True if notifications from the notifier are presently enabled.
  bool enabled;

  // True if the setting is enforced by administrator and the user can't change.
  bool enforced;

  // An icon displayed next to the name.
  gfx.mojom.ImageSkia? icon;
};

// The message center controller funnels notification requests from the client
// to the MessageCenter.
interface AshMessageCenterController {
  SetClient(associated AshMessageCenterClient client);

  // Sets the ARC notification instance.
  SetArcNotificationsInstance(arc.mojom.NotificationsInstance instance);

  // Shows a notification. |display_token| will be used to reference this
  // notification for AshMessageCenterClient::Close().
  ShowClientNotification(message_center.mojom.Notification notification,
                         mojo_base.mojom.UnguessableToken display_token);

  // Closes a notification by the notification ID.
  CloseClientNotification(string id);

  UpdateNotifierIcon(message_center.mojom.NotifierId notifier_id,
                     gfx.mojom.ImageSkia icon);

  NotifierEnabledChanged(message_center.mojom.NotifierId notifier_id,
                         bool enabled);

  // Gets a list of all the notifications in the message center.
  GetActiveNotifications() =>
      (array<message_center.mojom.Notification> notifications);

  // Changes the quiet mode state in the message center.
  SetQuietMode(bool enabled);
};

// The message center client interface mimics
// message_center::NotificationDelegate. The ID strings match the id passed in
// |notification| in ShowClientNotification and the format of the ID is up to
// the client.
interface AshMessageCenterClient {
  // Called when a notification previously displayed by the client is closed.
  HandleNotificationClosed(mojo_base.mojom.UnguessableToken display_token,
                           bool by_user);

  // Called when the body of a notification is clicked.
  HandleNotificationClicked(string id);

  // Called when a notification that has buttons (e.g., "Learn more") receives a
  // click on one of the buttons. |reply| is a user-provided string for cases
  // where the button had a text input field attached to it.
  HandleNotificationButtonClicked(string id, int32 button_index,
                                  mojo_base.mojom.String16? reply);

  // Called when a notification's settings button has been pressed (and the
  // handler is SettingsButtonHandler::DELEGATE).
  HandleNotificationSettingsButtonClicked(string id);

  // Called when a notification has been disabled (via inline settings).
  DisableNotification(string id);

  // Called when a user enables or disables notifications from the given
  // notifier.
  SetNotifierEnabled(message_center.mojom.NotifierId notifier_id, bool enabled);

  // Asks the client for a list of notifiers and associated UI information to be
  // displayed in a settings panel.
  GetNotifierList() => (array<NotifierUiData> notifiers);

  // Gets ARC app id from a given package name.
  GetArcAppIdByPackageName(string package_name) => (string app_id);

  // Show the lockscreen notification setting on the Chrome OS setting.
  ShowLockScreenNotificationSettings();
};
