Loading core/api/system-current.txt +19 −0 Original line number Original line Diff line number Diff line Loading @@ -176,6 +176,7 @@ package android { field public static final String OBSERVE_APP_USAGE = "android.permission.OBSERVE_APP_USAGE"; field public static final String OBSERVE_APP_USAGE = "android.permission.OBSERVE_APP_USAGE"; field public static final String OBSERVE_NETWORK_POLICY = "android.permission.OBSERVE_NETWORK_POLICY"; field public static final String OBSERVE_NETWORK_POLICY = "android.permission.OBSERVE_NETWORK_POLICY"; field public static final String OBSERVE_ROLE_HOLDERS = "android.permission.OBSERVE_ROLE_HOLDERS"; field public static final String OBSERVE_ROLE_HOLDERS = "android.permission.OBSERVE_ROLE_HOLDERS"; field public static final String OBSERVE_SENSOR_PRIVACY = "android.permission.OBSERVE_SENSOR_PRIVACY"; field public static final String OPEN_ACCESSIBILITY_DETAILS_SETTINGS = "android.permission.OPEN_ACCESSIBILITY_DETAILS_SETTINGS"; field public static final String OPEN_ACCESSIBILITY_DETAILS_SETTINGS = "android.permission.OPEN_ACCESSIBILITY_DETAILS_SETTINGS"; field public static final String OVERRIDE_WIFI_CONFIG = "android.permission.OVERRIDE_WIFI_CONFIG"; field public static final String OVERRIDE_WIFI_CONFIG = "android.permission.OVERRIDE_WIFI_CONFIG"; field public static final String PACKAGE_VERIFICATION_AGENT = "android.permission.PACKAGE_VERIFICATION_AGENT"; field public static final String PACKAGE_VERIFICATION_AGENT = "android.permission.PACKAGE_VERIFICATION_AGENT"; Loading Loading @@ -2550,10 +2551,12 @@ package android.content.pm { field public static final String EXTRA_REQUEST_PERMISSIONS_NAMES = "android.content.pm.extra.REQUEST_PERMISSIONS_NAMES"; field public static final String EXTRA_REQUEST_PERMISSIONS_NAMES = "android.content.pm.extra.REQUEST_PERMISSIONS_NAMES"; field public static final String EXTRA_REQUEST_PERMISSIONS_RESULTS = "android.content.pm.extra.REQUEST_PERMISSIONS_RESULTS"; field public static final String EXTRA_REQUEST_PERMISSIONS_RESULTS = "android.content.pm.extra.REQUEST_PERMISSIONS_RESULTS"; field public static final String FEATURE_BROADCAST_RADIO = "android.hardware.broadcastradio"; field public static final String FEATURE_BROADCAST_RADIO = "android.hardware.broadcastradio"; field public static final String FEATURE_CAMERA_TOGGLE = "android.hardware.camera.toggle"; field public static final String FEATURE_CONTEXT_HUB = "android.hardware.context_hub"; field public static final String FEATURE_CONTEXT_HUB = "android.hardware.context_hub"; field public static final String FEATURE_CROSS_LAYER_BLUR = "android.software.cross_layer_blur"; field public static final String FEATURE_CROSS_LAYER_BLUR = "android.software.cross_layer_blur"; field @Deprecated public static final String FEATURE_INCREMENTAL_DELIVERY = "android.software.incremental_delivery"; field @Deprecated public static final String FEATURE_INCREMENTAL_DELIVERY = "android.software.incremental_delivery"; field public static final String FEATURE_INCREMENTAL_DELIVERY_VERSION = "android.software.incremental_delivery_version"; field public static final String FEATURE_INCREMENTAL_DELIVERY_VERSION = "android.software.incremental_delivery_version"; field public static final String FEATURE_MICROPHONE_TOGGLE = "android.hardware.microphone.toggle"; field public static final String FEATURE_REBOOT_ESCROW = "android.hardware.reboot_escrow"; field public static final String FEATURE_REBOOT_ESCROW = "android.hardware.reboot_escrow"; field public static final String FEATURE_TELEPHONY_CARRIERLOCK = "android.hardware.telephony.carrierlock"; field public static final String FEATURE_TELEPHONY_CARRIERLOCK = "android.hardware.telephony.carrierlock"; field public static final String FEATURE_TELEPHONY_IMS_SINGLE_REGISTRATION = "android.hardware.telephony.ims.singlereg"; field public static final String FEATURE_TELEPHONY_IMS_SINGLE_REGISTRATION = "android.hardware.telephony.ims.singlereg"; Loading Loading @@ -2908,6 +2911,22 @@ package android.hardware { method public boolean injectSensorData(android.hardware.Sensor, float[], int, long); method public boolean injectSensorData(android.hardware.Sensor, float[], int, long); } } public final class SensorPrivacyManager { method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(int, @NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener); method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(int, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener); method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public boolean isSensorPrivacyEnabled(int); method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void removeSensorPrivacyListener(@NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener); } public static interface SensorPrivacyManager.OnSensorPrivacyChangedListener { method public void onSensorPrivacyChanged(boolean); } public static class SensorPrivacyManager.Sensors { field public static final int CAMERA = 2; // 0x2 field public static final int MICROPHONE = 1; // 0x1 } } } package android.hardware.biometrics { package android.hardware.biometrics { Loading core/api/test-current.txt +17 −5 Original line number Original line Diff line number Diff line Loading @@ -718,8 +718,10 @@ package android.content.pm { method public void holdLock(android.os.IBinder, int); method public void holdLock(android.os.IBinder, int); method @RequiresPermission(android.Manifest.permission.KEEP_UNINSTALLED_PACKAGES) public void setKeepUninstalledPackages(@NonNull java.util.List<java.lang.String>); method @RequiresPermission(android.Manifest.permission.KEEP_UNINSTALLED_PACKAGES) public void setKeepUninstalledPackages(@NonNull java.util.List<java.lang.String>); field public static final String FEATURE_ADOPTABLE_STORAGE = "android.software.adoptable_storage"; field public static final String FEATURE_ADOPTABLE_STORAGE = "android.software.adoptable_storage"; field public static final String FEATURE_CAMERA_TOGGLE = "android.hardware.camera.toggle"; field public static final String FEATURE_FILE_BASED_ENCRYPTION = "android.software.file_based_encryption"; field public static final String FEATURE_FILE_BASED_ENCRYPTION = "android.software.file_based_encryption"; field public static final String FEATURE_HDMI_CEC = "android.hardware.hdmi.cec"; field public static final String FEATURE_HDMI_CEC = "android.hardware.hdmi.cec"; field public static final String FEATURE_MICROPHONE_TOGGLE = "android.hardware.microphone.toggle"; field public static final int FLAG_PERMISSION_REVOKE_WHEN_REQUESTED = 128; // 0x80 field public static final int FLAG_PERMISSION_REVOKE_WHEN_REQUESTED = 128; // 0x80 field public static final int MATCH_KNOWN_PACKAGES = 4202496; // 0x402000 field public static final int MATCH_KNOWN_PACKAGES = 4202496; // 0x402000 field public static final String SYSTEM_SHARED_LIBRARY_SERVICES = "android.ext.services"; field public static final String SYSTEM_SHARED_LIBRARY_SERVICES = "android.ext.services"; Loading Loading @@ -880,11 +882,21 @@ package android.graphics.fonts { package android.hardware { package android.hardware { public final class SensorPrivacyManager { public final class SensorPrivacyManager { method public boolean isIndividualSensorPrivacyEnabled(int); method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(int, @NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener); method @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setIndividualSensorPrivacy(int, boolean); method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(int, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener); method @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setIndividualSensorPrivacyForProfileGroup(int, boolean); method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public boolean isSensorPrivacyEnabled(int); field public static final int INDIVIDUAL_SENSOR_CAMERA = 2; // 0x2 method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void removeSensorPrivacyListener(@NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener); field public static final int INDIVIDUAL_SENSOR_MICROPHONE = 1; // 0x1 method @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setSensorPrivacy(int, boolean); method @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setSensorPrivacyForProfileGroup(int, boolean); } public static interface SensorPrivacyManager.OnSensorPrivacyChangedListener { method public void onSensorPrivacyChanged(boolean); } public static class SensorPrivacyManager.Sensors { field public static final int CAMERA = 2; // 0x2 field public static final int MICROPHONE = 1; // 0x1 } } } } Loading core/java/android/content/pm/PackageManager.java +16 −1 Original line number Original line Diff line number Diff line Loading @@ -3623,11 +3623,26 @@ public abstract class PackageManager { /** /** * Feature for {@link #getSystemAvailableFeatures} and * Feature for {@link #getSystemAvailableFeatures} and * {@link #hasSystemFeature}: The device supports a enabling/disabling sensor privacy for * {@link #hasSystemFeature}: The device supports a enabling/disabling sensor privacy for * camera. When sensory privacy for the camera is enabled no camera data is send to clients, * microphone. When sensory privacy for the microphone is enabled no microphone data is sent to * clients, e.g. all audio data is silent. * * @hide */ @SystemApi @TestApi @SdkConstant(SdkConstantType.FEATURE) public static final String FEATURE_MICROPHONE_TOGGLE = "android.hardware.microphone.toggle"; /** * Feature for {@link #getSystemAvailableFeatures} and * {@link #hasSystemFeature}: The device supports a enabling/disabling sensor privacy for * camera. When sensory privacy for the camera is enabled no camera data is sent to clients, * e.g. the view finder in a camera app would appear blank. * e.g. the view finder in a camera app would appear blank. * * * @hide * @hide */ */ @SystemApi @TestApi @SdkConstant(SdkConstantType.FEATURE) @SdkConstant(SdkConstantType.FEATURE) public static final String FEATURE_CAMERA_TOGGLE = "android.hardware.camera.toggle"; public static final String FEATURE_CAMERA_TOGGLE = "android.hardware.camera.toggle"; Loading core/java/android/hardware/SensorPrivacyManager.java +85 −29 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,7 @@ package android.hardware; import android.annotation.IntDef; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.SystemService; import android.annotation.TestApi; import android.annotation.TestApi; import android.content.Context; import android.content.Context; Loading @@ -33,6 +34,7 @@ import com.android.internal.annotations.GuardedBy; import java.lang.annotation.Retention; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy; import java.util.concurrent.Executor; /** /** * This class provides access to the sensor privacy services; sensor privacy allows the * This class provides access to the sensor privacy services; sensor privacy allows the Loading @@ -42,9 +44,21 @@ import java.lang.annotation.RetentionPolicy; * * * @hide * @hide */ */ @SystemApi @TestApi @TestApi @SystemService(Context.SENSOR_PRIVACY_SERVICE) @SystemService(Context.SENSOR_PRIVACY_SERVICE) public final class SensorPrivacyManager { public final class SensorPrivacyManager { /** * @hide */ public static final boolean USE_MICROPHONE_TOGGLE = true; /** * @hide */ public static final boolean USE_CAMERA_TOGGLE = true; /** /** * Unique Id of this manager to identify to the service * Unique Id of this manager to identify to the service * @hide * @hide Loading @@ -58,28 +72,39 @@ public final class SensorPrivacyManager { public static final String EXTRA_SENSOR = SensorPrivacyManager.class.getName() public static final String EXTRA_SENSOR = SensorPrivacyManager.class.getName() + ".extra.sensor"; + ".extra.sensor"; /** * Individual sensors not listed in {@link Sensors} * @hide */ @SystemApi @TestApi public static class Sensors { private Sensors() {} /** Microphone /** Microphone * @hide */ * @hide */ @SystemApi @TestApi @TestApi public static final int INDIVIDUAL_SENSOR_MICROPHONE = public static final int MICROPHONE = SensorPrivacyIndividualEnabledSensorProto.MICROPHONE; SensorPrivacyIndividualEnabledSensorProto.MICROPHONE; /** Camera /** Camera * @hide */ * @hide */ @SystemApi @TestApi @TestApi public static final int INDIVIDUAL_SENSOR_CAMERA = public static final int CAMERA = SensorPrivacyIndividualEnabledSensorProto.CAMERA; SensorPrivacyIndividualEnabledSensorProto.CAMERA; /** /** * Individual sensors not listed in {@link Sensor} * Individual sensors not listed in {@link Sensors} * * @hide * @hide */ */ @IntDef(prefix = "INDIVIDUAL_SENSOR_", value = { @IntDef(value = { INDIVIDUAL_SENSOR_MICROPHONE, MICROPHONE, INDIVIDUAL_SENSOR_CAMERA CAMERA }) }) @Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE) public @interface IndividualSensor {} public @interface Sensor {} } /** /** * A class implementing this interface can register with the {@link * A class implementing this interface can register with the {@link Loading @@ -88,6 +113,8 @@ public final class SensorPrivacyManager { * * * @hide * @hide */ */ @SystemApi @TestApi public interface OnSensorPrivacyChangedListener { public interface OnSensorPrivacyChangedListener { /** /** * Callback invoked when the sensor privacy state changes. * Callback invoked when the sensor privacy state changes. Loading Loading @@ -165,7 +192,8 @@ public final class SensorPrivacyManager { * * * @hide * @hide */ */ public void addSensorPrivacyListener(final OnSensorPrivacyChangedListener listener) { @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(@NonNull final OnSensorPrivacyChangedListener listener) { synchronized (mListeners) { synchronized (mListeners) { ISensorPrivacyListener iListener = mListeners.get(listener); ISensorPrivacyListener iListener = mListeners.get(listener); if (iListener == null) { if (iListener == null) { Loading Loading @@ -196,15 +224,37 @@ public final class SensorPrivacyManager { * * * @hide * @hide */ */ public void addSensorPrivacyListener(@IndividualSensor int sensor, @SystemApi final OnSensorPrivacyChangedListener listener) { @TestApi @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(@Sensors.Sensor int sensor, @NonNull OnSensorPrivacyChangedListener listener) { addSensorPrivacyListener(sensor, mContext.getMainExecutor(), listener); } /** * Registers a new listener to receive notification when the state of sensor privacy * changes. * * @param sensor the sensor to listen to changes to * @param executor the executor to dispatch the callback on * @param listener the OnSensorPrivacyChangedListener to be notified when the state of sensor * privacy changes. * * @hide */ @SystemApi @TestApi @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(@Sensors.Sensor int sensor, @NonNull Executor executor, @NonNull OnSensorPrivacyChangedListener listener) { synchronized (mListeners) { synchronized (mListeners) { ISensorPrivacyListener iListener = mListeners.get(listener); ISensorPrivacyListener iListener = mListeners.get(listener); if (iListener == null) { if (iListener == null) { iListener = new ISensorPrivacyListener.Stub() { iListener = new ISensorPrivacyListener.Stub() { @Override @Override public void onSensorPrivacyChanged(boolean enabled) { public void onSensorPrivacyChanged(boolean enabled) { listener.onSensorPrivacyChanged(enabled); executor.execute(() -> listener.onSensorPrivacyChanged(enabled)); } } }; }; mListeners.put(listener, iListener); mListeners.put(listener, iListener); Loading @@ -228,7 +278,10 @@ public final class SensorPrivacyManager { * * * @hide * @hide */ */ public void removeSensorPrivacyListener(OnSensorPrivacyChangedListener listener) { @SystemApi @TestApi @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void removeSensorPrivacyListener(@NonNull OnSensorPrivacyChangedListener listener) { synchronized (mListeners) { synchronized (mListeners) { ISensorPrivacyListener iListener = mListeners.get(listener); ISensorPrivacyListener iListener = mListeners.get(listener); if (iListener != null) { if (iListener != null) { Loading @@ -249,6 +302,7 @@ public final class SensorPrivacyManager { * * * @hide * @hide */ */ @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public boolean isSensorPrivacyEnabled() { public boolean isSensorPrivacyEnabled() { try { try { return mService.isSensorPrivacyEnabled(); return mService.isSensorPrivacyEnabled(); Loading @@ -264,8 +318,10 @@ public final class SensorPrivacyManager { * * * @hide * @hide */ */ @SystemApi @TestApi @TestApi public boolean isIndividualSensorPrivacyEnabled(@IndividualSensor int sensor) { @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public boolean isSensorPrivacyEnabled(@Sensors.Sensor int sensor) { try { try { return mService.isIndividualSensorPrivacyEnabled(mContext.getUserId(), sensor); return mService.isIndividualSensorPrivacyEnabled(mContext.getUserId(), sensor); } catch (RemoteException e) { } catch (RemoteException e) { Loading @@ -283,8 +339,7 @@ public final class SensorPrivacyManager { */ */ @TestApi @TestApi @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setIndividualSensorPrivacy(@IndividualSensor int sensor, public void setSensorPrivacy(@Sensors.Sensor int sensor, boolean enable) { boolean enable) { try { try { mService.setIndividualSensorPrivacy(mContext.getUserId(), sensor, enable); mService.setIndividualSensorPrivacy(mContext.getUserId(), sensor, enable); } catch (RemoteException e) { } catch (RemoteException e) { Loading @@ -303,7 +358,7 @@ public final class SensorPrivacyManager { */ */ @TestApi @TestApi @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setIndividualSensorPrivacyForProfileGroup(@IndividualSensor int sensor, public void setSensorPrivacyForProfileGroup(@Sensors.Sensor int sensor, boolean enable) { boolean enable) { try { try { mService.setIndividualSensorPrivacyForProfileGroup(mContext.getUserId(), sensor, mService.setIndividualSensorPrivacyForProfileGroup(mContext.getUserId(), sensor, Loading @@ -321,7 +376,8 @@ public final class SensorPrivacyManager { * * * @hide * @hide */ */ public void suppressIndividualSensorPrivacyReminders(@NonNull String packageName, @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void suppressSensorPrivacyReminders(@NonNull String packageName, boolean suppress) { boolean suppress) { try { try { mService.suppressIndividualSensorPrivacyReminders(mContext.getUserId(), packageName, mService.suppressIndividualSensorPrivacyReminders(mContext.getUserId(), packageName, Loading core/java/com/android/server/SystemConfig.java +9 −0 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.app.ActivityManager; import android.content.ComponentName; import android.content.ComponentName; import android.content.pm.FeatureInfo; import android.content.pm.FeatureInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.hardware.SensorPrivacyManager; import android.os.Build; import android.os.Build; import android.os.CarrierAssociatedAppEntry; import android.os.CarrierAssociatedAppEntry; import android.os.Environment; import android.os.Environment; Loading Loading @@ -1252,6 +1253,14 @@ public class SystemConfig { addFeature(PackageManager.FEATURE_CROSS_LAYER_BLUR, 0); addFeature(PackageManager.FEATURE_CROSS_LAYER_BLUR, 0); } } if (SensorPrivacyManager.USE_MICROPHONE_TOGGLE) { addFeature(PackageManager.FEATURE_MICROPHONE_TOGGLE, 0); } if (SensorPrivacyManager.USE_CAMERA_TOGGLE) { addFeature(PackageManager.FEATURE_CAMERA_TOGGLE, 0); } for (String featureName : mUnavailableFeatures) { for (String featureName : mUnavailableFeatures) { removeFeature(featureName); removeFeature(featureName); } } Loading Loading
core/api/system-current.txt +19 −0 Original line number Original line Diff line number Diff line Loading @@ -176,6 +176,7 @@ package android { field public static final String OBSERVE_APP_USAGE = "android.permission.OBSERVE_APP_USAGE"; field public static final String OBSERVE_APP_USAGE = "android.permission.OBSERVE_APP_USAGE"; field public static final String OBSERVE_NETWORK_POLICY = "android.permission.OBSERVE_NETWORK_POLICY"; field public static final String OBSERVE_NETWORK_POLICY = "android.permission.OBSERVE_NETWORK_POLICY"; field public static final String OBSERVE_ROLE_HOLDERS = "android.permission.OBSERVE_ROLE_HOLDERS"; field public static final String OBSERVE_ROLE_HOLDERS = "android.permission.OBSERVE_ROLE_HOLDERS"; field public static final String OBSERVE_SENSOR_PRIVACY = "android.permission.OBSERVE_SENSOR_PRIVACY"; field public static final String OPEN_ACCESSIBILITY_DETAILS_SETTINGS = "android.permission.OPEN_ACCESSIBILITY_DETAILS_SETTINGS"; field public static final String OPEN_ACCESSIBILITY_DETAILS_SETTINGS = "android.permission.OPEN_ACCESSIBILITY_DETAILS_SETTINGS"; field public static final String OVERRIDE_WIFI_CONFIG = "android.permission.OVERRIDE_WIFI_CONFIG"; field public static final String OVERRIDE_WIFI_CONFIG = "android.permission.OVERRIDE_WIFI_CONFIG"; field public static final String PACKAGE_VERIFICATION_AGENT = "android.permission.PACKAGE_VERIFICATION_AGENT"; field public static final String PACKAGE_VERIFICATION_AGENT = "android.permission.PACKAGE_VERIFICATION_AGENT"; Loading Loading @@ -2550,10 +2551,12 @@ package android.content.pm { field public static final String EXTRA_REQUEST_PERMISSIONS_NAMES = "android.content.pm.extra.REQUEST_PERMISSIONS_NAMES"; field public static final String EXTRA_REQUEST_PERMISSIONS_NAMES = "android.content.pm.extra.REQUEST_PERMISSIONS_NAMES"; field public static final String EXTRA_REQUEST_PERMISSIONS_RESULTS = "android.content.pm.extra.REQUEST_PERMISSIONS_RESULTS"; field public static final String EXTRA_REQUEST_PERMISSIONS_RESULTS = "android.content.pm.extra.REQUEST_PERMISSIONS_RESULTS"; field public static final String FEATURE_BROADCAST_RADIO = "android.hardware.broadcastradio"; field public static final String FEATURE_BROADCAST_RADIO = "android.hardware.broadcastradio"; field public static final String FEATURE_CAMERA_TOGGLE = "android.hardware.camera.toggle"; field public static final String FEATURE_CONTEXT_HUB = "android.hardware.context_hub"; field public static final String FEATURE_CONTEXT_HUB = "android.hardware.context_hub"; field public static final String FEATURE_CROSS_LAYER_BLUR = "android.software.cross_layer_blur"; field public static final String FEATURE_CROSS_LAYER_BLUR = "android.software.cross_layer_blur"; field @Deprecated public static final String FEATURE_INCREMENTAL_DELIVERY = "android.software.incremental_delivery"; field @Deprecated public static final String FEATURE_INCREMENTAL_DELIVERY = "android.software.incremental_delivery"; field public static final String FEATURE_INCREMENTAL_DELIVERY_VERSION = "android.software.incremental_delivery_version"; field public static final String FEATURE_INCREMENTAL_DELIVERY_VERSION = "android.software.incremental_delivery_version"; field public static final String FEATURE_MICROPHONE_TOGGLE = "android.hardware.microphone.toggle"; field public static final String FEATURE_REBOOT_ESCROW = "android.hardware.reboot_escrow"; field public static final String FEATURE_REBOOT_ESCROW = "android.hardware.reboot_escrow"; field public static final String FEATURE_TELEPHONY_CARRIERLOCK = "android.hardware.telephony.carrierlock"; field public static final String FEATURE_TELEPHONY_CARRIERLOCK = "android.hardware.telephony.carrierlock"; field public static final String FEATURE_TELEPHONY_IMS_SINGLE_REGISTRATION = "android.hardware.telephony.ims.singlereg"; field public static final String FEATURE_TELEPHONY_IMS_SINGLE_REGISTRATION = "android.hardware.telephony.ims.singlereg"; Loading Loading @@ -2908,6 +2911,22 @@ package android.hardware { method public boolean injectSensorData(android.hardware.Sensor, float[], int, long); method public boolean injectSensorData(android.hardware.Sensor, float[], int, long); } } public final class SensorPrivacyManager { method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(int, @NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener); method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(int, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener); method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public boolean isSensorPrivacyEnabled(int); method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void removeSensorPrivacyListener(@NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener); } public static interface SensorPrivacyManager.OnSensorPrivacyChangedListener { method public void onSensorPrivacyChanged(boolean); } public static class SensorPrivacyManager.Sensors { field public static final int CAMERA = 2; // 0x2 field public static final int MICROPHONE = 1; // 0x1 } } } package android.hardware.biometrics { package android.hardware.biometrics { Loading
core/api/test-current.txt +17 −5 Original line number Original line Diff line number Diff line Loading @@ -718,8 +718,10 @@ package android.content.pm { method public void holdLock(android.os.IBinder, int); method public void holdLock(android.os.IBinder, int); method @RequiresPermission(android.Manifest.permission.KEEP_UNINSTALLED_PACKAGES) public void setKeepUninstalledPackages(@NonNull java.util.List<java.lang.String>); method @RequiresPermission(android.Manifest.permission.KEEP_UNINSTALLED_PACKAGES) public void setKeepUninstalledPackages(@NonNull java.util.List<java.lang.String>); field public static final String FEATURE_ADOPTABLE_STORAGE = "android.software.adoptable_storage"; field public static final String FEATURE_ADOPTABLE_STORAGE = "android.software.adoptable_storage"; field public static final String FEATURE_CAMERA_TOGGLE = "android.hardware.camera.toggle"; field public static final String FEATURE_FILE_BASED_ENCRYPTION = "android.software.file_based_encryption"; field public static final String FEATURE_FILE_BASED_ENCRYPTION = "android.software.file_based_encryption"; field public static final String FEATURE_HDMI_CEC = "android.hardware.hdmi.cec"; field public static final String FEATURE_HDMI_CEC = "android.hardware.hdmi.cec"; field public static final String FEATURE_MICROPHONE_TOGGLE = "android.hardware.microphone.toggle"; field public static final int FLAG_PERMISSION_REVOKE_WHEN_REQUESTED = 128; // 0x80 field public static final int FLAG_PERMISSION_REVOKE_WHEN_REQUESTED = 128; // 0x80 field public static final int MATCH_KNOWN_PACKAGES = 4202496; // 0x402000 field public static final int MATCH_KNOWN_PACKAGES = 4202496; // 0x402000 field public static final String SYSTEM_SHARED_LIBRARY_SERVICES = "android.ext.services"; field public static final String SYSTEM_SHARED_LIBRARY_SERVICES = "android.ext.services"; Loading Loading @@ -880,11 +882,21 @@ package android.graphics.fonts { package android.hardware { package android.hardware { public final class SensorPrivacyManager { public final class SensorPrivacyManager { method public boolean isIndividualSensorPrivacyEnabled(int); method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(int, @NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener); method @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setIndividualSensorPrivacy(int, boolean); method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(int, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener); method @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setIndividualSensorPrivacyForProfileGroup(int, boolean); method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public boolean isSensorPrivacyEnabled(int); field public static final int INDIVIDUAL_SENSOR_CAMERA = 2; // 0x2 method @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void removeSensorPrivacyListener(@NonNull android.hardware.SensorPrivacyManager.OnSensorPrivacyChangedListener); field public static final int INDIVIDUAL_SENSOR_MICROPHONE = 1; // 0x1 method @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setSensorPrivacy(int, boolean); method @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setSensorPrivacyForProfileGroup(int, boolean); } public static interface SensorPrivacyManager.OnSensorPrivacyChangedListener { method public void onSensorPrivacyChanged(boolean); } public static class SensorPrivacyManager.Sensors { field public static final int CAMERA = 2; // 0x2 field public static final int MICROPHONE = 1; // 0x1 } } } } Loading
core/java/android/content/pm/PackageManager.java +16 −1 Original line number Original line Diff line number Diff line Loading @@ -3623,11 +3623,26 @@ public abstract class PackageManager { /** /** * Feature for {@link #getSystemAvailableFeatures} and * Feature for {@link #getSystemAvailableFeatures} and * {@link #hasSystemFeature}: The device supports a enabling/disabling sensor privacy for * {@link #hasSystemFeature}: The device supports a enabling/disabling sensor privacy for * camera. When sensory privacy for the camera is enabled no camera data is send to clients, * microphone. When sensory privacy for the microphone is enabled no microphone data is sent to * clients, e.g. all audio data is silent. * * @hide */ @SystemApi @TestApi @SdkConstant(SdkConstantType.FEATURE) public static final String FEATURE_MICROPHONE_TOGGLE = "android.hardware.microphone.toggle"; /** * Feature for {@link #getSystemAvailableFeatures} and * {@link #hasSystemFeature}: The device supports a enabling/disabling sensor privacy for * camera. When sensory privacy for the camera is enabled no camera data is sent to clients, * e.g. the view finder in a camera app would appear blank. * e.g. the view finder in a camera app would appear blank. * * * @hide * @hide */ */ @SystemApi @TestApi @SdkConstant(SdkConstantType.FEATURE) @SdkConstant(SdkConstantType.FEATURE) public static final String FEATURE_CAMERA_TOGGLE = "android.hardware.camera.toggle"; public static final String FEATURE_CAMERA_TOGGLE = "android.hardware.camera.toggle"; Loading
core/java/android/hardware/SensorPrivacyManager.java +85 −29 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,7 @@ package android.hardware; import android.annotation.IntDef; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.SystemService; import android.annotation.TestApi; import android.annotation.TestApi; import android.content.Context; import android.content.Context; Loading @@ -33,6 +34,7 @@ import com.android.internal.annotations.GuardedBy; import java.lang.annotation.Retention; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy; import java.util.concurrent.Executor; /** /** * This class provides access to the sensor privacy services; sensor privacy allows the * This class provides access to the sensor privacy services; sensor privacy allows the Loading @@ -42,9 +44,21 @@ import java.lang.annotation.RetentionPolicy; * * * @hide * @hide */ */ @SystemApi @TestApi @TestApi @SystemService(Context.SENSOR_PRIVACY_SERVICE) @SystemService(Context.SENSOR_PRIVACY_SERVICE) public final class SensorPrivacyManager { public final class SensorPrivacyManager { /** * @hide */ public static final boolean USE_MICROPHONE_TOGGLE = true; /** * @hide */ public static final boolean USE_CAMERA_TOGGLE = true; /** /** * Unique Id of this manager to identify to the service * Unique Id of this manager to identify to the service * @hide * @hide Loading @@ -58,28 +72,39 @@ public final class SensorPrivacyManager { public static final String EXTRA_SENSOR = SensorPrivacyManager.class.getName() public static final String EXTRA_SENSOR = SensorPrivacyManager.class.getName() + ".extra.sensor"; + ".extra.sensor"; /** * Individual sensors not listed in {@link Sensors} * @hide */ @SystemApi @TestApi public static class Sensors { private Sensors() {} /** Microphone /** Microphone * @hide */ * @hide */ @SystemApi @TestApi @TestApi public static final int INDIVIDUAL_SENSOR_MICROPHONE = public static final int MICROPHONE = SensorPrivacyIndividualEnabledSensorProto.MICROPHONE; SensorPrivacyIndividualEnabledSensorProto.MICROPHONE; /** Camera /** Camera * @hide */ * @hide */ @SystemApi @TestApi @TestApi public static final int INDIVIDUAL_SENSOR_CAMERA = public static final int CAMERA = SensorPrivacyIndividualEnabledSensorProto.CAMERA; SensorPrivacyIndividualEnabledSensorProto.CAMERA; /** /** * Individual sensors not listed in {@link Sensor} * Individual sensors not listed in {@link Sensors} * * @hide * @hide */ */ @IntDef(prefix = "INDIVIDUAL_SENSOR_", value = { @IntDef(value = { INDIVIDUAL_SENSOR_MICROPHONE, MICROPHONE, INDIVIDUAL_SENSOR_CAMERA CAMERA }) }) @Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE) public @interface IndividualSensor {} public @interface Sensor {} } /** /** * A class implementing this interface can register with the {@link * A class implementing this interface can register with the {@link Loading @@ -88,6 +113,8 @@ public final class SensorPrivacyManager { * * * @hide * @hide */ */ @SystemApi @TestApi public interface OnSensorPrivacyChangedListener { public interface OnSensorPrivacyChangedListener { /** /** * Callback invoked when the sensor privacy state changes. * Callback invoked when the sensor privacy state changes. Loading Loading @@ -165,7 +192,8 @@ public final class SensorPrivacyManager { * * * @hide * @hide */ */ public void addSensorPrivacyListener(final OnSensorPrivacyChangedListener listener) { @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(@NonNull final OnSensorPrivacyChangedListener listener) { synchronized (mListeners) { synchronized (mListeners) { ISensorPrivacyListener iListener = mListeners.get(listener); ISensorPrivacyListener iListener = mListeners.get(listener); if (iListener == null) { if (iListener == null) { Loading Loading @@ -196,15 +224,37 @@ public final class SensorPrivacyManager { * * * @hide * @hide */ */ public void addSensorPrivacyListener(@IndividualSensor int sensor, @SystemApi final OnSensorPrivacyChangedListener listener) { @TestApi @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(@Sensors.Sensor int sensor, @NonNull OnSensorPrivacyChangedListener listener) { addSensorPrivacyListener(sensor, mContext.getMainExecutor(), listener); } /** * Registers a new listener to receive notification when the state of sensor privacy * changes. * * @param sensor the sensor to listen to changes to * @param executor the executor to dispatch the callback on * @param listener the OnSensorPrivacyChangedListener to be notified when the state of sensor * privacy changes. * * @hide */ @SystemApi @TestApi @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void addSensorPrivacyListener(@Sensors.Sensor int sensor, @NonNull Executor executor, @NonNull OnSensorPrivacyChangedListener listener) { synchronized (mListeners) { synchronized (mListeners) { ISensorPrivacyListener iListener = mListeners.get(listener); ISensorPrivacyListener iListener = mListeners.get(listener); if (iListener == null) { if (iListener == null) { iListener = new ISensorPrivacyListener.Stub() { iListener = new ISensorPrivacyListener.Stub() { @Override @Override public void onSensorPrivacyChanged(boolean enabled) { public void onSensorPrivacyChanged(boolean enabled) { listener.onSensorPrivacyChanged(enabled); executor.execute(() -> listener.onSensorPrivacyChanged(enabled)); } } }; }; mListeners.put(listener, iListener); mListeners.put(listener, iListener); Loading @@ -228,7 +278,10 @@ public final class SensorPrivacyManager { * * * @hide * @hide */ */ public void removeSensorPrivacyListener(OnSensorPrivacyChangedListener listener) { @SystemApi @TestApi @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public void removeSensorPrivacyListener(@NonNull OnSensorPrivacyChangedListener listener) { synchronized (mListeners) { synchronized (mListeners) { ISensorPrivacyListener iListener = mListeners.get(listener); ISensorPrivacyListener iListener = mListeners.get(listener); if (iListener != null) { if (iListener != null) { Loading @@ -249,6 +302,7 @@ public final class SensorPrivacyManager { * * * @hide * @hide */ */ @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public boolean isSensorPrivacyEnabled() { public boolean isSensorPrivacyEnabled() { try { try { return mService.isSensorPrivacyEnabled(); return mService.isSensorPrivacyEnabled(); Loading @@ -264,8 +318,10 @@ public final class SensorPrivacyManager { * * * @hide * @hide */ */ @SystemApi @TestApi @TestApi public boolean isIndividualSensorPrivacyEnabled(@IndividualSensor int sensor) { @RequiresPermission(android.Manifest.permission.OBSERVE_SENSOR_PRIVACY) public boolean isSensorPrivacyEnabled(@Sensors.Sensor int sensor) { try { try { return mService.isIndividualSensorPrivacyEnabled(mContext.getUserId(), sensor); return mService.isIndividualSensorPrivacyEnabled(mContext.getUserId(), sensor); } catch (RemoteException e) { } catch (RemoteException e) { Loading @@ -283,8 +339,7 @@ public final class SensorPrivacyManager { */ */ @TestApi @TestApi @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setIndividualSensorPrivacy(@IndividualSensor int sensor, public void setSensorPrivacy(@Sensors.Sensor int sensor, boolean enable) { boolean enable) { try { try { mService.setIndividualSensorPrivacy(mContext.getUserId(), sensor, enable); mService.setIndividualSensorPrivacy(mContext.getUserId(), sensor, enable); } catch (RemoteException e) { } catch (RemoteException e) { Loading @@ -303,7 +358,7 @@ public final class SensorPrivacyManager { */ */ @TestApi @TestApi @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void setIndividualSensorPrivacyForProfileGroup(@IndividualSensor int sensor, public void setSensorPrivacyForProfileGroup(@Sensors.Sensor int sensor, boolean enable) { boolean enable) { try { try { mService.setIndividualSensorPrivacyForProfileGroup(mContext.getUserId(), sensor, mService.setIndividualSensorPrivacyForProfileGroup(mContext.getUserId(), sensor, Loading @@ -321,7 +376,8 @@ public final class SensorPrivacyManager { * * * @hide * @hide */ */ public void suppressIndividualSensorPrivacyReminders(@NonNull String packageName, @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY) public void suppressSensorPrivacyReminders(@NonNull String packageName, boolean suppress) { boolean suppress) { try { try { mService.suppressIndividualSensorPrivacyReminders(mContext.getUserId(), packageName, mService.suppressIndividualSensorPrivacyReminders(mContext.getUserId(), packageName, Loading
core/java/com/android/server/SystemConfig.java +9 −0 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.app.ActivityManager; import android.content.ComponentName; import android.content.ComponentName; import android.content.pm.FeatureInfo; import android.content.pm.FeatureInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.hardware.SensorPrivacyManager; import android.os.Build; import android.os.Build; import android.os.CarrierAssociatedAppEntry; import android.os.CarrierAssociatedAppEntry; import android.os.Environment; import android.os.Environment; Loading Loading @@ -1252,6 +1253,14 @@ public class SystemConfig { addFeature(PackageManager.FEATURE_CROSS_LAYER_BLUR, 0); addFeature(PackageManager.FEATURE_CROSS_LAYER_BLUR, 0); } } if (SensorPrivacyManager.USE_MICROPHONE_TOGGLE) { addFeature(PackageManager.FEATURE_MICROPHONE_TOGGLE, 0); } if (SensorPrivacyManager.USE_CAMERA_TOGGLE) { addFeature(PackageManager.FEATURE_CAMERA_TOGGLE, 0); } for (String featureName : mUnavailableFeatures) { for (String featureName : mUnavailableFeatures) { removeFeature(featureName); removeFeature(featureName); } } Loading