16b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey/*
26b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey * Copyright (C) 2012 The Android Open Source Project
36b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey *
46b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
56b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey * you may not use this file except in compliance with the License.
66b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey * You may obtain a copy of the License at
76b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey *
86b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
96b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey *
106b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
116b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
126b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey * See the License for the specific language governing permissions and
146b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey * limitations under the License.
156b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey */
166b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
176b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkeypackage android.support.v4.net;
186b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
196b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkeyimport android.os.Build;
206b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
2140e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkeyimport java.net.DatagramSocket;
226b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkeyimport java.net.Socket;
236b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkeyimport java.net.SocketException;
246b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
256b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey/**
266b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey * Helper for accessing features in TrafficStats introduced after API level 14
276b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey * in a backwards compatible fashion.
286b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey */
29c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banespublic final class TrafficStatsCompat {
306b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
316b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    interface TrafficStatsCompatImpl {
326b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        void clearThreadStatsTag();
336b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        int getThreadStatsTag();
346b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        void incrementOperationCount(int operationCount);
356b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        void incrementOperationCount(int tag, int operationCount);
366b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        void setThreadStatsTag(int tag);
376b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        void tagSocket(Socket socket) throws SocketException;
386b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        void untagSocket(Socket socket) throws SocketException;
3940e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey        void tagDatagramSocket(DatagramSocket socket) throws SocketException;
4040e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey        void untagDatagramSocket(DatagramSocket socket) throws SocketException;
416b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    }
426b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
436b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    static class BaseTrafficStatsCompatImpl implements TrafficStatsCompatImpl {
446b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        private static class SocketTags {
456b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey            public int statsTag = -1;
466b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        }
476b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
486b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        private ThreadLocal<SocketTags> mThreadSocketTags = new ThreadLocal<SocketTags>() {
496b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey            @Override
506b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey            protected SocketTags initialValue() {
516b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey                return new SocketTags();
526b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey            }
536b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        };
546b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
556b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        @Override
566b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        public void clearThreadStatsTag() {
576b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey            mThreadSocketTags.get().statsTag = -1;
586b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        }
596b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
606b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        @Override
616b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        public int getThreadStatsTag() {
626b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey            return mThreadSocketTags.get().statsTag;
636b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        }
646b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
656b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        @Override
666b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        public void incrementOperationCount(int operationCount) {
676b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        }
686b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
696b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        @Override
706b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        public void incrementOperationCount(int tag, int operationCount) {
716b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        }
726b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
736b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        @Override
746b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        public void setThreadStatsTag(int tag) {
756b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey            mThreadSocketTags.get().statsTag = tag;
766b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        }
776b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
786b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        @Override
796b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        public void tagSocket(Socket socket) {
806b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        }
816b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
826b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        @Override
836b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        public void untagSocket(Socket socket) {
846b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        }
8540e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey
8640e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey        @Override
8740e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey        public void tagDatagramSocket(DatagramSocket socket) {
8840e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey        }
8940e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey
9040e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey        @Override
9140e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey        public void untagDatagramSocket(DatagramSocket socket) {
9240e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey        }
936b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    }
946b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
956b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    static class IcsTrafficStatsCompatImpl implements TrafficStatsCompatImpl {
966b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        @Override
976b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        public void clearThreadStatsTag() {
986b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey            TrafficStatsCompatIcs.clearThreadStatsTag();
996b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        }
1006b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
1016b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        @Override
1026b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        public int getThreadStatsTag() {
1036b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey            return TrafficStatsCompatIcs.getThreadStatsTag();
1046b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        }
1056b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
1066b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        @Override
1076b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        public void incrementOperationCount(int operationCount) {
1086b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey            TrafficStatsCompatIcs.incrementOperationCount(operationCount);
1096b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        }
1106b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
1116b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        @Override
1126b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        public void incrementOperationCount(int tag, int operationCount) {
1136b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey            TrafficStatsCompatIcs.incrementOperationCount(tag, operationCount);
1146b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        }
1156b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
1166b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        @Override
1176b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        public void setThreadStatsTag(int tag) {
1186b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey            TrafficStatsCompatIcs.setThreadStatsTag(tag);
1196b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        }
1206b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
1216b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        @Override
1226b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        public void tagSocket(Socket socket) throws SocketException {
1236b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey            TrafficStatsCompatIcs.tagSocket(socket);
1246b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        }
1256b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
1266b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        @Override
1276b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        public void untagSocket(Socket socket) throws SocketException {
1286b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey            TrafficStatsCompatIcs.untagSocket(socket);
1296b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        }
13040e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey
13140e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey        @Override
13240e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey        public void tagDatagramSocket(DatagramSocket socket) throws SocketException {
13340e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey            TrafficStatsCompatIcs.tagDatagramSocket(socket);
13440e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey        }
13540e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey
13640e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey        @Override
13740e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey        public void untagDatagramSocket(DatagramSocket socket) throws SocketException {
13840e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey            TrafficStatsCompatIcs.untagDatagramSocket(socket);
13940e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey        }
1406b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    }
1416b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
142ba3b64f481c376d6c0ad96c9a31d747e9038ebabJeff Sharkey    static class Api24TrafficStatsCompatImpl extends IcsTrafficStatsCompatImpl {
143ba3b64f481c376d6c0ad96c9a31d747e9038ebabJeff Sharkey        @Override
144ba3b64f481c376d6c0ad96c9a31d747e9038ebabJeff Sharkey        public void tagDatagramSocket(DatagramSocket socket) throws SocketException {
145ba3b64f481c376d6c0ad96c9a31d747e9038ebabJeff Sharkey            TrafficStatsCompatApi24.tagDatagramSocket(socket);
146ba3b64f481c376d6c0ad96c9a31d747e9038ebabJeff Sharkey        }
147ba3b64f481c376d6c0ad96c9a31d747e9038ebabJeff Sharkey
148ba3b64f481c376d6c0ad96c9a31d747e9038ebabJeff Sharkey        @Override
149ba3b64f481c376d6c0ad96c9a31d747e9038ebabJeff Sharkey        public void untagDatagramSocket(DatagramSocket socket) throws SocketException {
150ba3b64f481c376d6c0ad96c9a31d747e9038ebabJeff Sharkey            TrafficStatsCompatApi24.untagDatagramSocket(socket);
151ba3b64f481c376d6c0ad96c9a31d747e9038ebabJeff Sharkey        }
152ba3b64f481c376d6c0ad96c9a31d747e9038ebabJeff Sharkey    }
153ba3b64f481c376d6c0ad96c9a31d747e9038ebabJeff Sharkey
1546b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    private static final TrafficStatsCompatImpl IMPL;
1556b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
1566b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    static {
157ba3b64f481c376d6c0ad96c9a31d747e9038ebabJeff Sharkey        if ("N".equals(Build.VERSION.CODENAME)) {
158ba3b64f481c376d6c0ad96c9a31d747e9038ebabJeff Sharkey            IMPL = new Api24TrafficStatsCompatImpl();
159ba3b64f481c376d6c0ad96c9a31d747e9038ebabJeff Sharkey        } else if (Build.VERSION.SDK_INT >= 14) {
1606b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey            IMPL = new IcsTrafficStatsCompatImpl();
1616b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        } else {
1626b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey            IMPL = new BaseTrafficStatsCompatImpl();
1636b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        }
1646b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    }
1656b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
1666b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    /**
1676b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * Clear active tag used when accounting {@link Socket} traffic originating
1686b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * from the current thread.
1696b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     */
1706b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    public static void clearThreadStatsTag() {
1716b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        IMPL.clearThreadStatsTag();
1726b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    }
1736b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
1746b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    /**
1756b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * Get the active tag used when accounting {@link Socket} traffic originating
1766b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * from the current thread. Only one active tag per thread is supported.
1776b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * {@link #tagSocket(Socket)}.
1786b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     */
1796b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    public static int getThreadStatsTag() {
1806b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        return IMPL.getThreadStatsTag();
1816b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    }
1826b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
1836b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    /**
1846b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * Increment count of network operations performed under the accounting tag
1856b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * currently active on the calling thread. This can be used to derive
1866b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * bytes-per-operation.
1876b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     *
1886b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * @param operationCount Number of operations to increment count by.
1896b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     */
1906b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    public static void incrementOperationCount(int operationCount) {
1916b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        IMPL.incrementOperationCount(operationCount);
1926b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    }
1936b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
1946b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    /**
1956b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * Increment count of network operations performed under the given
1966b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * accounting tag. This can be used to derive bytes-per-operation.
1976b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     *
1986b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * @param tag Accounting tag used in {@link #setThreadStatsTag(int)}.
1996b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * @param operationCount Number of operations to increment count by.
2006b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     */
2016b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    public static void incrementOperationCount(int tag, int operationCount) {
2026b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        IMPL.incrementOperationCount(tag, operationCount);
2036b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    }
2046b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
2056b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    /**
2066b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * Set active tag to use when accounting {@link Socket} traffic originating
2076b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * from the current thread. Only one active tag per thread is supported.
2086b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * <p>
2096b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * Changes only take effect during subsequent calls to
2106b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * {@link #tagSocket(Socket)}.
2116b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * <p>
2126b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * Tags between {@code 0xFFFFFF00} and {@code 0xFFFFFFFF} are reserved and
2136b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * used internally by system services like DownloadManager when performing
2146b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * traffic on behalf of an application.
2156b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     */
2166b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    public static void setThreadStatsTag(int tag) {
2176b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        IMPL.setThreadStatsTag(tag);
2186b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    }
2196b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
2206b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    /**
2216b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * Tag the given {@link Socket} with any statistics parameters active for
2226b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * the current thread. Subsequent calls always replace any existing
2236b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * parameters. When finished, call {@link #untagSocket(Socket)} to remove
2246b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * statistics parameters.
2256b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     *
2266b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * @see #setThreadStatsTag(int)
2276b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     */
2286b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    public static void tagSocket(Socket socket) throws SocketException {
2296b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        IMPL.tagSocket(socket);
2306b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    }
2316b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey
2326b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    /**
2336b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     * Remove any statistics parameters from the given {@link Socket}.
2346b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey     */
2356b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    public static void untagSocket(Socket socket) throws SocketException {
2366b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey        IMPL.untagSocket(socket);
2376b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey    }
238c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banes
23940e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey    /**
24040e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey     * Tag the given {@link DatagramSocket} with any statistics parameters
24140e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey     * active for the current thread. Subsequent calls always replace any
24240e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey     * existing parameters. When finished, call
24340e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey     * {@link #untagDatagramSocket(DatagramSocket)} to remove statistics
24440e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey     * parameters.
24540e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey     *
24640e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey     * @see #setThreadStatsTag(int)
24740e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey     */
24840e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey    public static void tagDatagramSocket(DatagramSocket socket) throws SocketException {
24940e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey        IMPL.tagDatagramSocket(socket);
25040e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey    }
25140e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey
25240e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey    /**
25340e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey     * Remove any statistics parameters from the given {@link DatagramSocket}.
25440e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey     */
25540e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey    public static void untagDatagramSocket(DatagramSocket socket) throws SocketException {
25640e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey        IMPL.untagDatagramSocket(socket);
25740e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey    }
25840e65d82b9029bf10c78dd3217b110cb325045aaJeff Sharkey
259c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banes    private TrafficStatsCompat() {}
2606b96c2a5aecbb56116667959e43489966e02ff73Jeff Sharkey}
261