// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.net;

import android.net.TrafficStats;
import android.os.Process;

import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;

/**
 * This class interacts with TrafficStats API provided by Android.
 */
@JNINamespace("net::android::traffic_stats")
public class AndroidTrafficStats {
    private AndroidTrafficStats() {}

    /**
     * @return Number of bytes transmitted since device boot. Counts packets across all network
     *         interfaces, and always increases monotonically since device boot. Statistics are
     *         measured at the network layer, so they include both TCP and UDP usage.
     */
    @CalledByNative
    private static long getTotalTxBytes() {
        long bytes = TrafficStats.getTotalTxBytes();
        return bytes != TrafficStats.UNSUPPORTED ? bytes : TrafficStatsError.ERROR_NOT_SUPPORTED;
    }

    /**
     * @return Number of bytes received since device boot. Counts packets across all network
     *         interfaces, and always increases monotonically since device boot. Statistics are
     *         measured at the network layer, so they include both TCP and UDP usage.
     */
    @CalledByNative
    private static long getTotalRxBytes() {
        long bytes = TrafficStats.getTotalRxBytes();
        return bytes != TrafficStats.UNSUPPORTED ? bytes : TrafficStatsError.ERROR_NOT_SUPPORTED;
    }

    /**
     * @return Number of bytes transmitted since device boot that were attributed to caller's UID.
     *         Counts packets across all network interfaces, and always increases monotonically
     *         since device boot. Statistics are measured at the network layer, so they include
     *         both TCP and UDP usage.
     */
    @CalledByNative
    private static long getCurrentUidTxBytes() {
        long bytes = TrafficStats.getUidTxBytes(Process.myUid());
        return bytes != TrafficStats.UNSUPPORTED ? bytes : TrafficStatsError.ERROR_NOT_SUPPORTED;
    }

    /**
     * @return Number of bytes received since device boot that were attributed to caller's UID.
     *         Counts packets across all network interfaces, and always increases monotonically
     *         since device boot. Statistics are measured at the network layer, so they include
     *         both TCP and UDP usage.
     */
    @CalledByNative
    private static long getCurrentUidRxBytes() {
        long bytes = TrafficStats.getUidRxBytes(Process.myUid());
        return bytes != TrafficStats.UNSUPPORTED ? bytes : TrafficStatsError.ERROR_NOT_SUPPORTED;
    }
}
