// 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.
//
// Sync protocol datatype extension for push notifications..

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

import "synced_notification_render.proto";

// This message allows clients to identify a notification they have created.
message SyncedNotificationIdentifier {
  // The application that the notification is a part of.
  optional string app_id = 1;

  // Notifications with the same coalescing key (isolated to the same app_id)
  // will be grouped together when fetched.
  optional string coalescing_key = 2;
}

message SyncedNotificationCreator {
  // The gaia id of the creator.  If a notification does not have a clear
  // creator, skip this and follow the directions below to use a system creator.
  optional int64 gaia_id = 1;

  // Indicates that the creator is a "system" creator.  Example of these are
  // notifications sent to the user where the addressee is "Google", such as the
  // "You have violated our TOS, and have 3 days to fix it or you'll lose your
  // account" notifications.  If is_system is set, gaia_id must not be set and
  // instead the app_id field must be set.
  optional bool is_system = 2;

  // Only set this in the system-creator case.
  optional string app_id = 3;
}

message SyncedNotificationRecipients {
  repeated int64 gaia_id = 1;

  // For now, only support gaia id recipients.  Add more recipient types via
  // 'repeated Type other_type = X' when necessary.
}

message SyncedNotification {
  // A secondary type that is isolated within the same app_id.
  //
  // NOTE: For ASBE support purposes this must be in the format [A-Za-z_]+.
  optional string type = 1;

  // Whatever string the client entered during creation.  If no external_id is
  // specified, the notification can no longer be identified individually for
  // fetching/deleting, etc...
  optional string external_id = 2;

  // The creator of the notification.
  optional SyncedNotificationCreator creator = 3;

  // Client specific data.
  optional MapData client_data = 4;
}

message CoalescedSyncedNotification {
  // An opaque string key used to identify individual coalesced notifications.
  optional string key = 1;

  optional string app_id = 2;

  // All the notifications that are grouped together.
  repeated SyncedNotification notification = 3;

  // Data that is used directly by endpoints to render notifications in the case
  // where no "native" app can handle the notification.
  optional SyncedNotificationRenderInfo render_info = 4;

  // Read state will be per coalesced notification.
  enum ReadState {
    UNREAD = 1;
    READ = 2;
    DISMISSED = 3;
    SEEN = 4;
  }
  optional ReadState read_state = 5;

  // The time when the LATEST notification of the coalesced notification is
  // created (in milliseconds since the linux epoch).
  // This is called updated_version in the server side protobuf.
  optional uint64 creation_time_msec = 6;

  enum Priority {
    INVISIBLE = 1;
    LOW = 2;
    HIGH = 3;
    // We will most likely add at least one more priority in the near future.
  };
  optional Priority priority = 7;

  // Security token that is to be used when making a PerformUserAction request
  // when any user action within this coalesced notification is triggered.
  optional string user_action_token = 8;

  // This field corresponds to catchup_version in entity, which represents the
  // version entity was last modified. Note that the
  // Entity.last_modified_version will be actually the last creation version.
  // See comments in updated_version.
  optional uint64 last_modified_version = 9;

  // Clients should use this field to order the notifications. Currently this is
  // calculated from (priority, updated_version) pair.
  optional uint64 sort_version = 10;
}

message SyncedNotificationList {
  repeated CoalescedSyncedNotification coalesced_notification = 1;
}

// MapData, Data, and ListData are used to sending aribitrary payloads
// between instances of applications using Synced Notifications.  The
// schema atop MapData will be defined by the client application.
message MapData {
  message Entry {
    optional string key = 1;
    optional Data value = 2;
  };
  repeated Entry entry = 1;
};

message Data {
  optional bool boolean_value = 1;
  optional int32 int_value = 2;
  optional double float_value = 3;
  optional string string_value = 4;
  optional ListData list_value = 5;
  optional MapData map_value = 6;
};

message ListData {
  repeated Data value = 1;
};

// The RenderContext encapsulates data about the device that is displaying the
// notification. In the future, RenderContext might include data like the
// location of the user.
message RenderContext {
  // The type of the device. This will be used to decide the resolution as well
  // as the size of the image returned with the response.
  // The server will try to find the closest matching resource to use.
  // The android densities are from
  // http://developer.android.com/guide/practices/screens_support.html
  enum DeviceType {
    UNKNOWN = 0;
    IOS_NON_RETINA = 1;
    IOS_RETINA = 2;
    ANDROID_MDPI = 3;
    ANDROID_HDPI = 4;
    ANDROID_XHDPI = 5;
    ANDROID_TVDPI = 6;
    DESKTOP_NON_RETINA = 7;
    DESKTOP_RETINA = 8;
    ANDROID_XXHDPI = 9;
    CHROME_1X = 10;
    CHROME_2X = 11;
  }

  optional DeviceType device_type = 1;

  // The locale to render the notifications in.
  optional string language_code = 2;
};

// List of AppIds and whether to treat the list as a Whitelist or Blacklist.
message AppList {
  enum Type {
    // Specified app_ids are supported.
    WHITELIST = 1;
    // Specified app_ids are not supported.
    BLACKLIST = 2;
  }

  // Whether to treat the app_id list as a Whitelist or Blacklist.
  optional Type type = 1 [default = WHITELIST];

  // List of AppIds.
  repeated string app_id = 2;
};

message ServerContext {
  // render_context encapsulates data about the device that is displaying the
  // notifications.
  optional RenderContext render_context = 1;

  // List of AppIds and whether it is a blacklist or whitelist.
  // This field needs to be set only when the set of apps enabled on a client
  // changes.  In the server response, this field will get cleared.
  optional AppList app_list = 2;

  // The view that the device has registered with.  It is obtained from guns
  // based on the app_list specified above.
  optional string view_id = 3;
};