| // Copyright 2022 Google LLC |
| // |
| // 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. |
| // The main purpose of mirroring external protos here is to separate API and |
| // storage protos. The same tag numbers are used for making migration work. |
| |
| syntax = "proto2"; |
| |
| package mdi.download.internal; |
| |
| import "google/protobuf/any.proto"; |
| import "google/protobuf/timestamp.proto"; |
| import "transform.proto"; |
| |
| option java_package = "com.google.mobiledatadownload.internal"; |
| option java_outer_classname = "MetadataProto"; |
| |
| // Mirrors mdi.download.ExtraHttpHeader |
| // |
| // HTTP headers are described in https://tools.ietf.org/html/rfc7230#section-3.2 |
| // as key:value, where the value may have a whitespace on each end. |
| message ExtraHttpHeader { |
| optional string key = 1; |
| optional string value = 2; |
| } |
| |
| // This proto is used to store file group metadata on disk for internal use. It |
| // consists of all fields mirrored from DataFileGroup and an extra field for |
| // bookkeeping. |
| // |
| // The tag number of extra fields should start from 1000 to reserve room for |
| // growing DataFileGroup. |
| // |
| // Next id: 1000 |
| message DataFileGroupInternal { |
| // Extra information that is kept on disk. |
| // |
| // The extension was originally introduced in cl/248813966. We are migrating |
| // away from the extension. However, we still need to read from fields in the |
| // extension. Reuse the same tag number as the extension number to read from |
| // the extension. |
| optional DataFileGroupBookkeeping bookkeeping = 248813966; |
| |
| // Unique name to identify the group. It should be unique per owner package. |
| // In GMSCore, use the module name as the prefix of the group name. |
| // |
| // Ex: A group name in mdisync module could be named: mdisync-profile-photos. |
| // |
| // This shouldn't ideally be something like "config", and |
| // instead should better define the feature it will be used for. |
| // |
| // Ex: "icing-language-detection-model", "smart-action-detection-model" |
| optional string group_name = 1; |
| |
| // The name of the package that owns this group. If this field is left empty, |
| // the owner is assumed to be the package name of the host app. |
| // |
| // The files will only be downloaded onto the device if the owner package is |
| // present on the device. |
| // |
| // Ex: "com.google.android.gms", "com.google.android.apps.bugle" |
| optional string owner_package = 6; |
| |
| // Client set version number used to identify the file group. |
| // |
| // Note that this does not uniquely identify the contents of the file group. |
| // It simply reflects a snapshot of client config changes. |
| // For example: say there's a file group 'language-detector-model' that |
| // downloads a different file per user locale. |
| // data_file_group { |
| // file_group_name = 'language-detector-model' |
| // file_group_version_number = 1 |
| // file { |
| // url = 'en-model' |
| // } |
| // } |
| // data_file_group { |
| // file_group_name = 'language-detector-model' |
| // file_group_version_number = 1 |
| // file { |
| // url = 'es-model' |
| // } |
| // } |
| // Note that even though the actual contents of the file group are different |
| // for each locale, the version is the same because this config was pushed |
| // at the same snapshot. |
| // |
| // Available GMS v18+. |
| optional int32 file_group_version_number = 10; |
| |
| // DEPRECATED |
| // MDD team recommends to use explicit properties instead. |
| optional google.protobuf.Any custom_property = 20 [deprecated = true]; |
| |
| // Custom metadata attached to the file group. |
| // |
| // This allows clients to include specific metadata about the group for their |
| // own processing purposes. The metadata will be stored with the group and |
| // accessible when the file group is retrieved. |
| // |
| // This property should only be used if absolutely necessary. Please consult |
| // with <internal>@ if you have questions about this property or a potential |
| // use-case. |
| optional google.protobuf.Any custom_metadata = 27; |
| |
| reserved 21; |
| |
| // Mirrors mdi.download.DataFileGroup.AllowedReaders |
| enum AllowedReaders { |
| ALL_GOOGLE_APPS = 0; |
| ONLY_GOOGLE_PLAY_SERVICES = 1; |
| ALL_APPS = 2; |
| } |
| |
| // Defines who is allowed to read this file group. Currently the options are: |
| // |
| // ALL_GOOGLE_APPS: accessible to all Google 1p Apps. |
| // ONLY_GOOGLE_PLAY_SERVICES: accessible to only GMS Core. |
| // |
| // If this field is not explicitly set it defaults to "ALL_GOOGLE_APPS". |
| // |
| // Available GMS v20+. |
| optional AllowedReaders allowed_readers_enum = 12; |
| |
| // Length of time (in seconds) for which a file group version will live after |
| // since a newer version became fully downloaded. Clients should set this time |
| // to be more than the time in which they call MDD to refresh their data. |
| // NOTE: MDD will delete the file group version within a day of this time. |
| // Ex: 172800 // 2 Days |
| optional int64 stale_lifetime_secs = 3; |
| |
| // The timestamp at which this filegroup should be deleted, even if it is |
| // still active, specified in seconds since epoch. |
| // NOTE: MDD will delete the file group version within a day of this time. |
| optional int64 expiration_date_secs = 11; |
| |
| // Specify the conditions under which the file group should be downloaded. |
| optional DownloadConditions download_conditions = 13; |
| |
| // Setting this flag to true will mean that the downloaded files will appear |
| // to be in a directory by themselves. |
| // The file name/file path of the exposed file will be the filename set in the |
| // file.relative_file_path field, OR if that field is empty, the file name |
| // from the file.url_to_download field. This enables downloaded files to refer |
| // to each other by name. |
| // It's invalid to set this flag to true if two files end up with the same |
| // file path. |
| // Valid on iOS, cMDD, and aMDD. |
| // |
| // NOTE: For aMDD, this feature is not available if Android Blob Sharing is |
| // enabled or if using an API level below 21 (L). If either case is true, this |
| // option will be ignored. |
| optional bool preserve_filenames_and_isolate_files = 14; |
| |
| // List of files in the group. |
| repeated DataFile file = 2; |
| |
| // Tag for the network traffic to download this file group. |
| // Tag space is determined by the host app. |
| // For Gmscore, the tag should come from: |
| // <internal> |
| optional int32 traffic_tag = 16; |
| |
| // Extra HTTP headers to apply when downloading all files in the group. |
| repeated ExtraHttpHeader group_extra_http_headers = 17; |
| |
| reserved 19; |
| |
| // Unique identifier of a DataFileGroup config (i.e. a "snapshot") created |
| // when using MDD Ingress API. |
| optional int64 build_id = 23; |
| |
| // A fingerprint allowing clients to identify a DataFileGroup |
| // config based on a given set of properties (i.e. a "partition" of |
| // any file group properties). This can be used by clients as an exact match |
| // for a class of DataFileGroups during targeting or as a compatibility check. |
| optional string variant_id = 26; |
| |
| // The locales compatible with the file group. This can be different from the |
| // device locale. |
| // |
| // Values in this list may be exact locales (e.g. "en-US") or language-only |
| // ("en-*"). |
| // Example 1: locale = ["en-US"]; // compatible with "en-US" only |
| // Example 2: locale = ["en-US", "en-CA"]; // compatible with "en-US" or |
| // // "en-CA" |
| // Example 3: locale = ["en-*"]; // compatible with all "en" locales |
| repeated string locale = 25; |
| |
| reserved 28; |
| |
| reserved 4, 5, 7, 8, 9, 15, 18, 22, 24; |
| } |
| |
| // Mirrors mdi.download.DataFile |
| // |
| // A data file represents all the metadata to download the file and then |
| // manage it on the device. |
| // Next tag: 22 |
| // |
| // This should not contain any fields that are marked internal, as we compare |
| // the protos directly to decide if it is a new version of the file. |
| // LINT.IfChange(data_file) |
| message DataFile { |
| // A unique identifier of the file within the group, that can be used to |
| // get this file from the group. |
| // Ex: "language-detection-model" |
| optional string file_id = 7; |
| |
| // Url from where the file is to be downloaded. |
| // Ex: https://www.gstatic.com/group-name/model_1234.zip |
| optional string url_to_download = 2; |
| |
| // Exact size of the file. This is used to check if there is space available |
| // for the file before scheduling the download. |
| // The byte_size is optional. If not set, MDD will try with best effort to get |
| // the file size using the HTTP HEAD request. |
| optional int32 byte_size = 4; |
| |
| // Enum for checksum types. |
| // NOTE: do not add any new checksum type here, older MDD versions would break |
| // otherwise. |
| enum ChecksumType { |
| // Default checksum is SHA1. |
| DEFAULT = 0; |
| |
| // No checksum is provided. |
| NONE = 1; |
| |
| reserved 2 /* SHA256 */; |
| } |
| |
| optional ChecksumType checksum_type = 15; |
| |
| // SHA1 checksum to verify the file before it can be used. This is also used |
| // to de-duplicate files between different groups. |
| // For most files, this will be the checksum of the file being downloaded. |
| // For files with download_transform, this should contain the transform of |
| // the file after the transforms have been applied. |
| // The checksum is optional. If not set, the checksum_type must be |
| // ChecksumType.NONE. |
| optional string checksum = 5; |
| |
| // The following are <internal> transforms to apply to the downloaded files. |
| // Transforms are bi-directional and defined in terms of what they do on |
| // write. Since these transforms are applied while reading, their |
| // directionality is reversed. Eg, you'll see 'compress' to indicate that the |
| // file should be decompressed. |
| |
| // These transforms are applied once by MDD after downloading the file. |
| // Currently only compress is available. |
| // Valid on Android. iOS support is tracked by b/118828045. |
| optional mobstore.proto.Transforms download_transforms = 11; |
| |
| // If DataFile has download_transforms, this field must be provided with the |
| // SHA1 checksum of the file before any transform are applied. The original |
| // checksum would also be checked after the download_transforms are applied. |
| optional string downloaded_file_checksum = 14; |
| |
| // Exact size of the downloaded file. If the DataFile has download transforms |
| // like compress and zip, the downloaded file size would be different than |
| // the final file size on disk. Client could use |
| // this field to track the downloaded file size and calculate the download |
| // progress percentage. This field is not used by MDD currently. |
| optional int32 downloaded_file_byte_size = 16; |
| |
| // These transforms are evaluated by the caller on-the-fly when reading the |
| // data with MobStore. Any transforms installed in the caller's MobStore |
| // instance is available. |
| // Valid on Android. iOS support is tracked by b/118759254. |
| optional mobstore.proto.Transforms read_transforms = 12; |
| |
| // List of delta files that can be encoded and decoded with base files. |
| // If the device has any base file, the delta file which is much |
| // smaller will be downloaded instead of the full file. |
| // For most clients, only one delta file should be enough. If specifying |
| // multiple delta files, they should be in a sequence from the most recent |
| // base file to the oldest. |
| // This is currently only supported on Android. |
| repeated DeltaFile delta_file = 13; |
| |
| enum AndroidSharingType { |
| // The dataFile isn't available for sharing. |
| UNSUPPORTED = 0; |
| |
| // If sharing with the Android Blob Sharing Service isn't available, fall |
| // back to normal behavior, i.e. download locally. |
| ANDROID_BLOB_WHEN_AVAILABLE = 1; |
| } |
| |
| // Defines whether the file should be shared and how. |
| // NOTE: currently this field is only used by aMDD and has no effect on iMDD. |
| optional AndroidSharingType android_sharing_type = 17; |
| |
| // Enum for android sharing checksum types. |
| enum AndroidSharingChecksumType { |
| NOT_SET = 0; |
| |
| // If the file group should be shared through the Android Blob Sharing |
| // Service, the checksum type must be set to SHA256. |
| SHA2_256 = 1; |
| } |
| |
| optional AndroidSharingChecksumType android_sharing_checksum_type = 18; |
| |
| // Checksum used to access files through the Android Blob Sharing Service. |
| optional string android_sharing_checksum = 19; |
| |
| // Relative file path and file name to be preserved within the parent |
| // directory when creating symlinks for the file groups that have |
| // preserve_filenames_and_isolate_files set to true. |
| // This filename should NOT start or end with a '/', and it can not contain |
| // the substring '..'. |
| // Working example: "subDir/FileName.txt". |
| optional string relative_file_path = 20; |
| |
| // Custom metadata attached to the file. |
| // |
| // This allows clients to include specific metadata about the file for their |
| // own processing purposes. The metadata will be stored with the file and |
| // accessible when the file's file group is retrieved. |
| // |
| // This property should only be used if absolutely necessary. Please consult |
| // with <internal>@ if you have questions about this property or a potential |
| // use-case. |
| optional google.protobuf.Any custom_metadata = 21; |
| |
| reserved 1, 3, 6, 8, 9; |
| } |
| // LINT.ThenChange( |
| // <internal>, |
| // <internal>) |
| |
| // Mirrors mdi.download.DeltaFile |
| // |
| // A delta file represents all the metadata to download for a diff file encoded |
| // based on a base file |
| // LINT.IfChange(delta_file) |
| message DeltaFile { |
| // These fields all mirror the similarly-named fields in DataFile. |
| optional string url_to_download = 1; |
| optional int32 byte_size = 2; |
| optional string checksum = 3; |
| |
| // Enum of all diff decoders supported |
| enum DiffDecoder { |
| // Default to have no diff decoder specified, will thrown unsupported |
| // exception |
| UNSPECIFIED = 0; |
| |
| // VcDIFF decoder |
| // Generic Differencing and Compression Data Format |
| // For more information, please refer to rfc3284 |
| // The VcDiff decoder for GMS service: |
| // <internal> |
| VC_DIFF = 1; |
| } |
| // The diff decoder used to generate full file with delta and base file. |
| // For MDD as a GMS service, a VcDiff decoder will be registered and injected |
| // in by default. Using MDD as a library, clients need to register and inject |
| // in a VcDiff decoder, otherwise, an exception will be thrown. |
| optional DiffDecoder diff_decoder = 5; |
| |
| // The base file represents to a full file on device. It should contain the |
| // bare minimum fields of a DataFile to identify a DataFile on device. |
| optional BaseFile base_file = 6; |
| |
| reserved 4; |
| } |
| // LINT.ThenChange( |
| // <internal>, |
| // <internal>) |
| |
| // Mirrors mdi.download.BaseFile |
| message BaseFile { |
| // SHA1 checksum of the base file to identify a file on device. It should |
| // match the checksum field of the base file used to generate the delta file. |
| optional string checksum = 1; |
| } |
| |
| // Mirrors mdi.download.DownloadConditions |
| // |
| // Next id: 5 |
| message DownloadConditions { |
| // TODO(b/143548753): The first value in an enum must have a specific prefix. |
| enum DeviceStoragePolicy { |
| // MDD will block download of files in android low storage. Currently MDD |
| // doesn't delete the files in case the device reaches low storage |
| // after the file has been downloaded. |
| BLOCK_DOWNLOAD_IN_LOW_STORAGE = 0; |
| |
| // Block download of files only under a lower threshold defined here |
| // <internal> |
| BLOCK_DOWNLOAD_LOWER_THRESHOLD = 1; |
| |
| // Set the storage threshold to an extremely low value when downloading. |
| // IMPORTANT: if the download make the device runs out of disk, this could |
| // render the device unusable. |
| // This should only be used for critical use cases such as privacy |
| // violations. Emergency fix should not belong to this category. Please |
| // talks to <internal>@ when you want to use this option. |
| EXTREMELY_LOW_THRESHOLD = 2; |
| } |
| |
| // Specify the device storage under which the files should be downloaded. |
| // By default, the files will only be downloaded if the device is not in |
| // low storage. |
| optional DeviceStoragePolicy device_storage_policy = 1; |
| |
| // TODO(b/143548753): The first value in an enum must have a specific prefix. |
| enum DeviceNetworkPolicy { |
| // Only download files on wifi. |
| DOWNLOAD_ONLY_ON_WIFI = 0; |
| |
| // Allow download on any network including wifi and cellular. |
| DOWNLOAD_ON_ANY_NETWORK = 1; |
| |
| // Allow downloading only on wifi first, then after a configurable time |
| // period set in the field download_first_on_wifi_period_secs below, |
| // allow downloading on any network including wifi and cellular. |
| DOWNLOAD_FIRST_ON_WIFI_THEN_ON_ANY_NETWORK = 2; |
| } |
| |
| // Specify the device network under which the files should be downloaded. |
| // By default, the files will only be downloaded on wifi. |
| // |
| // If your feature targets below v20 and want to download on cellular in |
| // these versions of gms, also set allow_dowload_without_wifi = true; |
| optional DeviceNetworkPolicy device_network_policy = 2; |
| |
| // This field will only be used when the |
| // DeviceNetworkPolicy = DOWNLOAD_FIRST_ON_WIFI_THEN_ON_ANY_NETWORK |
| // MDD will download the file only on wifi for this period of time. If the |
| // download was not finished, MDD will download on any network including |
| // wifi and cellular. |
| // Ex: 604800 // 7 Days |
| optional int64 download_first_on_wifi_period_secs = 4; |
| |
| // TODO(b/143548753): The first value in an enum must have a specific prefix. |
| enum ActivatingCondition { |
| // The download is activated as soon the server side config is received and |
| // the server configured download conditions are satisfied. |
| ALWAYS_ACTIVATED = 0; |
| |
| // The download is activated when both server side activation conditions |
| // are satisfied and the client has activated the download on device. |
| // |
| // Clients can activate this group using the activateFileGroup API. |
| // <internal> |
| DEVICE_ACTIVATED = 1; |
| } |
| |
| // Specify how the download is activated. By default, the download is |
| // activated as soon as server configured activating conditions are satisfied. |
| optional ActivatingCondition activating_condition = 3; |
| } |
| |
| // This proto contains extra information about a file group for bookkeeping. |
| // Next tag: 6 |
| message DataFileGroupBookkeeping { |
| // The epoch time (seconds since 1/1/1970) at which this stale file group will |
| // be deleted. |
| optional int64 stale_expiration_date = 1; |
| |
| // The timestamp (epoch time, milliseconds since 1/1/1970) that the file group |
| // was first received. |
| // |
| // If this is an update on an existing group, then the timestamp from the old |
| // group is used if no files were updated. |
| optional int64 group_new_files_received_timestamp = 2; |
| |
| // The timestamp (epoch time, milliseconds since 1/1/1970) at which the group |
| // was first marked as downloaded. |
| optional int64 group_downloaded_timestamp_in_millis = 3; |
| |
| // The timestamp (epoch time, milliseconds since 1/1/1970) that MDD starts |
| // downloading the file group for the first time. |
| optional int64 group_download_started_timestamp_in_millis = 4; |
| |
| // The total count of download periodic tasks needed to fully download the |
| // file group. |
| optional int32 download_started_count = 5; |
| } |
| |
| // Key used by mdd to uniquely identify a client group. |
| message GroupKey { |
| // The name of the group. |
| optional string group_name = 1; |
| |
| // The package name of the group owner. A null value or empty value means |
| // that the group is not associated with any package. |
| optional string owner_package = 2; |
| |
| // The account associated to the file group. |
| optional string account = 5; |
| |
| // Whether or not all files in a fileGroup have been downloaded. |
| optional bool downloaded = 4; |
| |
| // The variant id of the group. A null or empty value indicates that the group |
| // does not have an associated variant. |
| optional string variant_id = 6; |
| |
| reserved 3; |
| } |
| |
| // Group Key properties that apply to all groups with that key. |
| message GroupKeyProperties { |
| // Whether this group key has been activated on the device. |
| optional bool activated_on_device = 1; |
| } |
| |
| // SharedFile is a internal data structure of the SharedFileManager. |
| message SharedFile { |
| optional string file_name = 4; |
| optional FileStatus file_status = 5; |
| |
| // This field will be used to determine if a file can be retrieved from the |
| // Android Blob Sharing Service. |
| optional bool android_shared = 8; |
| |
| // The maximum expiration date found for a downloaded data file. If |
| // {@code android_shared} is set to true, this field stores the current lease |
| // expiration date. The default value is 0. |
| // See <internal> for more details. |
| optional int64 max_expiration_date_secs = 9; |
| |
| // Checksum used to access files through the Android Blob Sharing Service. |
| optional string android_sharing_checksum = 10; |
| |
| // If the file is downloaded successfully but fails checksum matching, we will |
| // attempt to delete the file so it can be redownloaded from scratch. To |
| // prevent unnecessary network bandwidth, we keep track of the number of these |
| // attempts in this field and stop after a certain number. (configurable by a |
| // download flag). |
| optional int32 checksum_mismatch_retry_download_count = 11; |
| |
| reserved 1, 2, 3, 6, 7; |
| } |
| |
| // Metadata used by |
| // com.google.android.libraries.mdi.download.MobileDataDownloadManager |
| message MobileDataDownloadManagerMetadata { |
| optional bool mdd_migrated_to_offroad = 1; |
| optional int32 reset_trigger = 2; |
| } |
| |
| // Metadata used by |
| // com.google.android.libraries.mdi.download.SharedFileManager |
| message SharedFileManagerMetadata { |
| optional bool migrated_to_new_file_key = 1; |
| optional int64 next_file_name = 2; |
| } |
| |
| // Collects all data used by |
| // com.google.android.libraries.mdi.download.internal.Migrations |
| message MigrationsStore { |
| enum FileKeyVersion { |
| NEW_FILE_KEY = 0; |
| ADD_DOWNLOAD_TRANSFORM = 1; |
| USE_CHECKSUM_ONLY = 2; |
| } |
| optional bool is_migrated_to_new_file_key = 1; |
| optional FileKeyVersion current_version = 2; |
| } |
| |
| // Collects all data used by |
| // com.google.android.libraries.mdi.download.internal.FileGroupsMetadata |
| message FileGroupsMetadataStore { |
| // Key must be a serialized GroupKey. |
| map<string, DataFileGroupInternal> data_file_groups = 1; |
| // Key must be a serialized GroupKey. |
| map<string, GroupKeyProperties> group_key_properties = 2; |
| repeated DataFileGroupInternal stale_groups = 3; |
| } |
| |
| // Collects all data used by |
| // com.google.android.libraries.mdi.download.internal.SharedFilesMetadata |
| message SharedFilesMetadataStore { |
| // The key must be a serialized NewFileKey. |
| map<string, SharedFile> shared_files = 1; |
| } |
| |
| enum FileStatus { |
| // The file has never been seen before. |
| NONE = 0; |
| // The file has been subscribed to, but download has not been attempted. |
| SUBSCRIBED = 1; |
| // The file download is currently in progress. |
| DOWNLOAD_IN_PROGRESS = 2; |
| // Downloading the file failed. |
| DOWNLOAD_FAILED = 3; |
| // The file was downloaded completely, and is available for use. |
| DOWNLOAD_COMPLETE = 4; |
| // The file was corrupted or lost after being successfully downloaded. |
| CORRUPTED = 6; |
| // Status returned when their is an error while getting the file status. |
| // This is never saved on disk. |
| INTERNAL_ERROR = 5; |
| } |
| |
| // Key used by the SharedFileManager to identify a shared file. |
| message NewFileKey { |
| // These fields all mirror the similarly-named fields in DataFile. |
| optional string url_to_download = 1 [deprecated = true]; |
| optional int32 byte_size = 2 [deprecated = true]; |
| optional string checksum = 3; |
| optional DataFileGroupInternal.AllowedReaders allowed_readers = 4; |
| optional mobstore.proto.Transforms download_transforms = 5 |
| [deprecated = true]; |
| } |
| |
| // This proto is used to store state for logging. See details at |
| // <internal> |
| message LoggingState { |
| // The last time maintenance was run. This should be updated every time |
| // maintenance is run. |
| // Note: the current implementation only uses this to determine the date of |
| // the last log event, but in the future we may want more granular |
| // measurements for this, so we store the timestamp as-is. |
| optional google.protobuf.Timestamp last_maintenance_run_timestamp = 1; |
| |
| // File group specific logging state keyed by GroupKey, build id and version |
| // number. |
| repeated FileGroupLoggingState file_group_logging_state = 2; |
| |
| // Set to true once the shared preferences migration is complete. |
| // Note: this field isn't strictly necessary at the moment - we could just |
| // check that the file_group_logging_state is empty since no one should write |
| // to the network usage monitor shared prefs since the migration will be |
| // installed at the same cl where the code is removed. However, if we were to |
| // add more fields to FileGroupLoggingState, it would be less straightforward |
| // to check for migration state - so having this boolean makes it a bit safer. |
| optional bool shared_preferences_network_usage_monitor_migration_complete = 3; |
| |
| // Info to enable stable sampling. See <internal> for more |
| // info. This field will be set by a migration on first access. |
| optional SamplingInfo sampling_info = 4; |
| } |
| |
| // This proto is used to store state for logging that is specific to a File |
| // Group. This includes network usage logging and maybe download tiers (for |
| // <internal>). |
| message FileGroupLoggingState { |
| optional GroupKey group_key = 1; |
| optional int64 build_id = 2; |
| optional int32 file_group_version_number = 3; |
| optional int64 cellular_usage = 4; |
| optional int64 wifi_usage = 5; |
| } |
| |
| // Next id: 3 |
| message SamplingInfo { |
| // Random number generated and persisted on device. This number should not |
| // change (unless device storage/mdd is cleared). It is used as a stable |
| // identifier to determine whether MDD should log events. |
| optional int64 stable_log_sampling_salt = 1; |
| |
| // When the stable_log_sampling_salt was first set. This will be used during |
| // roll out to determine which devices have enabled stable sampling for a |
| // sufficient time period. |
| optional google.protobuf.Timestamp log_sampling_salt_set_timestamp = 2; |
| } |