/*
 * 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.
 */

syntax = "proto2";

import "frameworks/proto_logging/stats/atoms.proto";
import "frameworks/proto_logging/stats/atom_field_options.proto";
import "frameworks/proto_logging/stats/enums/stats/mediaprovider/mediaprovider_enums.proto";

package android.os.statsd.providers.mediaprovider;

option java_package = "com.android.os.providers.mediaprovider";
option java_multiple_files = true;

extend Atom {
    optional MediaProviderVolumeRecoveryReported media_provider_volume_recovery_reported = 586 [(module) = "mediaprovider"];
    optional FileAccessAttributesQueryReported file_access_attributes_query_reported = 1061 [(module) = "mediaprovider"];
    optional OwnedPhotosRevokedFromAppReported owned_photos_revoked_from_app_reported = 1065 [(module) = "mediaprovider"];
    optional MediaMetadataExtractionReported media_metadata_extraction_reported = 1066 [(module) = "mediaprovider"];
    optional MediaProviderOpReported media_provider_op_reported = 1112 [(module) = "mediaprovider"];
    optional FuseOpReported fuse_op_reported = 1113 [(module) = "mediaprovider_jni"];
    optional DeviceStorageStateReported device_storage_state_reported = 1114 [(module) = "mediaprovider"];
    optional DeviceStorageStatePerUidReported device_storage_state_per_uid_reported = 1115 [(module) = "mediaprovider"];
}

/**
 * Logs when MediaProvider recovers volume data after a DB rollback.
 * Logged from:
 *   packages/providers/MediaProvider/src/com/android/providers/media/DatabaseHelper.java
 */
message MediaProviderVolumeRecoveryReported {
    enum Volume {
        UNKNOWN = 0;
        INTERNAL = 1;
        EXTERNAL_PRIMARY = 2;
        PUBLIC = 3;
    }
    // Volume recovered
    optional Volume volume = 1;
    // Time taken to recover data in milliseconds
    optional float recovery_time_millis = 2;
    // Count of rows recovered
    optional int64 rows_recovered = 3;
    // Dirty rows count
    optional int64 dirty_rows_found = 4;
    // Count of rows in level db batch
    optional int64 total_leveldb_rows = 5;
    // Count of insertion failures
    optional int64 insertionFailures = 6;
    enum Status {
        STATUS_UNKNOWN = 0;
        SUCCESS = 1;
        BACKUP_MISSING = 2;
        VOLUME_NOT_ATTACHED = 3;
        FUSE_DAEMON_TIMEOUT = 4;
        GET_BACKUP_DATA_FAILURE = 5;
        OTHER_ERROR = 6;
    }
    // Status code of volume recovery event
    optional Status status = 7;
}

/*
 * Logs when MediaProvider queries for file access attributes for filepath to check if file open is
 * permitted.
 * Logged from:
 *   packages/providers/MediaProvider/src/com/android/providers/media/MediaProvider.java
 */
message FileAccessAttributesQueryReported {
    // Latency between query fired to SQL and response object received
    optional int32 sql_query_duration_millis = 1;
    // Latency between query fired to LevelDb and response object received
    optional int32 leveldb_query_duration_millis = 2;
    // Flag to check data consistency between SQL and LevelDb
    optional bool is_data_consistent = 3;
}

/*
 * Logs count of items that have ownership revoked from apps
 * Logged from:
 *   packages/providers/MediaProvider/src/com/android/providers/media/MediaProvider.java
 * Estimated Logging Rate:
 *  Peak: 1 time in 1 sec | Avg: <10 in 1 day
 */
message OwnedPhotosRevokedFromAppReported {
    // number of items for which ownership is revoked
    optional int32 revoked_ownership_item_count = 1;

    // package uid of the package whose ownership is revoked
    optional int32 package_uid = 2 [(is_uid) = true];
}

/*
 * Logs metadata extraction during media scan for different media types.
 * Logged from:
 *   packages/providers/MediaProvider/src/com/android/providers/media/scan/ModernMediaScanner.java
 * Estimated Logging Rate:
 *  Peak: 1 time in 5 sec | Avg: <10 per device per day
 */
message MediaMetadataExtractionReported {
    // Total number of media files scanned during this session.
    optional int32 total_files_scanned = 1;

    // Number of files restored from backup
    optional int32 files_scanned_from_backup = 2;

    // Average time (in nanoseconds) taken to extract metadata across all media types.
    optional int64 avg_extraction_time_ns = 3;

    // ---- Image metadata extraction stats ---

    // Number of image files whose metadata was extracted using backup data.
    optional int32 image_extracted_with_backup_count = 4;

    // Average time (in nanoseconds) to extract metadata for images using backup.
    optional int64 image_extracted_with_backup_avg_time_ns = 5;

    // Number of image files whose metadata was extracted without using backup.
    optional int32 image_extracted_without_backup_count = 6;

    // Average time (in nanoseconds) to extract metadata for images without backup.
    optional int64 image_extracted_without_backup_avg_time_ns = 7;

    // --- Video metadata extraction stats ---

    // Number of video files whose metadata was extracted using backup data.
    optional int32 video_extracted_with_backup_count = 8;

    // Average time (in nanoseconds) to extract metadata for videos using backup.
    optional int64 video_extracted_with_backup_avg_time_ns = 9;

    // Number of video files whose metadata was extracted without using backup.
    optional int32 video_extracted_without_backup_count = 10;

    // Average time (in nanoseconds) to extract metadata for videos without backup.
    optional int64 video_extracted_without_backup_avg_time_ns = 11;

    // --- Audio metadata extraction stats ---

    // Number of audio files whose metadata was extracted using backup data.
    optional int32 audio_extracted_with_backup_count = 12;

    // Average time (in nanoseconds) to extract metadata for audio using backup.
    optional int64 audio_extracted_with_backup_avg_time_ns = 13;

    // Number of audio files whose metadata was extracted without using backup.
    optional int32 audio_extracted_without_backup_count = 14;

    // Average time (in nanoseconds) to extract metadata for audio without backup.
    optional int64 audio_extracted_without_backup_avg_time_ns = 15;

    // --- Document metadata extraction stats ---

    // Number of document files whose metadata was extracted using backup data.
    optional int32 document_extracted_with_backup_count = 16;

    // Average time (in nanoseconds) to extract metadata for documents using backup.
    optional int64 document_extracted_with_backup_avg_time_ns = 17;

    // Number of document files whose metadata was extracted without using backup.
    optional int32 document_extracted_without_backup_count = 18;

    // Average time (in nanoseconds) to extract metadata for documents without backup.
    optional int64 document_extracted_without_backup_avg_time_ns = 19;
}

/**
 * Logs when MediaProvider APIs are invoked.
 * Logged from:
 *     packages/providers/MediaProvider/src/com/android/providers/media/MediaProvider.java
 *     packages/providers/MediaProvider/src/com/android/providers/media/AsyncPickerFileOpener.java
 */
message MediaProviderOpReported {
    // MediaProvider operation type
    optional stats.mediaprovider.MediaProviderOp op_type = 1;
    // Uri type for which operation metrics are logged
    optional stats.mediaprovider.Uri uri_type = 2;
    // Volume type for which operation metrics are logged
    optional stats.mediaprovider.VolumeType volume = 3;
    // Calling package uid
    optional int32 package_uid = 4 [(is_uid) = true];
    // Time taken to execute operation (in nanoseconds)
    optional int64 execution_time_nanos = 5;
}

/**
 * Logs when MediaProvider APIs are invoked.
 * Logged from:
 *     packages/providers/MediaProvider/src/com/android/providers/media/MediaProvider.java
 */
message FuseOpReported {
    // Native Fuse Operation Type
    optional stats.mediaprovider.FuseOp op_type = 1;
    // Volume type for which operation metrics are logged
    optional stats.mediaprovider.VolumeType volume = 2;
    // Calling package uid
    optional int32 package_uid = 3 [(is_uid) = true];
    // Time taken to execute operation (in nanoseconds)
    optional int64 execution_time_nanos = 4;
}

/**
 * Logs device storage state once every week
 * Logged from:
 *     packages/providers/MediaProvider/src/com/android/providers/media/MediaProvider.java
 */
message DeviceStorageStateReported {
    // Total storage size of media files on the device
    optional int64 device_storage_size_mb = 1;
    // Number of files stores in shared storage of the device
    optional int32 num_files_in_shared_storage = 2;
    // Number of image files stored in the device
    optional int32 num_images = 3;
    // Number of video files stored in the device
    optional int32 num_videos = 4;
    // Number of audio files stored in the device
    optional int32 num_audio = 5;
    // Number of document files stored in the device
    optional int32 num_documents = 6;
    // Number of other media files stored in the device
    optional int32 num_other_media = 7;
    // Number of files stored in the default documents directory
    optional int32 num_in_default_documents = 8;
    // Number of files stored in the default downloads directory
    optional int32 num_in_default_downloads = 9;
    // Number of files stored in the Android/media directory
    optional int32 num_in_android_media = 10;
    // Total storage size of files stored in shared storage
    optional int32 files_shared_storage_size_mb = 11;
    // Total storage size of image files stored in the device
    optional int32 images_storage_size_mb = 12;
    // Total storage size of video files stored in the device
    optional int32 videos_storage_size_mb = 13;
    // Total storage size of audio files stored in the device
    optional int32 audio_storage_size_mb = 14;
    // Total storage size of documents files stored in the device
    optional int32 documents_storage_size_mb = 15;
    // Total storage size of other media files stored in the device
    optional int32 other_media_storage_size_mb = 16;
    // Total storage size of default downloads directory
    optional int32 default_downloads_storage_size_mb = 17;
    // Total storage size of default documents directory
    optional int32 default_documents_storage_size_mb = 18;
    // Total storage size of Android/media directory
    optional int32 android_media_storage_size_mb = 19;
}

/**
 * Logs storage state of each package uid once every week
 * Logged from:
 *     packages/providers/MediaProvider/src/com/android/providers/media/MediaProvider.java
 */
message DeviceStorageStatePerUidReported {
    // Package uid for which stats are logged
    optional int32 package_uid = 1 [(is_uid) = true];
    // Number of files owned by the package
    optional int32 num_owned_files = 2;
    // Total storage size of the package owned files
    optional int32 owned_files_storage_size_mb = 3;
    // Number of image files owned by the package
    optional int32 num_images = 4;
    // Number of video files owned by the package
    optional int32 num_videos = 5;
    // Number of audio files owned by the package
    optional int32 num_audio = 6;
    // Number of document files owned by the package
    optional int32 num_documents = 7;
    // Number of other media type files owned by the package
    optional int32 num_other_media = 8;
}