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

Commit aaa6244b authored by Sarup Dalwani's avatar Sarup Dalwani Committed by Android (Google) Code Review
Browse files

Merge "Avoiding overlay activities when usb device is attached." into main

parents ace52242 3e5c6937
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -34,8 +34,20 @@ java_library_static {
        "android.hardware.usb-V1.2-java",
        "android.hardware.usb-V1.3-java",
        "android.hardware.usb-V3-java",
        "usb_flags_lib",
    ],
    lint: {
        baseline_filename: "lint-baseline.xml",
    },
}

aconfig_declarations {
    name: "usb_flags",
    package: "com.android.server.usb.flags",
    srcs: ["**/usb_flags.aconfig"],
}

java_aconfig_library {
    name: "usb_flags_lib",
    aconfig_declarations: "usb_flags",
}
+1 −1
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ import java.util.ArrayList;
 *
 * @hide
 */
class UsbHandlerManager {
public class UsbHandlerManager {
    private static final String LOG_TAG = UsbHandlerManager.class.getSimpleName();

    private final Context mContext;
+80 −3
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server.usb;

import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_MANAGED_PROFILE;

import android.Manifest;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
@@ -62,6 +63,7 @@ import com.android.internal.util.XmlUtils;
import com.android.internal.util.dump.DualDumpOutputStream;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
import com.android.server.usb.flags.Flags;
import com.android.server.utils.EventLogger;

import libcore.io.IoUtils;
@@ -80,8 +82,20 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class UsbProfileGroupSettingsManager {
public class UsbProfileGroupSettingsManager {
    /**
     * <application> level property that an app can specify to restrict any overlaying of
     * activities when usb device is attached.
     *
     *
     * <p>This should only be set by privileged apps having {@link Manifest.permission#MANAGE_USB}
     * permission.
     * @hide
     */
    public static final String PROPERTY_RESTRICT_USB_OVERLAY_ACTIVITIES =
            "android.app.PROPERTY_RESTRICT_USB_OVERLAY_ACTIVITIES";
    private static final String TAG = UsbProfileGroupSettingsManager.class.getSimpleName();
    private static final boolean DEBUG = false;

@@ -101,6 +115,8 @@ class UsbProfileGroupSettingsManager {

    private final PackageManager mPackageManager;

    private final ActivityManager mActivityManager;

    private final UserManager mUserManager;
    private final @NonNull UsbSettingsManager mSettingsManager;

@@ -224,7 +240,7 @@ class UsbProfileGroupSettingsManager {
     * @param settingsManager The settings manager of the service
     * @param usbResolveActivityManager The resovle activity manager of the service
     */
    UsbProfileGroupSettingsManager(@NonNull Context context, @NonNull UserHandle user,
    public UsbProfileGroupSettingsManager(@NonNull Context context, @NonNull UserHandle user,
            @NonNull UsbSettingsManager settingsManager,
            @NonNull UsbHandlerManager usbResolveActivityManager) {
        if (DEBUG) Slog.v(TAG, "Creating settings for " + user);
@@ -238,6 +254,7 @@ class UsbProfileGroupSettingsManager {

        mContext = context;
        mPackageManager = context.getPackageManager();
        mActivityManager = context.getSystemService(ActivityManager.class);
        mSettingsManager = settingsManager;
        mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);

@@ -895,8 +912,11 @@ class UsbProfileGroupSettingsManager {
        // Send broadcast to running activities with registered intent
        mContext.sendBroadcastAsUser(intent, UserHandle.ALL);

        //resolving activities only if there is no foreground activity restricting it.
        if (!shouldRestrictOverlayActivities()) {
            resolveActivity(intent, device, true /* showMtpNotification */);
        }
    }

    private void resolveActivity(Intent intent, UsbDevice device, boolean showMtpNotification) {
        final ArrayList<ResolveInfo> matches;
@@ -918,6 +938,63 @@ class UsbProfileGroupSettingsManager {
        resolveActivity(intent, matches, defaultActivity, device, null);
    }

    /**
     * @return true if any application in foreground have set restrict_usb_overlay_activities as
     * true in manifest file. The application needs to have MANAGE_USB permission.
     */
    private boolean shouldRestrictOverlayActivities() {

        if (!Flags.allowRestrictionOfOverlayActivities()) return false;

        List<ActivityManager.RunningAppProcessInfo> appProcessInfos = mActivityManager
                .getRunningAppProcesses();

        List<String> filteredAppProcessInfos = new ArrayList<>();
        boolean shouldRestrictOverlayActivities;

        //filtering out applications in foreground.
        for (ActivityManager.RunningAppProcessInfo processInfo : appProcessInfos) {
            if (processInfo.importance <= ActivityManager
                    .RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                filteredAppProcessInfos.addAll(List.of(processInfo.pkgList));
            }
        }

        if (DEBUG) Slog.d(TAG, "packages in foreground : " + filteredAppProcessInfos);

        List<String> packagesHoldingManageUsbPermission =
                mPackageManager.getPackagesHoldingPermissions(
                        new String[]{android.Manifest.permission.MANAGE_USB},
                        PackageManager.MATCH_SYSTEM_ONLY).stream()
                        .map(packageInfo -> packageInfo.packageName).collect(Collectors.toList());

        //retaining only packages that hold the required permission
        filteredAppProcessInfos.retainAll(packagesHoldingManageUsbPermission);

        if (DEBUG) {
            Slog.d(TAG, "packages in foreground with required permission : "
                    + filteredAppProcessInfos);
        }

        shouldRestrictOverlayActivities = filteredAppProcessInfos.stream().anyMatch(pkg -> {
            try {
                return mPackageManager.getProperty(PROPERTY_RESTRICT_USB_OVERLAY_ACTIVITIES, pkg)
                        .getBoolean();
            } catch (NameNotFoundException e) {
                if (DEBUG) {
                    Slog.d(TAG, "property PROPERTY_RESTRICT_USB_OVERLAY_ACTIVITIES "
                            + "not present for " + pkg);
                }
                return false;
            }
        });

        if (shouldRestrictOverlayActivities) {
            Slog.d(TAG, "restricting starting of usb overlay activities");
        }
        return shouldRestrictOverlayActivities;
    }

    public void deviceAttachedForFixedHandler(UsbDevice device, ComponentName component) {
        final Intent intent = createDeviceAttachedIntent(device);

+2 −2
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ import java.util.List;
/**
 * Maintains all {@link UsbUserSettingsManager} for all users.
 */
class UsbSettingsManager {
public class UsbSettingsManager {
    private static final String LOG_TAG = UsbSettingsManager.class.getSimpleName();
    private static final boolean DEBUG = false;

@@ -70,7 +70,7 @@ class UsbSettingsManager {
     *
     * @return The settings for the user
     */
    @NonNull UsbUserSettingsManager getSettingsForUser(@UserIdInt int userId) {
    public @NonNull UsbUserSettingsManager getSettingsForUser(@UserIdInt int userId) {
        synchronized (mSettingsByUser) {
            UsbUserSettingsManager settings = mSettingsByUser.get(userId);
            if (settings == null) {
+2 −2
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ import org.xmlpull.v1.XmlPullParser;
import java.util.ArrayList;
import java.util.List;

class UsbUserSettingsManager {
public class UsbUserSettingsManager {
    private static final String TAG = UsbUserSettingsManager.class.getSimpleName();
    private static final boolean DEBUG = false;

@@ -81,7 +81,7 @@ class UsbUserSettingsManager {
     *
     * @return The resolve infos of the activities that can handle the intent
     */
    List<ResolveInfo> queryIntentActivities(@NonNull Intent intent) {
    public List<ResolveInfo> queryIntentActivities(@NonNull Intent intent) {
        return mPackageManager.queryIntentActivitiesAsUser(intent, PackageManager.GET_META_DATA,
                mUser.getIdentifier());
    }
Loading