BandwidthTest.java revision b5d55e302d2253e4bfb233ea705caf258cdc4cb9
133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang/* 233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * Copyright (C) 2011, The Android Open Source Project 333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * 433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * Licensed under the Apache License, Version 2.0 (the "License"); 533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * you may not use this file except in compliance with the License. 633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * You may obtain a copy of the License at 733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * 833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * http://www.apache.org/licenses/LICENSE-2.0 933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * 1033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * Unless required by applicable law or agreed to in writing, software 1133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * distributed under the License is distributed on an "AS IS" BASIS, 1233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * See the License for the specific language governing permissions and 1433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * limitations under the License. 1533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang */ 1633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 1733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangpackage com.android.bandwidthtest; 1833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 1933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.content.Context; 2033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.net.ConnectivityManager; 2133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.net.NetworkInfo.State; 2233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.net.NetworkStats; 2333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.net.TrafficStats; 2433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.net.wifi.WifiManager; 2533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.os.Bundle; 2633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.os.Environment; 2733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.os.Process; 2833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.os.SystemClock; 2933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.telephony.TelephonyManager; 3033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.test.InstrumentationTestCase; 3133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.test.suitebuilder.annotation.LargeTest; 3233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport android.util.Log; 3333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 3433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport com.android.bandwidthtest.util.BandwidthTestUtil; 3533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport com.android.bandwidthtest.util.ConnectionUtil; 3633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 3733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangimport java.io.File; 3833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 3933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang/** 4033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * Test that downloads files from a test server and reports the bandwidth metrics collected. 4133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang */ 4233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuangpublic class BandwidthTest extends InstrumentationTestCase { 4333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 4433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang private static final String LOG_TAG = "BandwidthTest"; 4533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang private final static String PROF_LABEL = "PROF_"; 4633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang private final static String PROC_LABEL = "PROC_"; 4733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang private final static int INSTRUMENTATION_IN_PROGRESS = 2; 4833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 4933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang private final static String BASE_DIR = 5033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang Environment.getExternalStorageDirectory().getAbsolutePath(); 5133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang private final static String TMP_FILENAME = "tmp.dat"; 5233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang // Download 10.486 * 106 bytes (+ headers) from app engine test server. 5333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang private final int FILE_SIZE = 10485613; 5433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang private Context mContext; 5533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang private ConnectionUtil mConnectionUtil; 5633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang private TelephonyManager mTManager; 5733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang private int mUid; 5833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang private String mSsid; 5933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang private String mTestServer; 6033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang private String mDeviceId; 6133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang private BandwidthTestRunner mRunner; 6233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 6333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 6433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang @Override 6533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang protected void setUp() throws Exception { 6633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang super.setUp(); 6733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang mRunner = (BandwidthTestRunner) getInstrumentation(); 6833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang mSsid = mRunner.mSsid; 6933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang mTestServer = mRunner.mTestServer; 7033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang mContext = mRunner.getTargetContext(); 7133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang mConnectionUtil = new ConnectionUtil(mContext); 7233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang mConnectionUtil.initialize(); 7333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang Log.v(LOG_TAG, "Initialized mConnectionUtil"); 7433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang mUid = Process.myUid(); 7533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang mTManager = (TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE); 7633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang mDeviceId = mTManager.getDeviceId(); 7733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang } 7833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 7933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang @Override 8033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang protected void tearDown() throws Exception { 8133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang mConnectionUtil.cleanUp(); 8233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang super.tearDown(); 8333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang } 8433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 8533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang /** 8633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * Ensure that downloading on wifi reports reasonable stats. 8733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang */ 8833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang @LargeTest 8933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang public void testWifiDownload() { 9033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang assertTrue(setDeviceWifiAndAirplaneMode(mSsid)); 9133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang NetworkStats pre_test_stats = fetchDataFromProc(mUid); 9233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang String ts = Long.toString(System.currentTimeMillis()); 9333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 9433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang String targetUrl = BandwidthTestUtil.buildDownloadUrl( 9533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang mTestServer, FILE_SIZE, mDeviceId, ts); 9633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang TrafficStats.startDataProfiling(mContext); 9733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang File tmpSaveFile = new File(BASE_DIR + File.separator + TMP_FILENAME); 9833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang assertTrue(BandwidthTestUtil.DownloadFromUrl(targetUrl, tmpSaveFile)); 9933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang NetworkStats prof_stats = TrafficStats.stopDataProfiling(mContext); 10033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 10133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang NetworkStats post_test_stats = fetchDataFromProc(mUid); 10233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang NetworkStats proc_stats = post_test_stats.subtract(pre_test_stats); 10333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 10433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang // Output measurements to instrumentation out, so that it can be compared to that of 10533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang // the server. 10633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang Bundle results = new Bundle(); 10733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang results.putString("device_id", mDeviceId); 10833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang results.putString("timestamp", ts); 10933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang results.putInt("size", FILE_SIZE); 11033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang AddStatsToResults(PROF_LABEL, prof_stats, results); 11133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang AddStatsToResults(PROC_LABEL, proc_stats, results); 11233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang getInstrumentation().sendStatus(INSTRUMENTATION_IN_PROGRESS, results); 11333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 11433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang // Clean up. 11533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang assertTrue(cleanUpFile(tmpSaveFile)); 11633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang } 11733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 11833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang /** 11933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * We want to make sure that if we use the Download Manager to download stuff, 12033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * accounting still goes to the app making the call and that the numbers still make sense. 12133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang */ 12233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang @LargeTest 12333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang public void testWifiDownloadWithDownloadManager() { 12433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang assertTrue(setDeviceWifiAndAirplaneMode(mSsid)); 12533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang // If we are using the download manager, then the data that is written to /proc/uid_stat/ 12633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang // is accounted against download manager's uid, since it uses pre-ICS API. 12733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang int downloadManagerUid = mConnectionUtil.downloadManagerUid(); 12833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang assertTrue(downloadManagerUid >= 0); 12933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang NetworkStats pre_test_stats = fetchDataFromProc(downloadManagerUid); 13033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang // start profiling 13133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang TrafficStats.startDataProfiling(mContext); 13233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang String ts = Long.toString(System.currentTimeMillis()); 13333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang String targetUrl = BandwidthTestUtil.buildDownloadUrl( 13433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang mTestServer, FILE_SIZE, mDeviceId, ts); 13533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang Log.v(LOG_TAG, "Download url: " + targetUrl); 13633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang File tmpSaveFile = new File(BASE_DIR + File.separator + TMP_FILENAME); 13733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang assertTrue(mConnectionUtil.startDownloadAndWait(targetUrl, 500000)); 13833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang NetworkStats prof_stats = TrafficStats.stopDataProfiling(mContext); 13933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang NetworkStats post_test_stats = fetchDataFromProc(downloadManagerUid); 14033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang NetworkStats proc_stats = post_test_stats.subtract(pre_test_stats); 14133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 14233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang // Output measurements to instrumentation out, so that it can be compared to that of 14333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang // the server. 14433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang Bundle results = new Bundle(); 14533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang results.putString("device_id", mDeviceId); 14633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang results.putString("timestamp", ts); 14733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang results.putInt("size", FILE_SIZE); 14833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang AddStatsToResults(PROF_LABEL, prof_stats, results); 14933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang AddStatsToResults(PROC_LABEL, proc_stats, results); 15033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang getInstrumentation().sendStatus(INSTRUMENTATION_IN_PROGRESS, results); 15133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 15233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang // Clean up. 15333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang assertTrue(cleanUpFile(tmpSaveFile)); 15433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang } 15533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 15633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang /** 15733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * Fetch network data from /proc/uid_stat/uid 15833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * @return populated {@link NetworkStats} 15933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang */ 16033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang public NetworkStats fetchDataFromProc(int uid) { 16133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang String root_filepath = "/proc/uid_stat/" + uid + "/"; 16233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang File rcv_stat = new File (root_filepath + "tcp_rcv"); 16333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang int rx = BandwidthTestUtil.parseIntValueFromFile(rcv_stat); 16433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang File snd_stat = new File (root_filepath + "tcp_snd"); 16533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang int tx = BandwidthTestUtil.parseIntValueFromFile(snd_stat); 16633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1); 167b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey stats.addValues(NetworkStats.IFACE_ALL, uid, NetworkStats.SET_DEFAULT, 168b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey NetworkStats.TAG_NONE, rx, 0, tx, 0, 0); 16933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang return stats; 17033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang } 17133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 17233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang /** 17333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * Turn on Airplane mode and connect to the wifi 17433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * @param ssid of the wifi to connect to 17533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * @return true if we successfully connected to a given network. 17633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang */ 17733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang public boolean setDeviceWifiAndAirplaneMode(String ssid) { 17833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang mConnectionUtil.setAirplaneMode(mContext, true); 17933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang assertTrue(mConnectionUtil.connectToWifi(ssid)); 18033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang assertTrue(mConnectionUtil.waitForWifiState(WifiManager.WIFI_STATE_ENABLED, 18133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang ConnectionUtil.LONG_TIMEOUT)); 18233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang return mConnectionUtil.waitForNetworkState(ConnectivityManager.TYPE_WIFI, State.CONNECTED, 18333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang ConnectionUtil.LONG_TIMEOUT); 18433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang } 18533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 18633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang /** 18733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * Output the {@link NetworkStats} to Instrumentation out. 18833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * @param label to attach to this given stats. 18933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * @param stats {@link NetworkStats} to add. 19033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * @param results {@link Bundle} to be added to. 19133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang */ 19233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang public void AddStatsToResults(String label, NetworkStats stats, Bundle results){ 19333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang if (results == null || results.isEmpty()) { 19433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang Log.e(LOG_TAG, "Empty bundle provided."); 19533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang return; 19633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang } 19733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang for (int i = 0; i < stats.size(); ++i) { 19833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang android.net.NetworkStats.Entry entry = stats.getValues(i, null); 19933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang results.putInt(label + "uid", entry.uid); 20033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang results.putString(label + "iface", entry.iface); 20133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang results.putInt(label + "tag", entry.tag); 20233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang results.putLong(label + "tx", entry.txBytes); 20333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang results.putLong(label + "rx", entry.rxBytes); 20433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang } 20533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang } 20633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang 20733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang /** 20833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * Remove file if it exists. 20933f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * @param file {@link File} to delete. 21033f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang * @return true if successfully deleted the file. 21133f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang */ 21233f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang private boolean cleanUpFile(File file) { 21333f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang if (file.exists()) { 21433f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang return file.delete(); 21533f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang } 21633f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang return true; 21733f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang } 21833f869951fde247927e66c3aa4ab86fc61f783adTsu Chiang Chuang}