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

Commit 8b6082b5 authored by Patrick Rohr's avatar Patrick Rohr
Browse files

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
parent 1ab1849a
Loading
Loading
Loading
Loading
+40 −4
Original line number Original line Diff line number Diff line
@@ -149,6 +149,7 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.UserInfo;
import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.IConnectivityManager;
import android.net.IConnectivityManager;
@@ -609,6 +610,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
    @GuardedBy("mUidRulesFirstLock")
    @GuardedBy("mUidRulesFirstLock")
    private final SparseBooleanArray mInternetPermissionMap = new SparseBooleanArray();
    private final SparseBooleanArray mInternetPermissionMap = new SparseBooleanArray();


    private RestrictedModeObserver mRestrictedModeObserver;

    // TODO: keep allowlist of system-critical services that should never have
    // TODO: keep allowlist of system-critical services that should never have
    // rules enforced, such as system, phone, and radio UIDs.
    // rules enforced, such as system, phone, and radio UIDs.


@@ -622,6 +625,34 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
        int COUNT = IS_UID_NETWORKING_BLOCKED + 1;
        int COUNT = IS_UID_NETWORKING_BLOCKED + 1;
    }
    }


    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[]{
    public final StatLogger mStatLogger = new StatLogger(new String[]{
            "updateNetworkEnabledNL()",
            "updateNetworkEnabledNL()",
            "isUidNetworkingBlocked()",
            "isUidNetworkingBlocked()",
@@ -797,9 +828,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
                    mRestrictPower = mPowerManagerInternal.getLowPowerState(
                    mRestrictPower = mPowerManagerInternal.getLowPowerState(
                            ServiceType.NETWORK_FIREWALL).batterySaverEnabled;
                            ServiceType.NETWORK_FIREWALL).batterySaverEnabled;


                    mRestrictedNetworkingMode = Settings.Global.getInt(
                    mRestrictedModeObserver = new RestrictedModeObserver(mContext,
                            mContext.getContentResolver(),
                            enabled -> {
                            Settings.Global.RESTRICTED_NETWORKING_MODE, 0) != 0;
                                synchronized (mUidRulesFirstLock) {
                                    mRestrictedNetworkingMode = enabled;
                                    updateRestrictedModeAllowlistUL();
                                }
                            });
                    mRestrictedNetworkingMode = mRestrictedModeObserver.isRestrictedModeEnabled();


                    mSystemReady = true;
                    mSystemReady = true;