// Copyright (c) 2012 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.
//

// Update proto_value_conversions{.h,.cc,_unittest.cc} if you change
// any fields in this file.

syntax = "proto2";

option optimize_for = LITE_RUNTIME;
option retain_unknown_fields = true;

package sync_pb;

// Data that is used directly by endpoints to render notifications in the case
// where no "native" app can handle the notification.
message SyncedNotificationRenderInfo {
  // Render information for the collapsed (summary) view of a notification.
  optional CollapsedInfo collapsed_info = 1;

  // Render information for the expanded view of a notification.
  optional ExpandedInfo expanded_info = 2;
}

// Render information for the collapsed (summary) view of a coalesced
// notification.
message CollapsedInfo {
  optional SimpleCollapsedLayout simple_collapsed_layout = 1;

  // The creation time of the notification in microseconds since the UNIX
  // epoch.
  optional uint64 creation_timestamp_usec = 2;

  // The default destination target.
  optional SyncedNotificationDestination default_destination = 3;

  repeated Target target = 4;

  // Defines a repeated list of meta tags that provide some context on what
  // this collapsed info is describing. Nothing about the display of this
  // collapsed info is defined by the meta tags.
  repeated string meta_tag = 5;
}

// Render information for the expanded (detail) view of a coalesced
// notification.
message ExpandedInfo {
  optional SimpleExpandedLayout simple_expanded_layout = 1;

  // Collapsed information for each notification in the coalesced group.
  repeated CollapsedInfo collapsed_info = 2;

  // A set of targets for actions the user can take, or destinations the
  // viewer can be taken to. These relate to the coalesced notification.
  repeated Target target = 3;

  // Enhanced context for the expanded view.
  repeated string meta_tag = 4;
}

message SimpleCollapsedLayout {
  // Application icon.
  optional SyncedNotificationImage app_icon = 1;

  // Profile image(s) of the notification creator(s) to show in the
  // collapsed UI.
  repeated SyncedNotificationProfileImage profile_image = 2;

  // Heading - often the name(s) of the notification creator(s).
  optional string heading = 3;

  // Description - often the action that generated the notification.
  optional string description = 4;

  // Media - one or more shared media items.
  repeated Media media = 5;

  // Annotation - often the annotation of the entity generating the
  // notification.
  optional string annotation = 6;
}

message SimpleExpandedLayout {
  // Title - often the title of the underlying entity referred to by the
  // notification(s).
  optional string title = 1;

  // Text content - often a snippet of text from the underlying entity
  // reference or the notification.
  optional string text = 2;

  repeated Media media = 3;

  // Profile image, usually this is the creator of the referenced entity.
  optional SyncedNotificationProfileImage profile_image = 4;

  // A set of targets for actions the user can take, or destinations the
  // viewer can be taken to. Usually these relate to the referenced entity.
  repeated Target target = 5;
}

// Media.
message Media {
  // TOOD(jro): Do we need other media types?
  optional SyncedNotificationImage image = 1;
}

// Secondary destinations and actions grouped into a message to account for
// ordering.
message Target {
  // URL that the user will be taken to by clicking on the notification.
  optional SyncedNotificationDestination destination = 1;
  // URI to POST if the user clicks on a button.
  optional SyncedNotificationAction action = 2;

  // A key to identify this target within a group of targets.
  optional string target_key = 3;
}

// A Destination is a target URL that the user can be taken to by clicking on or
// selecting the notification or part thereof.
message SyncedNotificationDestination {
  // The description for the link to the destination.
  optional string text = 1;

  // The icon to use for the link to the destination.
  optional SyncedNotificationImage icon = 2;

  // The destination URL.
  optional string url = 3;

  // Optional label to aid accessibility.
  optional string accessibility_label = 4;
}

// An Action encapsulates an UI component that trigger certain programmable
// actions.  Depending on the endpoint, this may show up as a HTML button, an
// action button associated with the notification on native mobile, a link, or
// even the notification card itself.
message SyncedNotificationAction {
  // The description for the Action.
  optional string text = 1;

  // The icon to use for the Action.
  optional SyncedNotificationImage icon = 2;

  // The URL that performs the action.
  optional string url = 3;

  // Additional request data.
  optional string request_data = 4;

  // Optional label to aid accessibility.
  optional string accessibility_label= 5;

  // Defines a repeated list of meta tags that provide some context on this
  // action. Nothing about the display of this action is defined by the tags.
  repeated string meta_tag = 6;
}

message SyncedNotificationImage {
  // Note that the image may be from any source. Clients wishing to resize the
  // image should ensure the image is proxied appropriately.
  optional string url = 1;
  optional string alt_text = 2;
  optional int32 preferred_width = 3;
  optional int32 preferred_height = 4;
}

message SyncedNotificationProfileImage {
  // Url for the image.
  optional string image_url = 1;
  // Object id for the image.
  optional string oid = 2;
  // Name to display for this image.
  optional string display_name = 3;
}
