summaryrefslogtreecommitdiffstats
path: root/src/com
diff options
context:
space:
mode:
authorLorenzo Colitti <lorenzo@google.com>2017-04-27 00:56:39 +0900
committerLorenzo Colitti <lorenzo@google.com>2017-05-03 22:14:08 +0900
commitb6245156f647e4e41198026ef6a3bfc54790e384 (patch)
treebaebfd0a59787da9238ca0ef655a96a5f08180a8 /src/com
parentd51b94b04207da480c000a784109416ba2f3c51e (diff)
downloadpackages_apps_Settings-b6245156f647e4e41198026ef6a3bfc54790e384.tar.gz
packages_apps_Settings-b6245156f647e4e41198026ef6a3bfc54790e384.tar.bz2
packages_apps_Settings-b6245156f647e4e41198026ef6a3bfc54790e384.zip
Add a "sign into network" button to the wifi details page.
Bug: 36203355 Test: manually signed into captive portal Test: make -j64 RunSettingsRoboTests Change-Id: I3242ef30125ddfdaaac9b80ead4f8ac14ea6d364
Diffstat (limited to 'src/com')
-rw-r--r--src/com/android/settings/vpn2/ConnectivityManagerWrapper.java33
-rw-r--r--src/com/android/settings/vpn2/ConnectivityManagerWrapperImpl.java20
-rw-r--r--src/com/android/settings/wifi/details/WifiDetailPreferenceController.java108
-rw-r--r--src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java20
4 files changed, 156 insertions, 25 deletions
diff --git a/src/com/android/settings/vpn2/ConnectivityManagerWrapper.java b/src/com/android/settings/vpn2/ConnectivityManagerWrapper.java
index 9424278c9e..9e20c9d1fd 100644
--- a/src/com/android/settings/vpn2/ConnectivityManagerWrapper.java
+++ b/src/com/android/settings/vpn2/ConnectivityManagerWrapper.java
@@ -16,6 +16,11 @@
package com.android.settings.vpn2;
+import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
+import android.net.Network;
+import android.net.NetworkRequest;
+import android.os.Handler;
import android.net.ProxyInfo;
/**
@@ -27,6 +32,11 @@ import android.net.ProxyInfo;
public interface ConnectivityManagerWrapper {
/**
+ * Returns the real ConnectivityManager object wrapped by this wrapper.
+ */
+ public ConnectivityManager getConnectivityManager();
+
+ /**
* Calls {@code ConnectivityManager.getAlwaysOnVpnPackageForUser()}.
*
* @see android.net.ConnectivityManager#getAlwaysOnVpnPackageForUser
@@ -39,4 +49,27 @@ public interface ConnectivityManagerWrapper {
* @see android.net.ConnectivityManager#getGlobalProxy
*/
ProxyInfo getGlobalProxy();
+
+ /**
+ * Calls {@code ConnectivityManager.registerNetworkCallback()}.
+ *
+ * This is part of the ConnectivityManager public API in SDK 26 or above, but is not yet visible
+ * to the robolectric tests, which currently build with SDK 23.
+ * TODO: delete this once the robolectric tests build with SDK 26 or above.
+ *
+ * @see android.net.ConnectivityManager#registerNetworkCallback(NetworkRequest,NetworkCallback,Handler)
+ */
+ public void registerNetworkCallback(NetworkRequest request, NetworkCallback callback,
+ Handler handler);
+
+ /**
+ * Calls {@code ConnectivityManager.startCaptivePortalApp()}.
+ *
+ * This is part of the ConnectivityManager public API in SDK 26 or above, but is not yet visible
+ * to the robolectric tests, which currently build with SDK 23.
+ * TODO: delete this once the robolectric tests build with SDK 26 or above.
+ *
+ * @see android.net.ConnectivityManager#startCaptivePortalApp(Network)
+ */
+ public void startCaptivePortalApp(Network network);
}
diff --git a/src/com/android/settings/vpn2/ConnectivityManagerWrapperImpl.java b/src/com/android/settings/vpn2/ConnectivityManagerWrapperImpl.java
index d3c17f210e..f742cd22b0 100644
--- a/src/com/android/settings/vpn2/ConnectivityManagerWrapperImpl.java
+++ b/src/com/android/settings/vpn2/ConnectivityManagerWrapperImpl.java
@@ -17,6 +17,10 @@
package com.android.settings.vpn2;
import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
+import android.net.Network;
+import android.net.NetworkRequest;
+import android.os.Handler;
import android.net.ProxyInfo;
public class ConnectivityManagerWrapperImpl implements ConnectivityManagerWrapper {
@@ -28,6 +32,11 @@ public class ConnectivityManagerWrapperImpl implements ConnectivityManagerWrappe
}
@Override
+ public ConnectivityManager getConnectivityManager() {
+ return mCm;
+ }
+
+ @Override
public String getAlwaysOnVpnPackageForUser(int userId) {
return mCm.getAlwaysOnVpnPackageForUser(userId);
}
@@ -36,4 +45,15 @@ public class ConnectivityManagerWrapperImpl implements ConnectivityManagerWrappe
public ProxyInfo getGlobalProxy() {
return mCm.getGlobalProxy();
}
+
+ @Override
+ public void registerNetworkCallback(NetworkRequest request, NetworkCallback callback,
+ Handler handler) {
+ mCm.registerNetworkCallback(request, callback, handler);
+ }
+
+ @Override
+ public void startCaptivePortalApp(Network network) {
+ mCm.startCaptivePortalApp(network);
+ }
}
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index 21fda306c1..341daa12d3 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -22,30 +22,38 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.drawable.Drawable;
import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
import android.net.IpPrefix;
import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkBadging;
+import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
import android.net.NetworkInfo;
import android.net.NetworkUtils;
import android.net.RouteInfo;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
+import android.os.Handler;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils;
import android.util.Log;
+import android.widget.Button;
+import android.view.View;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
+import com.android.settings.applications.LayoutPreference;
import com.android.settings.core.PreferenceController;
import com.android.settings.core.lifecycle.Lifecycle;
import com.android.settings.core.lifecycle.LifecycleObserver;
import com.android.settings.core.lifecycle.events.OnPause;
import com.android.settings.core.lifecycle.events.OnResume;
import com.android.settings.wifi.WifiDetailPreference;
+import com.android.settings.vpn2.ConnectivityManagerWrapper;
import com.android.settingslib.wifi.AccessPoint;
import java.net.Inet4Address;
@@ -55,6 +63,9 @@ import java.net.UnknownHostException;
import java.util.List;
import java.util.StringJoiner;
+import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
+
/**
* Controller for logic pertaining to displaying Wifi information for the
* {@link WifiNetworkDetailsFragment}.
@@ -67,6 +78,8 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
@VisibleForTesting
static final String KEY_CONNECTION_DETAIL_PREF = "connection_detail";
@VisibleForTesting
+ static final String KEY_BUTTONS_PREF = "buttons";
+ @VisibleForTesting
static final String KEY_SIGNAL_STRENGTH_PREF = "signal_strength";
@VisibleForTesting
static final String KEY_LINK_SPEED = "link_speed";
@@ -88,9 +101,14 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
static final String KEY_IPV6_ADDRESS_CATEGORY = "ipv6_details_category";
private AccessPoint mAccessPoint;
+ private final ConnectivityManagerWrapper mConnectivityManagerWrapper;
private final ConnectivityManager mConnectivityManager;
private final Fragment mFragment;
+ private final Handler mHandler;
+ private LinkProperties mLinkProperties;
+ private Network mNetwork;
private NetworkInfo mNetworkInfo;
+ private NetworkCapabilities mNetworkCapabilities;
private Context mPrefContext;
private int mRssi;
private String[] mSignalStr;
@@ -98,8 +116,10 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
private WifiInfo mWifiInfo;
private final WifiManager mWifiManager;
- // Preferences - in order of appearance
+ // UI elements - in order of appearance
private Preference mConnectionDetailPref;
+ private LayoutPreference mButtonsPref;
+ private Button mSignInButton;
private WifiDetailPreference mSignalStrengthPref;
private WifiDetailPreference mLinkSpeedPref;
private WifiDetailPreference mFrequencyPref;
@@ -123,18 +143,50 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
}
};
+ private final NetworkRequest mNetworkRequest = new NetworkRequest.Builder()
+ .clearCapabilities().addTransportType(TRANSPORT_WIFI).build();
+
+ // Must be run on the UI thread since it directly manipulates UI state.
+ private final NetworkCallback mNetworkCallback = new NetworkCallback() {
+ @Override
+ public void onLinkPropertiesChanged(Network network, LinkProperties lp) {
+ if (network.equals(mNetwork) && !lp.equals(mLinkProperties)) {
+ mLinkProperties = lp;
+ updateIpLayerInfo();
+ }
+ }
+
+ @Override
+ public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) {
+ if (network.equals(mNetwork) && !nc.equals(mNetworkCapabilities)) {
+ mNetworkCapabilities = nc;
+ updateIpLayerInfo();
+ }
+ }
+
+ @Override
+ public void onLost(Network network) {
+ if (network.equals(mNetwork)) {
+ exitActivity();
+ }
+ }
+ };
+
public WifiDetailPreferenceController(
AccessPoint accessPoint,
- ConnectivityManager connectivityManager,
+ ConnectivityManagerWrapper connectivityManagerWrapper,
Context context,
Fragment fragment,
+ Handler handler,
Lifecycle lifecycle,
WifiManager wifiManager) {
super(context);
mAccessPoint = accessPoint;
- mConnectivityManager = connectivityManager;
+ mConnectivityManager = connectivityManagerWrapper.getConnectivityManager();
+ mConnectivityManagerWrapper = connectivityManagerWrapper;
mFragment = fragment;
+ mHandler = handler;
mNetworkInfo = accessPoint.getNetworkInfo();
mRssi = accessPoint.getRssi();
mSignalStr = context.getResources().getStringArray(R.array.wifi_signal);
@@ -167,6 +219,12 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
mConnectionDetailPref = screen.findPreference(KEY_CONNECTION_DETAIL_PREF);
+ mButtonsPref = (LayoutPreference) screen.findPreference(KEY_BUTTONS_PREF);
+ mSignInButton = (Button) mButtonsPref.findViewById(R.id.right_button);
+ mSignInButton.setText(com.android.internal.R.string.network_available_sign_in);
+ mSignInButton.setOnClickListener(
+ view -> mConnectivityManagerWrapper.startCaptivePortalApp(mNetwork));
+
mSignalStrengthPref =
(WifiDetailPreference) screen.findPreference(KEY_SIGNAL_STRENGTH_PREF);
mLinkSpeedPref = (WifiDetailPreference) screen.findPreference(KEY_LINK_SPEED);
@@ -191,6 +249,12 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
@Override
public void onResume() {
+ mConnectivityManagerWrapper.registerNetworkCallback(mNetworkRequest, mNetworkCallback,
+ mHandler);
+ mNetwork = mWifiManager.getCurrentNetwork();
+ mLinkProperties = mConnectivityManager.getLinkProperties(mNetwork);
+ mNetworkCapabilities = mConnectivityManager.getNetworkCapabilities(mNetwork);
+
updateInfo();
mContext.registerReceiver(mReceiver, mFilter);
@@ -198,13 +262,17 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
@Override
public void onPause() {
+ mNetwork = null;
+ mLinkProperties = null;
+ mNetworkCapabilities = null;
mContext.unregisterReceiver(mReceiver);
+ mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
}
private void updateInfo() {
- mNetworkInfo = mConnectivityManager.getNetworkInfo(mWifiManager.getCurrentNetwork());
+ mNetworkInfo = mConnectivityManager.getNetworkInfo(mNetwork);
mWifiInfo = mWifiManager.getConnectionInfo();
- if (mNetworkInfo == null || mWifiInfo == null) {
+ if (mNetwork == null || mNetworkInfo == null || mWifiInfo == null) {
exitActivity();
return;
}
@@ -238,7 +306,7 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
}
mFrequencyPref.setDetailText(band);
- setIpText();
+ updateIpLayerInfo();
}
private void exitActivity() {
@@ -270,7 +338,9 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
mSignalStrengthPref.setDetailText(mSignalStr[summarySignalLevel]);
}
- private void setIpText() {
+ private void updateIpLayerInfo() {
+ mSignInButton.setVisibility(canSignIntoNetwork() ? View.VISIBLE : View.INVISIBLE);
+
// Reset all fields
mIpv6AddressCategory.removeAll();
mIpv6AddressCategory.setVisible(false);
@@ -279,18 +349,12 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
mGatewayPref.setVisible(false);
mDnsPref.setVisible(false);
- Network currentNetwork = mWifiManager.getCurrentNetwork();
- if (currentNetwork == null) {
+ if (mNetwork == null || mLinkProperties == null) {
return;
}
+ List<InetAddress> addresses = mLinkProperties.getAddresses();
- LinkProperties linkProperties = mConnectivityManager.getLinkProperties(currentNetwork);
- if (linkProperties == null) {
- return;
- }
- List<InetAddress> addresses = linkProperties.getAddresses();
-
- // Set IPv4 and Ipv6 addresses
+ // Set IPv4 and IPv6 addresses
for (int i = 0; i < addresses.size(); i++) {
InetAddress addr = addresses.get(i);
if (addr instanceof Inet4Address) {
@@ -310,7 +374,7 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
// Set up IPv4 gateway and subnet mask
String gateway = null;
String subnet = null;
- for (RouteInfo routeInfo : linkProperties.getRoutes()) {
+ for (RouteInfo routeInfo : mLinkProperties.getRoutes()) {
if (routeInfo.hasGateway() && routeInfo.getGateway() instanceof Inet4Address) {
gateway = routeInfo.getGateway().getHostAddress();
}
@@ -333,7 +397,7 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
// Set IPv4 DNS addresses
StringJoiner stringJoiner = new StringJoiner(",");
- for (InetAddress dnsServer : linkProperties.getDnsServers()) {
+ for (InetAddress dnsServer : mLinkProperties.getDnsServers()) {
if (dnsServer instanceof Inet4Address) {
stringJoiner.add(dnsServer.getHostAddress());
}
@@ -363,6 +427,14 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
}
/**
+ * Returns whether the user can sign into the network represented by this preference.
+ */
+ private boolean canSignIntoNetwork() {
+ return mNetworkCapabilities != null && mNetworkCapabilities.hasCapability(
+ NET_CAPABILITY_CAPTIVE_PORTAL);
+ }
+
+ /**
* Forgets the wifi network associated with this preference.
*/
public void forgetNetwork() {
diff --git a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
index adcfcc0b3a..fe16cdb030 100644
--- a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
+++ b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
@@ -17,8 +17,12 @@ package com.android.settings.wifi.details;
import android.content.Context;
import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
+import android.net.NetworkRequest;
import android.net.wifi.WifiManager;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
import android.widget.Button;
import com.android.internal.logging.nano.MetricsProto;
@@ -26,6 +30,7 @@ import com.android.settings.R;
import com.android.settings.applications.LayoutPreference;
import com.android.settings.core.PreferenceController;
import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.vpn2.ConnectivityManagerWrapperImpl;
import com.android.settingslib.wifi.AccessPoint;
import java.util.ArrayList;
@@ -40,9 +45,6 @@ import java.util.List;
public class WifiNetworkDetailsFragment extends DashboardFragment {
private static final String TAG = "WifiNetworkDetailsFrg";
- // XML KEYS
- private static final String KEY_FORGET_BUTTON = "forget_button";
-
private AccessPoint mAccessPoint;
private Button mForgetButton;
private WifiDetailPreferenceController mWifiDetailPreferenceController;
@@ -59,9 +61,11 @@ public class WifiNetworkDetailsFragment extends DashboardFragment {
// Header Title set automatically from launching Preference
- LayoutPreference forgetPreference = ((LayoutPreference) findPreference(KEY_FORGET_BUTTON));
- forgetPreference.setVisible(mWifiDetailPreferenceController.canForgetNetwork());
- mForgetButton = (Button) forgetPreference.findViewById(R.id.button);
+ LayoutPreference buttonsPreference = ((LayoutPreference) findPreference(
+ WifiDetailPreferenceController.KEY_BUTTONS_PREF));
+ buttonsPreference.setVisible(mWifiDetailPreferenceController.canForgetNetwork());
+
+ mForgetButton = (Button) buttonsPreference.findViewById(R.id.left_button);
mForgetButton.setText(R.string.forget);
mForgetButton.setOnClickListener(view -> forgetNetwork());
}
@@ -88,11 +92,13 @@ public class WifiNetworkDetailsFragment extends DashboardFragment {
@Override
protected List<PreferenceController> getPreferenceControllers(Context context) {
+ ConnectivityManager cm = context.getSystemService(ConnectivityManager.class);
mWifiDetailPreferenceController = new WifiDetailPreferenceController(
mAccessPoint,
- context.getSystemService(ConnectivityManager.class),
+ new ConnectivityManagerWrapperImpl(cm),
context,
this,
+ new Handler(Looper.getMainLooper()), // UI thread.
getLifecycle(),
context.getSystemService(WifiManager.class));