Add Restricted Mode settings observer to NetworkPolicyManagerService

This allows to enable / disable restricted mode at runtime.

Test: adb shell settings put global restricted_networking_mode 1
Bug: 170322816
Bug: 157505406
Change-Id: Ie9456f6a0b8d6d4e8e4bdfc3f6954e247fd9c5fb
Merged-In: Ie9456f6a0b8d6d4e8e4bdfc3f6954e247fd9c5fb
This commit is contained in:
Patrick Rohr
2020-12-14 21:58:56 +01:00
parent 1ab1849ab2
commit 8b6082b585

View File

@@ -149,6 +149,7 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.IConnectivityManager;
@@ -609,6 +610,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
@GuardedBy("mUidRulesFirstLock")
private final SparseBooleanArray mInternetPermissionMap = new SparseBooleanArray();
private RestrictedModeObserver mRestrictedModeObserver;
// TODO: keep allowlist of system-critical services that should never have
// rules enforced, such as system, phone, and radio UIDs.
@@ -622,7 +625,35 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
int COUNT = IS_UID_NETWORKING_BLOCKED + 1;
}
public final StatLogger mStatLogger = new StatLogger(new String[] {
private static class RestrictedModeObserver extends ContentObserver {
private final Context mContext;
private final RestrictedModeListener mListener;
RestrictedModeObserver(Context ctx, RestrictedModeListener listener) {
super(null);
mContext = ctx;
mListener = listener;
mContext.getContentResolver().registerContentObserver(
Settings.Global.getUriFor(Settings.Global.RESTRICTED_NETWORKING_MODE), false,
this);
}
public boolean isRestrictedModeEnabled() {
return Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.RESTRICTED_NETWORKING_MODE, 0) != 0;
}
@Override
public void onChange(boolean selfChange) {
mListener.onChange(isRestrictedModeEnabled());
}
public interface RestrictedModeListener {
void onChange(boolean enabled);
}
}
public final StatLogger mStatLogger = new StatLogger(new String[]{
"updateNetworkEnabledNL()",
"isUidNetworkingBlocked()",
});
@@ -797,9 +828,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
mRestrictPower = mPowerManagerInternal.getLowPowerState(
ServiceType.NETWORK_FIREWALL).batterySaverEnabled;
mRestrictedNetworkingMode = Settings.Global.getInt(
mContext.getContentResolver(),
Settings.Global.RESTRICTED_NETWORKING_MODE, 0) != 0;
mRestrictedModeObserver = new RestrictedModeObserver(mContext,
enabled -> {
synchronized (mUidRulesFirstLock) {
mRestrictedNetworkingMode = enabled;
updateRestrictedModeAllowlistUL();
}
});
mRestrictedNetworkingMode = mRestrictedModeObserver.isRestrictedModeEnabled();
mSystemReady = true;