/*
 * 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.service.procstats;

option java_multiple_files = true;
option java_outer_classname = "ProcessStatsEnums";

enum ScreenState {
    SCREEN_STATE_UNKNOWN = 0;
    SCREEN_STATE_OFF = 1;
    SCREEN_STATE_ON = 2;
}

enum MemoryState {
    MEMORY_STATE_UNKNOWN = 0;
    MEMORY_STATE_NORMAL = 1;     // normal.
    MEMORY_STATE_MODERATE = 2;   // moderate memory pressure.
    MEMORY_STATE_LOW = 3;        // low memory.
    MEMORY_STATE_CRITICAL = 4;   // critical memory.
}

// this enum list is from frameworks/base/core/java/com/android/internal/app/procstats/ProcessStats.java
// and not frameworks/base/core/java/android/app/ActivityManager.java
enum ProcessState {
    PROCESS_STATE_UNKNOWN = 0;
    // Persistent system process.
    PROCESS_STATE_PERSISTENT = 1;
    // Top activity; actually any visible activity.
    PROCESS_STATE_TOP = 2;
    // Important foreground process (ime, wallpaper, etc).
    PROCESS_STATE_IMPORTANT_FOREGROUND = 3;
    // Important background process.
    PROCESS_STATE_IMPORTANT_BACKGROUND = 4;
    // Performing backup operation.
    PROCESS_STATE_BACKUP = 5;
    // Background process running a service.
    PROCESS_STATE_SERVICE = 6;
    // Process not running, but would be if there was enough RAM.
    PROCESS_STATE_SERVICE_RESTARTING = 7;
    // Process running a receiver.
    PROCESS_STATE_RECEIVER = 8;
    // Heavy-weight process (currently not used).
    PROCESS_STATE_HEAVY_WEIGHT = 9;
    // Process hosting home/launcher app when not on top.
    PROCESS_STATE_HOME = 10;
    // Process hosting the last app the user was in.
    PROCESS_STATE_LAST_ACTIVITY = 11;
    // Cached process hosting a previous activity.
    PROCESS_STATE_CACHED_ACTIVITY = 12;
    // Cached process hosting a client activity.
    PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 13;
    // Cached process that is empty.
    PROCESS_STATE_CACHED_EMPTY = 14;
}

enum ServiceOperationState {
    SERVICE_OPERATION_STATE_UNKNOWN = 0;
    SERVICE_OPERATION_STATE_RUNNING = 1;
    SERVICE_OPERATION_STATE_STARTED = 2;
    SERVICE_OPERATION_STATE_FOREGROUND = 3;
    SERVICE_OPERATION_STATE_BOUND = 4;
    SERVICE_OPERATION_STATE_EXECUTING = 5;
}

// this enum list is from frameworks/base/core/java/com/android/internal/app/procstats/ProcessStats.java
// and not frameworks/base/core/java/android/app/ActivityManager.java
enum AggregatedProcessState {
    AGGREGATED_PROCESS_STATE_UNKNOWN = 0;
    // Persistent system process; PERSISTENT or PERSISTENT_UI in ActivityManager
    AGGREGATED_PROCESS_STATE_PERSISTENT = 1;
    // Top activity; actually any visible activity; TOP or TOP_SLEEPING in ActivityManager
    AGGREGATED_PROCESS_STATE_TOP = 2;
    // Bound top foreground process; BOUND_TOP or BOUND_FOREGROUND_SERVICE in ActivityManager
    AGGREGATED_PROCESS_STATE_BOUND_TOP_OR_FGS = 3;
    // Important foreground process; FOREGROUND_SERVICE in ActivityManager
    AGGREGATED_PROCESS_STATE_FGS = 4;
    // Important foreground process ; IMPORTANT_FOREGROUND in ActivityManager
    AGGREGATED_PROCESS_STATE_IMPORTANT_FOREGROUND = 5;
    // Various background processes; IMPORTANT_BACKGROUND, TRANSIENT_BACKGROUND, BACKUP, SERVICE,
    // HEAVY_WEIGHT in ActivityManager
    AGGREGATED_PROCESS_STATE_BACKGROUND = 6;
    // Process running a receiver; RECEIVER in ActivityManager
    AGGREGATED_PROCESS_STATE_RECEIVER = 7;
    // Various cached processes; HOME, LAST_ACTIVITY, CACHED_ACTIVITY, CACHED_RECENT,
    // CACHED_ACTIVITY_CLIENT, CACHED_EMPTY in ActivityManager
    AGGREGATED_PROCESS_STATE_CACHED = 8;
}