Loading services/usb/Android.bp +12 −0 Original line number Diff line number Diff line Loading @@ -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", } services/usb/java/com/android/server/usb/UsbHandlerManager.java +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java +80 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; Loading @@ -101,6 +115,8 @@ class UsbProfileGroupSettingsManager { private final PackageManager mPackageManager; private final ActivityManager mActivityManager; private final UserManager mUserManager; private final @NonNull UsbSettingsManager mSettingsManager; Loading Loading @@ -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); Loading @@ -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); Loading Loading @@ -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; Loading @@ -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); Loading services/usb/java/com/android/server/usb/UsbSettingsManager.java +2 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading services/usb/java/com/android/server/usb/UsbUserSettingsManager.java +2 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading
services/usb/Android.bp +12 −0 Original line number Diff line number Diff line Loading @@ -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", }
services/usb/java/com/android/server/usb/UsbHandlerManager.java +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading
services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java +80 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; Loading @@ -101,6 +115,8 @@ class UsbProfileGroupSettingsManager { private final PackageManager mPackageManager; private final ActivityManager mActivityManager; private final UserManager mUserManager; private final @NonNull UsbSettingsManager mSettingsManager; Loading Loading @@ -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); Loading @@ -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); Loading Loading @@ -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; Loading @@ -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); Loading
services/usb/java/com/android/server/usb/UsbSettingsManager.java +2 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading
services/usb/java/com/android/server/usb/UsbUserSettingsManager.java +2 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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