diff options
author | Lorenzo Colitti <lorenzo@google.com> | 2017-04-27 00:56:39 +0900 |
---|---|---|
committer | Lorenzo Colitti <lorenzo@google.com> | 2017-05-03 22:14:08 +0900 |
commit | b6245156f647e4e41198026ef6a3bfc54790e384 (patch) | |
tree | baebfd0a59787da9238ca0ef655a96a5f08180a8 /src/com | |
parent | d51b94b04207da480c000a784109416ba2f3c51e (diff) | |
download | packages_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')
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)); |