2424import static android .content .Intent .ACTION_SHUTDOWN ;
2525import static android .content .Intent .ACTION_UID_REMOVED ;
2626import static android .content .Intent .EXTRA_UID ;
27- import static android .net .ConnectivityManager .CONNECTIVITY_ACTION_IMMEDIATE ;
2827import static android .net .ConnectivityManager .ACTION_TETHER_STATE_CHANGED ;
28+ import static android .net .ConnectivityManager .CONNECTIVITY_ACTION_IMMEDIATE ;
2929import static android .net .NetworkStats .IFACE_ALL ;
3030import static android .net .NetworkStats .SET_ALL ;
3131import static android .net .NetworkStats .SET_DEFAULT ;
4343import static android .provider .Settings .Secure .NETSTATS_TAG_MAX_HISTORY ;
4444import static android .provider .Settings .Secure .NETSTATS_UID_BUCKET_DURATION ;
4545import static android .provider .Settings .Secure .NETSTATS_UID_MAX_HISTORY ;
46+ import static android .telephony .PhoneStateListener .LISTEN_DATA_CONNECTION_STATE ;
47+ import static android .telephony .PhoneStateListener .LISTEN_NONE ;
4648import static android .text .format .DateUtils .DAY_IN_MILLIS ;
4749import static android .text .format .DateUtils .HOUR_IN_MILLIS ;
4850import static android .text .format .DateUtils .MINUTE_IN_MILLIS ;
51+ import static android .text .format .DateUtils .SECOND_IN_MILLIS ;
4952import static com .android .internal .util .Preconditions .checkNotNull ;
5053import static com .android .server .NetworkManagementService .LIMIT_GLOBAL_ALERT ;
5154import static com .android .server .NetworkManagementSocketTagger .resetKernelUidStats ;
8083import android .os .RemoteException ;
8184import android .os .SystemClock ;
8285import android .provider .Settings ;
86+ import android .telephony .PhoneStateListener ;
8387import android .telephony .TelephonyManager ;
8488import android .util .EventLog ;
8589import android .util .Log ;
121125 */
122126public class NetworkStatsService extends INetworkStatsService .Stub {
123127 private static final String TAG = "NetworkStats" ;
124- private static final boolean LOGD = true ;
128+ private static final boolean LOGD = false ;
125129 private static final boolean LOGV = false ;
126130
127131 /** File header magic number: "ANET" */
@@ -132,7 +136,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
132136 private static final int VERSION_UID_WITH_TAG = 3 ;
133137 private static final int VERSION_UID_WITH_SET = 4 ;
134138
135- private static final int MSG_PERFORM_POLL = 0x1 ;
139+ private static final int MSG_PERFORM_POLL = 1 ;
140+ private static final int MSG_UPDATE_IFACES = 2 ;
136141
137142 /** Flags to control detail level of poll event. */
138143 private static final int FLAG_PERSIST_NETWORK = 0x10 ;
@@ -144,6 +149,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
144149 private final INetworkManagementService mNetworkManager ;
145150 private final IAlarmManager mAlarmManager ;
146151 private final TrustedTime mTime ;
152+ private final TelephonyManager mTeleManager ;
147153 private final NetworkStatsSettings mSettings ;
148154
149155 private final PowerManager .WakeLock mWakeLock ;
@@ -227,6 +233,7 @@ public NetworkStatsService(Context context, INetworkManagementService networkMan
227233 mNetworkManager = checkNotNull (networkManager , "missing INetworkManagementService" );
228234 mAlarmManager = checkNotNull (alarmManager , "missing IAlarmManager" );
229235 mTime = checkNotNull (time , "missing TrustedTime" );
236+ mTeleManager = checkNotNull (TelephonyManager .getDefault (), "missing TelephonyManager" );
230237 mSettings = checkNotNull (settings , "missing NetworkStatsSettings" );
231238
232239 final PowerManager powerManager = (PowerManager ) context .getSystemService (
@@ -279,6 +286,10 @@ public void systemReady() {
279286 // ignored; service lives in system_server
280287 }
281288
289+ // watch for networkType changes that aren't broadcast through
290+ // CONNECTIVITY_ACTION_IMMEDIATE above.
291+ mTeleManager .listen (mPhoneListener , LISTEN_DATA_CONNECTION_STATE );
292+
282293 registerPollAlarmLocked ();
283294 registerGlobalAlert ();
284295
@@ -288,10 +299,13 @@ public void systemReady() {
288299
289300 private void shutdownLocked () {
290301 mContext .unregisterReceiver (mConnReceiver );
302+ mContext .unregisterReceiver (mTetherReceiver );
291303 mContext .unregisterReceiver (mPollReceiver );
292304 mContext .unregisterReceiver (mRemovedReceiver );
293305 mContext .unregisterReceiver (mShutdownReceiver );
294306
307+ mTeleManager .listen (mPhoneListener , LISTEN_NONE );
308+
295309 writeNetworkStatsLocked ();
296310 if (mUidStatsLoaded ) {
297311 writeUidStatsLocked ();
@@ -535,14 +549,7 @@ public void forceUpdate() {
535549 public void onReceive (Context context , Intent intent ) {
536550 // on background handler thread, and verified CONNECTIVITY_INTERNAL
537551 // permission above.
538- synchronized (mStatsLock ) {
539- mWakeLock .acquire ();
540- try {
541- updateIfacesLocked ();
542- } finally {
543- mWakeLock .release ();
544- }
545- }
552+ updateIfaces ();
546553 }
547554 };
548555
@@ -619,6 +626,46 @@ public void limitReached(String limitName, String iface) {
619626 }
620627 };
621628
629+ private int mLastPhoneState = TelephonyManager .DATA_UNKNOWN ;
630+ private int mLastPhoneNetworkType = TelephonyManager .NETWORK_TYPE_UNKNOWN ;
631+
632+ /**
633+ * Receiver that watches for {@link TelephonyManager} changes, such as
634+ * transitioning between network types.
635+ */
636+ private PhoneStateListener mPhoneListener = new PhoneStateListener () {
637+ @ Override
638+ public void onDataConnectionStateChanged (int state , int networkType ) {
639+ final boolean stateChanged = state != mLastPhoneState ;
640+ final boolean networkTypeChanged = networkType != mLastPhoneNetworkType ;
641+
642+ if (networkTypeChanged && !stateChanged ) {
643+ // networkType changed without a state change, which means we
644+ // need to roll our own update. delay long enough for
645+ // ConnectivityManager to process.
646+ // TODO: add direct event to ConnectivityService instead of
647+ // relying on this delay.
648+ if (LOGV ) Slog .v (TAG , "triggering delayed updateIfaces()" );
649+ mHandler .sendMessageDelayed (
650+ mHandler .obtainMessage (MSG_UPDATE_IFACES ), SECOND_IN_MILLIS );
651+ }
652+
653+ mLastPhoneState = state ;
654+ mLastPhoneNetworkType = networkType ;
655+ }
656+ };
657+
658+ private void updateIfaces () {
659+ synchronized (mStatsLock ) {
660+ mWakeLock .acquire ();
661+ try {
662+ updateIfacesLocked ();
663+ } finally {
664+ mWakeLock .release ();
665+ }
666+ }
667+ }
668+
622669 /**
623670 * Inspect all current {@link NetworkState} to derive mapping from {@code
624671 * iface} to {@link NetworkStatsHistory}. When multiple {@link NetworkInfo}
@@ -713,19 +760,6 @@ private void performPollLocked(int flags) {
713760 final long threshold = mSettings .getPersistThreshold ();
714761
715762 try {
716- // record network stats
717- final NetworkStats networkSnapshot = mNetworkManager .getNetworkStatsSummary ();
718- performNetworkPollLocked (networkSnapshot , currentTime );
719-
720- // persist when enough network data has occurred
721- final NetworkStats persistNetworkDelta = computeStatsDelta (
722- mLastPersistNetworkSnapshot , networkSnapshot , true );
723- final boolean networkPastThreshold = persistNetworkDelta .getTotalBytes () > threshold ;
724- if (persistForce || (persistNetwork && networkPastThreshold )) {
725- writeNetworkStatsLocked ();
726- mLastPersistNetworkSnapshot = networkSnapshot ;
727- }
728-
729763 // record tethering stats; persisted during normal UID cycle below
730764 final String [] ifacePairs = mConnManager .getTetheredIfacePairs ();
731765 final NetworkStats tetherSnapshot = mNetworkManager .getNetworkStatsTethering (
@@ -744,6 +778,19 @@ private void performPollLocked(int flags) {
744778 writeUidStatsLocked ();
745779 mLastPersistUidSnapshot = uidSnapshot ;
746780 }
781+
782+ // record network stats
783+ final NetworkStats networkSnapshot = mNetworkManager .getNetworkStatsSummary ();
784+ performNetworkPollLocked (networkSnapshot , currentTime );
785+
786+ // persist when enough network data has occurred
787+ final NetworkStats persistNetworkDelta = computeStatsDelta (
788+ mLastPersistNetworkSnapshot , networkSnapshot , true );
789+ final boolean networkPastThreshold = persistNetworkDelta .getTotalBytes () > threshold ;
790+ if (persistForce || (persistNetwork && networkPastThreshold )) {
791+ writeNetworkStatsLocked ();
792+ mLastPersistNetworkSnapshot = networkSnapshot ;
793+ }
747794 } catch (IllegalStateException e ) {
748795 Log .wtf (TAG , "problem reading network stats" , e );
749796 } catch (RemoteException e ) {
@@ -1356,6 +1403,10 @@ public boolean handleMessage(Message msg) {
13561403 performPoll (flags );
13571404 return true ;
13581405 }
1406+ case MSG_UPDATE_IFACES : {
1407+ updateIfaces ();
1408+ return true ;
1409+ }
13591410 default : {
13601411 return false ;
13611412 }
0 commit comments