// Copyright (C) 2023 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License

// This is the schema definition for aconfig files. Modifications need to be
// either backwards compatible, or include updates to all aconfig files in the
// Android tree.

syntax = "proto2";

package android.aconfig;

// This protobuf file defines messages used to represent and manage flags in the "aconfig" system
// The following format requirements apply across various message fields:
//
// # name: name of the flag
//
//    format: a lowercase string in snake_case format, no consecutive underscores, and no leading
//      digit. For example adjust_rate is a valid name, while AdjustRate, adjust__rate, and
//      adjust_rate are invalid
//
// # namespace: namespace the flag belongs to
//
//    format: a lowercase string in snake_case format, no consecutive underscores, and no leading
//      digit. For example android_bar_system
//
// # package: package to which the flag belongs
//
//    format: lowercase strings in snake_case format, delimited by dots, no consecutive underscores
//      and no leading digit in each string. For example com.android.mypackage is a valid name
//      while com.android.myPackage, com.android.1mypackage are invalid
//
// # container: container as software built in its entirety using the same build environment and
//    always installed as a single unit
//
//    For example the following are all separate containers:
//        * the system partition
//        * the vendor partition
//        * apexes: each APEX is its own container
//        * APKs: for APKs which are released independently via Play, each APK is its own container.
//            If an APK is released as part of a Mainline module, or as part of the system partition
//            via OTA, then they are part of the apex or the system partition container
//
//    format: lowercase strings in snake_case format, delimited by dots if multiple, no consecutive
//      underscores or leading digits in each string. The recommended container values are the
//      partition names or the module names

// messages used in both aconfig input and output

enum flag_state {
  ENABLED = 1;
  DISABLED = 2;
}

enum flag_permission {
  READ_ONLY = 1;
  READ_WRITE = 2;
}

// aconfig input messages: flag declarations and values

message flag_declaration {
  // Name of the flag (required)
  // See # name for format detail
  optional string name = 1;

  // Namespace the flag belongs to (required)
  // See # namespace for format detail
  optional string namespace = 2;

  // Textual description of the flag's purpose (required)
  optional string description = 3;

  // Single bug id related to the flag (required)
  repeated string bug = 4;

  // Indicates if the flag is permanently read-only and cannot be changed
  // via release configs (optional)
  // Default value false
  optional bool is_fixed_read_only = 5;

  // Indicates if the flag is exported and accessible beyond its originating container (optional)
  // Default value false
  optional bool is_exported = 6;

  // Additional information about the flag, including its purpose and form factors (optional)
  optional flag_metadata metadata = 7;
};

// Optional metadata about the flag, such as its purpose and its intended form factors.
// Can influence the applied policies and testing strategy.
message flag_metadata {
  enum flag_purpose {
    PURPOSE_UNSPECIFIED = 0;
    PURPOSE_FEATURE = 1;
    PURPOSE_BUGFIX = 2;
  }

  optional flag_purpose purpose = 1;

  // TODO(b/315025930): Add field to designate intended target device form factor(s), such as phone, watch or other.
}

message flag_declarations {
  // Package to which the flag belongs (required)
  // See # package for format detail
  optional string package = 1;

  // List of flag_declaration objects (required)
  repeated flag_declaration flag = 2;

  // Container the flag belongs to (optional)
  // See # container for format detail
  optional string container = 3;
};

message flag_value {
  // Package to which the flag belongs (required)
  // See # package for format detail
  optional string package = 1;

  // Name of the flag (required)
  // See # name for format detail
  optional string name = 2;

  optional flag_state state = 3;
  optional flag_permission permission = 4;
};

message flag_values {
  repeated flag_value flag_value = 1;
};

// aconfig output messages: parsed and verified flag declarations and values

message tracepoint {
  // path to declaration or value file relative to $TOP
  optional string source = 1;
  optional flag_state state = 2;
  optional flag_permission permission = 3;
}

message parsed_flag {
  // Package to which the flag belongs (required)
  // See # package for format detail
  optional string package = 1;

  // Name of the flag (required)
  // See # name for format detail
  optional string name = 2;

  // Namespace the flag belongs to (required)
  // See # namespace for format detail
  optional string namespace = 3;

  // Textual description of the flag's purpose (required)
  optional string description = 4;

  // Single bug id related to the flag (required)
  repeated string bug = 5;

  optional flag_state state = 6;
  optional flag_permission permission = 7;
  repeated tracepoint trace = 8;

  // Indicates if the flag is permanently read-only and cannot be changed
  // via release configs (optional)
  // Default value false
  optional bool is_fixed_read_only = 9;

  // Indicates if the flag is exported and accessible beyond its originating container (optional)
  // Default value false
  optional bool is_exported = 10;

  // Container the flag belongs to (optional)
  // See # container for format detail
  optional string container = 11;

  // Additional information about the flag, including its purpose and form factors (optional)
  optional flag_metadata metadata = 12;
}

message parsed_flags {
  repeated parsed_flag parsed_flag = 1;
}
