Merge "Fix work profile fingerprint userId"
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/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index 2e6611f..d6c1931 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -123,7 +123,8 @@
     private final ArrayAdapter<String> mPhase2FullAdapter;
 
     // e.g. AccessPoint.SECURITY_NONE
-    private int mAccessPointSecurity;
+    @VisibleForTesting
+    int mAccessPointSecurity;
     private TextView mPasswordView;
 
     private String mUnspecifiedCertString;
@@ -465,7 +466,8 @@
         } else {
             enabled = ipAndProxyFieldsAreValid();
         }
-        if (mAccessPointSecurity == AccessPoint.SECURITY_EAP) {
+        if (mAccessPointSecurity == AccessPoint.SECURITY_EAP && mEapCaCertSpinner != null
+                && mView.findViewById(R.id.l_ca_cert).getVisibility() != View.GONE) {
             String caCertSelection = (String) mEapCaCertSpinner.getSelectedItem();
             if (caCertSelection.equals(mUnspecifiedCertString)) {
                 // Disallow submit if the user has not selected a CA certificate for an EAP network
@@ -481,7 +483,8 @@
                 enabled = false;
             }
         }
-        if (mAccessPointSecurity == AccessPoint.SECURITY_EAP
+        if (mAccessPointSecurity == AccessPoint.SECURITY_EAP && mEapUserCertSpinner != null
+                && mView.findViewById(R.id.l_user_cert).getVisibility() != View.GONE
                 && mEapUserCertSpinner.getSelectedItem().equals(mUnspecifiedCertString)) {
             // Disallow submit if the user has not selected a user certificate for an EAP network
             // configuration.
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 */);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
index 54be773..471c991 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
@@ -57,11 +57,10 @@
     @Mock
     private Context mContext;
     @Mock
-    private View mView;
-    @Mock
     private AccessPoint mAccessPoint;
     @Mock
     private KeyStore mKeyStore;
+    private View mView;
     private Spinner mHiddenSettingsSpinner;
 
     public WifiConfigController mController;
@@ -74,6 +73,7 @@
     private static final String SHORT_PSK = "abcdefg";
     // Valid PSK pass phrase
     private static final String GOOD_PSK = "abcdefghijklmnopqrstuvwxyz";
+    private static final String GOOD_SSID = "abc";
     private static final int DHCP = 0;
 
     @Before
@@ -185,6 +185,9 @@
 
     @Test
     public void isSubmittable_EapToPskWithValidPassword_shouldReturnTrue() {
+        mController = new TestWifiConfigController(mConfigUiBase, mView, null,
+                WifiConfigUiBase.MODE_CONNECT);
+        final TextView ssid = mView.findViewById(R.id.ssid);
         final TextView password = mView.findViewById(R.id.password);
         final Spinner securitySpinner = mView.findViewById(R.id.security);
         assertThat(password).isNotNull();
@@ -195,6 +198,16 @@
         mController.onItemSelected(securitySpinner, null, AccessPoint.SECURITY_EAP, 0);
         mController.onItemSelected(securitySpinner, null, AccessPoint.SECURITY_PSK, 0);
         password.setText(GOOD_PSK);
+        ssid.setText(GOOD_SSID);
+
+        assertThat(mController.isSubmittable()).isTrue();
+    }
+
+    @Test
+    public void isSubmittable_EapWithAkaMethod_shouldReturnTrue() {
+        when(mAccessPoint.isSaved()).thenReturn(true);
+        mController.mAccessPointSecurity = AccessPoint.SECURITY_EAP;
+        mView.findViewById(R.id.l_ca_cert).setVisibility(View.GONE);
 
         assertThat(mController.isSubmittable()).isTrue();
     }