From 411435b66982a4fc51186558058606e03c547a43 Mon Sep 17 00:00:00 2001 From: lucaslin Date: Wed, 20 Mar 2019 11:41:21 +0800 Subject: [PATCH] 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 Merged-In: I0e87f6f2ede173f45a7b6fcf842b4f9a83d8efa1 --- AndroidManifest.xml | 2 +- res/values/strings.xml | 2 ++ .../settings/wifi/WifiNoInternetDialog.java | 19 ++++++++++++++++--- .../WifiDetailPreferenceController.java | 13 ++++++++----- .../WifiDetailPreferenceControllerTest.java | 13 +++++++++++++ 5 files changed, 40 insertions(+), 9 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 5c0256b614c..0271c92c326 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -348,7 +348,7 @@ android:clearTaskOnLaunch="true" android:excludeFromRecents="true" android:exported="true" - android:permission="android.permission.CONNECTIVITY_INTERNAL" + android:permission="android.permission.NETWORK_STACK" android:taskAffinity="" android:theme="@*android:style/Theme.DeviceDefault.Light.Dialog.Alert"> diff --git a/res/values/strings.xml b/res/values/strings.xml index 8790dcb6f3f..44e26c33dba 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2040,6 +2040,8 @@ This network has no internet access. Stay connected? + + Some apps and services may not work due to limited connectivity. Use anyway? Don\u2019t ask again for this network diff --git a/src/com/android/settings/wifi/WifiNoInternetDialog.java b/src/com/android/settings/wifi/WifiNoInternetDialog.java index b175665a943..e641f2cc097 100644 --- a/src/com/android/settings/wifi/WifiNoInternetDialog.java +++ b/src/com/android/settings/wifi/WifiNoInternetDialog.java @@ -38,6 +38,7 @@ import com.android.internal.app.AlertController; import com.android.settings.R; 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.NetworkCapabilities.NET_CAPABILITY_VALIDATED; @@ -53,8 +54,9 @@ public final class WifiNoInternetDialog extends AlertActivity implements private String mAction; private boolean isKnownAction(Intent intent) { - return intent.getAction().equals(ACTION_PROMPT_UNVALIDATED) || - intent.getAction().equals(ACTION_PROMPT_LOST_VALIDATION); + return intent.getAction().equals(ACTION_PROMPT_UNVALIDATED) + || intent.getAction().equals(ACTION_PROMPT_LOST_VALIDATION) + || intent.getAction().equals(ACTION_PROMPT_PARTIAL_CONNECTIVITY); } @Override @@ -131,6 +133,11 @@ public final class WifiNoInternetDialog extends AlertActivity implements ap.mMessage = getString(R.string.no_internet_access_text); ap.mPositiveButtonText = getString(R.string.yes); 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 { ap.mTitle = getString(R.string.lost_internet_access_title); ap.mMessage = getString(R.string.lost_internet_access_text); @@ -146,7 +153,8 @@ public final class WifiNoInternetDialog extends AlertActivity implements ap.mView = checkbox; 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)); } else { 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); action = (accept ? "Connect" : "Ignore"); 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 { what = "LOST_INTERNET"; final boolean avoid = (which == BUTTON_POSITIVE); diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java index fda5ce49347..dece92787d7 100644 --- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java +++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java @@ -16,6 +16,7 @@ package com.android.settings.wifi.details; 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.TRANSPORT_WIFI; @@ -192,12 +193,14 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController @Override public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) { - // If the network just validated or lost Internet access, refresh network state. - // Don't do this on every NetworkCapabilities change because refreshNetworkState - // sends IPCs to the system server from the UI thread, which can cause jank. + // If the network just validated or lost Internet access or detected partial internet + // connectivity, refresh network state. Don't do this on every NetworkCapabilities + // 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 (hasCapabilityChanged(nc, NET_CAPABILITY_VALIDATED) || - hasCapabilityChanged(nc, NET_CAPABILITY_CAPTIVE_PORTAL)) { + if (hasCapabilityChanged(nc, NET_CAPABILITY_VALIDATED) + || hasCapabilityChanged(nc, NET_CAPABILITY_CAPTIVE_PORTAL) + || hasCapabilityChanged(nc, NET_CAPABILITY_PARTIAL_CONNECTIVITY)) { refreshNetworkState(); } mNetworkCapabilities = nc; diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java index 435882b1790..d5fd48e3615 100644 --- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java @@ -622,6 +622,19 @@ public class WifiDetailPreferenceControllerTest { nc.removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED); updateNetworkCapabilities(nc); 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