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

Commit 638a6e81 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

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

parents ba83e90e d31a97fd
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -23,5 +23,6 @@ oneway interface INetworkPolicyListener {
    void onMeteredIfacesChanged(in String[] meteredIfaces);
    void onMeteredIfacesChanged(in String[] meteredIfaces);
    void onRestrictBackgroundChanged(boolean restrictBackground);
    void onRestrictBackgroundChanged(boolean restrictBackground);
    void onRestrictBackgroundWhitelistChanged(int uid, boolean whitelisted);
    void onRestrictBackgroundWhitelistChanged(int uid, boolean whitelisted);
    void onRestrictPowerChanged(boolean restrictPower);


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


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


        @Override
        public void onRestrictPowerChanged(boolean restrictPower) {
        }

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


    final private Context mContext;
    final private Context mContext;
    private int mNetworkPreference;
    private int mNetworkPreference;
@@ -665,9 +669,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
        try {
        try {
            mPolicyManager.setConnectivityListener(mPolicyListener);
            mPolicyManager.setConnectivityListener(mPolicyListener);
            mRestrictBackground = mPolicyManager.getRestrictBackground();
            mRestrictBackground = mPolicyManager.getRestrictBackground();
            mRestrictPower = mPolicyManager.getRestrictPower();
        } catch (RemoteException e) {
        } catch (RemoteException e) {
            // ouch, no rules updates means some processes may never get network
            // 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(
        final PowerManager powerManager = (PowerManager) context.getSystemService(
@@ -919,22 +924,34 @@ public class ConnectivityService extends IConnectivityManager.Stub
            uidRules = mUidRules.get(uid, RULE_NONE);
            uidRules = mUidRules.get(uid, RULE_NONE);
        }
        }


        switch (uidRules) {
        boolean allowed = true;
            case RULE_ALLOW_ALL:
        // Check Data Saver Mode first...
            case RULE_ALLOW_METERED:
        if (networkMetered) {
            case RULE_TEMPORARY_ALLOW_METERED:
            if ((uidRules & RULE_REJECT_METERED) != 0) {
                return false;
                if (LOGD_RULES) Log.d(TAG, "uid " + uid + " is blacklisted");
            case RULE_REJECT_METERED:
                // Explicitly blacklisted.
                return networkMetered;
                allowed = false;
            case RULE_REJECT_ALL:
            } else {
                return true;
                allowed = !mRestrictBackground
            case RULE_NONE:
                      || (uidRules & RULE_ALLOW_METERED) != 0
            default:
                      || (uidRules & RULE_TEMPORARY_ALLOW_METERED) != 0;
                // When background data is restricted device-wide, the default
                if (LOGD_RULES) Log.d(TAG, "allowed status for uid " + uid + " when"
                // behavior for apps should be like RULE_REJECT_METERED
                        + " mRestrictBackground=" + mRestrictBackground
                return mRestrictBackground ? networkMetered : false;
                        + ", 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) {
    private void maybeLogBlockedNetworkInfo(NetworkInfo ni, int uid) {
        if (ni == null || !LOGD_BLOCKED_NETWORKINFO) return;
        if (ni == null || !LOGD_BLOCKED_NETWORKINFO) return;
@@ -1380,7 +1397,7 @@ public class ConnectivityService extends IConnectivityManager.Stub


            synchronized (mRulesLock) {
            synchronized (mRulesLock) {
                // skip update when we've already applied rules
                // 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;
                if (oldRules == uidRules) return;


                mUidRules.put(uid, uidRules);
                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
        @Override
        public void onRestrictBackgroundWhitelistChanged(int uid, boolean whitelisted) {
        public void onRestrictBackgroundWhitelistChanged(int uid, boolean whitelisted) {
            if (LOGD_RULES) {
            if (LOGD_RULES) {
@@ -1862,6 +1891,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
        pw.println(mRestrictBackground);
        pw.println(mRestrictBackground);
        pw.println();
        pw.println();


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

        pw.println("Status for known UIDs:");
        pw.println("Status for known UIDs:");
        pw.increaseIndent();
        pw.increaseIndent();
        final int size = mUidRules.size();
        final int size = mUidRules.size();
@@ -3998,9 +4031,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
            synchronized(mRulesLock) {
            synchronized(mRulesLock) {
                uidRules = mUidRules.get(uid, RULE_ALLOW_ALL);
                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
                // 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);
                networkCapabilities.addCapability(NET_CAPABILITY_NOT_METERED);
            }
            }
        }
        }
+5 −0
Original line number Original line Diff line number Diff line
@@ -169,6 +169,11 @@ public class ConnectivityController extends StateController implements
            updateTrackedJobs(-1);
            updateTrackedJobs(-1);
        }
        }


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

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