From ab9c9e4df9c68c10693e34fe8fb1428d2f13f201 Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Wed, 3 Oct 2018 17:17:52 -0700 Subject: [PATCH] Get ethernet data usage from NetworkStatsManager. - change to use NetworkStatsManager.querySummaryForUser() to check for ethernet usage data instead of getting it from INetworkStatsSession. Bug: 111751694 Test: make RunSettingsRoboTests Change-Id: I60364b4a5f7879906beba194c50955154d56803a --- .../settings/datausage/DataUsageUtils.java | 65 +++++++++++++------ .../datausage/DataUsageUtilsTest.java | 23 +++++++ 2 files changed, 68 insertions(+), 20 deletions(-) diff --git a/src/com/android/settings/datausage/DataUsageUtils.java b/src/com/android/settings/datausage/DataUsageUtils.java index 096bdfe4fc0..3001d2e3f1e 100644 --- a/src/com/android/settings/datausage/DataUsageUtils.java +++ b/src/com/android/settings/datausage/DataUsageUtils.java @@ -18,6 +18,8 @@ import static android.net.ConnectivityManager.TYPE_MOBILE; import static android.net.ConnectivityManager.TYPE_WIFI; import static android.telephony.TelephonyManager.SIM_STATE_READY; +import android.app.usage.NetworkStats.Bucket; +import android.app.usage.NetworkStatsManager; import android.content.Context; import android.net.ConnectivityManager; import android.net.INetworkStatsService; @@ -33,8 +35,11 @@ import android.telephony.TelephonyManager; import android.text.BidiFormatter; import android.text.format.Formatter; import android.text.format.Formatter.BytesResult; +import android.util.FeatureFlagUtils; import android.util.Log; +import com.android.settings.core.FeatureFlags; + import java.util.List; /** @@ -69,28 +74,48 @@ public final class DataUsageUtils { } final ConnectivityManager conn = ConnectivityManager.from(context); - final boolean hasEthernet = conn.isNetworkSupported(ConnectivityManager.TYPE_ETHERNET); - - final long ethernetBytes; - try { - INetworkStatsService statsService = INetworkStatsService.Stub.asInterface( - ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); - - INetworkStatsSession statsSession = statsService.openSession(); - if (statsSession != null) { - ethernetBytes = statsSession.getSummaryForNetwork( - NetworkTemplate.buildTemplateEthernet(), Long.MIN_VALUE, Long.MAX_VALUE) - .getTotalBytes(); - TrafficStats.closeQuietly(statsSession); - } else { - ethernetBytes = 0; - } - } catch (RemoteException e) { - throw new RuntimeException(e); + if (!conn.isNetworkSupported(ConnectivityManager.TYPE_ETHERNET)) { + return false; } - // only show ethernet when both hardware present and traffic has occurred - return hasEthernet && ethernetBytes > 0; + if (FeatureFlagUtils.isEnabled(context, FeatureFlags.DATA_USAGE_V2)) { + final TelephonyManager telephonyManager = TelephonyManager.from(context);; + final NetworkStatsManager networkStatsManager = + context.getSystemService(NetworkStatsManager.class); + boolean hasEthernetUsage = false; + try { + final Bucket bucket = networkStatsManager.querySummaryForUser( + ConnectivityManager.TYPE_ETHERNET, telephonyManager.getSubscriberId(), + 0L /* startTime */, System.currentTimeMillis() /* endTime */); + if (bucket != null) { + hasEthernetUsage = bucket.getRxBytes() > 0 || bucket.getTxBytes() > 0; + } + } catch (RemoteException e) { + Log.e(TAG, "Exception querying network detail.", e); + } + return hasEthernetUsage; + } else { + final long ethernetBytes; + try { + INetworkStatsService statsService = INetworkStatsService.Stub.asInterface( + ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); + + INetworkStatsSession statsSession = statsService.openSession(); + if (statsSession != null) { + ethernetBytes = statsSession.getSummaryForNetwork( + NetworkTemplate.buildTemplateEthernet(), Long.MIN_VALUE, Long.MAX_VALUE) + .getTotalBytes(); + TrafficStats.closeQuietly(statsSession); + } else { + ethernetBytes = 0; + } + } catch (RemoteException e) { + throw new RuntimeException(e); + } + + // only show ethernet when both hardware present and traffic has occurred + return ethernetBytes > 0; + } } /** diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageUtilsTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageUtilsTest.java index 0270be4b4cd..4ab42569fa8 100644 --- a/tests/robotests/src/com/android/settings/datausage/DataUsageUtilsTest.java +++ b/tests/robotests/src/com/android/settings/datausage/DataUsageUtilsTest.java @@ -19,13 +19,19 @@ package com.android.settings.datausage; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.anyLong; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.usage.NetworkStatsManager; import android.content.Context; import android.net.ConnectivityManager; import android.telephony.TelephonyManager; import android.util.DataUnit; +import android.util.FeatureFlagUtils; +import com.android.settings.core.FeatureFlags; import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; @@ -42,6 +48,9 @@ public final class DataUsageUtilsTest { private ConnectivityManager mManager; @Mock private TelephonyManager mTelephonyManager; + @Mock + private NetworkStatsManager mNetworkStatsManager; + private Context mContext; @Before @@ -51,6 +60,7 @@ public final class DataUsageUtilsTest { mContext = shadowContext.getApplicationContext(); shadowContext.setSystemService(Context.CONNECTIVITY_SERVICE, mManager); shadowContext.setSystemService(Context.TELEPHONY_SERVICE, mTelephonyManager); + shadowContext.setSystemService(Context.NETWORK_STATS_SERVICE, mNetworkStatsManager); } @Test @@ -88,4 +98,17 @@ public final class DataUsageUtilsTest { assertThat(formattedDataUsage).isEqualTo("1.00 GB"); } + + @Test + public void hasEthernet_shouldQueryEthernetSummaryForUser() throws Exception { + FeatureFlagUtils.setEnabled(mContext, FeatureFlags.DATA_USAGE_V2, true); + when(mManager.isNetworkSupported(anyInt())).thenReturn(true); + final String subscriber = "TestSub"; + when(mTelephonyManager.getSubscriberId()).thenReturn(subscriber); + + DataUsageUtils.hasEthernet(mContext); + + verify(mNetworkStatsManager).querySummaryForUser(eq(ConnectivityManager.TYPE_ETHERNET), + eq(subscriber), anyLong() /* startTime */, anyLong() /* endTime */); + } }