/*
 * Copyright (C) 2006 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";
option java_multiple_files = true;

package android.content;

import "frameworks/base/core/proto/android/app/window_configuration.proto";
import "frameworks/base/core/proto/android/content/locale.proto";
import "frameworks/base/core/proto/android/privacy.proto";

/**
 * An android Configuration object.
 */
message ConfigurationProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional float font_scale = 1;
    optional uint32 mcc = 2;
    optional uint32 mnc = 3 [ (.android.privacy).dest = DEST_EXPLICIT ];
    repeated LocaleProto locales = 4 [deprecated = true];
    optional uint32 screen_layout = 5;
    optional uint32 color_mode = 6;
    optional uint32 touchscreen = 7;
    optional uint32 keyboard = 8;
    optional uint32 keyboard_hidden = 9;
    optional uint32 hard_keyboard_hidden = 10;
    optional uint32 navigation = 11;
    optional uint32 navigation_hidden = 12;
    optional uint32 orientation = 13;
    optional uint32 ui_mode = 14;
    optional uint32 screen_width_dp = 15;
    optional uint32 screen_height_dp = 16;
    optional uint32 smallest_screen_width_dp = 17;
    optional uint32 density_dpi = 18;
    optional .android.app.WindowConfigurationProto window_configuration = 19;
    optional string locale_list = 20;
}

/**
 * All current configuration data used to select resources.
 */
message ResourcesConfigurationProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    required ConfigurationProto configuration = 1;

    optional uint32 sdk_version = 2;
    optional uint32 screen_width_px = 3;
    optional uint32 screen_height_px = 4;
}

/**
 * Overall device configuration data.
 */
message DeviceConfigurationProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional uint32 stable_screen_width_px = 1;
    optional uint32 stable_screen_height_px = 2;
    optional uint32 stable_density_dpi = 3;

    optional uint64 total_ram = 4;
    optional bool low_ram = 5;
    optional uint32 max_cores = 6;
    optional bool has_secure_screen_lock = 7;

    optional uint32 opengl_version = 8;
    repeated string opengl_extensions = 9;

    repeated string shared_libraries = 10;
    repeated string features = 11;
    repeated string cpu_architectures = 12;
}

/**
 * All current configuration data device is running with, everything used
 * to filter and target apps.
 */
message GlobalConfigurationProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional ResourcesConfigurationProto resources = 1;
    optional DeviceConfigurationProto device = 2;
}
