// Copyright 2017 Google Inc. All Rights Reserved.
//
// 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.

// Enum for the state of a given caption property
enum CaptionState {

  // The property is not supported by the system. The application should provide
  // a way to set this property, otherwise it will not be changeable.
  "unsupported",

   // The property is supported by the system, but the user has not set it.
   // The application should provide a default setting for the property to
   // handle this case.
  "unset",

  // The user has set this property as a system default, meaning that it should
  // take priority over app defaults. If SystemCaptionSettings.supportsOverride
  // contains true, this value should be interpreted as explicitly saying
  // "do not override." If it contains false, it is up to the application to
  // intepret any additional meaning of this value.
  "set",

  // This property should take priority over everything but application-level
  // overrides, including video caption data.  If
  // SystemCaptionSettings.supportsOverride contains false, then no attributes
  // will ever contain this value.
  "override",
};
