/*
 * 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 android.support.annotation.IntDef;

import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;

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#addConfiguration(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,
    })
    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;
    }

}
