Merge "Get ethernet data usage from NetworkStatsManager."
diff --git a/src/com/android/settings/datausage/DataUsageUtils.java b/src/com/android/settings/datausage/DataUsageUtils.java
index 096bdfe..3001d2e 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_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.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 @@
         }
 
         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 0270be4..4ab4256 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 @@
 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 @@
     private ConnectivityManager mManager;
     @Mock
     private TelephonyManager mTelephonyManager;
+    @Mock
+    private NetworkStatsManager mNetworkStatsManager;
+
     private Context mContext;
 
     @Before
@@ -51,6 +60,7 @@
         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 @@
 
         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 */);
+    }
 }