Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 33b0104c authored by Lorenzo Colitti's avatar Lorenzo Colitti Committed by Android (Google) Code Review
Browse files

Merge "Add a "sign into network" button to the wifi details page." into oc-dev

parents 3a1d6db0 b6245156
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -28,9 +28,9 @@
            android:key="general_details_category" >
        <!-- Buttons -->
        <com.android.settings.applications.LayoutPreference
                android:key="forget_button"
                android:selectable="false"
                android:layout="@layout/single_button_panel" />
            android:key="buttons"
            android:layout="@layout/two_buttons_panel"
            android:selectable="false" />

        <com.android.settings.wifi.WifiDetailPreference
                android:key="signal_strength"
+33 −0
Original line number Diff line number Diff line
@@ -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;

/**
@@ -26,6 +31,11 @@ import android.net.ProxyInfo;
 */
public interface ConnectivityManagerWrapper {

    /**
     * Returns the real ConnectivityManager object wrapped by this wrapper.
     */
    public ConnectivityManager getConnectivityManager();

    /**
     * Calls {@code 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);
}
+20 −0
Original line number Diff line number Diff line
@@ -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 {
@@ -27,6 +31,11 @@ public class ConnectivityManagerWrapperImpl implements ConnectivityManagerWrappe
        mCm = cm;
    }

    @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);
    }
}
+90 −18
Original line number Diff line number Diff line
@@ -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());
            }
@@ -362,6 +426,14 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
        return mWifiInfo != null && mWifiInfo.isEphemeral() || mWifiConfig != null;
    }

    /**
     * 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.
     */
+13 −7
Original line number Diff line number Diff line
@@ -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));

Loading