Loading core/java/android/app/job/JobInfo.java +33 −4 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package android.app.job; import static android.util.TimeUtils.formatDuration; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; Loading @@ -24,7 +26,6 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.PersistableBundle; import android.util.Log; import static android.util.TimeUtils.formatDuration; import java.util.ArrayList; Loading Loading @@ -154,6 +155,20 @@ public class JobInfo implements Parcelable { */ public static final int PRIORITY_ADJ_ALWAYS_RUNNING = -80; /** * Indicates that the implementation of this job will be using * {@link JobService#startForeground(int, android.app.Notification)} to run * in the foreground. * <p> * When set, the internal scheduling of this job will ignore any background * network restrictions for the requesting app. Note that this flag alone * doesn't actually place your {@link JobService} in the foreground; you * still need to post the notification yourself. * * @hide */ public static final int FLAG_WILL_BE_FOREGROUND = 1 << 0; private final int jobId; private final PersistableBundle extras; private final ComponentName service; Loading @@ -174,6 +189,7 @@ public class JobInfo implements Parcelable { private final long initialBackoffMillis; private final int backoffPolicy; private final int priority; private final int flags; /** * Unique job id associated with this class. This is assigned to your job by the scheduler. Loading Loading @@ -201,6 +217,11 @@ public class JobInfo implements Parcelable { return priority; } /** @hide */ public int getFlags() { return flags; } /** * Whether this job needs the device to be plugged in. */ Loading Loading @@ -356,6 +377,7 @@ public class JobInfo implements Parcelable { hasEarlyConstraint = in.readInt() == 1; hasLateConstraint = in.readInt() == 1; priority = in.readInt(); flags = in.readInt(); } private JobInfo(JobInfo.Builder b) { Loading @@ -381,6 +403,7 @@ public class JobInfo implements Parcelable { hasEarlyConstraint = b.mHasEarlyConstraint; hasLateConstraint = b.mHasLateConstraint; priority = b.mPriority; flags = b.mFlags; } @Override Loading Loading @@ -410,6 +433,7 @@ public class JobInfo implements Parcelable { out.writeInt(hasEarlyConstraint ? 1 : 0); out.writeInt(hasLateConstraint ? 1 : 0); out.writeInt(priority); out.writeInt(this.flags); } public static final Creator<JobInfo> CREATOR = new Creator<JobInfo>() { Loading Loading @@ -504,6 +528,7 @@ public class JobInfo implements Parcelable { private PersistableBundle mExtras = PersistableBundle.EMPTY; private ComponentName mJobService; private int mPriority = PRIORITY_DEFAULT; private int mFlags; // Requirements. private boolean mRequiresCharging; private boolean mRequiresDeviceIdle; Loading Loading @@ -539,14 +564,18 @@ public class JobInfo implements Parcelable { mJobId = jobId; } /** * @hide */ /** @hide */ public Builder setPriority(int priority) { mPriority = priority; return this; } /** @hide */ public Builder setFlags(int flags) { mFlags = flags; return this; } /** * Set optional extras. This is persisted, so we only allow primitive types. * @param extras Bundle containing extras you want the scheduler to hold on to for you. Loading core/java/android/net/ConnectivityManager.java +18 −3 Original line number Diff line number Diff line Loading @@ -774,8 +774,13 @@ public class ConnectivityManager { * @hide */ public Network getActiveNetworkForUid(int uid) { return getActiveNetworkForUid(uid, false); } /** {@hide} */ public Network getActiveNetworkForUid(int uid, boolean ignoreBlocked) { try { return mService.getActiveNetworkForUid(uid); return mService.getActiveNetworkForUid(uid, ignoreBlocked); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading Loading @@ -836,8 +841,13 @@ public class ConnectivityManager { * {@hide} */ public NetworkInfo getActiveNetworkInfoForUid(int uid) { return getActiveNetworkInfoForUid(uid, false); } /** {@hide} */ public NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked) { try { return mService.getActiveNetworkInfoForUid(uid); return mService.getActiveNetworkInfoForUid(uid, ignoreBlocked); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading Loading @@ -880,8 +890,13 @@ public class ConnectivityManager { * is not valid. */ public NetworkInfo getNetworkInfo(Network network) { return getNetworkInfoForUid(network, Process.myUid(), false); } /** {@hide} */ public NetworkInfo getNetworkInfoForUid(Network network, int uid, boolean ignoreBlocked) { try { return mService.getNetworkInfoForNetwork(network); return mService.getNetworkInfoForUid(network, uid, ignoreBlocked); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading core/java/android/net/IConnectivityManager.aidl +3 −3 Original line number Diff line number Diff line Loading @@ -44,11 +44,11 @@ import com.android.internal.net.VpnProfile; interface IConnectivityManager { Network getActiveNetwork(); Network getActiveNetworkForUid(int uid); Network getActiveNetworkForUid(int uid, boolean ignoreBlocked); NetworkInfo getActiveNetworkInfo(); NetworkInfo getActiveNetworkInfoForUid(int uid); NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked); NetworkInfo getNetworkInfo(int networkType); NetworkInfo getNetworkInfoForNetwork(in Network network); NetworkInfo getNetworkInfoForUid(in Network network, int uid, boolean ignoreBlocked); NetworkInfo[] getAllNetworkInfo(); Network getNetworkForType(int networkType); Network[] getAllNetworks(); Loading core/java/android/net/INetworkPolicyManager.aidl +3 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,9 @@ interface INetworkPolicyManager { boolean isUidForeground(int uid); /** Higher priority listener before general event dispatch */ void setConnectivityListener(INetworkPolicyListener listener); void registerListener(INetworkPolicyListener listener); void unregisterListener(INetworkPolicyListener listener); Loading services/core/java/com/android/server/ConnectivityService.java +73 −36 Original line number Diff line number Diff line Loading @@ -29,8 +29,12 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; 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.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.RULE_UNKNOWN; import android.annotation.Nullable; import android.app.BroadcastOptions; import android.app.Notification; Loading Loading @@ -96,8 +100,10 @@ import android.security.Credentials; import android.security.KeyStore; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.ArraySet; import android.util.LocalLog; import android.util.LocalLog.ReadOnlyLocalLog; import android.util.Log; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; Loading @@ -121,9 +127,9 @@ import com.android.internal.util.XmlUtils; import com.android.server.am.BatteryStatsService; import com.android.server.connectivity.DataConnectionStats; import com.android.server.connectivity.KeepaliveTracker; import com.android.server.connectivity.NetworkDiagnostics; import com.android.server.connectivity.Nat464Xlat; import com.android.server.connectivity.NetworkAgentInfo; import com.android.server.connectivity.NetworkDiagnostics; import com.android.server.connectivity.NetworkMonitor; import com.android.server.connectivity.PacManager; import com.android.server.connectivity.PermissionMonitor; Loading @@ -131,8 +137,8 @@ import com.android.server.connectivity.Tethering; import com.android.server.connectivity.Vpn; import com.android.server.net.BaseNetworkObserver; import com.android.server.net.LockdownVpnTracker; import com.google.android.collect.Lists; import com.google.android.collect.Sets; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; Loading @@ -152,11 +158,11 @@ import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.SortedSet; import java.util.TreeSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.SortedSet; import java.util.TreeSet; /** * @hide Loading Loading @@ -202,9 +208,14 @@ public class ConnectivityService extends IConnectivityManager.Stub /** Lock around {@link #mUidRules} and {@link #mMeteredIfaces}. */ private Object mRulesLock = new Object(); /** Currently active network rules by UID. */ @GuardedBy("mRulesLock") private SparseIntArray mUidRules = new SparseIntArray(); /** Set of ifaces that are costly. */ private HashSet<String> mMeteredIfaces = Sets.newHashSet(); @GuardedBy("mRulesLock") private ArraySet<String> mMeteredIfaces = new ArraySet<>(); /** Flag indicating if background data is restricted. */ @GuardedBy("mRulesLock") private boolean mRestrictBackground; final private Context mContext; private int mNetworkPreference; Loading Loading @@ -651,7 +662,8 @@ public class ConnectivityService extends IConnectivityManager.Stub mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); try { mPolicyManager.registerListener(mPolicyListener); mPolicyManager.setConnectivityListener(mPolicyListener); mRestrictBackground = mPolicyManager.getRestrictBackground(); } catch (RemoteException e) { // ouch, no rules updates means some processes may never get network loge("unable to register INetworkPolicyListener" + e.toString()); Loading Loading @@ -819,7 +831,7 @@ public class ConnectivityService extends IConnectivityManager.Stub throw new IllegalStateException("No free netIds"); } private NetworkState getFilteredNetworkState(int networkType, int uid) { private NetworkState getFilteredNetworkState(int networkType, int uid, boolean ignoreBlocked) { if (mLegacyTypeTracker.isTypeSupported(networkType)) { final NetworkAgentInfo nai = mLegacyTypeTracker.getNetworkForType(networkType); final NetworkState state; Loading @@ -834,7 +846,7 @@ public class ConnectivityService extends IConnectivityManager.Stub state = new NetworkState(info, new LinkProperties(), new NetworkCapabilities(), null, null, null); } filterNetworkStateForUid(state, uid); filterNetworkStateForUid(state, uid, ignoreBlocked); return state; } else { return NetworkState.EMPTY; Loading Loading @@ -890,22 +902,36 @@ public class ConnectivityService extends IConnectivityManager.Stub /** * Check if UID should be blocked from using the network with the given LinkProperties. */ private boolean isNetworkWithLinkPropertiesBlocked(LinkProperties lp, int uid) { final boolean networkCostly; private boolean isNetworkWithLinkPropertiesBlocked(LinkProperties lp, int uid, boolean ignoreBlocked) { // Networks aren't blocked when ignoring blocked status if (ignoreBlocked) return false; // Networks are never blocked for system services if (uid < Process.FIRST_APPLICATION_UID) return false; final boolean networkMetered; final int uidRules; final String iface = (lp == null ? "" : lp.getInterfaceName()); synchronized (mRulesLock) { networkCostly = mMeteredIfaces.contains(iface); uidRules = mUidRules.get(uid, RULE_ALLOW_ALL); networkMetered = mMeteredIfaces.contains(iface); uidRules = mUidRules.get(uid, RULE_UNKNOWN); } if (uidRules == RULE_REJECT_ALL) { return true; } else if ((uidRules == RULE_REJECT_METERED) && networkCostly) { return true; } else { 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_UNKNOWN: default: // When background data is restricted device-wide, the default // behavior for apps should be like RULE_REJECT_METERED return mRestrictBackground ? networkMetered : false; } } Loading @@ -930,10 +956,10 @@ public class ConnectivityService extends IConnectivityManager.Stub * on {@link #isNetworkWithLinkPropertiesBlocked}, or * {@link NetworkInfo#isMetered()} based on network policies. */ private void filterNetworkStateForUid(NetworkState state, int uid) { private void filterNetworkStateForUid(NetworkState state, int uid, boolean ignoreBlocked) { if (state == null || state.networkInfo == null || state.linkProperties == null) return; if (isNetworkWithLinkPropertiesBlocked(state.linkProperties, uid)) { if (isNetworkWithLinkPropertiesBlocked(state.linkProperties, uid, ignoreBlocked)) { state.networkInfo.setDetailedState(DetailedState.BLOCKED, null, null); } if (mLockdownTracker != null) { Loading Loading @@ -962,7 +988,7 @@ public class ConnectivityService extends IConnectivityManager.Stub enforceAccessPermission(); final int uid = Binder.getCallingUid(); final NetworkState state = getUnfilteredActiveNetworkState(uid); filterNetworkStateForUid(state, uid); filterNetworkStateForUid(state, uid, false); maybeLogBlockedNetworkInfo(state.networkInfo, uid); return state.networkInfo; } Loading @@ -970,16 +996,16 @@ public class ConnectivityService extends IConnectivityManager.Stub @Override public Network getActiveNetwork() { enforceAccessPermission(); return getActiveNetworkForUidInternal(Binder.getCallingUid()); return getActiveNetworkForUidInternal(Binder.getCallingUid(), false); } @Override public Network getActiveNetworkForUid(int uid) { public Network getActiveNetworkForUid(int uid, boolean ignoreBlocked) { enforceConnectivityInternalPermission(); return getActiveNetworkForUidInternal(uid); return getActiveNetworkForUidInternal(uid, ignoreBlocked); } private Network getActiveNetworkForUidInternal(final int uid) { private Network getActiveNetworkForUidInternal(final int uid, boolean ignoreBlocked) { final int user = UserHandle.getUserId(uid); int vpnNetId = NETID_UNSET; synchronized (mVpns) { Loading @@ -994,7 +1020,10 @@ public class ConnectivityService extends IConnectivityManager.Stub if (nai != null) return nai.network; } nai = getDefaultNetwork(); if (nai != null && isNetworkWithLinkPropertiesBlocked(nai.linkProperties, uid)) nai = null; if (nai != null && isNetworkWithLinkPropertiesBlocked(nai.linkProperties, uid, ignoreBlocked)) { nai = null; } return nai != null ? nai.network : null; } Loading @@ -1006,10 +1035,10 @@ public class ConnectivityService extends IConnectivityManager.Stub } @Override public NetworkInfo getActiveNetworkInfoForUid(int uid) { public NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked) { enforceConnectivityInternalPermission(); final NetworkState state = getUnfilteredActiveNetworkState(uid); filterNetworkStateForUid(state, uid); filterNetworkStateForUid(state, uid, ignoreBlocked); return state.networkInfo; } Loading @@ -1023,22 +1052,21 @@ public class ConnectivityService extends IConnectivityManager.Stub // getUnfilteredActiveNetworkState. final NetworkState state = getUnfilteredActiveNetworkState(uid); if (state.networkInfo != null && state.networkInfo.getType() == networkType) { filterNetworkStateForUid(state, uid); filterNetworkStateForUid(state, uid, false); return state.networkInfo; } } final NetworkState state = getFilteredNetworkState(networkType, uid); final NetworkState state = getFilteredNetworkState(networkType, uid, false); return state.networkInfo; } @Override public NetworkInfo getNetworkInfoForNetwork(Network network) { public NetworkInfo getNetworkInfoForUid(Network network, int uid, boolean ignoreBlocked) { enforceAccessPermission(); final int uid = Binder.getCallingUid(); final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network); if (nai != null) { final NetworkState state = nai.getNetworkState(); filterNetworkStateForUid(state, uid); filterNetworkStateForUid(state, uid, ignoreBlocked); return state.networkInfo; } else { return null; Loading @@ -1063,8 +1091,8 @@ public class ConnectivityService extends IConnectivityManager.Stub public Network getNetworkForType(int networkType) { enforceAccessPermission(); final int uid = Binder.getCallingUid(); NetworkState state = getFilteredNetworkState(networkType, uid); if (!isNetworkWithLinkPropertiesBlocked(state.linkProperties, uid)) { NetworkState state = getFilteredNetworkState(networkType, uid, false); if (!isNetworkWithLinkPropertiesBlocked(state.linkProperties, uid, false)) { return state.network; } return null; Loading Loading @@ -1381,6 +1409,11 @@ public class ConnectivityService extends IConnectivityManager.Stub if (LOGD_RULES) { log("onRestrictBackgroundChanged(restrictBackground=" + restrictBackground + ")"); } synchronized (mRulesLock) { mRestrictBackground = restrictBackground; } if (restrictBackground) { log("onRestrictBackgroundChanged(true): disabling tethering"); mTethering.untetherAll(); Loading Loading @@ -1824,6 +1857,10 @@ public class ConnectivityService extends IConnectivityManager.Stub pw.decreaseIndent(); pw.println(); pw.print("Restrict background: "); pw.println(mRestrictBackground); pw.println(); pw.println("Network Requests:"); pw.increaseIndent(); for (NetworkRequestInfo nri : mNetworkRequests.values()) { Loading Loading @@ -2765,7 +2802,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // which isn't meant to work on uncreated networks. if (!nai.created) return; if (isNetworkWithLinkPropertiesBlocked(nai.linkProperties, uid)) return; if (isNetworkWithLinkPropertiesBlocked(nai.linkProperties, uid, false)) return; nai.networkMonitor.sendMessage(NetworkMonitor.CMD_FORCE_REEVALUATION, uid); } Loading Loading
core/java/android/app/job/JobInfo.java +33 −4 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package android.app.job; import static android.util.TimeUtils.formatDuration; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; Loading @@ -24,7 +26,6 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.PersistableBundle; import android.util.Log; import static android.util.TimeUtils.formatDuration; import java.util.ArrayList; Loading Loading @@ -154,6 +155,20 @@ public class JobInfo implements Parcelable { */ public static final int PRIORITY_ADJ_ALWAYS_RUNNING = -80; /** * Indicates that the implementation of this job will be using * {@link JobService#startForeground(int, android.app.Notification)} to run * in the foreground. * <p> * When set, the internal scheduling of this job will ignore any background * network restrictions for the requesting app. Note that this flag alone * doesn't actually place your {@link JobService} in the foreground; you * still need to post the notification yourself. * * @hide */ public static final int FLAG_WILL_BE_FOREGROUND = 1 << 0; private final int jobId; private final PersistableBundle extras; private final ComponentName service; Loading @@ -174,6 +189,7 @@ public class JobInfo implements Parcelable { private final long initialBackoffMillis; private final int backoffPolicy; private final int priority; private final int flags; /** * Unique job id associated with this class. This is assigned to your job by the scheduler. Loading Loading @@ -201,6 +217,11 @@ public class JobInfo implements Parcelable { return priority; } /** @hide */ public int getFlags() { return flags; } /** * Whether this job needs the device to be plugged in. */ Loading Loading @@ -356,6 +377,7 @@ public class JobInfo implements Parcelable { hasEarlyConstraint = in.readInt() == 1; hasLateConstraint = in.readInt() == 1; priority = in.readInt(); flags = in.readInt(); } private JobInfo(JobInfo.Builder b) { Loading @@ -381,6 +403,7 @@ public class JobInfo implements Parcelable { hasEarlyConstraint = b.mHasEarlyConstraint; hasLateConstraint = b.mHasLateConstraint; priority = b.mPriority; flags = b.mFlags; } @Override Loading Loading @@ -410,6 +433,7 @@ public class JobInfo implements Parcelable { out.writeInt(hasEarlyConstraint ? 1 : 0); out.writeInt(hasLateConstraint ? 1 : 0); out.writeInt(priority); out.writeInt(this.flags); } public static final Creator<JobInfo> CREATOR = new Creator<JobInfo>() { Loading Loading @@ -504,6 +528,7 @@ public class JobInfo implements Parcelable { private PersistableBundle mExtras = PersistableBundle.EMPTY; private ComponentName mJobService; private int mPriority = PRIORITY_DEFAULT; private int mFlags; // Requirements. private boolean mRequiresCharging; private boolean mRequiresDeviceIdle; Loading Loading @@ -539,14 +564,18 @@ public class JobInfo implements Parcelable { mJobId = jobId; } /** * @hide */ /** @hide */ public Builder setPriority(int priority) { mPriority = priority; return this; } /** @hide */ public Builder setFlags(int flags) { mFlags = flags; return this; } /** * Set optional extras. This is persisted, so we only allow primitive types. * @param extras Bundle containing extras you want the scheduler to hold on to for you. Loading
core/java/android/net/ConnectivityManager.java +18 −3 Original line number Diff line number Diff line Loading @@ -774,8 +774,13 @@ public class ConnectivityManager { * @hide */ public Network getActiveNetworkForUid(int uid) { return getActiveNetworkForUid(uid, false); } /** {@hide} */ public Network getActiveNetworkForUid(int uid, boolean ignoreBlocked) { try { return mService.getActiveNetworkForUid(uid); return mService.getActiveNetworkForUid(uid, ignoreBlocked); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading Loading @@ -836,8 +841,13 @@ public class ConnectivityManager { * {@hide} */ public NetworkInfo getActiveNetworkInfoForUid(int uid) { return getActiveNetworkInfoForUid(uid, false); } /** {@hide} */ public NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked) { try { return mService.getActiveNetworkInfoForUid(uid); return mService.getActiveNetworkInfoForUid(uid, ignoreBlocked); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading Loading @@ -880,8 +890,13 @@ public class ConnectivityManager { * is not valid. */ public NetworkInfo getNetworkInfo(Network network) { return getNetworkInfoForUid(network, Process.myUid(), false); } /** {@hide} */ public NetworkInfo getNetworkInfoForUid(Network network, int uid, boolean ignoreBlocked) { try { return mService.getNetworkInfoForNetwork(network); return mService.getNetworkInfoForUid(network, uid, ignoreBlocked); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading
core/java/android/net/IConnectivityManager.aidl +3 −3 Original line number Diff line number Diff line Loading @@ -44,11 +44,11 @@ import com.android.internal.net.VpnProfile; interface IConnectivityManager { Network getActiveNetwork(); Network getActiveNetworkForUid(int uid); Network getActiveNetworkForUid(int uid, boolean ignoreBlocked); NetworkInfo getActiveNetworkInfo(); NetworkInfo getActiveNetworkInfoForUid(int uid); NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked); NetworkInfo getNetworkInfo(int networkType); NetworkInfo getNetworkInfoForNetwork(in Network network); NetworkInfo getNetworkInfoForUid(in Network network, int uid, boolean ignoreBlocked); NetworkInfo[] getAllNetworkInfo(); Network getNetworkForType(int networkType); Network[] getAllNetworks(); Loading
core/java/android/net/INetworkPolicyManager.aidl +3 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,9 @@ interface INetworkPolicyManager { boolean isUidForeground(int uid); /** Higher priority listener before general event dispatch */ void setConnectivityListener(INetworkPolicyListener listener); void registerListener(INetworkPolicyListener listener); void unregisterListener(INetworkPolicyListener listener); Loading
services/core/java/com/android/server/ConnectivityService.java +73 −36 Original line number Diff line number Diff line Loading @@ -29,8 +29,12 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; 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.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.RULE_UNKNOWN; import android.annotation.Nullable; import android.app.BroadcastOptions; import android.app.Notification; Loading Loading @@ -96,8 +100,10 @@ import android.security.Credentials; import android.security.KeyStore; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.ArraySet; import android.util.LocalLog; import android.util.LocalLog.ReadOnlyLocalLog; import android.util.Log; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; Loading @@ -121,9 +127,9 @@ import com.android.internal.util.XmlUtils; import com.android.server.am.BatteryStatsService; import com.android.server.connectivity.DataConnectionStats; import com.android.server.connectivity.KeepaliveTracker; import com.android.server.connectivity.NetworkDiagnostics; import com.android.server.connectivity.Nat464Xlat; import com.android.server.connectivity.NetworkAgentInfo; import com.android.server.connectivity.NetworkDiagnostics; import com.android.server.connectivity.NetworkMonitor; import com.android.server.connectivity.PacManager; import com.android.server.connectivity.PermissionMonitor; Loading @@ -131,8 +137,8 @@ import com.android.server.connectivity.Tethering; import com.android.server.connectivity.Vpn; import com.android.server.net.BaseNetworkObserver; import com.android.server.net.LockdownVpnTracker; import com.google.android.collect.Lists; import com.google.android.collect.Sets; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; Loading @@ -152,11 +158,11 @@ import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.SortedSet; import java.util.TreeSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.SortedSet; import java.util.TreeSet; /** * @hide Loading Loading @@ -202,9 +208,14 @@ public class ConnectivityService extends IConnectivityManager.Stub /** Lock around {@link #mUidRules} and {@link #mMeteredIfaces}. */ private Object mRulesLock = new Object(); /** Currently active network rules by UID. */ @GuardedBy("mRulesLock") private SparseIntArray mUidRules = new SparseIntArray(); /** Set of ifaces that are costly. */ private HashSet<String> mMeteredIfaces = Sets.newHashSet(); @GuardedBy("mRulesLock") private ArraySet<String> mMeteredIfaces = new ArraySet<>(); /** Flag indicating if background data is restricted. */ @GuardedBy("mRulesLock") private boolean mRestrictBackground; final private Context mContext; private int mNetworkPreference; Loading Loading @@ -651,7 +662,8 @@ public class ConnectivityService extends IConnectivityManager.Stub mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); try { mPolicyManager.registerListener(mPolicyListener); mPolicyManager.setConnectivityListener(mPolicyListener); mRestrictBackground = mPolicyManager.getRestrictBackground(); } catch (RemoteException e) { // ouch, no rules updates means some processes may never get network loge("unable to register INetworkPolicyListener" + e.toString()); Loading Loading @@ -819,7 +831,7 @@ public class ConnectivityService extends IConnectivityManager.Stub throw new IllegalStateException("No free netIds"); } private NetworkState getFilteredNetworkState(int networkType, int uid) { private NetworkState getFilteredNetworkState(int networkType, int uid, boolean ignoreBlocked) { if (mLegacyTypeTracker.isTypeSupported(networkType)) { final NetworkAgentInfo nai = mLegacyTypeTracker.getNetworkForType(networkType); final NetworkState state; Loading @@ -834,7 +846,7 @@ public class ConnectivityService extends IConnectivityManager.Stub state = new NetworkState(info, new LinkProperties(), new NetworkCapabilities(), null, null, null); } filterNetworkStateForUid(state, uid); filterNetworkStateForUid(state, uid, ignoreBlocked); return state; } else { return NetworkState.EMPTY; Loading Loading @@ -890,22 +902,36 @@ public class ConnectivityService extends IConnectivityManager.Stub /** * Check if UID should be blocked from using the network with the given LinkProperties. */ private boolean isNetworkWithLinkPropertiesBlocked(LinkProperties lp, int uid) { final boolean networkCostly; private boolean isNetworkWithLinkPropertiesBlocked(LinkProperties lp, int uid, boolean ignoreBlocked) { // Networks aren't blocked when ignoring blocked status if (ignoreBlocked) return false; // Networks are never blocked for system services if (uid < Process.FIRST_APPLICATION_UID) return false; final boolean networkMetered; final int uidRules; final String iface = (lp == null ? "" : lp.getInterfaceName()); synchronized (mRulesLock) { networkCostly = mMeteredIfaces.contains(iface); uidRules = mUidRules.get(uid, RULE_ALLOW_ALL); networkMetered = mMeteredIfaces.contains(iface); uidRules = mUidRules.get(uid, RULE_UNKNOWN); } if (uidRules == RULE_REJECT_ALL) { return true; } else if ((uidRules == RULE_REJECT_METERED) && networkCostly) { return true; } else { 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_UNKNOWN: default: // When background data is restricted device-wide, the default // behavior for apps should be like RULE_REJECT_METERED return mRestrictBackground ? networkMetered : false; } } Loading @@ -930,10 +956,10 @@ public class ConnectivityService extends IConnectivityManager.Stub * on {@link #isNetworkWithLinkPropertiesBlocked}, or * {@link NetworkInfo#isMetered()} based on network policies. */ private void filterNetworkStateForUid(NetworkState state, int uid) { private void filterNetworkStateForUid(NetworkState state, int uid, boolean ignoreBlocked) { if (state == null || state.networkInfo == null || state.linkProperties == null) return; if (isNetworkWithLinkPropertiesBlocked(state.linkProperties, uid)) { if (isNetworkWithLinkPropertiesBlocked(state.linkProperties, uid, ignoreBlocked)) { state.networkInfo.setDetailedState(DetailedState.BLOCKED, null, null); } if (mLockdownTracker != null) { Loading Loading @@ -962,7 +988,7 @@ public class ConnectivityService extends IConnectivityManager.Stub enforceAccessPermission(); final int uid = Binder.getCallingUid(); final NetworkState state = getUnfilteredActiveNetworkState(uid); filterNetworkStateForUid(state, uid); filterNetworkStateForUid(state, uid, false); maybeLogBlockedNetworkInfo(state.networkInfo, uid); return state.networkInfo; } Loading @@ -970,16 +996,16 @@ public class ConnectivityService extends IConnectivityManager.Stub @Override public Network getActiveNetwork() { enforceAccessPermission(); return getActiveNetworkForUidInternal(Binder.getCallingUid()); return getActiveNetworkForUidInternal(Binder.getCallingUid(), false); } @Override public Network getActiveNetworkForUid(int uid) { public Network getActiveNetworkForUid(int uid, boolean ignoreBlocked) { enforceConnectivityInternalPermission(); return getActiveNetworkForUidInternal(uid); return getActiveNetworkForUidInternal(uid, ignoreBlocked); } private Network getActiveNetworkForUidInternal(final int uid) { private Network getActiveNetworkForUidInternal(final int uid, boolean ignoreBlocked) { final int user = UserHandle.getUserId(uid); int vpnNetId = NETID_UNSET; synchronized (mVpns) { Loading @@ -994,7 +1020,10 @@ public class ConnectivityService extends IConnectivityManager.Stub if (nai != null) return nai.network; } nai = getDefaultNetwork(); if (nai != null && isNetworkWithLinkPropertiesBlocked(nai.linkProperties, uid)) nai = null; if (nai != null && isNetworkWithLinkPropertiesBlocked(nai.linkProperties, uid, ignoreBlocked)) { nai = null; } return nai != null ? nai.network : null; } Loading @@ -1006,10 +1035,10 @@ public class ConnectivityService extends IConnectivityManager.Stub } @Override public NetworkInfo getActiveNetworkInfoForUid(int uid) { public NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked) { enforceConnectivityInternalPermission(); final NetworkState state = getUnfilteredActiveNetworkState(uid); filterNetworkStateForUid(state, uid); filterNetworkStateForUid(state, uid, ignoreBlocked); return state.networkInfo; } Loading @@ -1023,22 +1052,21 @@ public class ConnectivityService extends IConnectivityManager.Stub // getUnfilteredActiveNetworkState. final NetworkState state = getUnfilteredActiveNetworkState(uid); if (state.networkInfo != null && state.networkInfo.getType() == networkType) { filterNetworkStateForUid(state, uid); filterNetworkStateForUid(state, uid, false); return state.networkInfo; } } final NetworkState state = getFilteredNetworkState(networkType, uid); final NetworkState state = getFilteredNetworkState(networkType, uid, false); return state.networkInfo; } @Override public NetworkInfo getNetworkInfoForNetwork(Network network) { public NetworkInfo getNetworkInfoForUid(Network network, int uid, boolean ignoreBlocked) { enforceAccessPermission(); final int uid = Binder.getCallingUid(); final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network); if (nai != null) { final NetworkState state = nai.getNetworkState(); filterNetworkStateForUid(state, uid); filterNetworkStateForUid(state, uid, ignoreBlocked); return state.networkInfo; } else { return null; Loading @@ -1063,8 +1091,8 @@ public class ConnectivityService extends IConnectivityManager.Stub public Network getNetworkForType(int networkType) { enforceAccessPermission(); final int uid = Binder.getCallingUid(); NetworkState state = getFilteredNetworkState(networkType, uid); if (!isNetworkWithLinkPropertiesBlocked(state.linkProperties, uid)) { NetworkState state = getFilteredNetworkState(networkType, uid, false); if (!isNetworkWithLinkPropertiesBlocked(state.linkProperties, uid, false)) { return state.network; } return null; Loading Loading @@ -1381,6 +1409,11 @@ public class ConnectivityService extends IConnectivityManager.Stub if (LOGD_RULES) { log("onRestrictBackgroundChanged(restrictBackground=" + restrictBackground + ")"); } synchronized (mRulesLock) { mRestrictBackground = restrictBackground; } if (restrictBackground) { log("onRestrictBackgroundChanged(true): disabling tethering"); mTethering.untetherAll(); Loading Loading @@ -1824,6 +1857,10 @@ public class ConnectivityService extends IConnectivityManager.Stub pw.decreaseIndent(); pw.println(); pw.print("Restrict background: "); pw.println(mRestrictBackground); pw.println(); pw.println("Network Requests:"); pw.increaseIndent(); for (NetworkRequestInfo nri : mNetworkRequests.values()) { Loading Loading @@ -2765,7 +2802,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // which isn't meant to work on uncreated networks. if (!nai.created) return; if (isNetworkWithLinkPropertiesBlocked(nai.linkProperties, uid)) return; if (isNetworkWithLinkPropertiesBlocked(nai.linkProperties, uid, false)) return; nai.networkMonitor.sendMessage(NetworkMonitor.CMD_FORCE_REEVALUATION, uid); } Loading