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

Commit b8e8bee3 authored by Xiaozhen Lin's avatar Xiaozhen Lin
Browse files

Add package monitor

Whenever an app is removed, delete its UID from mUsbDisableRequesters
list. If all apps requesting USB to be disabled are removed, reenable USB data signaling.

Bug: 287498482
Test: manual testing
Change-Id: Ibb18380b7cbb0362d93920c716f9cbfd37c4b9ba
parent 865517d8
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -59,6 +59,8 @@ import android.util.Slog;
import android.util.proto.ProtoOutputStream;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.content.PackageMonitor;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
@@ -148,6 +150,7 @@ public class UsbService extends IUsbManager.Stub {
    private final UsbSettingsManager mSettingsManager;
    private final UsbPermissionManager mPermissionManager;

    static final int PACKAGE_MONITOR_OPERATION_ID = 1;
    /**
     * The user id of the current user. There might be several profiles (with separate user ids)
     * per user.
@@ -266,6 +269,10 @@ public class UsbService extends IUsbManager.Stub {
        if (mDeviceManager != null) {
            mDeviceManager.bootCompleted();
        }
        if (android.hardware.usb.flags.Flags.enableUsbDataSignalStaking()) {
            new PackageUninstallMonitor()
                    .register(mContext, UserHandle.ALL, BackgroundThread.getHandler());
        }
    }

    /** Called when a user is unlocked. */
@@ -1365,4 +1372,26 @@ public class UsbService extends IUsbManager.Stub {
    private static String removeLastChar(String value) {
        return value.substring(0, value.length() - 1);
    }

    /**
     * Upon app removal, clear associated UIDs from the mUsbDisableRequesters list
     * and re-enable USB data signaling if no remaining apps require USB disabling.
     */
    private class PackageUninstallMonitor extends PackageMonitor {
        @Override
        public void onUidRemoved(int uid) {
            synchronized (mUsbDisableRequesters) {
                for (String portId : mUsbDisableRequesters.keySet()) {
                    ArraySet<Integer> disabledUid = mUsbDisableRequesters.get(portId);
                    if (disabledUid != null) {
                        disabledUid.remove(uid);
                        if (disabledUid.isEmpty()) {
                            enableUsbData(portId, true, PACKAGE_MONITOR_OPERATION_ID,
                                    new IUsbOperationInternal.Default());
                        }
                    }
                }
            }
        }
    }
}