11059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey/* 21059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * Copyright (C) 2011 The Android Open Source Project 31059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * 41059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 51059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * you may not use this file except in compliance with the License. 61059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * You may obtain a copy of the License at 71059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * 81059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 91059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * 101059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * Unless required by applicable law or agreed to in writing, software 111059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 121059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * See the License for the specific language governing permissions and 141059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * limitations under the License. 151059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey */ 161059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 171059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeypackage com.android.internal.net; 181059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 198fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkeyimport static android.net.NetworkStats.SET_ALL; 201059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport static android.net.NetworkStats.TAG_NONE; 211059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport static android.net.NetworkStats.UID_ALL; 221059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport static com.android.server.NetworkManagementSocketTagger.kernelToTag; 231059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 241059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport android.net.NetworkStats; 25453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkeyimport android.os.StrictMode; 261059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport android.os.SystemClock; 271059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 28163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkeyimport com.android.internal.util.ProcFileReader; 291059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 301059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport java.io.File; 31163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkeyimport java.io.FileInputStream; 321059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport java.io.IOException; 331059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 341059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport libcore.io.IoUtils; 351059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 361059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey/** 371059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * Creates {@link NetworkStats} instances by parsing various {@code /proc/} 381059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * files as needed. 391059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey */ 401059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeypublic class NetworkStatsFactory { 411059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey private static final String TAG = "NetworkStatsFactory"; 421059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 431059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey // TODO: consider moving parsing to native code 441059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 451059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey /** Path to {@code /proc/net/xt_qtaguid/iface_stat_all}. */ 461059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey private final File mStatsXtIfaceAll; 47e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey /** Path to {@code /proc/net/xt_qtaguid/iface_stat_fmt}. */ 48e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey private final File mStatsXtIfaceFmt; 491059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey /** Path to {@code /proc/net/xt_qtaguid/stats}. */ 501059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey private final File mStatsXtUid; 511059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 521059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey public NetworkStatsFactory() { 531059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey this(new File("/proc/")); 541059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 551059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 561059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey // @VisibleForTesting 571059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey public NetworkStatsFactory(File procRoot) { 581059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey mStatsXtIfaceAll = new File(procRoot, "net/xt_qtaguid/iface_stat_all"); 59e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey mStatsXtIfaceFmt = new File(procRoot, "net/xt_qtaguid/iface_stat_fmt"); 60e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey mStatsXtUid = new File(procRoot, "net/xt_qtaguid/stats"); 611059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 621059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 631059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey /** 64e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey * Parse and return interface-level summary {@link NetworkStats} measured 65e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey * using {@code /proc/net/dev} style hooks, which may include non IP layer 66e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey * traffic. Values monotonically increase since device boot, and may include 67e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey * details about inactive interfaces. 681059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * 691059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * @throws IllegalStateException when problem parsing stats. 701059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey */ 71e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey public NetworkStats readNetworkStatsSummaryDev() throws IllegalStateException { 72453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads(); 73453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey 741059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 6); 751059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final NetworkStats.Entry entry = new NetworkStats.Entry(); 761059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 771d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey ProcFileReader reader = null; 781059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey try { 791d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey reader = new ProcFileReader(new FileInputStream(mStatsXtIfaceAll)); 801059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 811d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey while (reader.hasMoreData()) { 821d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey entry.iface = reader.nextString(); 831059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey entry.uid = UID_ALL; 848fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey entry.set = SET_ALL; 851059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey entry.tag = TAG_NONE; 861059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 871d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey final boolean active = reader.nextInt() != 0; 881d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey 891059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey // always include snapshot values 901d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey entry.rxBytes = reader.nextLong(); 911d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey entry.rxPackets = reader.nextLong(); 921d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey entry.txBytes = reader.nextLong(); 931d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey entry.txPackets = reader.nextLong(); 941059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 951059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey // fold in active numbers, but only when active 961059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey if (active) { 971d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey entry.rxBytes += reader.nextLong(); 981d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey entry.rxPackets += reader.nextLong(); 991d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey entry.txBytes += reader.nextLong(); 1001d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey entry.txPackets += reader.nextLong(); 1011059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 1021059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 1031059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey stats.addValues(entry); 1041d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey reader.finishLine(); 1051059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 1061059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } catch (NullPointerException e) { 1071059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey throw new IllegalStateException("problem parsing stats: " + e); 1081059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } catch (NumberFormatException e) { 1091059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey throw new IllegalStateException("problem parsing stats: " + e); 1101059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } catch (IOException e) { 1111059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey throw new IllegalStateException("problem parsing stats: " + e); 1121059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } finally { 1131059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey IoUtils.closeQuietly(reader); 114453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey StrictMode.setThreadPolicy(savedPolicy); 1151059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 1161059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey return stats; 1171059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 1181059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 1191059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey /** 120e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey * Parse and return interface-level summary {@link NetworkStats}. Designed 121e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey * to return only IP layer traffic. Values monotonically increase since 122e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey * device boot, and may include details about inactive interfaces. 123e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey * 124e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey * @throws IllegalStateException when problem parsing stats. 1251059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey */ 126e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey public NetworkStats readNetworkStatsSummaryXt() throws IllegalStateException { 127453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads(); 128453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey 129e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey // return null when kernel doesn't support 130e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey if (!mStatsXtIfaceFmt.exists()) return null; 131e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey 1321059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 6); 1331059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final NetworkStats.Entry entry = new NetworkStats.Entry(); 1341059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 135e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey ProcFileReader reader = null; 136e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey try { 137e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey // open and consume header line 138e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey reader = new ProcFileReader(new FileInputStream(mStatsXtIfaceFmt)); 139e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey reader.finishLine(); 1401059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 141e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey while (reader.hasMoreData()) { 142e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey entry.iface = reader.nextString(); 143e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey entry.uid = UID_ALL; 144e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey entry.set = SET_ALL; 145e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey entry.tag = TAG_NONE; 1461059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 147e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey entry.rxBytes = reader.nextLong(); 148e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey entry.rxPackets = reader.nextLong(); 149e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey entry.txBytes = reader.nextLong(); 150e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey entry.txPackets = reader.nextLong(); 1511059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 152e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey stats.addValues(entry); 153e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey reader.finishLine(); 1541059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 1551059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } catch (NullPointerException e) { 1561059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey throw new IllegalStateException("problem parsing stats: " + e); 1571059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } catch (NumberFormatException e) { 1581059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey throw new IllegalStateException("problem parsing stats: " + e); 1591059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } catch (IOException e) { 1601059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey throw new IllegalStateException("problem parsing stats: " + e); 1611059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } finally { 1621059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey IoUtils.closeQuietly(reader); 163453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey StrictMode.setThreadPolicy(savedPolicy); 1641059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 1651059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey return stats; 1661059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 1671059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 1681059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey public NetworkStats readNetworkStatsDetail() { 1691059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey return readNetworkStatsDetail(UID_ALL); 1701059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 1711059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 1721059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey /** 1731059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * Parse and return {@link NetworkStats} with UID-level details. Values 1741059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * monotonically increase since device boot. 1751059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * 1761059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * @throws IllegalStateException when problem parsing stats. 1771059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey */ 1781059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey public NetworkStats readNetworkStatsDetail(int limitUid) throws IllegalStateException { 179453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads(); 180453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey 1811059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 24); 1821059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final NetworkStats.Entry entry = new NetworkStats.Entry(); 1831059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 184163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey int idx = 1; 185163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey int lastIdx = 1; 1861059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 187163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey ProcFileReader reader = null; 1881059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey try { 189163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey // open and consume header line 190163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader = new ProcFileReader(new FileInputStream(mStatsXtUid)); 191163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.finishLine(); 1921059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 193163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey while (reader.hasMoreData()) { 194163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey idx = reader.nextInt(); 1951059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey if (idx != lastIdx + 1) { 1961059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey throw new IllegalStateException( 1971059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey "inconsistent idx=" + idx + " after lastIdx=" + lastIdx); 1981059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 1991059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey lastIdx = idx; 2001059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 201163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey entry.iface = reader.nextString(); 202163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey entry.tag = kernelToTag(reader.nextString()); 203163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey entry.uid = reader.nextInt(); 204163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey entry.set = reader.nextInt(); 205163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey entry.rxBytes = reader.nextLong(); 206163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey entry.rxPackets = reader.nextLong(); 207163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey entry.txBytes = reader.nextLong(); 208163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey entry.txPackets = reader.nextLong(); 2091059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 2101059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey if (limitUid == UID_ALL || limitUid == entry.uid) { 2111059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey stats.addValues(entry); 2121059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 213163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 214163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.finishLine(); 2151059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 2161059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } catch (NullPointerException e) { 217163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey throw new IllegalStateException("problem parsing idx " + idx, e); 2181059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } catch (NumberFormatException e) { 219163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey throw new IllegalStateException("problem parsing idx " + idx, e); 2201059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } catch (IOException e) { 221163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey throw new IllegalStateException("problem parsing idx " + idx, e); 2221059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } finally { 2231059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey IoUtils.closeQuietly(reader); 224453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey StrictMode.setThreadPolicy(savedPolicy); 2251059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 226163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 2271059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey return stats; 2281059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 2291059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey} 230