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