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

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

Implement firewall status bar indicator



* Add API to get the last resumed activity's UID
* Show blocked status indicator based on the last resumed activity's
  UID blocked status

Co-authored-by: default avatarTommy Webb <tommy@calyxinstitute.org>
Change-Id: I7aa405e7f5a2f70e6cf2b6156a29d220617e4ae5
parent 526e913c
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -283,6 +283,11 @@ interface IActivityTaskManager {
     */
    int getLastResumedActivityUserId();

    /**
     * Return the uid of last resumed activity.
     */
    int getLastResumedActivityUid();

    /**
     * Updates global configuration and applies changes to the entire system.
     * @param values Update values for global configuration. If null is passed it will request the
+9 −0
Original line number Diff line number Diff line
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">
  <path
      android:fillColor="#FF000000"
      android:pathData="M11,8.17L6.49,3.66C8.07,2.61 9.96,2 12,2c5.52,0 10,4.48 10,10c0,2.04 -0.61,3.93 -1.66,5.51l-1.46,-1.46C19.59,14.87 20,13.48 20,12c0,-3.35 -2.07,-6.22 -5,-7.41V5c0,1.1 -0.9,2 -2,2h-2V8.17zM21.19,21.19l-1.41,1.41l-2.27,-2.27C15.93,21.39 14.04,22 12,22C6.48,22 2,17.52 2,12c0,-2.04 0.61,-3.93 1.66,-5.51L1.39,4.22l1.41,-1.41L21.19,21.19zM11,18c-1.1,0 -2,-0.9 -2,-2v-1l-4.79,-4.79C4.08,10.79 4,11.38 4,12c0,4.08 3.05,7.44 7,7.93V18z"/>
</vector>
+4 −0
Original line number Diff line number Diff line
@@ -108,4 +108,8 @@
    <!-- Navigation bar dpad -->
    <string name="accessibility_dpad_left">Cursor left</string>
    <string name="accessibility_dpad_right">Cursor right</string>

    <!-- Name of the firewall status bar icon. -->
    <string name="status_bar_firewall">Firewall</string>
    <string name="status_bar_firewall_slot" translatable="false">firewall</string>
</resources>
+4 −0
Original line number Diff line number Diff line
@@ -28,6 +28,10 @@
        android:key="headset"
        android:title="@string/headset" />

    <com.android.systemui.tuner.StatusBarSwitch
        android:key="firewall"
        android:title="@string/status_bar_firewall" />

    <com.android.systemui.tuner.StatusBarSwitch
        android:icon="@drawable/ic_statusbar_work"
        android:key="managed_profile"
+86 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.annotation.Nullable;
import android.app.ActivityTaskManager;
import android.app.AlarmManager;
import android.app.AlarmManager.AlarmClockInfo;
import android.app.AppGlobals;
import android.app.IActivityManager;
import android.app.SynchronousUserSwitchObserver;
import android.app.admin.DevicePolicyManager;
@@ -30,11 +31,16 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.media.AudioManager;
import android.net.INetworkPolicyListener;
import android.net.INetworkPolicyManager;
import android.net.NetworkPolicyManager;
import android.os.Handler;
import android.os.Looper;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings.Global;
@@ -80,6 +86,8 @@ 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;
@@ -123,6 +131,7 @@ public class PhoneStatusBarPolicy
    private final String mSlotCamera;
    private final String mSlotSensorsOff;
    private final String mSlotScreenRecord;
    private final String mSlotFirewall;
    private final int mDisplayId;
    private final SharedPreferences mSharedPreferences;
    private final DateFormatUtil mDateFormatUtil;
@@ -160,6 +169,7 @@ public class PhoneStatusBarPolicy
    private boolean mCurrentUserSetup;

    private boolean mManagedProfileIconVisible = false;
    private boolean mFirewallVisible = false;

    private BluetoothController mBluetooth;
    private AlarmManager.AlarmClockInfo mNextAlarm;
@@ -230,6 +240,7 @@ public class PhoneStatusBarPolicy
        mSlotSensorsOff = resources.getString(com.android.internal.R.string.status_bar_sensors_off);
        mSlotScreenRecord = resources.getString(
                com.android.internal.R.string.status_bar_screen_record);
        mSlotFirewall = resources.getString(R.string.status_bar_firewall_slot);

        mDisplayId = displayId;
        mSharedPreferences = sharedPreferences;
@@ -331,6 +342,10 @@ public class PhoneStatusBarPolicy
        mIconController.setIcon(mSlotScreenRecord, R.drawable.stat_sys_screen_record, null);
        mIconController.setIconVisibility(mSlotScreenRecord, false);

        // firewall
        mIconController.setIcon(mSlotFirewall, R.drawable.stat_sys_firewall, null);
        mIconController.setIconVisibility(mSlotFirewall, mFirewallVisible);

        mRotationLockController.addCallback(this);
        mBluetooth.addCallback(this);
        mProvisionedController.addCallback(this);
@@ -346,6 +361,8 @@ public class PhoneStatusBarPolicy
        mLocationController.addCallback(this);
        mRecordingController.addCallback(this);

        registerNetworkPolicyListener();

        mCommandQueue.addCallback(this);

        // Get initial user setup state
@@ -578,6 +595,73 @@ public class PhoneStatusBarPolicy
        });
    }

    private void updateFirewall() {
        mUiBgExecutor.execute(() -> {
            try {
                final int uid = ActivityTaskManager.getService().getLastResumedActivityUid();
                final boolean isRestricted = INetworkPolicyManager.Stub.asInterface(
                        ServiceManager.getService(Context.NETWORK_POLICY_SERVICE))
                        .isUidNetworkingBlocked(uid, false);
                boolean isLauncher = false;
                List<ResolveInfo> homeActivities = new ArrayList<>();
                AppGlobals.getPackageManager().getHomeActivities(homeActivities);
                for (ResolveInfo homeActivity : homeActivities) {
                    if (uid == homeActivity.activityInfo.applicationInfo.uid) {
                        isLauncher = true;
                        break;
                    }
                }
                final boolean finalIsLauncher = isLauncher;
                mHandler.post(() -> {
                    final boolean showIcon;
                    if (!finalIsLauncher && isRestricted && (!mKeyguardStateController.isShowing()
                            || mKeyguardStateController.isOccluded())) {
                        showIcon = true;
                        mIconController.setIcon(mSlotFirewall, R.drawable.stat_sys_firewall, null);
                    } else {
                        showIcon = false;
                    }
                    if (mFirewallVisible != showIcon) {
                        mIconController.setIconVisibility(mSlotFirewall, showIcon);
                        mFirewallVisible = showIcon;
                    }
                });
            } catch (RemoteException e) {
                Log.w(TAG, "updateFirewall: ", e);
            }
        });
    }

    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 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();
        }
    };

    private final SynchronousUserSwitchObserver mUserSwitchListener =
            new SynchronousUserSwitchObserver() {
                @Override
@@ -633,12 +717,14 @@ public class PhoneStatusBarPolicy
            boolean forced) {
        if (mDisplayId == displayId) {
            updateManagedProfile();
            updateFirewall();
        }
    }

    @Override
    public void onKeyguardShowingChanged() {
        updateManagedProfile();
        updateFirewall();
    }

    @Override
Loading