diff --git a/res/values/strings.xml b/res/values/strings.xml index 2369864fac8..c52b2e6d08a 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6398,6 +6398,10 @@ VPN + + Not secure + + %d not secure Adaptive connectivity diff --git a/src/com/android/settings/network/VpnPreferenceController.java b/src/com/android/settings/network/VpnPreferenceController.java index 3116dd44850..0bec7ac2dd7 100644 --- a/src/com/android/settings/network/VpnPreferenceController.java +++ b/src/com/android/settings/network/VpnPreferenceController.java @@ -124,6 +124,7 @@ public class VpnPreferenceController extends AbstractPreferenceController // Copied from SystemUI::SecurityControllerImpl SparseArray vpns = new SparseArray<>(); final List users = mUserManager.getUsers(); + int connectedLegacyVpnCount = 0; for (UserInfo user : users) { VpnConfig cfg = mVpnManager.getVpnConfig(user.id); if (cfg == null) { @@ -134,6 +135,8 @@ public class VpnPreferenceController extends AbstractPreferenceController final LegacyVpnInfo legacyVpn = mVpnManager.getLegacyVpnInfo(user.id); if (legacyVpn == null || legacyVpn.state != LegacyVpnInfo.STATE_CONNECTED) { continue; + } else { + connectedLegacyVpnCount++; } } vpns.put(user.id, cfg); @@ -146,7 +149,7 @@ public class VpnPreferenceController extends AbstractPreferenceController uid = userInfo.id; } VpnConfig vpn = vpns.get(uid); - final String summary; + String summary; if (vpn == null) { summary = mContext.getString(R.string.vpn_disconnected_summary); } else { @@ -154,9 +157,26 @@ public class VpnPreferenceController extends AbstractPreferenceController } // Optionally add warning icon if an insecure VPN is present. if (Utils.isProviderModelEnabled(mContext) && mPreference instanceof VpnInfoPreference) { - ((VpnInfoPreference) mPreference).setInsecureVpn(hasInsecureVpn()); + 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 = vpns.size() + + LegacyVpnProfileStore.list(Credentials.VPN).length + - connectedLegacyVpnCount; + if (vpnCount == 1) { + summary = mContext.getString(R.string.vpn_settings_insecure_single); + } else { + summary = mContext.getString( + R.string.vpn_settings_insecure_multiple, insecureVpnCount); + } + } } - ThreadUtils.postOnMainThread(() -> mPreference.setSummary(summary)); + final String finalSummary = summary; + ThreadUtils.postOnMainThread(() -> mPreference.setSummary(finalSummary)); } @VisibleForTesting @@ -177,17 +197,18 @@ public class VpnPreferenceController extends AbstractPreferenceController } @VisibleForTesting - protected boolean hasInsecureVpn() { + protected int getInsecureVpnCount() { + int count = 0; for (String key : LegacyVpnProfileStore.list(Credentials.VPN)) { final VpnProfile profile = VpnProfile.decode(key, LegacyVpnProfileStore.get(Credentials.VPN + key)); // Return whether any profile is an insecure type. if (VpnProfile.isLegacyType(profile.type)) { - return true; + count++; } } // We did not find any insecure VPNs. - return false; + return count; } // Copied from SystemUI::SecurityControllerImpl