Merge "Ignore/Fix broken tests"
diff --git a/src/com/android/settings/network/VpnPreferenceController.java b/src/com/android/settings/network/VpnPreferenceController.java
index d745ff5..a1e72b0 100644
--- a/src/com/android/settings/network/VpnPreferenceController.java
+++ b/src/com/android/settings/network/VpnPreferenceController.java
@@ -129,6 +129,35 @@
         }
         UserManager userManager = mContext.getSystemService(UserManager.class);
         VpnManager vpnManager = mContext.getSystemService(VpnManager.class);
+        String summary = getInsecureVpnSummaryOverride(userManager, vpnManager);
+        if (summary == null) {
+            final UserInfo userInfo = userManager.getUserInfo(UserHandle.myUserId());
+            final int uid;
+            if (userInfo.isRestricted()) {
+                uid = userInfo.restrictedProfileParentId;
+            } else {
+                uid = userInfo.id;
+            }
+            VpnConfig vpn = vpnManager.getVpnConfig(uid);
+            if ((vpn != null) && vpn.legacy) {
+                // Legacy VPNs should do nothing if the network is disconnected. Third-party
+                // VPN warnings need to continue as traffic can still go to the app.
+                final LegacyVpnInfo legacyVpn = vpnManager.getLegacyVpnInfo(uid);
+                if (legacyVpn == null || legacyVpn.state != LegacyVpnInfo.STATE_CONNECTED) {
+                    vpn = null;
+                }
+            }
+            if (vpn == null) {
+                summary = mContext.getString(R.string.vpn_disconnected_summary);
+            } else {
+                summary = getNameForVpnConfig(vpn, UserHandle.of(uid));
+            }
+        }
+        final String finalSummary = summary;
+        ThreadUtils.postOnMainThread(() -> mPreference.setSummary(finalSummary));
+    }
+
+    protected int getNumberOfNonLegacyVpn(UserManager userManager, VpnManager vpnManager) {
         // Copied from SystemUI::SecurityControllerImpl
         SparseArray<VpnConfig> vpns = new SparseArray<>();
         final List<UserInfo> users = userManager.getUsers();
@@ -149,38 +178,22 @@
             }
             vpns.put(user.id, cfg);
         }
-        int numberOfNonLegacyVpn = vpns.size() - connectedLegacyVpnCount;
-        String summary = getInsecureVpnSummaryOverride(numberOfNonLegacyVpn);
-        if (summary == null) {
-            final UserInfo userInfo = userManager.getUserInfo(UserHandle.myUserId());
-            final int uid;
-            if (userInfo.isRestricted()) {
-                uid = userInfo.restrictedProfileParentId;
-            } else {
-                uid = userInfo.id;
-            }
-            VpnConfig vpn = vpns.get(uid);
-            if (vpn == null) {
-                summary = mContext.getString(R.string.vpn_disconnected_summary);
-            } else {
-                summary = getNameForVpnConfig(vpn, UserHandle.of(uid));
-            }
-        }
-        final String finalSummary = summary;
-        ThreadUtils.postOnMainThread(() -> mPreference.setSummary(finalSummary));
+        return vpns.size() - connectedLegacyVpnCount;
     }
 
-    protected String getInsecureVpnSummaryOverride(int numberOfNonLegacyVpn) {
+    protected String getInsecureVpnSummaryOverride(UserManager userManager,
+            VpnManager vpnManager) {
         // Optionally add warning icon if an insecure VPN is present.
         if (mPreference instanceof VpnInfoPreference) {
             final int insecureVpnCount = getInsecureVpnCount();
             boolean isInsecureVPN = insecureVpnCount > 0;
             ((VpnInfoPreference) mPreference).setInsecureVpn(isInsecureVPN);
+
             // Set the summary based on the total number of VPNs and insecure VPNs.
             if (isInsecureVPN) {
                 // Add the users and the number of legacy vpns to determine if there is more than
                 // one vpn, since there can be more than one VPN per user.
-                final int vpnCount = numberOfNonLegacyVpn
+                final int vpnCount = getNumberOfNonLegacyVpn(userManager, vpnManager)
                         + LegacyVpnProfileStore.list(Credentials.VPN).length;
                 if (vpnCount == 1) {
                     return mContext.getString(R.string.vpn_settings_insecure_single);
diff --git a/tests/robotests/src/com/android/settings/bluetooth/AlwaysDiscoverableTest.java b/tests/robotests/src/com/android/settings/bluetooth/AlwaysDiscoverableTest.java
index 89e76b4..03e6e89 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/AlwaysDiscoverableTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/AlwaysDiscoverableTest.java
@@ -26,7 +26,6 @@
 import android.content.Intent;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -75,13 +74,13 @@
     }
 
     @Test
-    @Ignore
     public void startSetsModeAndRegistersReceiver() {
         mBluetoothAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_NONE);
         mAlwaysDiscoverable.start();
         assertThat(mBluetoothAdapter.getScanMode())
                 .isEqualTo(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE);
-        verify(mContext).registerReceiver(eq(mAlwaysDiscoverable), any());
+        verify(mContext).registerReceiver(eq(mAlwaysDiscoverable), any(),
+                eq(Context.RECEIVER_EXPORTED_UNAUDITED));
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java
index c18537b..cc1087e 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothEnablerTest.java
@@ -19,6 +19,7 @@
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
@@ -47,7 +48,6 @@
 
 import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -206,11 +206,11 @@
     }
 
     @Test
-    @Ignore
     public void bluetoothTurnsOff_switchTurnsOff() {
         // Start up with bluetooth turned on. The switch should get turned on.
         ArgumentCaptor<BroadcastReceiver> captor = ArgumentCaptor.forClass(BroadcastReceiver.class);
-        when(mContext.registerReceiver(captor.capture(), any(IntentFilter.class))).thenReturn(null);
+        when(mContext.registerReceiver(captor.capture(), any(IntentFilter.class),
+                eq(Context.RECEIVER_EXPORTED_UNAUDITED))).thenReturn(null);
         mShadowBluetoothAdapter.setState(BluetoothAdapter.STATE_ON);
         verify(mSwitchController, never()).setChecked(anyBoolean());
         mBluetoothEnabler.resume(mContext);
@@ -231,11 +231,11 @@
     }
 
     @Test
-    @Ignore
     public void bluetoothTurnsOn_switchTurnsOn() {
         // Start up with bluetooth turned on. The switch should be left off.
         ArgumentCaptor<BroadcastReceiver> captor = ArgumentCaptor.forClass(BroadcastReceiver.class);
-        when(mContext.registerReceiver(captor.capture(), any(IntentFilter.class))).thenReturn(null);
+        when(mContext.registerReceiver(captor.capture(), any(IntentFilter.class),
+                eq(Context.RECEIVER_EXPORTED_UNAUDITED))).thenReturn(null);
         mShadowBluetoothAdapter.setState(BluetoothAdapter.STATE_OFF);
         verify(mSwitchController, never()).setChecked(anyBoolean());
         mBluetoothEnabler.resume(mContext);
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java
index 3b7b698..e9d834c 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java
@@ -47,7 +47,6 @@
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -155,16 +154,21 @@
     }
 
     @Test
-    @Ignore
-    public void callbackCanRegisterAndUnregister() {
+    public void onStart_registerCallback() {
         // register the callback in onStart()
         mPreConnectedDeviceController.onStart();
 
         verify(mBluetoothDeviceUpdater).registerCallback();
         verify(mDockUpdater).registerCallback();
         verify(mContext).registerReceiver(mPreConnectedDeviceController.mReceiver,
-                mPreConnectedDeviceController.mIntentFilter);
+                mPreConnectedDeviceController.mIntentFilter, Context.RECEIVER_EXPORTED_UNAUDITED);
         verify(mBluetoothDeviceUpdater).refreshPreference();
+    }
+
+    @Test
+    public void onStop_unregisterCallback() {
+        // register it first
+        mContext.registerReceiver(mPreConnectedDeviceController.mReceiver, null);
 
         // unregister the callback in onStop()
         mPreConnectedDeviceController.onStop();