Modify dialog message for partial connectivity

In some networks, network validation may only get success
result for http probe but fail result for https probe.
For this kind of network, it may still work at some websites
or apps, but user didn't know about that. In order to fix this
issue, we will check if network has partial connectivity and
notify user to make a choice if they want to use this partial
connectivity or not.

Bug: 113450764
Bug: 128489091
Test: 1. Build pass.
      2. make -j44 RunSettingsRoboTests
      ROBOTEST_FILTER=WifiDetailPreferenceControllerTest
      3. Change captive_portal_https_url to https://invalid.com
      to simulate partial connectivity.

Change-Id: I0e87f6f2ede173f45a7b6fcf842b4f9a83d8efa1
This commit is contained in:
lucaslin
2019-03-20 11:41:21 +08:00
parent e230d19810
commit 7335c594be
5 changed files with 40 additions and 9 deletions

View File

@@ -340,7 +340,7 @@
android:clearTaskOnLaunch="true" android:clearTaskOnLaunch="true"
android:excludeFromRecents="true" android:excludeFromRecents="true"
android:exported="true" android:exported="true"
android:permission="android.permission.CONNECTIVITY_INTERNAL" android:permission="android.permission.NETWORK_STACK"
android:theme="@*android:style/Theme.DeviceDefault.Light.Dialog.Alert"> android:theme="@*android:style/Theme.DeviceDefault.Light.Dialog.Alert">
<intent-filter> <intent-filter>
<action android:name="android.net.conn.PROMPT_UNVALIDATED" /> <action android:name="android.net.conn.PROMPT_UNVALIDATED" />

View File

@@ -2213,6 +2213,8 @@
<!-- Dialog text to tell the user that the selected network does not have Internet access. --> <!-- Dialog text to tell the user that the selected network does not have Internet access. -->
<string name="no_internet_access_text">This network has no internet access. Stay connected?</string> <string name="no_internet_access_text">This network has no internet access. Stay connected?</string>
<!-- Dialog text to tell the user that the selected network has incomplete Internet access. [CHAR LIMIT=100] -->
<string name="partial_connectivity_text">Some apps and services may not work due to limited connectivity. Use anyway?</string>
<string name="no_internet_access_remember">Don\u2019t ask again for this network</string> <string name="no_internet_access_remember">Don\u2019t ask again for this network</string>
<!-- Dialog text to tell the user that the selected network has lost Internet access, and asking the user whether they want to avoid this network. --> <!-- Dialog text to tell the user that the selected network has lost Internet access, and asking the user whether they want to avoid this network. -->

View File

@@ -17,6 +17,7 @@
package com.android.settings.wifi; package com.android.settings.wifi;
import static android.net.ConnectivityManager.ACTION_PROMPT_LOST_VALIDATION; import static android.net.ConnectivityManager.ACTION_PROMPT_LOST_VALIDATION;
import static android.net.ConnectivityManager.ACTION_PROMPT_PARTIAL_CONNECTIVITY;
import static android.net.ConnectivityManager.ACTION_PROMPT_UNVALIDATED; import static android.net.ConnectivityManager.ACTION_PROMPT_UNVALIDATED;
import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED; import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
@@ -53,8 +54,9 @@ public final class WifiNoInternetDialog extends AlertActivity implements
private String mAction; private String mAction;
private boolean isKnownAction(Intent intent) { private boolean isKnownAction(Intent intent) {
return intent.getAction().equals(ACTION_PROMPT_UNVALIDATED) || return intent.getAction().equals(ACTION_PROMPT_UNVALIDATED)
intent.getAction().equals(ACTION_PROMPT_LOST_VALIDATION); || intent.getAction().equals(ACTION_PROMPT_LOST_VALIDATION)
|| intent.getAction().equals(ACTION_PROMPT_PARTIAL_CONNECTIVITY);
} }
@Override @Override
@@ -131,6 +133,11 @@ public final class WifiNoInternetDialog extends AlertActivity implements
ap.mMessage = getString(R.string.no_internet_access_text); ap.mMessage = getString(R.string.no_internet_access_text);
ap.mPositiveButtonText = getString(R.string.yes); ap.mPositiveButtonText = getString(R.string.yes);
ap.mNegativeButtonText = getString(R.string.no); ap.mNegativeButtonText = getString(R.string.no);
} else if (ACTION_PROMPT_PARTIAL_CONNECTIVITY.equals(mAction)) {
ap.mTitle = mNetworkName;
ap.mMessage = getString(R.string.partial_connectivity_text);
ap.mPositiveButtonText = getString(R.string.yes);
ap.mNegativeButtonText = getString(R.string.no);
} else { } else {
ap.mTitle = getString(R.string.lost_internet_access_title); ap.mTitle = getString(R.string.lost_internet_access_title);
ap.mMessage = getString(R.string.lost_internet_access_text); ap.mMessage = getString(R.string.lost_internet_access_text);
@@ -146,7 +153,8 @@ public final class WifiNoInternetDialog extends AlertActivity implements
ap.mView = checkbox; ap.mView = checkbox;
mAlwaysAllow = (CheckBox) checkbox.findViewById(com.android.internal.R.id.alwaysUse); mAlwaysAllow = (CheckBox) checkbox.findViewById(com.android.internal.R.id.alwaysUse);
if (ACTION_PROMPT_UNVALIDATED.equals(mAction)) { if (ACTION_PROMPT_UNVALIDATED.equals(mAction)
|| ACTION_PROMPT_PARTIAL_CONNECTIVITY.equals(mAction)) {
mAlwaysAllow.setText(getString(R.string.no_internet_access_remember)); mAlwaysAllow.setText(getString(R.string.no_internet_access_remember));
} else { } else {
mAlwaysAllow.setText(getString(R.string.lost_internet_access_persist)); mAlwaysAllow.setText(getString(R.string.lost_internet_access_persist));
@@ -174,6 +182,11 @@ public final class WifiNoInternetDialog extends AlertActivity implements
final boolean accept = (which == BUTTON_POSITIVE); final boolean accept = (which == BUTTON_POSITIVE);
action = (accept ? "Connect" : "Ignore"); action = (accept ? "Connect" : "Ignore");
mCM.setAcceptUnvalidated(mNetwork, accept, always); mCM.setAcceptUnvalidated(mNetwork, accept, always);
} else if (ACTION_PROMPT_PARTIAL_CONNECTIVITY.equals(mAction)) {
what = "PARTIAL_CONNECTIVITY";
final boolean accept = (which == BUTTON_POSITIVE);
action = (accept ? "Connect" : "Ignore");
mCM.setAcceptPartialConnectivity(mNetwork, accept, always);
} else { } else {
what = "LOST_INTERNET"; what = "LOST_INTERNET";
final boolean avoid = (which == BUTTON_POSITIVE); final boolean avoid = (which == BUTTON_POSITIVE);

View File

@@ -16,6 +16,7 @@
package com.android.settings.wifi.details; package com.android.settings.wifi.details;
import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL; import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
import static android.net.NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY;
import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED; import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI; import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
@@ -210,12 +211,14 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController
@Override @Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) { public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) {
// If the network just validated or lost Internet access, refresh network state. // If the network just validated or lost Internet access or detected partial internet
// Don't do this on every NetworkCapabilities change because update accesspoint notify // connectivity, refresh network state. Don't do this on every NetworkCapabilities
// changed for accesspoint changed on the main thread, which can cause jank. // change because refreshNetworkState sends IPCs to the system server from the UI
// thread, which can cause jank.
if (network.equals(mNetwork) && !nc.equals(mNetworkCapabilities)) { if (network.equals(mNetwork) && !nc.equals(mNetworkCapabilities)) {
if (hasCapabilityChanged(nc, NET_CAPABILITY_VALIDATED) || if (hasCapabilityChanged(nc, NET_CAPABILITY_VALIDATED)
hasCapabilityChanged(nc, NET_CAPABILITY_CAPTIVE_PORTAL)) { || hasCapabilityChanged(nc, NET_CAPABILITY_CAPTIVE_PORTAL)
|| hasCapabilityChanged(nc, NET_CAPABILITY_PARTIAL_CONNECTIVITY)) {
mAccessPoint.update(mWifiConfig, mWifiInfo, mNetworkInfo); mAccessPoint.update(mWifiConfig, mWifiInfo, mNetworkInfo);
refreshEntityHeader(); refreshEntityHeader();
} }

View File

@@ -649,6 +649,19 @@ public class WifiDetailPreferenceControllerTest {
nc.removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED); nc.removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
updateNetworkCapabilities(nc); updateNetworkCapabilities(nc);
inOrder.verify(mockHeaderController).setSummary(summary); inOrder.verify(mockHeaderController).setSummary(summary);
// UI will be refreshed when device connects to a partial connectivity network.
summary = "Limited connection";
when(mockAccessPoint.getSettingsSummary()).thenReturn(summary);
nc.addCapability(NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY);
updateNetworkCapabilities(nc);
inOrder.verify(mockHeaderController).setSummary(summary);
// Although UI will be refreshed when network become validated. The Settings should
// continue to display "Limited connection" if network still provides partial connectivity.
nc.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
updateNetworkCapabilities(nc);
inOrder.verify(mockHeaderController).setSummary(summary);
} }
@Test @Test