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