1155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande/* 2155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Copyright (C) 2013 The Android Open Source Project 3155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 4155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Licensed under the Apache License, Version 2.0 (the "License"); 5155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * you may not use this file except in compliance with the License. 6155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * You may obtain a copy of the License at 7155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 8155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * http://www.apache.org/licenses/LICENSE-2.0 9155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * 10155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Unless required by applicable law or agreed to in writing, software 11155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * distributed under the License is distributed on an "AS IS" BASIS, 12155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * See the License for the specific language governing permissions and 14155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * limitations under the License. 15155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 16155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 17155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandepackage com.android.server.wifi; 18155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 198e14dcb9dc38149b4672eceb3fe22287ea4343a0Peter Qiuimport static android.net.NetworkInfo.DetailedState.CONNECTED; 208e14dcb9dc38149b4672eceb3fe22287ea4343a0Peter Qiu 21155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.content.BroadcastReceiver; 22155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.content.Context; 23155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.content.Intent; 24155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.content.IntentFilter; 25155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.net.NetworkInfo; 26155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.net.TrafficStats; 27155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.net.wifi.WifiManager; 28155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.os.Handler; 298e14dcb9dc38149b4672eceb3fe22287ea4343a0Peter Qiuimport android.os.Looper; 30155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport android.os.Message; 318e14dcb9dc38149b4672eceb3fe22287ea4343a0Peter Qiuimport android.os.Messenger; 328e14dcb9dc38149b4672eceb3fe22287ea4343a0Peter Qiuimport android.os.RemoteException; 33992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalleimport android.util.Log; 34155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 35155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport java.io.FileDescriptor; 36155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport java.io.PrintWriter; 37155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport java.util.ArrayList; 38155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport java.util.List; 39155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeimport java.util.concurrent.atomic.AtomicBoolean; 40155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 41da918df16e03ee19be62343313d954027d3eb3abRebecca Silberstein/** 42da918df16e03ee19be62343313d954027d3eb3abRebecca Silberstein * Polls for traffic stats and notifies the clients 43da918df16e03ee19be62343313d954027d3eb3abRebecca Silberstein */ 44da918df16e03ee19be62343313d954027d3eb3abRebecca Silbersteinpublic class WifiTrafficPoller { 45992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle 461c0d1409f4f52d9b699777660054d8a8134e4459Samuel Tan private static final boolean DBG = false; 472af03130d7f85823223b8591dc52858d851b301dMitchell Wills private static final String TAG = "WifiTrafficPoller"; 48155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /** 49155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * Interval in milliseconds between polling for traffic 50155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande * statistics 51155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande */ 52155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final int POLL_TRAFFIC_STATS_INTERVAL_MSECS = 1000; 53155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 54155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final int ENABLE_TRAFFIC_STATS_POLL = 1; 55155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final int TRAFFIC_STATS_POLL = 2; 56155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final int ADD_CLIENT = 3; 57155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private static final int REMOVE_CLIENT = 4; 58155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 59155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private boolean mEnableTrafficStatsPoll = false; 60155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private int mTrafficStatsPollToken = 0; 61155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private long mTxPkts; 62155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private long mRxPkts; 63155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande /* Tracks last reported data activity */ 64155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private int mDataActivity; 65155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 66155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private final List<Messenger> mClients = new ArrayList<Messenger>(); 67155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // err on the side of updating at boot since screen on broadcast may be missed 68155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // the first time 69155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private AtomicBoolean mScreenOn = new AtomicBoolean(true); 70155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private final TrafficHandler mTrafficHandler; 71155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private NetworkInfo mNetworkInfo; 72155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private final String mInterface; 73155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 747002981cd8cf4ed73e9bbb2c1a877c3594e0ab39Samuel Tan private boolean mVerboseLoggingEnabled = false; 757002981cd8cf4ed73e9bbb2c1a877c3594e0ab39Samuel Tan 768e14dcb9dc38149b4672eceb3fe22287ea4343a0Peter Qiu WifiTrafficPoller(Context context, Looper looper, String iface) { 77155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mInterface = iface; 788e14dcb9dc38149b4672eceb3fe22287ea4343a0Peter Qiu mTrafficHandler = new TrafficHandler(looper); 79155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 80155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande IntentFilter filter = new IntentFilter(); 81155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 82155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande filter.addAction(Intent.ACTION_SCREEN_OFF); 83155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande filter.addAction(Intent.ACTION_SCREEN_ON); 84155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 85155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande context.registerReceiver( 86155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande new BroadcastReceiver() { 87155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande @Override 88155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void onReceive(Context context, Intent intent) { 89cf731bc480e2e11474b5d820b7d7a04bd0eff176Ningyuan Wang if (intent == null) { 90cf731bc480e2e11474b5d820b7d7a04bd0eff176Ningyuan Wang return; 91cf731bc480e2e11474b5d820b7d7a04bd0eff176Ningyuan Wang } 92cf731bc480e2e11474b5d820b7d7a04bd0eff176Ningyuan Wang if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals( 93cf731bc480e2e11474b5d820b7d7a04bd0eff176Ningyuan Wang intent.getAction())) { 94155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mNetworkInfo = (NetworkInfo) intent.getParcelableExtra( 95155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande WifiManager.EXTRA_NETWORK_INFO); 96cf731bc480e2e11474b5d820b7d7a04bd0eff176Ningyuan Wang } else if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) { 97155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mScreenOn.set(false); 98cf731bc480e2e11474b5d820b7d7a04bd0eff176Ningyuan Wang } else if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) { 99155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mScreenOn.set(true); 100155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 101155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande evaluateTrafficStatsPolling(); 102155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 103155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande }, filter); 104155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 105155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 106155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande void addClient(Messenger client) { 107155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Message.obtain(mTrafficHandler, ADD_CLIENT, client).sendToTarget(); 108155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 109155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 110155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande void removeClient(Messenger client) { 111155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Message.obtain(mTrafficHandler, REMOVE_CLIENT, client).sendToTarget(); 112155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 113155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 114992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle void enableVerboseLogging(int verbose) { 1157002981cd8cf4ed73e9bbb2c1a877c3594e0ab39Samuel Tan if (verbose > 0) { 1167002981cd8cf4ed73e9bbb2c1a877c3594e0ab39Samuel Tan mVerboseLoggingEnabled = true; 117992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle } else { 1187002981cd8cf4ed73e9bbb2c1a877c3594e0ab39Samuel Tan mVerboseLoggingEnabled = false; 119992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle } 120992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle } 121992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle 122155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private class TrafficHandler extends Handler { 1238e14dcb9dc38149b4672eceb3fe22287ea4343a0Peter Qiu public TrafficHandler(Looper looper) { 1248e14dcb9dc38149b4672eceb3fe22287ea4343a0Peter Qiu super(looper); 1258e14dcb9dc38149b4672eceb3fe22287ea4343a0Peter Qiu } 1268e14dcb9dc38149b4672eceb3fe22287ea4343a0Peter Qiu 127155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public void handleMessage(Message msg) { 128155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande switch (msg.what) { 129155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case ENABLE_TRAFFIC_STATS_POLL: 130155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mEnableTrafficStatsPoll = (msg.arg1 == 1); 1317002981cd8cf4ed73e9bbb2c1a877c3594e0ab39Samuel Tan if (mVerboseLoggingEnabled) { 1321c0d1409f4f52d9b699777660054d8a8134e4459Samuel Tan Log.d(TAG, "ENABLE_TRAFFIC_STATS_POLL " 133992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle + mEnableTrafficStatsPoll + " Token " 134992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle + Integer.toString(mTrafficStatsPollToken)); 135992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle } 136155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mTrafficStatsPollToken++; 137155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mEnableTrafficStatsPoll) { 138155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande notifyOnDataActivity(); 139155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessageDelayed(Message.obtain(this, TRAFFIC_STATS_POLL, 140155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mTrafficStatsPollToken, 0), POLL_TRAFFIC_STATS_INTERVAL_MSECS); 141155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 142155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 143155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case TRAFFIC_STATS_POLL: 1441c0d1409f4f52d9b699777660054d8a8134e4459Samuel Tan if (DBG) { 1451c0d1409f4f52d9b699777660054d8a8134e4459Samuel Tan Log.d(TAG, "TRAFFIC_STATS_POLL " 146992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle + mEnableTrafficStatsPoll + " Token " 147992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle + Integer.toString(mTrafficStatsPollToken) 148992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle + " num clients " + mClients.size()); 149992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle } 150155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (msg.arg1 == mTrafficStatsPollToken) { 151155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande notifyOnDataActivity(); 152155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sendMessageDelayed(Message.obtain(this, TRAFFIC_STATS_POLL, 153155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mTrafficStatsPollToken, 0), POLL_TRAFFIC_STATS_INTERVAL_MSECS); 154155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 155155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 156155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case ADD_CLIENT: 157155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mClients.add((Messenger) msg.obj); 1587002981cd8cf4ed73e9bbb2c1a877c3594e0ab39Samuel Tan if (mVerboseLoggingEnabled) { 1591c0d1409f4f52d9b699777660054d8a8134e4459Samuel Tan Log.d(TAG, "ADD_CLIENT: " 160992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle + Integer.toString(mClients.size())); 161992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle } 162155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 163155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande case REMOVE_CLIENT: 164155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mClients.remove(msg.obj); 165155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande break; 166155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 167155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 168155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 169155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 170155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 171155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void evaluateTrafficStatsPolling() { 172155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Message msg; 173155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mNetworkInfo == null) return; 174155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (mNetworkInfo.getDetailedState() == CONNECTED && mScreenOn.get()) { 175155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande msg = Message.obtain(mTrafficHandler, 176155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ENABLE_TRAFFIC_STATS_POLL, 1, 0); 177155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } else { 178155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande msg = Message.obtain(mTrafficHandler, 179155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande ENABLE_TRAFFIC_STATS_POLL, 0, 0); 180155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 181155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande msg.sendToTarget(); 182155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 183155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 184155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private void notifyOnDataActivity() { 185155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande long sent, received; 186155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande long preTxPkts = mTxPkts, preRxPkts = mRxPkts; 187155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande int dataActivity = WifiManager.DATA_ACTIVITY_NONE; 188155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 189155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mTxPkts = TrafficStats.getTxPackets(mInterface); 190155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mRxPkts = TrafficStats.getRxPackets(mInterface); 191155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 1921c0d1409f4f52d9b699777660054d8a8134e4459Samuel Tan if (DBG) { 1931c0d1409f4f52d9b699777660054d8a8134e4459Samuel Tan Log.d(TAG, " packet count Tx=" 194992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle + Long.toString(mTxPkts) 195992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle + " Rx=" 196992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle + Long.toString(mRxPkts)); 197992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle } 198992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle 199155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (preTxPkts > 0 || preRxPkts > 0) { 200155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande sent = mTxPkts - preTxPkts; 201155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande received = mRxPkts - preRxPkts; 202155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (sent > 0) { 203155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande dataActivity |= WifiManager.DATA_ACTIVITY_OUT; 204155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 205155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (received > 0) { 206155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande dataActivity |= WifiManager.DATA_ACTIVITY_IN; 207155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 208155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 209155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande if (dataActivity != mDataActivity && mScreenOn.get()) { 210155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande mDataActivity = dataActivity; 2117002981cd8cf4ed73e9bbb2c1a877c3594e0ab39Samuel Tan if (mVerboseLoggingEnabled) { 212992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle Log.e(TAG, "notifying of data activity " 213992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle + Integer.toString(mDataActivity)); 214992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle } 215155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande for (Messenger client : mClients) { 216155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande Message msg = Message.obtain(); 217155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande msg.what = WifiManager.DATA_ACTIVITY_NOTIFICATION; 218155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande msg.arg1 = mDataActivity; 219155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande try { 220155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande client.send(msg); 221155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } catch (RemoteException e) { 222155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Failed to reach, skip 223155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande // Client removal is handled in WifiService 224155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 225155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 226155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 227155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 228155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 229155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 230155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 231155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande pw.println("mEnableTrafficStatsPoll " + mEnableTrafficStatsPoll); 232155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande pw.println("mTrafficStatsPollToken " + mTrafficStatsPollToken); 233155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande pw.println("mTxPkts " + mTxPkts); 234155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande pw.println("mRxPkts " + mRxPkts); 235155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande pw.println("mDataActivity " + mDataActivity); 236155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande } 237155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande 238155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande} 239