• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.arm.devlib.netstats;
2 
3 import java.lang.InterruptedException;
4 import java.lang.System;
5 import java.lang.Thread;
6 import java.util.ArrayList;
7 import java.util.Arrays;
8 import java.util.List;
9 import java.util.Map;
10 import java.util.HashMap;
11 
12 import android.app.Activity;
13 import android.app.IntentService;
14 import android.content.Intent;
15 import android.content.pm.ApplicationInfo;
16 import android.content.pm.PackageManager;
17 import android.net.TrafficStats;
18 import android.os.Bundle;
19 import android.util.Log;
20 
21 class TrafficPoller implements Runnable {
22 
23     private String tag;
24     private int period;
25     private PackageManager pm;
26     private static String TAG = "TrafficMetrics";
27     private List<String> packageNames;
28     private Map<String, Map<String, Long>> previousValues;
29 
TrafficPoller(String tag, PackageManager pm, int period, List<String> packages)30     public TrafficPoller(String tag, PackageManager pm, int period, List<String> packages) {
31         this.tag = tag;
32         this.pm = pm;
33         this.period = period;
34         this.packageNames = packages;
35         this.previousValues = new HashMap<String, Map<String, Long>>();
36     }
37 
run()38     public void run() {
39         try {
40             while (true) {
41                 Thread.sleep(this.period);
42                 getPakagesInfo();
43                 if (Thread.interrupted()) {
44                     throw new InterruptedException();
45                 }
46             }
47         } catch (InterruptedException e) {
48         }
49     }
50 
getPakagesInfo()51     public void getPakagesInfo() {
52         List<ApplicationInfo> apps;
53         if (this.packageNames == null) {
54             apps = pm.getInstalledApplications(0);
55             for (ApplicationInfo app : apps) {
56             }
57         } else {
58             apps = new ArrayList<ApplicationInfo>();
59             for (String packageName : packageNames) {
60                 try {
61                     ApplicationInfo info = pm.getApplicationInfo(packageName,  0);
62                     apps.add(info);
63                 } catch (PackageManager.NameNotFoundException e) {
64                     e.printStackTrace();
65                 }
66             }
67         }
68 
69         for (ApplicationInfo appInfo : apps) {
70             int uid = appInfo.uid;
71             String name = appInfo.packageName;
72             long time =  System.currentTimeMillis();
73             long received = TrafficStats.getUidRxBytes(uid);
74             long sent = TrafficStats.getUidTxBytes(uid);
75 
76             if (!this.previousValues.containsKey(name)) {
77                 this.previousValues.put(name, new HashMap<String, Long>());
78                 this.previousValues.get(name).put("sent", sent);
79                 this.previousValues.get(name).put("received", received);
80                 Log.i(this.tag, String.format("INITIAL \"%s\" TX: %d RX: %d",
81                                               name, sent, received));
82             } else {
83                 long previosSent = this.previousValues.get(name).put("sent", sent);
84                 long previosReceived = this.previousValues.get(name).put("received", received);
85                 Log.i(this.tag, String.format("%d \"%s\" TX: %d RX: %d",
86                                               time, name,
87                                               sent - previosSent,
88                                               received - previosReceived));
89             }
90         }
91     }
92 }
93 
94 public class TrafficMetricsService extends IntentService {
95 
96     private static String TAG = "TrafficMetrics";
97     private Thread thread;
98     private static int defaultPollingPeriod = 5000;
99 
TrafficMetricsService()100     public TrafficMetricsService() {
101             super("TrafficMetrics");
102     }
103 
104     @Override
onHandleIntent(Intent intent)105     public void onHandleIntent(Intent intent) {
106         List<String> packages = null;
107         String runTag = intent.getStringExtra("tag");
108         if (runTag == null) {
109             runTag = TAG;
110         }
111         String packagesString = intent.getStringExtra("packages");
112         int pollingPeriod = intent.getIntExtra("period", this.defaultPollingPeriod);
113         if (packagesString != null) {
114             packages = new ArrayList<String>(Arrays.asList(packagesString.split(",")));
115         }
116 
117         if (this.thread != null) {
118             Log.e(runTag, "Attemping to start when monitoring is already in progress.");
119             return;
120         }
121         this.thread = new Thread(new TrafficPoller(runTag, getPackageManager(), pollingPeriod, packages));
122         this.thread.start();
123     }
124 }
125