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

package com.android.settings.fuelgauge.batterytip;

import androidx.annotation.IntDef;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/** This class provides all the configs needed if we want to use {@link android.app.StatsManager} */
public class StatsManagerConfig {
    /**
     * The key that represents the anomaly config. This value is used in {@link
     * android.app.StatsManager#addConfig(long, byte[])}
     */
    public static final long ANOMALY_CONFIG_KEY = 1;

    /** The key that represents subscriber, which is settings app. */
    public static final long SUBSCRIBER_ID = 1;

    @Retention(RetentionPolicy.SOURCE)
    @IntDef({
        AnomalyType.NULL,
        AnomalyType.UNKNOWN_REASON,
        AnomalyType.EXCESSIVE_WAKELOCK_ALL_SCREEN_OFF,
        AnomalyType.EXCESSIVE_WAKEUPS_IN_BACKGROUND,
        AnomalyType.EXCESSIVE_UNOPTIMIZED_BLE_SCAN,
        AnomalyType.EXCESSIVE_BACKGROUND_SERVICE,
        AnomalyType.EXCESSIVE_WIFI_SCAN,
        AnomalyType.EXCESSIVE_FLASH_WRITES,
        AnomalyType.EXCESSIVE_MEMORY_IN_BACKGROUND,
        AnomalyType.EXCESSIVE_DAVEY_RATE,
        AnomalyType.EXCESSIVE_JANKY_FRAMES,
        AnomalyType.SLOW_COLD_START_TIME,
        AnomalyType.SLOW_HOT_START_TIME,
        AnomalyType.SLOW_WARM_START_TIME,
        AnomalyType.EXCESSIVE_BACKGROUND_SYNCS,
        AnomalyType.EXCESSIVE_GPS_SCANS_IN_BACKGROUND,
        AnomalyType.EXCESSIVE_JOB_SCHEDULING,
        AnomalyType.EXCESSIVE_MOBILE_NETWORK_IN_BACKGROUND,
        AnomalyType.EXCESSIVE_WIFI_LOCK_TIME,
        AnomalyType.JOB_TIMED_OUT,
        AnomalyType.LONG_UNOPTIMIZED_BLE_SCAN,
        AnomalyType.BACKGROUND_ANR,
        AnomalyType.BACKGROUND_CRASH_RATE,
        AnomalyType.EXCESSIVE_ANR_LOOPING,
        AnomalyType.EXCESSIVE_ANRS,
        AnomalyType.EXCESSIVE_CRASH_RATE,
        AnomalyType.EXCESSIVE_CRASH_LOOPING,
        AnomalyType.NUMBER_OF_OPEN_FILES,
        AnomalyType.EXCESSIVE_CAMERA_USAGE_IN_BACKGROUND,
        AnomalyType.EXCESSIVE_CONTACT_ACCESS,
        AnomalyType.EXCESSIVE_AUDIO_IN_BACKGROUND,
        AnomalyType.EXCESSIVE_CRASH_ANR_IN_BACKGROUND,
        AnomalyType.BATTERY_DRAIN_FROM_UNUSED_APP,
    })
    public @interface AnomalyType {
        /** This represents an error condition in the anomaly detection. */
        int NULL = -1;

        /** The anomaly type does not match any other defined type. */
        int UNKNOWN_REASON = 0;

        /**
         * The application held a partial (screen off) wake lock for a period of time that exceeded
         * the threshold with the screen off when not charging.
         */
        int EXCESSIVE_WAKELOCK_ALL_SCREEN_OFF = 1;

        /**
         * The application exceeded the maximum number of wakeups while in the background when not
         * charging.
         */
        int EXCESSIVE_WAKEUPS_IN_BACKGROUND = 2;

        /** The application did unoptimized Bluetooth scans too frequently when not charging. */
        int EXCESSIVE_UNOPTIMIZED_BLE_SCAN = 3;

        /**
         * The application ran in the background for a period of time that exceeded the threshold.
         */
        int EXCESSIVE_BACKGROUND_SERVICE = 4;

        /** The application exceeded the maximum number of wifi scans when not charging. */
        int EXCESSIVE_WIFI_SCAN = 5;

        /** The application exceed the maximum number of flash writes */
        int EXCESSIVE_FLASH_WRITES = 6;

        /**
         * The application used more than the maximum memory, while not spending any time in the
         * foreground.
         */
        int EXCESSIVE_MEMORY_IN_BACKGROUND = 7;

        /**
         * The application exceeded the maximum percentage of frames with a render rate of greater
         * than 700ms.
         */
        int EXCESSIVE_DAVEY_RATE = 8;

        /**
         * The application exceeded the maximum percentage of frames with a render rate greater than
         * 16ms.
         */
        int EXCESSIVE_JANKY_FRAMES = 9;

        /**
         * The application exceeded the maximum cold start time - the app has not been launched
         * since last system start, died or was killed.
         */
        int SLOW_COLD_START_TIME = 10;

        /**
         * The application exceeded the maximum hot start time - the app and activity are already in
         * memory.
         */
        int SLOW_HOT_START_TIME = 11;

        /**
         * The application exceeded the maximum warm start time - the app was already in memory but
         * the activity wasn’t created yet or was removed from memory.
         */
        int SLOW_WARM_START_TIME = 12;

        /** The application exceeded the maximum number of syncs while in the background. */
        int EXCESSIVE_BACKGROUND_SYNCS = 13;

        /** The application exceeded the maximum number of gps scans while in the background. */
        int EXCESSIVE_GPS_SCANS_IN_BACKGROUND = 14;

        /** The application scheduled more than the maximum number of jobs while not charging. */
        int EXCESSIVE_JOB_SCHEDULING = 15;

        /**
         * The application exceeded the maximum amount of mobile network traffic while in the
         * background.
         */
        int EXCESSIVE_MOBILE_NETWORK_IN_BACKGROUND = 16;

        /**
         * The application held the WiFi lock for more than the maximum amount of time while not
         * charging.
         */
        int EXCESSIVE_WIFI_LOCK_TIME = 17;

        /** The application scheduled a job that ran longer than the maximum amount of time. */
        int JOB_TIMED_OUT = 18;

        /**
         * The application did an unoptimized Bluetooth scan that exceeded the maximum time while in
         * the background.
         */
        int LONG_UNOPTIMIZED_BLE_SCAN = 19;

        /** The application exceeded the maximum ANR rate while in the background. */
        int BACKGROUND_ANR = 20;

        /** The application exceeded the maximum crash rate while in the background. */
        int BACKGROUND_CRASH_RATE = 21;

        /** The application exceeded the maximum ANR-looping rate. */
        int EXCESSIVE_ANR_LOOPING = 22;

        /** The application exceeded the maximum ANR rate. */
        int EXCESSIVE_ANRS = 23;

        /** The application exceeded the maximum crash rate. */
        int EXCESSIVE_CRASH_RATE = 24;

        /** The application exceeded the maximum crash-looping rate. */
        int EXCESSIVE_CRASH_LOOPING = 25;

        /** The application crashed because no more file descriptors were available. */
        int NUMBER_OF_OPEN_FILES = 26;

        /** The application used an excessive amount of CPU while in a background process state. */
        int EXCESSIVE_CPU_USAGE_IN_BACKGROUND = 27;

        /**
         * The application kept the camera open for an excessive amount of time while in a bckground
         * process state.
         */
        int EXCESSIVE_CAMERA_USAGE_IN_BACKGROUND = 28;

        /** The application has accessed the contacts content provider an excessive amount. */
        int EXCESSIVE_CONTACT_ACCESS = 29;

        /** The application has played too much audio while in a background process state. */
        int EXCESSIVE_AUDIO_IN_BACKGROUND = 30;

        /**
         * The application has crashed or ANRed too many times while in a background process state.
         */
        int EXCESSIVE_CRASH_ANR_IN_BACKGROUND = 31;

        /**
         * An application which has not been used by the user recently was detected to cause an
         * excessive amount of battery drain.
         */
        int BATTERY_DRAIN_FROM_UNUSED_APP = 32;
    }
}
