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

Commit c05f2daa authored by Oliver Scott's avatar Oliver Scott Committed by Michael Bestas
Browse files

fixup! Implement firewall status bar indicator

Check UID network access when its default network changes.

Issue: calyxos#1041
Requires: I2729b61c349ec2812a74d7d1c04b90a58b0f5b88
Change-Id: Ied0f465f485a4415ae50f4ffc50a4ce9b6caa25e
parent 714095c8
Loading
Loading
Loading
Loading
+42 −34
Original line number Diff line number Diff line
@@ -22,18 +22,20 @@ import android.annotation.Nullable;
import android.app.ActivityTaskManager;
import android.app.AlarmManager;
import android.app.AlarmManager.AlarmClockInfo;
import android.app.AppGlobals;
import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.media.AudioManager;
import android.net.ConnectivityManager;
import android.net.INetworkPolicyListener;
import android.net.INetworkPolicyManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkPolicyManager;
import android.os.Handler;
import android.os.Looper;
@@ -48,6 +50,7 @@ import android.text.format.DateFormat;
import android.util.Log;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.lifecycle.Observer;

import com.android.systemui.R;
@@ -85,8 +88,6 @@ import com.android.systemui.util.time.DateFormatUtil;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.Executor;
@@ -136,6 +137,7 @@ public class PhoneStatusBarPolicy
    private final DateFormatUtil mDateFormatUtil;
    private final TelecomManager mTelecomManager;

    private final Context mContext;
    private final Handler mHandler;
    private final CastController mCast;
    private final HotspotController mHotspot;
@@ -162,6 +164,8 @@ public class PhoneStatusBarPolicy
    private final RecordingController mRecordingController;
    private final RingerModeTracker mRingerModeTracker;
    private final PrivacyLogger mPrivacyLogger;
    private final ConnectivityManager mConnectivityManager;
    private final NetworkPolicyManager mNetworkPolicyManager;

    private boolean mZenVisible;
    private boolean mVibrateVisible;
@@ -171,11 +175,13 @@ public class PhoneStatusBarPolicy
    private boolean mManagedProfileIconVisible = false;
    private boolean mFirewallVisible = false;

    private int mLastResumedActivityUid = -1;

    private BluetoothController mBluetooth;
    private AlarmManager.AlarmClockInfo mNextAlarm;

    @Inject
    public PhoneStatusBarPolicy(StatusBarIconController iconController,
    public PhoneStatusBarPolicy(Context context, StatusBarIconController iconController,
            CommandQueue commandQueue, BroadcastDispatcher broadcastDispatcher,
            @Main Executor mainExecutor, @UiBackground Executor uiBgExecutor, @Main Looper looper,
            @Main Resources resources, CastController castController,
@@ -194,6 +200,7 @@ public class PhoneStatusBarPolicy
            RingerModeTracker ringerModeTracker,
            PrivacyItemController privacyItemController,
            PrivacyLogger privacyLogger) {
        mContext = context;
        mIconController = iconController;
        mCommandQueue = commandQueue;
        mBroadcastDispatcher = broadcastDispatcher;
@@ -222,6 +229,8 @@ public class PhoneStatusBarPolicy
        mTelecomManager = telecomManager;
        mRingerModeTracker = ringerModeTracker;
        mPrivacyLogger = privacyLogger;
        mConnectivityManager = context.getSystemService(ConnectivityManager.class);
        mNetworkPolicyManager = context.getSystemService(NetworkPolicyManager.class);

        mSlotCast = resources.getString(com.android.internal.R.string.status_bar_cast);
        mSlotHotspot = resources.getString(com.android.internal.R.string.status_bar_hotspot);
@@ -269,6 +278,8 @@ public class PhoneStatusBarPolicy
        // listen for user / profile change.
        mUserTracker.addCallback(mUserSwitchListener, mMainExecutor);

        mNetworkPolicyManager.registerListener(mNetworkPolicyListener);

        // TTY status
        updateTTY();

@@ -359,8 +370,6 @@ public class PhoneStatusBarPolicy
        mLocationController.addCallback(this);
        mRecordingController.addCallback(this);

        registerNetworkPolicyListener();

        mCommandQueue.addCallback(this);

        // Get initial user setup state
@@ -597,12 +606,24 @@ public class PhoneStatusBarPolicy
        mUiBgExecutor.execute(() -> {
            try {
                final int uid = ActivityTaskManager.getService().getLastResumedActivityUid();
                final boolean isRestricted = INetworkPolicyManager.Stub.asInterface(
                        ServiceManager.getService(Context.NETWORK_POLICY_SERVICE))
                        .isUidNetworkingBlocked(uid, false);
                if (mLastResumedActivityUid != uid) {
                    mLastResumedActivityUid = uid;
                    try {
                        mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
                    } catch (IllegalArgumentException e) {
                        // Ignore
                    }
                    mConnectivityManager.registerDefaultNetworkCallbackForUid(uid, mNetworkCallback,
                            mHandler);
                }
                final boolean isRestricted =
                        mNetworkPolicyManager.isUidNetworkingBlocked(uid, false /*meteredNetwork*/);
                boolean isLauncher = false;
                List<ResolveInfo> homeActivities = new ArrayList<>();
                AppGlobals.getPackageManager().getHomeActivities(homeActivities);
                List<ResolveInfo> homeActivities =
                        mContext.getPackageManager().queryIntentActivitiesAsUser(
                                new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME)
                                        .addCategory(Intent.CATEGORY_DEFAULT),
                                PackageManager.ResolveInfoFlags.of(0), UserHandle.getUserId(uid));
                for (ResolveInfo homeActivity : homeActivities) {
                    if (uid == homeActivity.activityInfo.applicationInfo.uid) {
                        isLauncher = true;
@@ -630,33 +651,20 @@ public class PhoneStatusBarPolicy
        });
    }

    private void registerNetworkPolicyListener() {
        try {
            INetworkPolicyManager policyManager = INetworkPolicyManager.Stub.asInterface(
                    ServiceManager.getService(Context.NETWORK_POLICY_SERVICE));
            policyManager.registerListener(mNetworkPolicyListener);
        } catch (RemoteException e) {
            Log.e(TAG, "registerNetworkPolicyListener: ", e);
            return;
        }
    private final ConnectivityManager.NetworkCallback mNetworkCallback =
            new ConnectivityManager.NetworkCallback() {
                @Override
                public void onCapabilitiesChanged(@NonNull Network network,
                        @NonNull NetworkCapabilities networkCapabilities) {
                    mHandler.post(() -> updateFirewall());
                }
            };

    private final INetworkPolicyListener mNetworkPolicyListener =
            new NetworkPolicyManager.Listener() {
        @Override
        public void onUidRulesChanged(int uid, int uidRules) {
            if (DEBUG) Log.d(TAG, "INetworkPolicyListener." +
                    "onUidRulesChanged: uid: " + uid +
                    ", uidRules: " + uidRules);
            updateFirewall();
        }

        @Override
        public void onUidPoliciesChanged(int uid, int uidPolicies) {
            if (DEBUG) Log.d(TAG, "INetworkPolicyListener." +
                    "onUidPoliciesChanged: uid: " + uid +
                    ", uidPolicies: " + uidPolicies);
            updateFirewall();
            mHandler.post(() -> updateFirewall());
        }
    };