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 288b2c3a14603d163d7564e6f60286995079687690Jeff Sharkeyimport com.android.internal.annotations.VisibleForTesting; 29163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkeyimport com.android.internal.util.ProcFileReader; 301059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 311059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport java.io.File; 32163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkeyimport java.io.FileInputStream; 331059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport java.io.IOException; 341059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 351059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeyimport libcore.io.IoUtils; 361059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 371059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey/** 381059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * Creates {@link NetworkStats} instances by parsing various {@code /proc/} 391059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * files as needed. 401059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey */ 411059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkeypublic class NetworkStatsFactory { 421059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey private static final String TAG = "NetworkStatsFactory"; 431059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 441059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey // TODO: consider moving parsing to native code 451059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 461059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey /** Path to {@code /proc/net/xt_qtaguid/iface_stat_all}. */ 471059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey private final File mStatsXtIfaceAll; 48e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey /** Path to {@code /proc/net/xt_qtaguid/iface_stat_fmt}. */ 49e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey private final File mStatsXtIfaceFmt; 501059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey /** Path to {@code /proc/net/xt_qtaguid/stats}. */ 511059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey private final File mStatsXtUid; 521059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 531059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey public NetworkStatsFactory() { 541059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey this(new File("/proc/")); 551059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 561059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 578b2c3a14603d163d7564e6f60286995079687690Jeff Sharkey @VisibleForTesting 581059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey public NetworkStatsFactory(File procRoot) { 591059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey mStatsXtIfaceAll = new File(procRoot, "net/xt_qtaguid/iface_stat_all"); 60e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey mStatsXtIfaceFmt = new File(procRoot, "net/xt_qtaguid/iface_stat_fmt"); 61e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey mStatsXtUid = new File(procRoot, "net/xt_qtaguid/stats"); 621059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 631059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 641059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey /** 65e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey * Parse and return interface-level summary {@link NetworkStats} measured 66e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey * using {@code /proc/net/dev} style hooks, which may include non IP layer 67e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey * traffic. Values monotonically increase since device boot, and may include 68e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey * details about inactive interfaces. 691059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * 701059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * @throws IllegalStateException when problem parsing stats. 711059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey */ 72e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey public NetworkStats readNetworkStatsSummaryDev() throws IllegalStateException { 73453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads(); 74453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey 751059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 6); 761059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final NetworkStats.Entry entry = new NetworkStats.Entry(); 771059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 781d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey ProcFileReader reader = null; 791059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey try { 801d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey reader = new ProcFileReader(new FileInputStream(mStatsXtIfaceAll)); 811059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 821d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey while (reader.hasMoreData()) { 831d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey entry.iface = reader.nextString(); 841059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey entry.uid = UID_ALL; 858fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey entry.set = SET_ALL; 861059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey entry.tag = TAG_NONE; 871059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 881d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey final boolean active = reader.nextInt() != 0; 891d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey 901059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey // always include snapshot values 911d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey entry.rxBytes = reader.nextLong(); 921d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey entry.rxPackets = reader.nextLong(); 931d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey entry.txBytes = reader.nextLong(); 941d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey entry.txPackets = reader.nextLong(); 951059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 961059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey // fold in active numbers, but only when active 971059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey if (active) { 981d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey entry.rxBytes += reader.nextLong(); 991d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey entry.rxPackets += reader.nextLong(); 1001d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey entry.txBytes += reader.nextLong(); 1011d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey entry.txPackets += reader.nextLong(); 1021059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 1031059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 1041059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey stats.addValues(entry); 1051d29a3064f20652416f81ea292adcc07566ba974Jeff Sharkey reader.finishLine(); 1061059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 1071059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } catch (NullPointerException e) { 1081059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey throw new IllegalStateException("problem parsing stats: " + e); 1091059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } catch (NumberFormatException e) { 1101059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey throw new IllegalStateException("problem parsing stats: " + e); 1111059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } catch (IOException e) { 1121059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey throw new IllegalStateException("problem parsing stats: " + e); 1131059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } finally { 1141059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey IoUtils.closeQuietly(reader); 115453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey StrictMode.setThreadPolicy(savedPolicy); 1161059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 1171059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey return stats; 1181059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 1191059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 1201059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey /** 121e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey * Parse and return interface-level summary {@link NetworkStats}. Designed 122e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey * to return only IP layer traffic. Values monotonically increase since 123e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey * device boot, and may include details about inactive interfaces. 124e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey * 125e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey * @throws IllegalStateException when problem parsing stats. 1261059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey */ 127e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey public NetworkStats readNetworkStatsSummaryXt() throws IllegalStateException { 128453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads(); 129453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey 130e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey // return null when kernel doesn't support 131e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey if (!mStatsXtIfaceFmt.exists()) return null; 132e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey 1331059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 6); 1341059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final NetworkStats.Entry entry = new NetworkStats.Entry(); 1351059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 136e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey ProcFileReader reader = null; 137e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey try { 138e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey // open and consume header line 139e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey reader = new ProcFileReader(new FileInputStream(mStatsXtIfaceFmt)); 140e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey reader.finishLine(); 1411059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 142e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey while (reader.hasMoreData()) { 143e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey entry.iface = reader.nextString(); 144e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey entry.uid = UID_ALL; 145e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey entry.set = SET_ALL; 146e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey entry.tag = TAG_NONE; 1471059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 148e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey entry.rxBytes = reader.nextLong(); 149e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey entry.rxPackets = reader.nextLong(); 150e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey entry.txBytes = reader.nextLong(); 151e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey entry.txPackets = reader.nextLong(); 1521059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 153e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey stats.addValues(entry); 154e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey reader.finishLine(); 1551059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 1561059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } catch (NullPointerException e) { 1571059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey throw new IllegalStateException("problem parsing stats: " + e); 1581059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } catch (NumberFormatException e) { 1591059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey throw new IllegalStateException("problem parsing stats: " + e); 1601059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } catch (IOException e) { 1611059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey throw new IllegalStateException("problem parsing stats: " + e); 1621059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } finally { 1631059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey IoUtils.closeQuietly(reader); 164453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey StrictMode.setThreadPolicy(savedPolicy); 1651059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 1661059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey return stats; 1671059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 1681059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 1691059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey public NetworkStats readNetworkStatsDetail() { 1701059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey return readNetworkStatsDetail(UID_ALL); 1711059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 1721059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 1731059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey /** 1741059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * Parse and return {@link NetworkStats} with UID-level details. Values 1751059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * monotonically increase since device boot. 1761059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * 1771059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey * @throws IllegalStateException when problem parsing stats. 1781059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey */ 1791059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey public NetworkStats readNetworkStatsDetail(int limitUid) throws IllegalStateException { 180453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads(); 181453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey 1821059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 24); 1831059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey final NetworkStats.Entry entry = new NetworkStats.Entry(); 1841059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 185163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey int idx = 1; 186163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey int lastIdx = 1; 1871059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 188163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey ProcFileReader reader = null; 1891059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey try { 190163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey // open and consume header line 191163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader = new ProcFileReader(new FileInputStream(mStatsXtUid)); 192163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.finishLine(); 1931059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 194163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey while (reader.hasMoreData()) { 195163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey idx = reader.nextInt(); 1961059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey if (idx != lastIdx + 1) { 1971059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey throw new IllegalStateException( 1981059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey "inconsistent idx=" + idx + " after lastIdx=" + lastIdx); 1991059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 2001059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey lastIdx = idx; 2011059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 202163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey entry.iface = reader.nextString(); 203163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey entry.tag = kernelToTag(reader.nextString()); 204163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey entry.uid = reader.nextInt(); 205163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey entry.set = reader.nextInt(); 206163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey entry.rxBytes = reader.nextLong(); 207163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey entry.rxPackets = reader.nextLong(); 208163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey entry.txBytes = reader.nextLong(); 209163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey entry.txPackets = reader.nextLong(); 2101059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 2111059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey if (limitUid == UID_ALL || limitUid == entry.uid) { 2121059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey stats.addValues(entry); 2131059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 214163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 215163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey reader.finishLine(); 2161059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 2171059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } catch (NullPointerException e) { 218163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey throw new IllegalStateException("problem parsing idx " + idx, e); 2191059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } catch (NumberFormatException e) { 220163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey throw new IllegalStateException("problem parsing idx " + idx, e); 2211059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } catch (IOException e) { 222163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey throw new IllegalStateException("problem parsing idx " + idx, e); 2231059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } finally { 2241059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey IoUtils.closeQuietly(reader); 225453dafa66372308fd5200f1749a2ef8e3e1846e9Jeff Sharkey StrictMode.setThreadPolicy(savedPolicy); 2261059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 227163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 2281059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey return stats; 2291059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 2301059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey} 231