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

Commit b1a65ee1 authored by Felipe Leme's avatar Felipe Leme
Browse files

Changed list metered-networks so it returns all networks.

Prior to this change it was relying on NMPS.getNetworkPolicies(), which
would not return networks that never had any policy attribute (like
metered) set.

This change fix this problem by also querying the WifiManager for the
list of saved wi-fi networks. In fact, the new logic is very similar to
what's done on SettingLib's NetworkPolicyEditor.

BUG: 26685616
Change-Id: I42f37de3a7367718036f45b15c6b5d37b67e7d01
parent ed330c7f
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -760,9 +760,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
                if (policy == null && meteredHint) {
                    // policy doesn't exist, and AP is hinting that it's
                    // metered: create an inferred policy.
                    policy = new NetworkPolicy(template, CYCLE_NONE, Time.TIMEZONE_UTC,
                            WARNING_DISABLED, LIMIT_DISABLED, SNOOZE_NEVER, SNOOZE_NEVER,
                            meteredHint, true);
                    policy = newWifiPolicy(template, meteredHint);
                    addNetworkPolicyLocked(policy);

                } else if (policy != null && policy.inferred) {
@@ -778,6 +776,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
        }
    };

    static NetworkPolicy newWifiPolicy(NetworkTemplate template, boolean metered) {
        return new NetworkPolicy(template, CYCLE_NONE, Time.TIMEZONE_UTC,
                WARNING_DISABLED, LIMIT_DISABLED, SNOOZE_NEVER, SNOOZE_NEVER,
                metered, true);
    }

    /**
     * Observer that watches for {@link INetworkManagementService} alerts.
     */
@@ -2154,7 +2158,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
    @Override
    public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err,
            String[] args, ResultReceiver resultReceiver) throws RemoteException {
        (new NetworkPolicyManagerShellCommand(this)).exec(
        (new NetworkPolicyManagerShellCommand(mContext, this)).exec(
                this, in, out, err, args, resultReceiver);
    }

+62 −18
Original line number Diff line number Diff line
@@ -16,14 +16,22 @@

package com.android.server.net;

import static android.net.wifi.WifiInfo.removeDoubleQuotes;
import static com.android.server.net.NetworkPolicyManagerService.newWifiPolicy;
import static com.android.server.net.NetworkPolicyManagerService.TAG;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import android.content.Context;
import android.net.INetworkPolicyManager;
import android.net.NetworkPolicy;
import android.net.NetworkTemplate;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Binder;
import android.os.RemoteException;
import android.os.ShellCommand;
@@ -31,10 +39,12 @@ import android.util.Log;

class NetworkPolicyManagerShellCommand extends ShellCommand {

    final INetworkPolicyManager mInterface;
    private final INetworkPolicyManager mInterface;
    private final WifiManager mWifiManager;

    NetworkPolicyManagerShellCommand(INetworkPolicyManager service) {
    NetworkPolicyManagerShellCommand(Context context, INetworkPolicyManager service) {
        mInterface = service;
        mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    }

    @Override
@@ -100,7 +110,7 @@ class NetworkPolicyManagerShellCommand extends ShellCommand {
        }
        switch(type) {
            case "metered-network":
                return getNonMobileMeteredNetwork();
                return getMeteredWifiNetwork();
            case "restrict-background":
                return getRestrictBackground();
        }
@@ -117,7 +127,7 @@ class NetworkPolicyManagerShellCommand extends ShellCommand {
        }
        switch(type) {
            case "metered-network":
                return setNonMobileMeteredNetwork();
                return setMeteredWifiNetwork();
            case "restrict-background":
                return setRestrictBackground();
        }
@@ -134,9 +144,9 @@ class NetworkPolicyManagerShellCommand extends ShellCommand {
        }
        switch(type) {
            case "metered-networks":
                return listNonMobileMeteredNetworks();
                return listMeteredWifiNetworks();
            case "restrict-background-whitelist":
                return runListRestrictBackgroundWhitelist();
                return listRestrictBackgroundWhitelist();
        }
        pw.println("Error: unknown list type '" + type + "'");
        return -1;
@@ -172,7 +182,7 @@ class NetworkPolicyManagerShellCommand extends ShellCommand {
        return -1;
    }

    private int runListRestrictBackgroundWhitelist() throws RemoteException {
    private int listRestrictBackgroundWhitelist() throws RemoteException {
        final PrintWriter pw = getOutPrintWriter();
        final int[] uids = mInterface.getRestrictBackgroundWhitelistedUids();
        pw.print("Restrict background whitelisted UIDs: ");
@@ -238,11 +248,11 @@ class NetworkPolicyManagerShellCommand extends ShellCommand {
        return 0;
    }

    private int listNonMobileMeteredNetworks() throws RemoteException {
    private int listMeteredWifiNetworks() throws RemoteException {
        final PrintWriter pw = getOutPrintWriter();
        final String arg = getNextArg();
        final Boolean filter = arg == null ? null : Boolean.valueOf(arg);
        for (NetworkPolicy policy : getNonMobilePolicies()) {
        for (NetworkPolicy policy : getWifiPolicies()) {
            if (filter != null && filter.booleanValue() != policy.metered) {
                continue;
            }
@@ -253,14 +263,14 @@ class NetworkPolicyManagerShellCommand extends ShellCommand {
        return 0;
    }

    private int getNonMobileMeteredNetwork() throws RemoteException {
    private int getMeteredWifiNetwork() throws RemoteException {
        final PrintWriter pw = getOutPrintWriter();
        final String id = getNextArg();
        if (id == null) {
            pw.println("Error: didn't specify ID");
            return -1;
        }
        final List<NetworkPolicy> policies = getNonMobilePolicies();
        final List<NetworkPolicy> policies = getWifiPolicies();
        for (NetworkPolicy policy: policies) {
            if (id.equals(getNetworkId(policy))) {
                pw.println(policy.metered);
@@ -270,7 +280,7 @@ class NetworkPolicyManagerShellCommand extends ShellCommand {
        return 0;
    }

    private int setNonMobileMeteredNetwork() throws RemoteException {
    private int setMeteredWifiNetwork() throws RemoteException {
        final PrintWriter pw = getOutPrintWriter();
        final String id = getNextArg();
        if (id == null) {
@@ -285,6 +295,7 @@ class NetworkPolicyManagerShellCommand extends ShellCommand {
        final boolean metered = Boolean.valueOf(arg);
        final NetworkPolicy[] policies = mInterface.getNetworkPolicies(null);
        boolean changed = false;
        // First try to find a policy with such id
        for (NetworkPolicy policy : policies) {
            if (policy.template.isMatchRuleMobile() || policy.metered == metered) {
                continue;
@@ -298,24 +309,57 @@ class NetworkPolicyManagerShellCommand extends ShellCommand {
        }
        if (changed) {
            mInterface.setNetworkPolicies(policies);
            return 0;
        }
        // Policy not found: check if there is a saved wi-fi with such id.
        for (WifiConfiguration config : mWifiManager.getConfiguredNetworks()) {
            final String ssid = removeDoubleQuotes(config.SSID);
            if (id.equals(ssid)) {
                final NetworkPolicy policy = newPolicy(ssid);
                Log.i(TAG, "Creating new policy for " + ssid + ": " + policy);
                final NetworkPolicy[] newPolicies = new NetworkPolicy[policies.length + 1];
                System.arraycopy(policies, 0, newPolicies, 0, policies.length);
                newPolicies[newPolicies.length - 1] = policy;
                mInterface.setNetworkPolicies(newPolicies);
            }
        }
        return 0;
    }

    private List<NetworkPolicy> getNonMobilePolicies() throws RemoteException {
    private List<NetworkPolicy> getWifiPolicies() throws RemoteException {
        // First gets a list of saved wi-fi networks.
        final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
        final Set<String> ssids = new HashSet<>(configs.size());
        for (WifiConfiguration config : configs) {
            ssids.add(removeDoubleQuotes(config.SSID));
        }

        // Then gets the saved policies.
        final NetworkPolicy[] policies = mInterface.getNetworkPolicies(null);
        final List<NetworkPolicy> nonMobilePolicies = new ArrayList<NetworkPolicy>(policies.length);
        final List<NetworkPolicy> wifiPolicies = new ArrayList<NetworkPolicy>(policies.length);
        for (NetworkPolicy policy: policies) {
            if (!policy.template.isMatchRuleMobile()) {
                nonMobilePolicies.add(policy);
                wifiPolicies.add(policy);
                final String netId = getNetworkId(policy);
                ssids.remove(netId);
            }
        }
        // Finally, creates new default policies for saved WI-FIs not policied yet.
        for (String ssid : ssids) {
            final NetworkPolicy policy = newPolicy(ssid);
            wifiPolicies.add(policy);
        }
        return nonMobilePolicies;
        return wifiPolicies;
    }

    private NetworkPolicy newPolicy(String ssid) {
        final NetworkTemplate template = NetworkTemplate.buildTemplateWifi(ssid);
        final NetworkPolicy policy = newWifiPolicy(template, false);
        return policy;
    }

    private String getNetworkId(NetworkPolicy policy) {
        // ids are typically enclosed on double quotes (")
        return policy.template.getNetworkId().replaceAll("^\"|\"$", "");
        return removeDoubleQuotes(policy.template.getNetworkId());
    }

    private int getNextBooleanArg() {