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

Commit 87d20317 authored by Felipe Leme's avatar Felipe Leme Committed by android-build-merger
Browse files

Merge "Fixed connectivity state in some restricted network scenarios." into nyc-dev

am: 638a6e81

* commit '638a6e81':
  Fixed connectivity state in some restricted network scenarios.

Change-Id: I5d3fdbbff6d92be9657d3ed466462ca911d20881
parents 9c671382 638a6e81
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -23,5 +23,6 @@ oneway interface INetworkPolicyListener {
    void onMeteredIfacesChanged(in String[] meteredIfaces);
    void onRestrictBackgroundChanged(boolean restrictBackground);
    void onRestrictBackgroundWhitelistChanged(int uid, boolean whitelisted);
    void onRestrictPowerChanged(boolean restrictPower);

}
+1 −0
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ interface INetworkPolicyManager {
    /** Control if background data is restricted system-wide. */
    void setRestrictBackground(boolean restrictBackground);
    boolean getRestrictBackground();
    boolean getRestrictPower();

    /** Callback used to change internal state on tethering */
    void onTetheringChanged(String iface, boolean tethering);
+4 −0
Original line number Diff line number Diff line
@@ -90,6 +90,10 @@ public class DataSaverController {
            });
        }

        @Override
        public void onRestrictPowerChanged(boolean restrictPower) {
        }

        @Override
        public void onRestrictBackgroundWhitelistChanged(int uid, boolean whitelisted) {
        }
+52 −19
Original line number Diff line number Diff line
@@ -30,8 +30,9 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED;
import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
import static android.net.NetworkPolicyManager.RULE_ALLOW_ALL;
import static android.net.NetworkPolicyManager.RULE_ALLOW_METERED;
import static android.net.NetworkPolicyManager.MASK_METERED_NETWORKS;
import static android.net.NetworkPolicyManager.MASK_ALL_NETWORKS;
import static android.net.NetworkPolicyManager.RULE_NONE;
import static android.net.NetworkPolicyManager.RULE_REJECT_ALL;
import static android.net.NetworkPolicyManager.RULE_REJECT_METERED;
import static android.net.NetworkPolicyManager.RULE_TEMPORARY_ALLOW_METERED;
import static android.net.NetworkPolicyManager.uidRulesToString;
@@ -217,6 +218,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
    /** Flag indicating if background data is restricted. */
    @GuardedBy("mRulesLock")
    private boolean mRestrictBackground;
    /** Flag indicating if background data is restricted due to battery savings. */
    @GuardedBy("mRulesLock")
    private boolean mRestrictPower;

    final private Context mContext;
    private int mNetworkPreference;
@@ -665,9 +669,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
        try {
            mPolicyManager.setConnectivityListener(mPolicyListener);
            mRestrictBackground = mPolicyManager.getRestrictBackground();
            mRestrictPower = mPolicyManager.getRestrictPower();
        } catch (RemoteException e) {
            // ouch, no rules updates means some processes may never get network
            loge("unable to register INetworkPolicyListener" + e.toString());
            loge("unable to register INetworkPolicyListener" + e);
        }

        final PowerManager powerManager = (PowerManager) context.getSystemService(
@@ -919,22 +924,34 @@ public class ConnectivityService extends IConnectivityManager.Stub
            uidRules = mUidRules.get(uid, RULE_NONE);
        }

        switch (uidRules) {
            case RULE_ALLOW_ALL:
            case RULE_ALLOW_METERED:
            case RULE_TEMPORARY_ALLOW_METERED:
                return false;
            case RULE_REJECT_METERED:
                return networkMetered;
            case RULE_REJECT_ALL:
                return true;
            case RULE_NONE:
            default:
                // When background data is restricted device-wide, the default
                // behavior for apps should be like RULE_REJECT_METERED
                return mRestrictBackground ? networkMetered : false;
        boolean allowed = true;
        // Check Data Saver Mode first...
        if (networkMetered) {
            if ((uidRules & RULE_REJECT_METERED) != 0) {
                if (LOGD_RULES) Log.d(TAG, "uid " + uid + " is blacklisted");
                // Explicitly blacklisted.
                allowed = false;
            } else {
                allowed = !mRestrictBackground
                      || (uidRules & RULE_ALLOW_METERED) != 0
                      || (uidRules & RULE_TEMPORARY_ALLOW_METERED) != 0;
                if (LOGD_RULES) Log.d(TAG, "allowed status for uid " + uid + " when"
                        + " mRestrictBackground=" + mRestrictBackground
                        + ", whitelisted=" + ((uidRules & RULE_ALLOW_METERED) != 0)
                        + ", tempWhitelist= + ((uidRules & RULE_TEMPORARY_ALLOW_METERED) != 0)"
                        + ": " + allowed);
            }
        }
        // ...then Battery Saver Mode.
        if (allowed && mRestrictPower) {
            allowed = (uidRules & RULE_ALLOW_ALL) != 0;
            if (LOGD_RULES) Log.d(TAG, "allowed status for uid " + uid + " when"
                    + " mRestrictPower=" + mRestrictPower
                    + ", whitelisted=" + ((uidRules & RULE_ALLOW_ALL) != 0)
                    + ": " + allowed);
        }
        return !allowed;
    }

    private void maybeLogBlockedNetworkInfo(NetworkInfo ni, int uid) {
        if (ni == null || !LOGD_BLOCKED_NETWORKINFO) return;
@@ -1380,7 +1397,7 @@ public class ConnectivityService extends IConnectivityManager.Stub

            synchronized (mRulesLock) {
                // skip update when we've already applied rules
                final int oldRules = mUidRules.get(uid, RULE_ALLOW_ALL);
                final int oldRules = mUidRules.get(uid, RULE_NONE);
                if (oldRules == uidRules) return;

                mUidRules.put(uid, uidRules);
@@ -1421,6 +1438,18 @@ public class ConnectivityService extends IConnectivityManager.Stub
            }
        }

        @Override
        public void onRestrictPowerChanged(boolean restrictPower) {
            // caller is NPMS, since we only register with them
            if (LOGD_RULES) {
                log("onRestrictPowerChanged(restrictPower=" + restrictPower + ")");
            }

            synchronized (mRulesLock) {
                mRestrictPower = restrictPower;
            }
        }

        @Override
        public void onRestrictBackgroundWhitelistChanged(int uid, boolean whitelisted) {
            if (LOGD_RULES) {
@@ -1862,6 +1891,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
        pw.println(mRestrictBackground);
        pw.println();

        pw.print("Restrict power: ");
        pw.println(mRestrictPower);
        pw.println();

        pw.println("Status for known UIDs:");
        pw.increaseIndent();
        final int size = mUidRules.size();
@@ -3998,9 +4031,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
            synchronized(mRulesLock) {
                uidRules = mUidRules.get(uid, RULE_ALLOW_ALL);
            }
            if (uidRules != RULE_ALLOW_ALL) {
            if ((uidRules & RULE_ALLOW_ALL) == 0) {
                // we could silently fail or we can filter the available nets to only give
                // them those they have access to.  Chose the more useful
                // them those they have access to.  Chose the more useful option.
                networkCapabilities.addCapability(NET_CAPABILITY_NOT_METERED);
            }
        }
+5 −0
Original line number Diff line number Diff line
@@ -169,6 +169,11 @@ public class ConnectivityController extends StateController implements
            updateTrackedJobs(-1);
        }

        @Override
        public void onRestrictPowerChanged(boolean restrictPower) {
            updateTrackedJobs(-1);
        }

        @Override
        public void onRestrictBackgroundChanged(boolean restrictBackground) {
            updateTrackedJobs(-1);
Loading