blob: 9d3bb693e8c7ec6cef8cb5378a85a78e6b61df27 [file] [log] [blame]
package com.arm.devlib.netstats;
import java.lang.InterruptedException;
import java.lang.System;
import java.lang.Thread;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import android.app.Activity;
import android.app.IntentService;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.net.TrafficStats;
import android.os.Bundle;
import android.util.Log;
class TrafficPoller implements Runnable {
private String tag;
private int period;
private PackageManager pm;
private static String TAG = "TrafficMetrics";
private List<String> packageNames;
private Map<String, Map<String, Long>> previousValues;
public TrafficPoller(String tag, PackageManager pm, int period, List<String> packages) {
this.tag = tag;
this.pm = pm;
this.period = period;
this.packageNames = packages;
this.previousValues = new HashMap<String, Map<String, Long>>();
}
public void run() {
try {
while (true) {
Thread.sleep(this.period);
getPakagesInfo();
if (Thread.interrupted()) {
throw new InterruptedException();
}
}
} catch (InterruptedException e) {
}
}
public void getPakagesInfo() {
List<ApplicationInfo> apps;
if (this.packageNames == null) {
apps = pm.getInstalledApplications(0);
for (ApplicationInfo app : apps) {
}
} else {
apps = new ArrayList<ApplicationInfo>();
for (String packageName : packageNames) {
try {
ApplicationInfo info = pm.getApplicationInfo(packageName, 0);
apps.add(info);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
}
for (ApplicationInfo appInfo : apps) {
int uid = appInfo.uid;
String name = appInfo.packageName;
long time = System.currentTimeMillis();
long received = TrafficStats.getUidRxBytes(uid);
long sent = TrafficStats.getUidTxBytes(uid);
if (!this.previousValues.containsKey(name)) {
this.previousValues.put(name, new HashMap<String, Long>());
this.previousValues.get(name).put("sent", sent);
this.previousValues.get(name).put("received", received);
Log.i(this.tag, String.format("INITIAL \"%s\" TX: %d RX: %d",
name, sent, received));
} else {
long previosSent = this.previousValues.get(name).put("sent", sent);
long previosReceived = this.previousValues.get(name).put("received", received);
Log.i(this.tag, String.format("%d \"%s\" TX: %d RX: %d",
time, name,
sent - previosSent,
received - previosReceived));
}
}
}
}
public class TrafficMetricsService extends IntentService {
private static String TAG = "TrafficMetrics";
private Thread thread;
private static int defaultPollingPeriod = 5000;
public TrafficMetricsService() {
super("TrafficMetrics");
}
@Override
public void onHandleIntent(Intent intent) {
List<String> packages = null;
String runTag = intent.getStringExtra("tag");
if (runTag == null) {
runTag = TAG;
}
String packagesString = intent.getStringExtra("packages");
int pollingPeriod = intent.getIntExtra("period", this.defaultPollingPeriod);
if (packagesString != null) {
packages = new ArrayList<String>(Arrays.asList(packagesString.split(",")));
}
if (this.thread != null) {
Log.e(runTag, "Attemping to start when monitoring is already in progress.");
return;
}
this.thread = new Thread(new TrafficPoller(runTag, getPackageManager(), pollingPeriod, packages));
this.thread.start();
}
}