/*
 * 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 android.stats.devicepolicy;
option java_multiple_files = true;

/**
 * Id for device policy features.
 */
enum EventId {
  SET_PASSWORD_QUALITY = 1;
  SET_PASSWORD_MINIMUM_LENGTH = 2;
  SET_PASSWORD_MINIMUM_NUMERIC = 3;
  SET_PASSWORD_MINIMUM_NON_LETTER = 4;
  SET_PASSWORD_MINIMUM_LETTERS = 5;
  SET_PASSWORD_MINIMUM_LOWER_CASE = 6;
  SET_PASSWORD_MINIMUM_UPPER_CASE = 7;
  SET_PASSWORD_MINIMUM_SYMBOLS = 8;
  SET_KEYGUARD_DISABLED_FEATURES = 9;
  LOCK_NOW = 10;
  WIPE_DATA_WITH_REASON = 11;
  ADD_USER_RESTRICTION = 12;
  REMOVE_USER_RESTRICTION = 13;
  SET_SECURE_SETTING = 14;
  SET_SECURITY_LOGGING_ENABLED = 15;
  RETRIEVE_SECURITY_LOGS = 16;
  RETRIEVE_PRE_REBOOT_SECURITY_LOGS = 17;
  SET_PERMISSION_POLICY = 18;
  SET_PERMISSION_GRANT_STATE = 19;
  INSTALL_KEY_PAIR = 20;
  INSTALL_CA_CERT = 21;
  CHOOSE_PRIVATE_KEY_ALIAS = 22;
  REMOVE_KEY_PAIR = 23;
  UNINSTALL_CA_CERTS = 24;
  SET_CERT_INSTALLER_PACKAGE = 25;
  SET_ALWAYS_ON_VPN_PACKAGE = 26;
  SET_PERMITTED_INPUT_METHODS = 27;
  SET_PERMITTED_ACCESSIBILITY_SERVICES = 28;
  SET_SCREEN_CAPTURE_DISABLED = 29;
  SET_CAMERA_DISABLED = 30;
  QUERY_SUMMARY_FOR_USER = 31;
  QUERY_SUMMARY = 32;
  QUERY_DETAILS = 33;
  REBOOT = 34;
  SET_MASTER_VOLUME_MUTED = 35;
  SET_AUTO_TIME_REQUIRED = 36;
  SET_KEYGUARD_DISABLED = 37;
  SET_STATUS_BAR_DISABLED = 38;
  SET_ORGANIZATION_COLOR = 39;
  SET_PROFILE_NAME = 40;
  SET_USER_ICON = 41;
  SET_DEVICE_OWNER_LOCK_SCREEN_INFO = 42;
  SET_SHORT_SUPPORT_MESSAGE = 43;
  SET_LONG_SUPPORT_MESSAGE = 44;
  SET_CROSS_PROFILE_CONTACTS_SEARCH_DISABLED = 45;
  SET_CROSS_PROFILE_CALLER_ID_DISABLED = 46;
  SET_BLUETOOTH_CONTACT_SHARING_DISABLED = 47;
  ADD_CROSS_PROFILE_INTENT_FILTER = 48;
  ADD_CROSS_PROFILE_WIDGET_PROVIDER = 49;
  SET_SYSTEM_UPDATE_POLICY = 50;
  SET_LOCKTASK_MODE_ENABLED = 51;
  ADD_PERSISTENT_PREFERRED_ACTIVITY = 52;
  REQUEST_BUGREPORT = 53;
  GET_WIFI_MAC_ADDRESS = 54;
  REQUEST_QUIET_MODE_ENABLED = 55;
  WORK_PROFILE_LOCATION_CHANGED = 56;
  DO_USER_INFO_CLICKED = 57;
  TRANSFER_OWNERSHIP = 58;
  GENERATE_KEY_PAIR = 59;
  SET_KEY_PAIR_CERTIFICATE = 60;
  SET_KEEP_UNINSTALLED_PACKAGES = 61;
  SET_APPLICATION_RESTRICTIONS = 62;
  SET_APPLICATION_HIDDEN = 63;
  ENABLE_SYSTEM_APP = 64;
  ENABLE_SYSTEM_APP_WITH_INTENT = 65;
  INSTALL_EXISTING_PACKAGE = 66;
  SET_UNINSTALL_BLOCKED = 67;
  SET_PACKAGES_SUSPENDED = 68;
  ON_LOCK_TASK_MODE_ENTERING = 69;
  SET_CROSS_PROFILE_CALENDAR_PACKAGES = 70;
  GET_USER_PASSWORD_COMPLEXITY_LEVEL = 72;
  INSTALL_SYSTEM_UPDATE = 73;
  INSTALL_SYSTEM_UPDATE_ERROR = 74;
  IS_MANAGED_KIOSK = 75;
  IS_UNATTENDED_MANAGED_KIOSK = 76;
  PROVISIONING_MANAGED_PROFILE_ON_FULLY_MANAGED_DEVICE = 77;
  PROVISIONING_PERSISTENT_DEVICE_OWNER = 78;

  // existing Tron logs to be migrated to statsd
  PROVISIONING_ENTRY_POINT_NFC = 79;
  PROVISIONING_ENTRY_POINT_QR_CODE = 80;
  PROVISIONING_ENTRY_POINT_CLOUD_ENROLLMENT = 81;
  PROVISIONING_ENTRY_POINT_ADB = 82;
  PROVISIONING_ENTRY_POINT_TRUSTED_SOURCE = 83;
  PROVISIONING_DPC_PACKAGE_NAME = 84;
  PROVISIONING_DPC_INSTALLED_BY_PACKAGE = 85;
  PROVISIONING_PROVISIONING_ACTIVITY_TIME_MS = 86;
  PROVISIONING_PREPROVISIONING_ACTIVITY_TIME_MS = 87;
  PROVISIONING_ENCRYPT_DEVICE_ACTIVITY_TIME_MS = 88;
  PROVISIONING_WEB_ACTIVITY_TIME_MS = 89;
  PROVISIONING_TRAMPOLINE_ACTIVITY_TIME_MS = 90;
  PROVISIONING_POST_ENCRYPTION_ACTIVITY_TIME_MS = 91;
  PROVISIONING_FINALIZATION_ACTIVITY_TIME_MS = 92;
  PROVISIONING_NETWORK_TYPE = 93;
  PROVISIONING_ACTION = 94;
  PROVISIONING_EXTRAS = 95;
  PROVISIONING_COPY_ACCOUNT_TASK_MS = 96;
  PROVISIONING_CREATE_PROFILE_TASK_MS = 97;
  PROVISIONING_START_PROFILE_TASK_MS = 98;
  PROVISIONING_DOWNLOAD_PACKAGE_TASK_MS = 99;
  PROVISIONING_INSTALL_PACKAGE_TASK_MS = 100;
  PROVISIONING_CANCELLED = 101;
  PROVISIONING_ERROR = 102;
  PROVISIONING_COPY_ACCOUNT_STATUS = 103;
  PROVISIONING_TOTAL_TASK_TIME_MS = 104;
  PROVISIONING_SESSION_STARTED = 105;
  PROVISIONING_SESSION_COMPLETED = 106;
  PROVISIONING_TERMS_ACTIVITY_TIME_MS = 107;
  PROVISIONING_TERMS_COUNT = 108;
  PROVISIONING_TERMS_READ = 109;

  SEPARATE_PROFILE_CHALLENGE_CHANGED = 110;
  SET_GLOBAL_SETTING = 111;
  INSTALL_PACKAGE = 112;
  UNINSTALL_PACKAGE = 113;
  WIFI_SERVICE_ADD_NETWORK_SUGGESTIONS = 114;
  WIFI_SERVICE_ADD_OR_UPDATE_NETWORK = 115;
  QUERY_SUMMARY_FOR_DEVICE = 116;
  REMOVE_CROSS_PROFILE_WIDGET_PROVIDER = 117;
  ESTABLISH_VPN = 118;
  SET_NETWORK_LOGGING_ENABLED = 119;
  RETRIEVE_NETWORK_LOGS = 120;
  PROVISIONING_PREPARE_TOTAL_TIME_MS = 121;
  PROVISIONING_PREPARE_STARTED = 122;
  PROVISIONING_PREPARE_COMPLETED = 123;
  PROVISIONING_FLOW_TYPE = 124;
  CROSS_PROFILE_APPS_GET_TARGET_USER_PROFILES = 125;
  CROSS_PROFILE_APPS_START_ACTIVITY_AS_USER = 126;
}
