//
// Copyright (C) 2018 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.
//

syntax = "proto2";

package textclassifier.tcs;

option java_package = "com.android.textclassifier.downloader";
option java_multiple_files = true;

// Manifest for a download task.
message ModelManifest {
  message Model {
    optional string url = 1;
    optional int64 size_in_bytes = 2;
    optional string fingerprint = 3;
    // ModelUsage enum used to assign usage to Model files.
    // Model file could have one of {DARK, LIVE, UNKNOWN} usage value.
    enum ModelUsage {
      UNKNOWN_USAGE = 0;
      LIVE_MODEL = 1;
      DARK_MODEL = 2;
    }
    optional ModelUsage usage = 4;
  }
  // All models to download in this task. Currently the size is always one.
  repeated Model models = 1;
  // Consistent with androidx.work.NetworkType.
  enum NetworkType {
    UNMETERED = 0;
    METERED = 1;
    NOT_REQUIRED = 2;
    NOT_ROAMING = 3;
    CONNECTED = 4;
  }
  // Notice: all fields below are not used currently
  optional NetworkType required_network_type = 2;
  optional bool requires_battery_not_low = 3;
  optional bool requires_charging = 4;
  optional bool requires_device_idle = 5;
  optional bool requires_storage_not_low = 6;
}
