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

Commit e6bef671 authored by Samiul Islam's avatar Samiul Islam
Browse files

Annotate System Manager classes that are restricted in SdkSandbox 1/n

These manager classes are inaccessible from SdkSandbox due to selinux
policies added back in Android U. Currently, developers trying to access
these managers/api will receive runtime error and crash, if they don't
handle the RTE properly.

To help developers understand if an API is available to the environment
they are running from, we are annotating these managers with the new
@RestrictedForEnvironment annotation.

This is a documentation enhancement feature. We are not adding any new
restriction. We are only highlighting the ALREADY existing restrictions
to users.

The annotation will be used to:
    - Update the javadoc in developer site.
    - Add lint support in IDE.

The annotation cannot be flag guarded (see flag stanza below). This
should still be safe since it's a documentation only change.

Bug: 320445933
Bug: 325606627
Test: atest SdkSandboxSystemServiceRestrictionsTests
Flag: EXEMPT RestrictedForEnvironment makes javadoc changes which cannot
      be disabled with flag. See b/396346859#comment11.
Change-Id: I5825d69883a9946e742858e83b0b5aba0781fa87
parent 0d9d579f
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -12767,7 +12767,7 @@ package android.content.pm {
    field public int reqTouchScreen;
  }
  public class CrossProfileApps {
  @RestrictedForEnvironment(environments=android.annotation.RestrictedForEnvironment.ENVIRONMENT_SDK_RUNTIME, from=android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) public class CrossProfileApps {
    method public boolean canInteractAcrossProfiles();
    method public boolean canRequestInteractAcrossProfiles();
    method @NonNull public android.content.Intent createRequestInteractAcrossProfilesIntent();
@@ -14000,7 +14000,7 @@ package android.content.pm {
    method @NonNull public android.content.pm.ShortcutInfo.Builder setStartingTheme(int);
  }
  public class ShortcutManager {
  @RestrictedForEnvironment(environments=android.annotation.RestrictedForEnvironment.ENVIRONMENT_SDK_RUNTIME, from=android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) public class ShortcutManager {
    method @WorkerThread public boolean addDynamicShortcuts(@NonNull java.util.List<android.content.pm.ShortcutInfo>);
    method @WorkerThread public android.content.Intent createShortcutResultIntent(@NonNull android.content.pm.ShortcutInfo);
    method public void disableShortcuts(@NonNull java.util.List<java.lang.String>);
@@ -14080,7 +14080,7 @@ package android.content.pm {
package android.content.pm.verify.domain {
  public final class DomainVerificationManager {
  @RestrictedForEnvironment(environments=android.annotation.RestrictedForEnvironment.ENVIRONMENT_SDK_RUNTIME, from=android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) public final class DomainVerificationManager {
    method @Nullable public android.content.pm.verify.domain.DomainVerificationUserState getDomainVerificationUserState(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
  }
@@ -21169,7 +21169,7 @@ package android.hardware.usb {
    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.usb.UsbInterface> CREATOR;
  }
  public class UsbManager {
  @RestrictedForEnvironment(environments=android.annotation.RestrictedForEnvironment.ENVIRONMENT_SDK_RUNTIME, from=android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) public class UsbManager {
    method public android.hardware.usb.UsbAccessory[] getAccessoryList();
    method public java.util.HashMap<java.lang.String,android.hardware.usb.UsbDevice> getDeviceList();
    method public boolean hasPermission(android.hardware.usb.UsbDevice);
@@ -29964,7 +29964,7 @@ package android.net {
    method public String sanitize(String);
  }
  public class VpnManager {
  @RestrictedForEnvironment(environments=android.annotation.RestrictedForEnvironment.ENVIRONMENT_SDK_RUNTIME, from=android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) public class VpnManager {
    method public void deleteProvisionedVpnProfile();
    method @Nullable public android.net.VpnProfileState getProvisionedVpnProfileState();
    method @Nullable public android.content.Intent provisionVpnProfile(@NonNull android.net.PlatformVpnProfile);
@@ -33485,7 +33485,7 @@ package android.os {
    method public boolean unlinkToDeath(@NonNull android.os.IBinder.DeathRecipient, int);
  }
  public final class BugreportManager {
  @RestrictedForEnvironment(environments=android.annotation.RestrictedForEnvironment.ENVIRONMENT_SDK_RUNTIME, from=android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) public final class BugreportManager {
    method @WorkerThread public void cancelBugreport();
    method @WorkerThread public void startConnectivityBugreport(@NonNull android.os.ParcelFileDescriptor, @NonNull java.util.concurrent.Executor, @NonNull android.os.BugreportManager.BugreportCallback);
  }
+2 −2
Original line number Diff line number Diff line
@@ -144,7 +144,7 @@ package android.content.pm {

package android.hardware.usb {

  public class UsbManager {
  @RestrictedForEnvironment(environments=android.annotation.RestrictedForEnvironment.ENVIRONMENT_SDK_RUNTIME, from=android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) public class UsbManager {
    method @RequiresPermission(android.Manifest.permission.MANAGE_USB) public int getGadgetHalVersion();
    method @RequiresPermission(android.Manifest.permission.MANAGE_USB) public int getUsbHalVersion();
    field public static final int GADGET_HAL_NOT_SUPPORTED = -1; // 0xffffffff
@@ -300,7 +300,7 @@ package android.net {
    method public static void setHttpProxyConfiguration(@Nullable android.net.ProxyInfo);
  }

  public class VpnManager {
  @RestrictedForEnvironment(environments=android.annotation.RestrictedForEnvironment.ENVIRONMENT_SDK_RUNTIME, from=android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) public class VpnManager {
    field public static final int TYPE_VPN_LEGACY = 3; // 0x3
    field public static final int TYPE_VPN_NONE = -1; // 0xffffffff
    field public static final int TYPE_VPN_OEM = 4; // 0x4
+5 −5
Original line number Diff line number Diff line
@@ -4073,7 +4073,7 @@ package android.content.pm {
    field public int targetSandboxVersion;
  }
  public class CrossProfileApps {
  @RestrictedForEnvironment(environments=android.annotation.RestrictedForEnvironment.ENVIRONMENT_SDK_RUNTIME, from=android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) public class CrossProfileApps {
    method @RequiresPermission(anyOf={android.Manifest.permission.INTERACT_ACROSS_PROFILES, android.Manifest.permission.START_CROSS_PROFILE_ACTIVITIES}) public void startActivity(@NonNull android.content.ComponentName, @NonNull android.os.UserHandle, @Nullable android.app.Activity, @Nullable android.os.Bundle);
    method @RequiresPermission(anyOf={android.Manifest.permission.INTERACT_ACROSS_PROFILES, android.Manifest.permission.START_CROSS_PROFILE_ACTIVITIES}) public void startActivity(@NonNull android.content.ComponentName, @NonNull android.os.UserHandle);
  }
@@ -4490,7 +4490,7 @@ package android.content.pm {
    method @Nullable public android.app.Person[] getPersons();
  }
  public class ShortcutManager {
  @RestrictedForEnvironment(environments=android.annotation.RestrictedForEnvironment.ENVIRONMENT_SDK_RUNTIME, from=android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) public class ShortcutManager {
    method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_APP_PREDICTIONS) @WorkerThread public java.util.List<android.content.pm.ShortcutManager.ShareShortcutInfo> getShareTargets(@NonNull android.content.IntentFilter);
    method public boolean hasShareTargets(@NonNull String);
  }
@@ -4626,7 +4626,7 @@ package android.content.pm.verify.domain {
    field public static final int STATE_UNMODIFIABLE = 2; // 0x2
  }
  public final class DomainVerificationManager {
  @RestrictedForEnvironment(environments=android.annotation.RestrictedForEnvironment.ENVIRONMENT_SDK_RUNTIME, from=android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) public final class DomainVerificationManager {
    method @Nullable @RequiresPermission(android.Manifest.permission.DOMAIN_VERIFICATION_AGENT) public android.content.pm.verify.domain.DomainVerificationInfo getDomainVerificationInfo(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
    method @NonNull @RequiresPermission(android.Manifest.permission.UPDATE_DOMAIN_VERIFICATION_USER_SELECTION) public java.util.SortedSet<android.content.pm.verify.domain.DomainOwner> getOwnersForDomain(@NonNull String);
    method @FlaggedApi("android.content.pm.relative_reference_intent_filters") @NonNull public java.util.Map<java.lang.String,java.util.List<android.content.UriRelativeFilterGroup>> getUriRelativeFilterGroups(@NonNull String, @NonNull java.util.List<java.lang.String>);
@@ -7199,7 +7199,7 @@ package android.hardware.usb {
    method public boolean resetDevice();
  }
  public class UsbManager {
  @RestrictedForEnvironment(environments=android.annotation.RestrictedForEnvironment.ENVIRONMENT_SDK_RUNTIME, from=android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) public class UsbManager {
    method @RequiresPermission(android.Manifest.permission.MANAGE_USB) public long getCurrentFunctions();
    method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_USB) public java.util.List<android.hardware.usb.UsbPort> getPorts();
    method @FlaggedApi("android.hardware.usb.flags.expose_usb_speed_system_api") @RequiresPermission(android.Manifest.permission.MANAGE_USB) public int getUsbBandwidthMbps();
@@ -11119,7 +11119,7 @@ package android.os {
    method @Nullable public Object onTransactStarted(@NonNull android.os.IBinder, int);
  }
  public final class BugreportManager {
  @RestrictedForEnvironment(environments=android.annotation.RestrictedForEnvironment.ENVIRONMENT_SDK_RUNTIME, from=android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) public final class BugreportManager {
    method @RequiresPermission(android.Manifest.permission.DUMP) @WorkerThread public void preDumpUiData();
    method @RequiresPermission(android.Manifest.permission.DUMP) public void requestBugreport(@NonNull android.os.BugreportParams, @Nullable CharSequence, @Nullable CharSequence);
    method @RequiresPermission(android.Manifest.permission.DUMP) @WorkerThread public void retrieveBugreport(@NonNull String, @NonNull android.os.ParcelFileDescriptor, @NonNull java.util.concurrent.Executor, @NonNull android.os.BugreportManager.BugreportCallback);
+3 −3
Original line number Diff line number Diff line
@@ -1112,7 +1112,7 @@ package android.content.pm {
    field public int privateFlags;
  }

  public class CrossProfileApps {
  @RestrictedForEnvironment(environments=android.annotation.RestrictedForEnvironment.ENVIRONMENT_SDK_RUNTIME, from=android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) public class CrossProfileApps {
    method public boolean canConfigureInteractAcrossProfiles(@NonNull String);
  }

@@ -1170,7 +1170,7 @@ package android.content.pm {
    method public boolean isVisibleToPublisher();
  }

  public class ShortcutManager {
  @RestrictedForEnvironment(environments=android.annotation.RestrictedForEnvironment.ENVIRONMENT_SDK_RUNTIME, from=android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) public class ShortcutManager {
    ctor public ShortcutManager(android.content.Context);
  }

@@ -1919,7 +1919,7 @@ package android.hardware.soundtrigger {

package android.hardware.usb {

  public class UsbManager {
  @RestrictedForEnvironment(environments=android.annotation.RestrictedForEnvironment.ENVIRONMENT_SDK_RUNTIME, from=android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) public class UsbManager {
    method public boolean isUvcGadgetSupportEnabled();
  }

+5 −0
Original line number Diff line number Diff line
@@ -16,15 +16,18 @@
package android.content.pm;

import static android.Manifest.permission.INTERACT_ACROSS_USERS;
import static android.annotation.RestrictedForEnvironment.ENVIRONMENT_SDK_RUNTIME;
import static android.app.admin.DevicePolicyResources.Strings.Core.SWITCH_TO_PERSONAL_LABEL;
import static android.app.admin.DevicePolicyResources.Strings.Core.SWITCH_TO_WORK_LABEL;
import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY;
import static android.app.admin.flags.Flags.FLAG_ALLOW_QUERYING_PROFILE_TYPE;


import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.RestrictedForEnvironment;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.annotation.UserHandleAware;
@@ -59,6 +62,8 @@ import java.util.stream.Collectors;
 * instance in any profile that is in {@link #getTargetUserProfiles()}. For example, app can
 * use this class to start its main activity in managed profile.
 */
@RestrictedForEnvironment(
        environments = ENVIRONMENT_SDK_RUNTIME, from = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
public class CrossProfileApps {

    /**
Loading