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

Unverified Commit e7994848 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 avatarMichael Bestas <mkbestas@gmail.com>
Change-Id: I7aa405e7f5a2f70e6cf2b6156a29d220617e4ae5
parent c4d4c68d
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -281,6 +281,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"
+96 −1
Original line number Diff line number Diff line
@@ -29,11 +29,20 @@ 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.Network;
import android.net.NetworkCapabilities;
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;
import android.service.notification.ZenModeConfig;
@@ -42,6 +51,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.broadcast.BroadcastDispatcher;
@@ -126,6 +136,7 @@ public class PhoneStatusBarPolicy
    private final String mSlotSensorsOff;
    private final String mSlotScreenRecord;
    private final String mSlotConnectedDisplay;
    private final String mSlotFirewall;
    private final int mDisplayId;
    private final SharedPreferences mSharedPreferences;
    private final DateFormatUtil mDateFormatUtil;
@@ -133,6 +144,7 @@ public class PhoneStatusBarPolicy
    private final ConnectedDisplayInteractor mConnectedDisplayInteractor;
    private final TelecomManager mTelecomManager;

    private final Context mContext;
    private final Handler mHandler;
    private final CastController mCast;
    private final HotspotController mHotspot;
@@ -159,6 +171,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;
@@ -166,12 +180,15 @@ public class PhoneStatusBarPolicy
    private boolean mCurrentUserSetup;

    private boolean mProfileIconVisible = 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,
@@ -193,6 +210,7 @@ public class PhoneStatusBarPolicy
            ConnectedDisplayInteractor connectedDisplayInteractor,
            JavaAdapter javaAdapter
    ) {
        mContext = context;
        mIconController = iconController;
        mCommandQueue = commandQueue;
        mConnectedDisplayInteractor = connectedDisplayInteractor;
@@ -223,6 +241,8 @@ public class PhoneStatusBarPolicy
        mRingerModeTracker = ringerModeTracker;
        mPrivacyLogger = privacyLogger;
        mJavaAdapter = javaAdapter;
        mConnectivityManager = context.getSystemService(ConnectivityManager.class);
        mNetworkPolicyManager = context.getSystemService(NetworkPolicyManager.class);

        mSlotCast = resources.getString(com.android.internal.R.string.status_bar_cast);
        mSlotConnectedDisplay = resources.getString(
@@ -245,6 +265,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;
@@ -273,6 +294,8 @@ public class PhoneStatusBarPolicy
        // listen for user / profile change.
        mUserTracker.addCallback(mUserSwitchListener, mMainExecutor);

        mNetworkPolicyManager.registerListener(mNetworkPolicyListener);

        // TTY status
        updateTTY();

@@ -349,6 +372,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);
@@ -609,6 +636,72 @@ public class PhoneStatusBarPolicy
        });
    }

    private void updateFirewall() {
        mUiBgExecutor.execute(() -> {
            try {
                final int uid = ActivityTaskManager.getService().getLastResumedActivityUid();
                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 =
                        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;
                        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 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 onUidPoliciesChanged(int uid, int uidPolicies) {
            mHandler.post(() -> updateFirewall());
        }
    };

    private final UserTracker.Callback mUserSwitchListener =
            new UserTracker.Callback() {
                @Override
@@ -664,6 +757,7 @@ public class PhoneStatusBarPolicy
            boolean forced) {
        if (mDisplayId == displayId) {
            updateProfileIcon();
            updateFirewall();
        }
    }

@@ -677,6 +771,7 @@ public class PhoneStatusBarPolicy
    @Override
    public void onKeyguardShowingChanged() {
        updateProfileIcon();
        updateFirewall();
    }

    @Override
Loading