1b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff/* 2b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * Copyright (C) 2013 The Android Open Source Project 3b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * 4b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * Licensed under the Apache License, Version 2.0 (the "License"); 5b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * you may not use this file except in compliance with the License. 6b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * You may obtain a copy of the License at 7b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * 8b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * http://www.apache.org/licenses/LICENSE-2.0 9b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * 10b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * Unless required by applicable law or agreed to in writing, software 11b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * distributed under the License is distributed on an "AS IS" BASIS, 12b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * See the License for the specific language governing permissions and 14b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * limitations under the License. 15b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff */ 16b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 17b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffpackage com.android.server.wifi; 18b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 19b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport android.content.BroadcastReceiver; 20b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport android.content.Context; 21b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport android.content.Intent; 22b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport android.content.IntentFilter; 23b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport android.net.NetworkInfo; 24b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport static android.net.NetworkInfo.DetailedState.CONNECTED; 25b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport android.net.TrafficStats; 26b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport android.net.wifi.WifiManager; 27302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriffimport android.os.Messenger; 28302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriffimport android.os.RemoteException; 29302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriffimport android.util.Log; 30b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport android.os.Handler; 31b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport android.os.Message; 32b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 33b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport java.io.FileDescriptor; 34b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport java.io.PrintWriter; 35c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriffimport java.util.ArrayList; 36b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport java.util.List; 37b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport java.util.concurrent.atomic.AtomicBoolean; 38b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 39b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriffimport com.android.internal.util.AsyncChannel; 40b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 41b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff/* Polls for traffic stats and notifies the clients */ 42b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sherifffinal class WifiTrafficPoller { 43b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff /** 44b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * Interval in milliseconds between polling for traffic 45b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff * statistics 46b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff */ 47b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff private static final int POLL_TRAFFIC_STATS_INTERVAL_MSECS = 1000; 48b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 49c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff private static final int ENABLE_TRAFFIC_STATS_POLL = 1; 50c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff private static final int TRAFFIC_STATS_POLL = 2; 51c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff private static final int ADD_CLIENT = 3; 52c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff private static final int REMOVE_CLIENT = 4; 53c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff 54b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff private boolean mEnableTrafficStatsPoll = false; 55b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff private int mTrafficStatsPollToken = 0; 56b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff private long mTxPkts; 57b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff private long mRxPkts; 58b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff /* Tracks last reported data activity */ 59b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff private int mDataActivity; 60b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 61c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff private final List<Messenger> mClients = new ArrayList<Messenger>(); 62b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff // err on the side of updating at boot since screen on broadcast may be missed 63b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff // the first time 64b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff private AtomicBoolean mScreenOn = new AtomicBoolean(true); 65b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff private final TrafficHandler mTrafficHandler; 66b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff private NetworkInfo mNetworkInfo; 67b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff private final String mInterface; 68b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 69c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff WifiTrafficPoller(Context context, String iface) { 70b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff mInterface = iface; 71b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff mTrafficHandler = new TrafficHandler(); 72b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 73b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff IntentFilter filter = new IntentFilter(); 74b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 75b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff filter.addAction(Intent.ACTION_SCREEN_OFF); 76b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff filter.addAction(Intent.ACTION_SCREEN_ON); 77b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 78b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff context.registerReceiver( 79b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff new BroadcastReceiver() { 80b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff @Override 81b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff public void onReceive(Context context, Intent intent) { 82b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff if (intent.getAction().equals( 83b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff WifiManager.NETWORK_STATE_CHANGED_ACTION)) { 84b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff mNetworkInfo = (NetworkInfo) intent.getParcelableExtra( 85b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff WifiManager.EXTRA_NETWORK_INFO); 86b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 87b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff mScreenOn.set(false); 88b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 89b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff mScreenOn.set(true); 90b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } 91b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff evaluateTrafficStatsPolling(); 92b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } 93b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff }, filter); 94b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } 95b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 96c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff void addClient(Messenger client) { 97c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff Message.obtain(mTrafficHandler, ADD_CLIENT, client).sendToTarget(); 98c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff } 99c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff 100c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff void removeClient(Messenger client) { 101c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff Message.obtain(mTrafficHandler, REMOVE_CLIENT, client).sendToTarget(); 102c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff } 103c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff 104b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 105b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff private class TrafficHandler extends Handler { 106b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff public void handleMessage(Message msg) { 107b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff switch (msg.what) { 108c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff case ENABLE_TRAFFIC_STATS_POLL: 109b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff mEnableTrafficStatsPoll = (msg.arg1 == 1); 110b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff mTrafficStatsPollToken++; 111b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff if (mEnableTrafficStatsPoll) { 112b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff notifyOnDataActivity(); 113c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff sendMessageDelayed(Message.obtain(this, TRAFFIC_STATS_POLL, 114b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff mTrafficStatsPollToken, 0), POLL_TRAFFIC_STATS_INTERVAL_MSECS); 115b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } 116b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff break; 117c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff case TRAFFIC_STATS_POLL: 118b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff if (msg.arg1 == mTrafficStatsPollToken) { 119b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff notifyOnDataActivity(); 120c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff sendMessageDelayed(Message.obtain(this, TRAFFIC_STATS_POLL, 121b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff mTrafficStatsPollToken, 0), POLL_TRAFFIC_STATS_INTERVAL_MSECS); 122b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } 123b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff break; 124c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff case ADD_CLIENT: 125c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff mClients.add((Messenger) msg.obj); 126c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff break; 127c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff case REMOVE_CLIENT: 128c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff mClients.remove(msg.obj); 129c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff break; 130b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } 131b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 132b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } 133b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } 134b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 135b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff private void evaluateTrafficStatsPolling() { 136b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff Message msg; 137b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff if (mNetworkInfo == null) return; 138b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff if (mNetworkInfo.getDetailedState() == CONNECTED && mScreenOn.get()) { 139b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff msg = Message.obtain(mTrafficHandler, 140c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff ENABLE_TRAFFIC_STATS_POLL, 1, 0); 141b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } else { 142b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff msg = Message.obtain(mTrafficHandler, 143c808a1955f7571108e8c22502897ed82c69a7c3bIrfan Sheriff ENABLE_TRAFFIC_STATS_POLL, 0, 0); 144b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } 145b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff msg.sendToTarget(); 146b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } 147b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 148b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff private void notifyOnDataActivity() { 149b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff long sent, received; 150b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff long preTxPkts = mTxPkts, preRxPkts = mRxPkts; 151b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff int dataActivity = WifiManager.DATA_ACTIVITY_NONE; 152b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 153b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff mTxPkts = TrafficStats.getTxPackets(mInterface); 154b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff mRxPkts = TrafficStats.getRxPackets(mInterface); 155b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 156b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff if (preTxPkts > 0 || preRxPkts > 0) { 157b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff sent = mTxPkts - preTxPkts; 158b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff received = mRxPkts - preRxPkts; 159b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff if (sent > 0) { 160b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff dataActivity |= WifiManager.DATA_ACTIVITY_OUT; 161b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } 162b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff if (received > 0) { 163b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff dataActivity |= WifiManager.DATA_ACTIVITY_IN; 164b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } 165b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 166b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff if (dataActivity != mDataActivity && mScreenOn.get()) { 167b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff mDataActivity = dataActivity; 168302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff for (Messenger client : mClients) { 169302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Message msg = Message.obtain(); 170302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff msg.what = WifiManager.DATA_ACTIVITY_NOTIFICATION; 171302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff msg.arg1 = mDataActivity; 172302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff try { 173302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff client.send(msg); 174302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } catch (RemoteException e) { 175302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff // Failed to reach, skip 176302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff // Client removal is handled in WifiService 177302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } 178b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } 179b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } 180b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } 181b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } 182b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 183b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 184b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff pw.println("mEnableTrafficStatsPoll " + mEnableTrafficStatsPoll); 185b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff pw.println("mTrafficStatsPollToken " + mTrafficStatsPollToken); 186b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff pw.println("mTxPkts " + mTxPkts); 187b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff pw.println("mRxPkts " + mRxPkts); 188b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff pw.println("mDataActivity " + mDataActivity); 189b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff } 190b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff 191b8c0e009a74ac2eaee8946fbe0bb3b3fe2749c9aIrfan Sheriff} 192