1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.net;
18
19import android.annotation.RequiresPermission;
20import android.annotation.SystemApi;
21import android.app.DownloadManager;
22import android.app.backup.BackupManager;
23import android.app.usage.NetworkStatsManager;
24import android.content.Context;
25import android.media.MediaPlayer;
26import android.os.RemoteException;
27import android.os.ServiceManager;
28
29import com.android.server.NetworkManagementSocketTagger;
30
31import dalvik.system.SocketTagger;
32
33import java.net.DatagramSocket;
34import java.net.Socket;
35import java.net.SocketException;
36
37/**
38 * Class that provides network traffic statistics. These statistics include
39 * bytes transmitted and received and network packets transmitted and received,
40 * over all interfaces, over the mobile interface, and on a per-UID basis.
41 * <p>
42 * These statistics may not be available on all platforms. If the statistics are
43 * not supported by this device, {@link #UNSUPPORTED} will be returned.
44 * <p>
45 * Note that the statistics returned by this class reset and start from zero
46 * after every reboot. To access more robust historical network statistics data,
47 * use {@link NetworkStatsManager} instead.
48 */
49public class TrafficStats {
50    /**
51     * The return value to indicate that the device does not support the statistic.
52     */
53    public final static int UNSUPPORTED = -1;
54
55    /** @hide */
56    public static final long KB_IN_BYTES = 1024;
57    /** @hide */
58    public static final long MB_IN_BYTES = KB_IN_BYTES * 1024;
59    /** @hide */
60    public static final long GB_IN_BYTES = MB_IN_BYTES * 1024;
61    /** @hide */
62    public static final long TB_IN_BYTES = GB_IN_BYTES * 1024;
63    /** @hide */
64    public static final long PB_IN_BYTES = TB_IN_BYTES * 1024;
65
66    /**
67     * Special UID value used when collecting {@link NetworkStatsHistory} for
68     * removed applications.
69     *
70     * @hide
71     */
72    public static final int UID_REMOVED = -4;
73
74    /**
75     * Special UID value used when collecting {@link NetworkStatsHistory} for
76     * tethering traffic.
77     *
78     * @hide
79     */
80    public static final int UID_TETHERING = -5;
81
82    /**
83     * Default tag value for {@link DownloadManager} traffic.
84     *
85     * @hide
86     */
87    public static final int TAG_SYSTEM_DOWNLOAD = 0xFFFFFF01;
88
89    /**
90     * Default tag value for {@link MediaPlayer} traffic.
91     *
92     * @hide
93     */
94    public static final int TAG_SYSTEM_MEDIA = 0xFFFFFF02;
95
96    /**
97     * Default tag value for {@link BackupManager} backup traffic; that is,
98     * traffic from the device to the storage backend.
99     *
100     * @hide
101     */
102    public static final int TAG_SYSTEM_BACKUP = 0xFFFFFF03;
103
104    /**
105     * Default tag value for {@link BackupManager} restore traffic; that is,
106     * app data retrieved from the storage backend at install time.
107     *
108     * @hide
109     */
110    public static final int TAG_SYSTEM_RESTORE = 0xFFFFFF04;
111
112    /** @hide */
113    public static final int TAG_SYSTEM_DHCP = 0xFFFFFF05;
114    /** @hide */
115    public static final int TAG_SYSTEM_NTP = 0xFFFFFF06;
116    /** @hide */
117    public static final int TAG_SYSTEM_PROBE = 0xFFFFFF07;
118    /** @hide */
119    public static final int TAG_SYSTEM_NEIGHBOR = 0xFFFFFF08;
120    /** @hide */
121    public static final int TAG_SYSTEM_GPS = 0xFFFFFF09;
122    /** @hide */
123    public static final int TAG_SYSTEM_PAC = 0xFFFFFF0A;
124
125    /**
126     * Sockets that are strictly local on device; never hits network.
127     *
128     * @hide
129     */
130    public static final int TAG_SYSTEM_LOCAL = 0xFFFFFFAA;
131
132    private static INetworkStatsService sStatsService;
133
134    private synchronized static INetworkStatsService getStatsService() {
135        if (sStatsService == null) {
136            sStatsService = INetworkStatsService.Stub.asInterface(
137                    ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
138        }
139        return sStatsService;
140    }
141
142    /**
143     * Snapshot of {@link NetworkStats} when the currently active profiling
144     * session started, or {@code null} if no session active.
145     *
146     * @see #startDataProfiling(Context)
147     * @see #stopDataProfiling(Context)
148     */
149    private static NetworkStats sActiveProfilingStart;
150
151    private static Object sProfilingLock = new Object();
152
153    /**
154     * Set active tag to use when accounting {@link Socket} traffic originating
155     * from the current thread. Only one active tag per thread is supported.
156     * <p>
157     * Changes only take effect during subsequent calls to
158     * {@link #tagSocket(Socket)}.
159     * <p>
160     * Tags between {@code 0xFFFFFF00} and {@code 0xFFFFFFFF} are reserved and
161     * used internally by system services like {@link DownloadManager} when
162     * performing traffic on behalf of an application.
163     *
164     * @see #clearThreadStatsTag()
165     */
166    public static void setThreadStatsTag(int tag) {
167        NetworkManagementSocketTagger.setThreadSocketStatsTag(tag);
168    }
169
170    /**
171     * Set active tag to use when accounting {@link Socket} traffic originating
172     * from the current thread. Only one active tag per thread is supported.
173     * <p>
174     * Changes only take effect during subsequent calls to
175     * {@link #tagSocket(Socket)}.
176     * <p>
177     * Tags between {@code 0xFFFFFF00} and {@code 0xFFFFFFFF} are reserved and
178     * used internally by system services like {@link DownloadManager} when
179     * performing traffic on behalf of an application.
180     *
181     * @return the current tag for the calling thread, which can be used to
182     *         restore any existing values after a nested operation is finished
183     */
184    public static int getAndSetThreadStatsTag(int tag) {
185        return NetworkManagementSocketTagger.setThreadSocketStatsTag(tag);
186    }
187
188    /**
189     * Set active tag to use when accounting {@link Socket} traffic originating
190     * from the current thread. The tag used internally is well-defined to
191     * distinguish all backup-related traffic.
192     *
193     * @hide
194     */
195    @SystemApi
196    public static void setThreadStatsTagBackup() {
197        setThreadStatsTag(TAG_SYSTEM_BACKUP);
198    }
199
200    /**
201     * Set active tag to use when accounting {@link Socket} traffic originating
202     * from the current thread. The tag used internally is well-defined to
203     * distinguish all restore-related traffic.
204     *
205     * @hide
206     */
207    @SystemApi
208    public static void setThreadStatsTagRestore() {
209        setThreadStatsTag(TAG_SYSTEM_RESTORE);
210    }
211
212    /**
213     * Get the active tag used when accounting {@link Socket} traffic originating
214     * from the current thread. Only one active tag per thread is supported.
215     * {@link #tagSocket(Socket)}.
216     *
217     * @see #setThreadStatsTag(int)
218     */
219    public static int getThreadStatsTag() {
220        return NetworkManagementSocketTagger.getThreadSocketStatsTag();
221    }
222
223    /**
224     * Clear any active tag set to account {@link Socket} traffic originating
225     * from the current thread.
226     *
227     * @see #setThreadStatsTag(int)
228     */
229    public static void clearThreadStatsTag() {
230        NetworkManagementSocketTagger.setThreadSocketStatsTag(-1);
231    }
232
233    /**
234     * Set specific UID to use when accounting {@link Socket} traffic
235     * originating from the current thread. Designed for use when performing an
236     * operation on behalf of another application.
237     * <p>
238     * Changes only take effect during subsequent calls to
239     * {@link #tagSocket(Socket)}.
240     * <p>
241     * To take effect, caller must hold
242     * {@link android.Manifest.permission#UPDATE_DEVICE_STATS} permission.
243     *
244     * @hide
245     */
246    @SystemApi
247    @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS)
248    public static void setThreadStatsUid(int uid) {
249        NetworkManagementSocketTagger.setThreadSocketStatsUid(uid);
250    }
251
252    /**
253     * Clear any active UID set to account {@link Socket} traffic originating
254     * from the current thread.
255     *
256     * @see #setThreadStatsUid(int)
257     * @hide
258     */
259    @SystemApi
260    @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS)
261    public static void clearThreadStatsUid() {
262        NetworkManagementSocketTagger.setThreadSocketStatsUid(-1);
263    }
264
265    /**
266     * Tag the given {@link Socket} with any statistics parameters active for
267     * the current thread. Subsequent calls always replace any existing
268     * parameters. When finished, call {@link #untagSocket(Socket)} to remove
269     * statistics parameters.
270     *
271     * @see #setThreadStatsTag(int)
272     */
273    public static void tagSocket(Socket socket) throws SocketException {
274        SocketTagger.get().tag(socket);
275    }
276
277    /**
278     * Remove any statistics parameters from the given {@link Socket}.
279     */
280    public static void untagSocket(Socket socket) throws SocketException {
281        SocketTagger.get().untag(socket);
282    }
283
284    /**
285     * Tag the given {@link DatagramSocket} with any statistics parameters
286     * active for the current thread. Subsequent calls always replace any
287     * existing parameters. When finished, call
288     * {@link #untagDatagramSocket(DatagramSocket)} to remove statistics
289     * parameters.
290     *
291     * @see #setThreadStatsTag(int)
292     */
293    public static void tagDatagramSocket(DatagramSocket socket) throws SocketException {
294        SocketTagger.get().tag(socket);
295    }
296
297    /**
298     * Remove any statistics parameters from the given {@link DatagramSocket}.
299     */
300    public static void untagDatagramSocket(DatagramSocket socket) throws SocketException {
301        SocketTagger.get().untag(socket);
302    }
303
304    /**
305     * Start profiling data usage for current UID. Only one profiling session
306     * can be active at a time.
307     *
308     * @hide
309     */
310    public static void startDataProfiling(Context context) {
311        synchronized (sProfilingLock) {
312            if (sActiveProfilingStart != null) {
313                throw new IllegalStateException("already profiling data");
314            }
315
316            // take snapshot in time; we calculate delta later
317            sActiveProfilingStart = getDataLayerSnapshotForUid(context);
318        }
319    }
320
321    /**
322     * Stop profiling data usage for current UID.
323     *
324     * @return Detailed {@link NetworkStats} of data that occurred since last
325     *         {@link #startDataProfiling(Context)} call.
326     * @hide
327     */
328    public static NetworkStats stopDataProfiling(Context context) {
329        synchronized (sProfilingLock) {
330            if (sActiveProfilingStart == null) {
331                throw new IllegalStateException("not profiling data");
332            }
333
334            // subtract starting values and return delta
335            final NetworkStats profilingStop = getDataLayerSnapshotForUid(context);
336            final NetworkStats profilingDelta = NetworkStats.subtract(
337                    profilingStop, sActiveProfilingStart, null, null);
338            sActiveProfilingStart = null;
339            return profilingDelta;
340        }
341    }
342
343    /**
344     * Increment count of network operations performed under the accounting tag
345     * currently active on the calling thread. This can be used to derive
346     * bytes-per-operation.
347     *
348     * @param operationCount Number of operations to increment count by.
349     */
350    public static void incrementOperationCount(int operationCount) {
351        final int tag = getThreadStatsTag();
352        incrementOperationCount(tag, operationCount);
353    }
354
355    /**
356     * Increment count of network operations performed under the given
357     * accounting tag. This can be used to derive bytes-per-operation.
358     *
359     * @param tag Accounting tag used in {@link #setThreadStatsTag(int)}.
360     * @param operationCount Number of operations to increment count by.
361     */
362    public static void incrementOperationCount(int tag, int operationCount) {
363        final int uid = android.os.Process.myUid();
364        try {
365            getStatsService().incrementOperationCount(uid, tag, operationCount);
366        } catch (RemoteException e) {
367            throw e.rethrowFromSystemServer();
368        }
369    }
370
371    /** {@hide} */
372    public static void closeQuietly(INetworkStatsSession session) {
373        // TODO: move to NetworkStatsService once it exists
374        if (session != null) {
375            try {
376                session.close();
377            } catch (RuntimeException rethrown) {
378                throw rethrown;
379            } catch (Exception ignored) {
380            }
381        }
382    }
383
384    /**
385     * Return number of packets transmitted across mobile networks since device
386     * boot. Counts packets across all mobile network interfaces, and always
387     * increases monotonically since device boot. Statistics are measured at the
388     * network layer, so they include both TCP and UDP usage.
389     * <p>
390     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
391     * return {@link #UNSUPPORTED} on devices where statistics aren't available.
392     */
393    public static long getMobileTxPackets() {
394        long total = 0;
395        for (String iface : getMobileIfaces()) {
396            total += getTxPackets(iface);
397        }
398        return total;
399    }
400
401    /**
402     * Return number of packets received across mobile networks since device
403     * boot. Counts packets across all mobile network interfaces, and always
404     * increases monotonically since device boot. Statistics are measured at the
405     * network layer, so they include both TCP and UDP usage.
406     * <p>
407     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
408     * return {@link #UNSUPPORTED} on devices where statistics aren't available.
409     */
410    public static long getMobileRxPackets() {
411        long total = 0;
412        for (String iface : getMobileIfaces()) {
413            total += getRxPackets(iface);
414        }
415        return total;
416    }
417
418    /**
419     * Return number of bytes transmitted across mobile networks since device
420     * boot. Counts packets across all mobile network interfaces, and always
421     * increases monotonically since device boot. Statistics are measured at the
422     * network layer, so they include both TCP and UDP usage.
423     * <p>
424     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
425     * return {@link #UNSUPPORTED} on devices where statistics aren't available.
426     */
427    public static long getMobileTxBytes() {
428        long total = 0;
429        for (String iface : getMobileIfaces()) {
430            total += getTxBytes(iface);
431        }
432        return total;
433    }
434
435    /**
436     * Return number of bytes received across mobile networks since device boot.
437     * Counts packets across all mobile network interfaces, and always increases
438     * monotonically since device boot. Statistics are measured at the network
439     * layer, so they include both TCP and UDP usage.
440     * <p>
441     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
442     * return {@link #UNSUPPORTED} on devices where statistics aren't available.
443     */
444    public static long getMobileRxBytes() {
445        long total = 0;
446        for (String iface : getMobileIfaces()) {
447            total += getRxBytes(iface);
448        }
449        return total;
450    }
451
452    /** {@hide} */
453    public static long getMobileTcpRxPackets() {
454        long total = 0;
455        for (String iface : getMobileIfaces()) {
456            final long stat = nativeGetIfaceStat(iface, TYPE_TCP_RX_PACKETS);
457            if (stat != UNSUPPORTED) {
458                total += stat;
459            }
460        }
461        return total;
462    }
463
464    /** {@hide} */
465    public static long getMobileTcpTxPackets() {
466        long total = 0;
467        for (String iface : getMobileIfaces()) {
468            final long stat = nativeGetIfaceStat(iface, TYPE_TCP_TX_PACKETS);
469            if (stat != UNSUPPORTED) {
470                total += stat;
471            }
472        }
473        return total;
474    }
475
476    /** {@hide} */
477    public static long getTxPackets(String iface) {
478        return nativeGetIfaceStat(iface, TYPE_TX_PACKETS);
479    }
480
481    /** {@hide} */
482    public static long getRxPackets(String iface) {
483        return nativeGetIfaceStat(iface, TYPE_RX_PACKETS);
484    }
485
486    /** {@hide} */
487    public static long getTxBytes(String iface) {
488        return nativeGetIfaceStat(iface, TYPE_TX_BYTES);
489    }
490
491    /** {@hide} */
492    public static long getRxBytes(String iface) {
493        return nativeGetIfaceStat(iface, TYPE_RX_BYTES);
494    }
495
496    /**
497     * Return number of packets transmitted since device boot. Counts packets
498     * across all network interfaces, and always increases monotonically since
499     * device boot. Statistics are measured at the network layer, so they
500     * include both TCP and UDP usage.
501     * <p>
502     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
503     * return {@link #UNSUPPORTED} on devices where statistics aren't available.
504     */
505    public static long getTotalTxPackets() {
506        return nativeGetTotalStat(TYPE_TX_PACKETS);
507    }
508
509    /**
510     * Return number of packets received since device boot. Counts packets
511     * across all network interfaces, and always increases monotonically since
512     * device boot. Statistics are measured at the network layer, so they
513     * include both TCP and UDP usage.
514     * <p>
515     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
516     * return {@link #UNSUPPORTED} on devices where statistics aren't available.
517     */
518    public static long getTotalRxPackets() {
519        return nativeGetTotalStat(TYPE_RX_PACKETS);
520    }
521
522    /**
523     * Return number of bytes transmitted since device boot. Counts packets
524     * across all network interfaces, and always increases monotonically since
525     * device boot. Statistics are measured at the network layer, so they
526     * include both TCP and UDP usage.
527     * <p>
528     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
529     * return {@link #UNSUPPORTED} on devices where statistics aren't available.
530     */
531    public static long getTotalTxBytes() {
532        return nativeGetTotalStat(TYPE_TX_BYTES);
533    }
534
535    /**
536     * Return number of bytes received since device boot. Counts packets across
537     * all network interfaces, and always increases monotonically since device
538     * boot. Statistics are measured at the network layer, so they include both
539     * TCP and UDP usage.
540     * <p>
541     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
542     * return {@link #UNSUPPORTED} on devices where statistics aren't available.
543     */
544    public static long getTotalRxBytes() {
545        return nativeGetTotalStat(TYPE_RX_BYTES);
546    }
547
548    /**
549     * Return number of bytes transmitted by the given UID since device boot.
550     * Counts packets across all network interfaces, and always increases
551     * monotonically since device boot. Statistics are measured at the network
552     * layer, so they include both TCP and UDP usage.
553     * <p>
554     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
555     * return {@link #UNSUPPORTED} on devices where statistics aren't available.
556     * <p>
557     * Starting in {@link android.os.Build.VERSION_CODES#N} this will only
558     * report traffic statistics for the calling UID. It will return
559     * {@link #UNSUPPORTED} for all other UIDs for privacy reasons. To access
560     * historical network statistics belonging to other UIDs, use
561     * {@link NetworkStatsManager}.
562     *
563     * @see android.os.Process#myUid()
564     * @see android.content.pm.ApplicationInfo#uid
565     */
566    public static long getUidTxBytes(int uid) {
567        // This isn't actually enforcing any security; it just returns the
568        // unsupported value. The real filtering is done at the kernel level.
569        final int callingUid = android.os.Process.myUid();
570        if (callingUid == android.os.Process.SYSTEM_UID || callingUid == uid) {
571            return nativeGetUidStat(uid, TYPE_TX_BYTES);
572        } else {
573            return UNSUPPORTED;
574        }
575    }
576
577    /**
578     * Return number of bytes received by the given UID since device boot.
579     * Counts packets across all network interfaces, and always increases
580     * monotonically since device boot. Statistics are measured at the network
581     * layer, so they include both TCP and UDP usage.
582     * <p>
583     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may return
584     * {@link #UNSUPPORTED} on devices where statistics aren't available.
585     * <p>
586     * Starting in {@link android.os.Build.VERSION_CODES#N} this will only
587     * report traffic statistics for the calling UID. It will return
588     * {@link #UNSUPPORTED} for all other UIDs for privacy reasons. To access
589     * historical network statistics belonging to other UIDs, use
590     * {@link NetworkStatsManager}.
591     *
592     * @see android.os.Process#myUid()
593     * @see android.content.pm.ApplicationInfo#uid
594     */
595    public static long getUidRxBytes(int uid) {
596        // This isn't actually enforcing any security; it just returns the
597        // unsupported value. The real filtering is done at the kernel level.
598        final int callingUid = android.os.Process.myUid();
599        if (callingUid == android.os.Process.SYSTEM_UID || callingUid == uid) {
600            return nativeGetUidStat(uid, TYPE_RX_BYTES);
601        } else {
602            return UNSUPPORTED;
603        }
604    }
605
606    /**
607     * Return number of packets transmitted by the given UID since device boot.
608     * Counts packets across all network interfaces, and always increases
609     * monotonically since device boot. Statistics are measured at the network
610     * layer, so they include both TCP and UDP usage.
611     * <p>
612     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may return
613     * {@link #UNSUPPORTED} on devices where statistics aren't available.
614     * <p>
615     * Starting in {@link android.os.Build.VERSION_CODES#N} this will only
616     * report traffic statistics for the calling UID. It will return
617     * {@link #UNSUPPORTED} for all other UIDs for privacy reasons. To access
618     * historical network statistics belonging to other UIDs, use
619     * {@link NetworkStatsManager}.
620     *
621     * @see android.os.Process#myUid()
622     * @see android.content.pm.ApplicationInfo#uid
623     */
624    public static long getUidTxPackets(int uid) {
625        // This isn't actually enforcing any security; it just returns the
626        // unsupported value. The real filtering is done at the kernel level.
627        final int callingUid = android.os.Process.myUid();
628        if (callingUid == android.os.Process.SYSTEM_UID || callingUid == uid) {
629            return nativeGetUidStat(uid, TYPE_TX_PACKETS);
630        } else {
631            return UNSUPPORTED;
632        }
633    }
634
635    /**
636     * Return number of packets received by the given UID since device boot.
637     * Counts packets across all network interfaces, and always increases
638     * monotonically since device boot. Statistics are measured at the network
639     * layer, so they include both TCP and UDP usage.
640     * <p>
641     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may return
642     * {@link #UNSUPPORTED} on devices where statistics aren't available.
643     * <p>
644     * Starting in {@link android.os.Build.VERSION_CODES#N} this will only
645     * report traffic statistics for the calling UID. It will return
646     * {@link #UNSUPPORTED} for all other UIDs for privacy reasons. To access
647     * historical network statistics belonging to other UIDs, use
648     * {@link NetworkStatsManager}.
649     *
650     * @see android.os.Process#myUid()
651     * @see android.content.pm.ApplicationInfo#uid
652     */
653    public static long getUidRxPackets(int uid) {
654        // This isn't actually enforcing any security; it just returns the
655        // unsupported value. The real filtering is done at the kernel level.
656        final int callingUid = android.os.Process.myUid();
657        if (callingUid == android.os.Process.SYSTEM_UID || callingUid == uid) {
658            return nativeGetUidStat(uid, TYPE_RX_PACKETS);
659        } else {
660            return UNSUPPORTED;
661        }
662    }
663
664    /**
665     * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
666     *             transport layer statistics are no longer available, and will
667     *             always return {@link #UNSUPPORTED}.
668     * @see #getUidTxBytes(int)
669     */
670    @Deprecated
671    public static long getUidTcpTxBytes(int uid) {
672        return UNSUPPORTED;
673    }
674
675    /**
676     * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
677     *             transport layer statistics are no longer available, and will
678     *             always return {@link #UNSUPPORTED}.
679     * @see #getUidRxBytes(int)
680     */
681    @Deprecated
682    public static long getUidTcpRxBytes(int uid) {
683        return UNSUPPORTED;
684    }
685
686    /**
687     * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
688     *             transport layer statistics are no longer available, and will
689     *             always return {@link #UNSUPPORTED}.
690     * @see #getUidTxBytes(int)
691     */
692    @Deprecated
693    public static long getUidUdpTxBytes(int uid) {
694        return UNSUPPORTED;
695    }
696
697    /**
698     * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
699     *             transport layer statistics are no longer available, and will
700     *             always return {@link #UNSUPPORTED}.
701     * @see #getUidRxBytes(int)
702     */
703    @Deprecated
704    public static long getUidUdpRxBytes(int uid) {
705        return UNSUPPORTED;
706    }
707
708    /**
709     * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
710     *             transport layer statistics are no longer available, and will
711     *             always return {@link #UNSUPPORTED}.
712     * @see #getUidTxPackets(int)
713     */
714    @Deprecated
715    public static long getUidTcpTxSegments(int uid) {
716        return UNSUPPORTED;
717    }
718
719    /**
720     * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
721     *             transport layer statistics are no longer available, and will
722     *             always return {@link #UNSUPPORTED}.
723     * @see #getUidRxPackets(int)
724     */
725    @Deprecated
726    public static long getUidTcpRxSegments(int uid) {
727        return UNSUPPORTED;
728    }
729
730    /**
731     * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
732     *             transport layer statistics are no longer available, and will
733     *             always return {@link #UNSUPPORTED}.
734     * @see #getUidTxPackets(int)
735     */
736    @Deprecated
737    public static long getUidUdpTxPackets(int uid) {
738        return UNSUPPORTED;
739    }
740
741    /**
742     * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
743     *             transport layer statistics are no longer available, and will
744     *             always return {@link #UNSUPPORTED}.
745     * @see #getUidRxPackets(int)
746     */
747    @Deprecated
748    public static long getUidUdpRxPackets(int uid) {
749        return UNSUPPORTED;
750    }
751
752    /**
753     * Return detailed {@link NetworkStats} for the current UID. Requires no
754     * special permission.
755     */
756    private static NetworkStats getDataLayerSnapshotForUid(Context context) {
757        // TODO: take snapshot locally, since proc file is now visible
758        final int uid = android.os.Process.myUid();
759        try {
760            return getStatsService().getDataLayerSnapshotForUid(uid);
761        } catch (RemoteException e) {
762            throw e.rethrowFromSystemServer();
763        }
764    }
765
766    /**
767     * Return set of any ifaces associated with mobile networks since boot.
768     * Interfaces are never removed from this list, so counters should always be
769     * monotonic.
770     */
771    private static String[] getMobileIfaces() {
772        try {
773            return getStatsService().getMobileIfaces();
774        } catch (RemoteException e) {
775            throw e.rethrowFromSystemServer();
776        }
777    }
778
779    // NOTE: keep these in sync with android_net_TrafficStats.cpp
780    private static final int TYPE_RX_BYTES = 0;
781    private static final int TYPE_RX_PACKETS = 1;
782    private static final int TYPE_TX_BYTES = 2;
783    private static final int TYPE_TX_PACKETS = 3;
784    private static final int TYPE_TCP_RX_PACKETS = 4;
785    private static final int TYPE_TCP_TX_PACKETS = 5;
786
787    private static native long nativeGetTotalStat(int type);
788    private static native long nativeGetIfaceStat(String iface, int type);
789    private static native long nativeGetUidStat(int uid, int type);
790}
791