summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/DataUsageSummary.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/DataUsageSummary.java')
-rw-r--r--src/com/android/settings/DataUsageSummary.java109
1 files changed, 74 insertions, 35 deletions
diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java
index bccc5a5..a95ab3f 100644
--- a/src/com/android/settings/DataUsageSummary.java
+++ b/src/com/android/settings/DataUsageSummary.java
@@ -25,6 +25,8 @@ import static android.net.NetworkPolicyManager.POLICY_NONE;
import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
import static android.net.NetworkPolicyManager.computeLastCycleBoundary;
import static android.net.NetworkPolicyManager.computeNextCycleBoundary;
+import static android.net.NetworkStats.SET_DEFAULT;
+import static android.net.NetworkStats.SET_FOREGROUND;
import static android.net.NetworkStats.TAG_NONE;
import static android.net.NetworkStatsHistory.FIELD_RX_BYTES;
import static android.net.NetworkStatsHistory.FIELD_TX_BYTES;
@@ -60,6 +62,7 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
+import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.ConnectivityManager;
import android.net.INetworkPolicyManager;
@@ -83,6 +86,7 @@ import android.text.TextUtils;
import android.text.format.DateUtils;
import android.text.format.Formatter;
import android.util.Log;
+import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@@ -119,6 +123,7 @@ import com.android.settings.net.NetworkPolicyEditor;
import com.android.settings.net.SummaryForAllUidLoader;
import com.android.settings.widget.DataUsageChartView;
import com.android.settings.widget.DataUsageChartView.DataUsageChartListener;
+import com.android.settings.widget.PieChartView;
import com.google.android.collect.Lists;
import java.util.ArrayList;
@@ -196,6 +201,9 @@ public class DataUsageSummary extends Fragment {
private View mAppDetail;
private ImageView mAppIcon;
private ViewGroup mAppTitles;
+ private PieChartView mAppPieChart;
+ private TextView mAppForeground;
+ private TextView mAppBackground;
private Button mAppSettings;
private LinearLayout mAppSwitches;
@@ -216,6 +224,8 @@ public class DataUsageSummary extends Fragment {
private NetworkStatsHistory mHistory;
private NetworkStatsHistory mDetailHistory;
+ private NetworkStatsHistory mDetailHistoryDefault;
+ private NetworkStatsHistory mDetailHistoryForeground;
private String mCurrentTab = null;
private String mIntentTab = null;
@@ -301,6 +311,9 @@ public class DataUsageSummary extends Fragment {
mAppDetail = mHeader.findViewById(R.id.app_detail);
mAppIcon = (ImageView) mAppDetail.findViewById(R.id.app_icon);
mAppTitles = (ViewGroup) mAppDetail.findViewById(R.id.app_titles);
+ mAppPieChart = (PieChartView) mAppDetail.findViewById(R.id.app_pie_chart);
+ mAppForeground = (TextView) mAppDetail.findViewById(R.id.app_foreground);
+ mAppBackground = (TextView) mAppDetail.findViewById(R.id.app_background);
mAppSwitches = (LinearLayout) mAppDetail.findViewById(R.id.app_switches);
mAppSettings = (Button) mAppDetail.findViewById(R.id.app_settings);
@@ -539,12 +552,8 @@ public class DataUsageSummary extends Fragment {
* Build {@link TabSpec} with thin indicator, and empty content.
*/
private TabSpec buildTabSpec(String tag, int titleRes) {
- final LayoutInflater inflater = LayoutInflater.from(mTabWidget.getContext());
- final View indicator = inflater.inflate(
- R.layout.tab_indicator_thin_holo, mTabWidget, false);
- final TextView title = (TextView) indicator.findViewById(android.R.id.title);
- title.setText(titleRes);
- return mTabHost.newTabSpec(tag).setIndicator(indicator).setContent(mEmptyTabContent);
+ return mTabHost.newTabSpec(tag).setIndicator(getText(titleRes)).setContent(
+ mEmptyTabContent);
}
private OnTabChangeListener mTabListener = new OnTabChangeListener() {
@@ -658,6 +667,10 @@ public class DataUsageSummary extends Fragment {
mAppDetail.setVisibility(View.GONE);
mCycleAdapter.setChangeVisible(true);
+ mDetailHistory = null;
+ mDetailHistoryDefault = null;
+ mDetailHistoryForeground = null;
+
// hide detail stats when not in detail mode
mChart.bindDetailNetworkStats(null);
return;
@@ -697,15 +710,20 @@ public class DataUsageSummary extends Fragment {
try {
// load stats for current uid and template
- // TODO: read template from extras
- mDetailHistory = mStatsService.getHistoryForUid(
- mTemplate, mUid, TAG_NONE, FIELD_RX_BYTES | FIELD_TX_BYTES);
+ mDetailHistoryDefault = mStatsService.getHistoryForUid(
+ mTemplate, mUid, SET_DEFAULT, TAG_NONE, FIELD_RX_BYTES | FIELD_TX_BYTES);
+ mDetailHistoryForeground = mStatsService.getHistoryForUid(
+ mTemplate, mUid, SET_FOREGROUND, TAG_NONE, FIELD_RX_BYTES | FIELD_TX_BYTES);
} catch (RemoteException e) {
// since we can't do much without history, and we don't want to
// leave with half-baked UI, we bail hard.
throw new RuntimeException("problem reading network stats", e);
}
+ mDetailHistory = new NetworkStatsHistory(mDetailHistoryForeground.getBucketDuration());
+ mDetailHistory.recordEntireHistory(mDetailHistoryDefault);
+ mDetailHistory.recordEntireHistory(mDetailHistoryForeground);
+
// bind chart to historical stats
mChart.bindDetailNetworkStats(mDetailHistory);
@@ -1012,14 +1030,28 @@ public class DataUsageSummary extends Fragment {
final long now = System.currentTimeMillis();
final Context context = getActivity();
- final NetworkStatsHistory.Entry entry;
- if (isAppDetailMode()) {
- if (mDetailHistory != null) {
- entry = mDetailHistory.getValues(start, end, now, null);
- } else {
- entry = null;
- }
+ NetworkStatsHistory.Entry entry = null;
+ if (isAppDetailMode() && mDetailHistory != null) {
+ // bind foreground/background to piechart and labels
+ entry = mDetailHistoryDefault.getValues(start, end, now, entry);
+ final long defaultBytes = entry.rxBytes + entry.txBytes;
+ entry = mDetailHistoryForeground.getValues(start, end, now, entry);
+ final long foregroundBytes = entry.rxBytes + entry.txBytes;
+
+ mAppPieChart.setOriginAngle(175);
+
+ mAppPieChart.removeAllSlices();
+ mAppPieChart.addSlice(foregroundBytes, Color.parseColor("#d88d3a"));
+ mAppPieChart.addSlice(defaultBytes, Color.parseColor("#666666"));
+
+ mAppPieChart.generatePath();
+
+ mAppBackground.setText(Formatter.formatFileSize(context, defaultBytes));
+ mAppForeground.setText(Formatter.formatFileSize(context, foregroundBytes));
+
+ // and finally leave with summary data for label below
+ entry = mDetailHistory.getValues(start, end, now, null);
getLoaderManager().destroyLoader(LOADER_SUMMARY);
@@ -1206,31 +1238,38 @@ public class DataUsageSummary extends Fragment {
public void bindStats(NetworkStats stats) {
mItems.clear();
- if (stats != null) {
- final AppUsageItem systemItem = new AppUsageItem();
- systemItem.uid = android.os.Process.SYSTEM_UID;
-
- NetworkStats.Entry entry = null;
- for (int i = 0; i < stats.size(); i++) {
- entry = stats.getValues(i, entry);
-
- final boolean isApp = entry.uid >= android.os.Process.FIRST_APPLICATION_UID
- && entry.uid <= android.os.Process.LAST_APPLICATION_UID;
- if (isApp || entry.uid == TrafficStats.UID_REMOVED) {
- final AppUsageItem item = new AppUsageItem();
- item.uid = entry.uid;
- item.total = entry.rxBytes + entry.txBytes;
+ final AppUsageItem systemItem = new AppUsageItem();
+ systemItem.uid = android.os.Process.SYSTEM_UID;
+
+ final SparseArray<AppUsageItem> knownUids = new SparseArray<AppUsageItem>();
+
+ NetworkStats.Entry entry = null;
+ final int size = stats != null ? stats.size() : 0;
+ for (int i = 0; i < size; i++) {
+ entry = stats.getValues(i, entry);
+
+ final int uid = entry.uid;
+ final boolean isApp = uid >= android.os.Process.FIRST_APPLICATION_UID
+ && uid <= android.os.Process.LAST_APPLICATION_UID;
+ if (isApp || uid == TrafficStats.UID_REMOVED) {
+ AppUsageItem item = knownUids.get(uid);
+ if (item == null) {
+ item = new AppUsageItem();
+ item.uid = uid;
+ knownUids.put(uid, item);
mItems.add(item);
- } else {
- systemItem.total += entry.rxBytes + entry.txBytes;
}
- }
- if (systemItem.total > 0) {
- mItems.add(systemItem);
+ item.total += entry.rxBytes + entry.txBytes;
+ } else {
+ systemItem.total += entry.rxBytes + entry.txBytes;
}
}
+ if (systemItem.total > 0) {
+ mItems.add(systemItem);
+ }
+
Collections.sort(mItems);
mLargest = (mItems.size() > 0) ? mItems.get(0).total : 0;
notifyDataSetChanged();