diff options
29 files changed, 835 insertions, 612 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index 7f35d4a47adf..880dbb89921e 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -18285,7 +18285,7 @@ package android.hardware.camera2.params { public final class OutputConfiguration implements android.os.Parcelable { ctor public OutputConfiguration(@NonNull android.view.Surface); ctor public OutputConfiguration(int, @NonNull android.view.Surface); - ctor public OutputConfiguration(@NonNull android.util.Size, @NonNull Class<T>); + ctor public <T> OutputConfiguration(@NonNull android.util.Size, @NonNull Class<T>); method public void addSensorPixelModeUsed(int); method public void addSurface(@NonNull android.view.Surface); method @NonNull public static java.util.Collection<android.hardware.camera2.params.OutputConfiguration> createInstancesForMultiResolutionOutput(@NonNull android.hardware.camera2.MultiResolutionImageReader); @@ -30910,6 +30910,8 @@ package android.os { field public static final int BATTERY_STATUS_NOT_CHARGING = 4; // 0x4 field public static final int BATTERY_STATUS_UNKNOWN = 1; // 0x1 field public static final String EXTRA_BATTERY_LOW = "battery_low"; + field public static final String EXTRA_CHARGING_STATUS = "android.os.extra.CHARGING_STATUS"; + field public static final String EXTRA_CYCLE_COUNT = "android.os.extra.CYCLE_COUNT"; field public static final String EXTRA_HEALTH = "health"; field public static final String EXTRA_ICON_SMALL = "icon-small"; field public static final String EXTRA_LEVEL = "level"; diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 1d3993106a8f..909a3dca3829 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -9152,6 +9152,14 @@ package android.os { public class BatteryManager { method @RequiresPermission(android.Manifest.permission.POWER_SAVER) public boolean setChargingStateUpdateDelayMillis(int); + field @RequiresPermission(android.Manifest.permission.BATTERY_STATS) public static final int BATTERY_PROPERTY_CHARGING_POLICY = 9; // 0x9 + field @RequiresPermission(android.Manifest.permission.BATTERY_STATS) public static final int BATTERY_PROPERTY_FIRST_USAGE_DATE = 8; // 0x8 + field @RequiresPermission(android.Manifest.permission.BATTERY_STATS) public static final int BATTERY_PROPERTY_MANUFACTURING_DATE = 7; // 0x7 + field @RequiresPermission(android.Manifest.permission.BATTERY_STATS) public static final int BATTERY_PROPERTY_STATE_OF_HEALTH = 10; // 0xa + field public static final int CHARGING_POLICY_ADAPTIVE_AC = 3; // 0x3 + field public static final int CHARGING_POLICY_ADAPTIVE_AON = 2; // 0x2 + field public static final int CHARGING_POLICY_ADAPTIVE_LONGLIFE = 4; // 0x4 + field public static final int CHARGING_POLICY_DEFAULT = 1; // 0x1 field public static final String EXTRA_EVENTS = "android.os.extra.EVENTS"; field public static final String EXTRA_EVENT_TIMESTAMP = "android.os.extra.EVENT_TIMESTAMP"; } diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java index 331a5abdc3b3..5b2ef6e305bf 100644 --- a/core/java/android/hardware/camera2/CameraCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -2609,31 +2609,31 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <table> * <thead> * <tr> - * <th align="left">Input Format</th> - * <th align="left">Output Format</th> - * <th align="left">Capability</th> + * <th style="text-align: left;">Input Format</th> + * <th style="text-align: left;">Output Format</th> + * <th style="text-align: left;">Capability</th> * </tr> * </thead> * <tbody> * <tr> - * <td align="left">{@link android.graphics.ImageFormat#PRIVATE }</td> - * <td align="left">{@link android.graphics.ImageFormat#JPEG }</td> - * <td align="left">PRIVATE_REPROCESSING</td> + * <td style="text-align: left;">{@link android.graphics.ImageFormat#PRIVATE }</td> + * <td style="text-align: left;">{@link android.graphics.ImageFormat#JPEG }</td> + * <td style="text-align: left;">PRIVATE_REPROCESSING</td> * </tr> * <tr> - * <td align="left">{@link android.graphics.ImageFormat#PRIVATE }</td> - * <td align="left">{@link android.graphics.ImageFormat#YUV_420_888 }</td> - * <td align="left">PRIVATE_REPROCESSING</td> + * <td style="text-align: left;">{@link android.graphics.ImageFormat#PRIVATE }</td> + * <td style="text-align: left;">{@link android.graphics.ImageFormat#YUV_420_888 }</td> + * <td style="text-align: left;">PRIVATE_REPROCESSING</td> * </tr> * <tr> - * <td align="left">{@link android.graphics.ImageFormat#YUV_420_888 }</td> - * <td align="left">{@link android.graphics.ImageFormat#JPEG }</td> - * <td align="left">YUV_REPROCESSING</td> + * <td style="text-align: left;">{@link android.graphics.ImageFormat#YUV_420_888 }</td> + * <td style="text-align: left;">{@link android.graphics.ImageFormat#JPEG }</td> + * <td style="text-align: left;">YUV_REPROCESSING</td> * </tr> * <tr> - * <td align="left">{@link android.graphics.ImageFormat#YUV_420_888 }</td> - * <td align="left">{@link android.graphics.ImageFormat#YUV_420_888 }</td> - * <td align="left">YUV_REPROCESSING</td> + * <td style="text-align: left;">{@link android.graphics.ImageFormat#YUV_420_888 }</td> + * <td style="text-align: left;">{@link android.graphics.ImageFormat#YUV_420_888 }</td> + * <td style="text-align: left;">YUV_REPROCESSING</td> * </tr> * </tbody> * </table> @@ -2650,26 +2650,26 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <table> * <thead> * <tr> - * <th align="left">Input Format</th> - * <th align="left">Output Format</th> - * <th align="left">Capability</th> + * <th style="text-align: left;">Input Format</th> + * <th style="text-align: left;">Output Format</th> + * <th style="text-align: left;">Capability</th> * </tr> * </thead> * <tbody> * <tr> - * <td align="left">{@link android.graphics.ImageFormat#PRIVATE }</td> - * <td align="left">{@link android.graphics.ImageFormat#Y8 }</td> - * <td align="left">PRIVATE_REPROCESSING</td> + * <td style="text-align: left;">{@link android.graphics.ImageFormat#PRIVATE }</td> + * <td style="text-align: left;">{@link android.graphics.ImageFormat#Y8 }</td> + * <td style="text-align: left;">PRIVATE_REPROCESSING</td> * </tr> * <tr> - * <td align="left">{@link android.graphics.ImageFormat#Y8 }</td> - * <td align="left">{@link android.graphics.ImageFormat#JPEG }</td> - * <td align="left">YUV_REPROCESSING</td> + * <td style="text-align: left;">{@link android.graphics.ImageFormat#Y8 }</td> + * <td style="text-align: left;">{@link android.graphics.ImageFormat#JPEG }</td> + * <td style="text-align: left;">YUV_REPROCESSING</td> * </tr> * <tr> - * <td align="left">{@link android.graphics.ImageFormat#Y8 }</td> - * <td align="left">{@link android.graphics.ImageFormat#Y8 }</td> - * <td align="left">YUV_REPROCESSING</td> + * <td style="text-align: left;">{@link android.graphics.ImageFormat#Y8 }</td> + * <td style="text-align: left;">{@link android.graphics.ImageFormat#Y8 }</td> + * <td style="text-align: left;">YUV_REPROCESSING</td> * </tr> * </tbody> * </table> @@ -2705,60 +2705,60 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <table> * <thead> * <tr> - * <th align="center">Format</th> - * <th align="center">Size</th> - * <th align="center">Hardware Level</th> - * <th align="center">Notes</th> + * <th style="text-align: center;">Format</th> + * <th style="text-align: center;">Size</th> + * <th style="text-align: center;">Hardware Level</th> + * <th style="text-align: center;">Notes</th> * </tr> * </thead> * <tbody> * <tr> - * <td align="center">JPEG</td> - * <td align="center">{@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</td> - * <td align="center">Any</td> - * <td align="center"></td> + * <td style="text-align: center;">JPEG</td> + * <td style="text-align: center;">{@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</td> + * <td style="text-align: center;">Any</td> + * <td style="text-align: center;"></td> * </tr> * <tr> - * <td align="center">JPEG</td> - * <td align="center">1920x1080 (1080p)</td> - * <td align="center">Any</td> - * <td align="center">if 1080p <= activeArraySize</td> + * <td style="text-align: center;">JPEG</td> + * <td style="text-align: center;">1920x1080 (1080p)</td> + * <td style="text-align: center;">Any</td> + * <td style="text-align: center;">if 1080p <= activeArraySize</td> * </tr> * <tr> - * <td align="center">JPEG</td> - * <td align="center">1280x720 (720)</td> - * <td align="center">Any</td> - * <td align="center">if 720p <= activeArraySize</td> + * <td style="text-align: center;">JPEG</td> + * <td style="text-align: center;">1280x720 (720)</td> + * <td style="text-align: center;">Any</td> + * <td style="text-align: center;">if 720p <= activeArraySize</td> * </tr> * <tr> - * <td align="center">JPEG</td> - * <td align="center">640x480 (480p)</td> - * <td align="center">Any</td> - * <td align="center">if 480p <= activeArraySize</td> + * <td style="text-align: center;">JPEG</td> + * <td style="text-align: center;">640x480 (480p)</td> + * <td style="text-align: center;">Any</td> + * <td style="text-align: center;">if 480p <= activeArraySize</td> * </tr> * <tr> - * <td align="center">JPEG</td> - * <td align="center">320x240 (240p)</td> - * <td align="center">Any</td> - * <td align="center">if 240p <= activeArraySize</td> + * <td style="text-align: center;">JPEG</td> + * <td style="text-align: center;">320x240 (240p)</td> + * <td style="text-align: center;">Any</td> + * <td style="text-align: center;">if 240p <= activeArraySize</td> * </tr> * <tr> - * <td align="center">YUV_420_888</td> - * <td align="center">all output sizes available for JPEG</td> - * <td align="center">FULL</td> - * <td align="center"></td> + * <td style="text-align: center;">YUV_420_888</td> + * <td style="text-align: center;">all output sizes available for JPEG</td> + * <td style="text-align: center;">FULL</td> + * <td style="text-align: center;"></td> * </tr> * <tr> - * <td align="center">YUV_420_888</td> - * <td align="center">all output sizes available for JPEG, up to the maximum video size</td> - * <td align="center">LIMITED</td> - * <td align="center"></td> + * <td style="text-align: center;">YUV_420_888</td> + * <td style="text-align: center;">all output sizes available for JPEG, up to the maximum video size</td> + * <td style="text-align: center;">LIMITED</td> + * <td style="text-align: center;"></td> * </tr> * <tr> - * <td align="center">IMPLEMENTATION_DEFINED</td> - * <td align="center">same as YUV_420_888</td> - * <td align="center">Any</td> - * <td align="center"></td> + * <td style="text-align: center;">IMPLEMENTATION_DEFINED</td> + * <td style="text-align: center;">same as YUV_420_888</td> + * <td style="text-align: center;">Any</td> + * <td style="text-align: center;"></td> * </tr> * </tbody> * </table> @@ -2773,66 +2773,66 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <table> * <thead> * <tr> - * <th align="center">Format</th> - * <th align="center">Size</th> - * <th align="center">Hardware Level</th> - * <th align="center">Notes</th> + * <th style="text-align: center;">Format</th> + * <th style="text-align: center;">Size</th> + * <th style="text-align: center;">Hardware Level</th> + * <th style="text-align: center;">Notes</th> * </tr> * </thead> * <tbody> * <tr> - * <td align="center">JPEG</td> - * <td align="center">{@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</td> - * <td align="center">Any</td> - * <td align="center"></td> + * <td style="text-align: center;">JPEG</td> + * <td style="text-align: center;">{@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</td> + * <td style="text-align: center;">Any</td> + * <td style="text-align: center;"></td> * </tr> * <tr> - * <td align="center">JPEG</td> - * <td align="center">1920x1080 (1080p)</td> - * <td align="center">Any</td> - * <td align="center">if 1080p <= activeArraySize</td> + * <td style="text-align: center;">JPEG</td> + * <td style="text-align: center;">1920x1080 (1080p)</td> + * <td style="text-align: center;">Any</td> + * <td style="text-align: center;">if 1080p <= activeArraySize</td> * </tr> * <tr> - * <td align="center">YUV_420_888</td> - * <td align="center">{@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</td> - * <td align="center">FULL</td> - * <td align="center"></td> + * <td style="text-align: center;">YUV_420_888</td> + * <td style="text-align: center;">{@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</td> + * <td style="text-align: center;">FULL</td> + * <td style="text-align: center;"></td> * </tr> * <tr> - * <td align="center">YUV_420_888</td> - * <td align="center">1920x1080 (1080p)</td> - * <td align="center">FULL</td> - * <td align="center">if 1080p <= activeArraySize</td> + * <td style="text-align: center;">YUV_420_888</td> + * <td style="text-align: center;">1920x1080 (1080p)</td> + * <td style="text-align: center;">FULL</td> + * <td style="text-align: center;">if 1080p <= activeArraySize</td> * </tr> * <tr> - * <td align="center">YUV_420_888</td> - * <td align="center">1280x720 (720)</td> - * <td align="center">FULL</td> - * <td align="center">if 720p <= activeArraySize</td> + * <td style="text-align: center;">YUV_420_888</td> + * <td style="text-align: center;">1280x720 (720)</td> + * <td style="text-align: center;">FULL</td> + * <td style="text-align: center;">if 720p <= activeArraySize</td> * </tr> * <tr> - * <td align="center">YUV_420_888</td> - * <td align="center">640x480 (480p)</td> - * <td align="center">FULL</td> - * <td align="center">if 480p <= activeArraySize</td> + * <td style="text-align: center;">YUV_420_888</td> + * <td style="text-align: center;">640x480 (480p)</td> + * <td style="text-align: center;">FULL</td> + * <td style="text-align: center;">if 480p <= activeArraySize</td> * </tr> * <tr> - * <td align="center">YUV_420_888</td> - * <td align="center">320x240 (240p)</td> - * <td align="center">FULL</td> - * <td align="center">if 240p <= activeArraySize</td> + * <td style="text-align: center;">YUV_420_888</td> + * <td style="text-align: center;">320x240 (240p)</td> + * <td style="text-align: center;">FULL</td> + * <td style="text-align: center;">if 240p <= activeArraySize</td> * </tr> * <tr> - * <td align="center">YUV_420_888</td> - * <td align="center">all output sizes available for FULL hardware level, up to the maximum video size</td> - * <td align="center">LIMITED</td> - * <td align="center"></td> + * <td style="text-align: center;">YUV_420_888</td> + * <td style="text-align: center;">all output sizes available for FULL hardware level, up to the maximum video size</td> + * <td style="text-align: center;">LIMITED</td> + * <td style="text-align: center;"></td> * </tr> * <tr> - * <td align="center">IMPLEMENTATION_DEFINED</td> - * <td align="center">same as YUV_420_888</td> - * <td align="center">Any</td> - * <td align="center"></td> + * <td style="text-align: center;">IMPLEMENTATION_DEFINED</td> + * <td style="text-align: center;">same as YUV_420_888</td> + * <td style="text-align: center;">Any</td> + * <td style="text-align: center;"></td> * </tr> * </tbody> * </table> @@ -2987,66 +2987,66 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <table> * <thead> * <tr> - * <th align="center">Format</th> - * <th align="center">Size</th> - * <th align="center">Hardware Level</th> - * <th align="center">Notes</th> + * <th style="text-align: center;">Format</th> + * <th style="text-align: center;">Size</th> + * <th style="text-align: center;">Hardware Level</th> + * <th style="text-align: center;">Notes</th> * </tr> * </thead> * <tbody> * <tr> - * <td align="center">{@link android.graphics.ImageFormat#JPEG }</td> - * <td align="center">{@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} (*1)</td> - * <td align="center">Any</td> - * <td align="center"></td> + * <td style="text-align: center;">{@link android.graphics.ImageFormat#JPEG }</td> + * <td style="text-align: center;">{@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} (*1)</td> + * <td style="text-align: center;">Any</td> + * <td style="text-align: center;"></td> * </tr> * <tr> - * <td align="center">{@link android.graphics.ImageFormat#JPEG }</td> - * <td align="center">1920x1080 (1080p)</td> - * <td align="center">Any</td> - * <td align="center">if 1080p <= activeArraySize</td> + * <td style="text-align: center;">{@link android.graphics.ImageFormat#JPEG }</td> + * <td style="text-align: center;">1920x1080 (1080p)</td> + * <td style="text-align: center;">Any</td> + * <td style="text-align: center;">if 1080p <= activeArraySize</td> * </tr> * <tr> - * <td align="center">{@link android.graphics.ImageFormat#YUV_420_888 }</td> - * <td align="center">{@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</td> - * <td align="center">FULL</td> - * <td align="center"></td> + * <td style="text-align: center;">{@link android.graphics.ImageFormat#YUV_420_888 }</td> + * <td style="text-align: center;">{@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}</td> + * <td style="text-align: center;">FULL</td> + * <td style="text-align: center;"></td> * </tr> * <tr> - * <td align="center">{@link android.graphics.ImageFormat#YUV_420_888 }</td> - * <td align="center">1920x1080 (1080p)</td> - * <td align="center">FULL</td> - * <td align="center">if 1080p <= activeArraySize</td> + * <td style="text-align: center;">{@link android.graphics.ImageFormat#YUV_420_888 }</td> + * <td style="text-align: center;">1920x1080 (1080p)</td> + * <td style="text-align: center;">FULL</td> + * <td style="text-align: center;">if 1080p <= activeArraySize</td> * </tr> * <tr> - * <td align="center">{@link android.graphics.ImageFormat#YUV_420_888 }</td> - * <td align="center">1280x720 (720)</td> - * <td align="center">FULL</td> - * <td align="center">if 720p <= activeArraySize</td> + * <td style="text-align: center;">{@link android.graphics.ImageFormat#YUV_420_888 }</td> + * <td style="text-align: center;">1280x720 (720)</td> + * <td style="text-align: center;">FULL</td> + * <td style="text-align: center;">if 720p <= activeArraySize</td> * </tr> * <tr> - * <td align="center">{@link android.graphics.ImageFormat#YUV_420_888 }</td> - * <td align="center">640x480 (480p)</td> - * <td align="center">FULL</td> - * <td align="center">if 480p <= activeArraySize</td> + * <td style="text-align: center;">{@link android.graphics.ImageFormat#YUV_420_888 }</td> + * <td style="text-align: center;">640x480 (480p)</td> + * <td style="text-align: center;">FULL</td> + * <td style="text-align: center;">if 480p <= activeArraySize</td> * </tr> * <tr> - * <td align="center">{@link android.graphics.ImageFormat#YUV_420_888 }</td> - * <td align="center">320x240 (240p)</td> - * <td align="center">FULL</td> - * <td align="center">if 240p <= activeArraySize</td> + * <td style="text-align: center;">{@link android.graphics.ImageFormat#YUV_420_888 }</td> + * <td style="text-align: center;">320x240 (240p)</td> + * <td style="text-align: center;">FULL</td> + * <td style="text-align: center;">if 240p <= activeArraySize</td> * </tr> * <tr> - * <td align="center">{@link android.graphics.ImageFormat#YUV_420_888 }</td> - * <td align="center">all output sizes available for FULL hardware level, up to the maximum video size</td> - * <td align="center">LIMITED</td> - * <td align="center"></td> + * <td style="text-align: center;">{@link android.graphics.ImageFormat#YUV_420_888 }</td> + * <td style="text-align: center;">all output sizes available for FULL hardware level, up to the maximum video size</td> + * <td style="text-align: center;">LIMITED</td> + * <td style="text-align: center;"></td> * </tr> * <tr> - * <td align="center">{@link android.graphics.ImageFormat#PRIVATE }</td> - * <td align="center">same as YUV_420_888</td> - * <td align="center">Any</td> - * <td align="center"></td> + * <td style="text-align: center;">{@link android.graphics.ImageFormat#PRIVATE }</td> + * <td style="text-align: center;">same as YUV_420_888</td> + * <td style="text-align: center;">Any</td> + * <td style="text-align: center;"></td> * </tr> * </tbody> * </table> @@ -3492,8 +3492,8 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri /** * <p>An array of mandatory stream combinations which are applicable when device lists * {@code PREVIEW_STABILIZATION} in {@link CameraCharacteristics#CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES android.control.availableVideoStabilizationModes}. - * This is an app-readable conversion of the preview stabilization mandatory stream combination - * {@link android.hardware.camera2.CameraDevice#createCaptureSession tables}.</p> + * This is an app-readable conversion of the preview stabilization mandatory stream + * combination {@link android.hardware.camera2.CameraDevice#createCaptureSession tables}.</p> * <p>The array of * {@link android.hardware.camera2.params.MandatoryStreamCombination combinations} is * generated according to the documented diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index c67a560b5885..7055c9c6aa4d 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -1000,24 +1000,25 @@ public abstract class CameraMetadata<TKey> { * camera's crop region is set to maximum size, the FOV of the physical streams for the * ultrawide lens will be the same as the logical stream, by making the crop region * smaller than its active array size to compensate for the smaller focal length.</p> - * <p>There are two ways for the application to capture RAW images from a logical camera - * with RAW capability:</p> + * <p>For a logical camera, typically the underlying physical cameras have different RAW + * capabilities (such as resolution or CFA pattern). There are two ways for the + * application to capture RAW images from the logical camera:</p> * <ul> - * <li>Because the underlying physical cameras may have different RAW capabilities (such - * as resolution or CFA pattern), to maintain backward compatibility, when a RAW stream - * is configured, the camera device makes sure the default active physical camera remains - * active and does not switch to other physical cameras. (One exception is that, if the - * logical camera consists of identical image sensors and advertises multiple focalLength - * due to different lenses, the camera device may generate RAW images from different - * physical cameras based on the focalLength being set by the application.) This - * backward-compatible approach usually results in loss of optical zoom, to telephoto - * lens or to ultrawide lens.</li> - * <li>Alternatively, to take advantage of the full zoomRatio range of the logical camera, - * the application should use {@link android.hardware.camera2.MultiResolutionImageReader } - * to capture RAW images from the currently active physical camera. Because different - * physical camera may have different RAW characteristics, the application needs to use - * the characteristics and result metadata of the active physical camera for the - * relevant RAW metadata.</li> + * <li>If the logical camera has RAW capability, the application can create and use RAW + * streams in the same way as before. In case a RAW stream is configured, to maintain + * backward compatibility, the camera device makes sure the default active physical + * camera remains active and does not switch to other physical cameras. (One exception + * is that, if the logical camera consists of identical image sensors and advertises + * multiple focalLength due to different lenses, the camera device may generate RAW + * images from different physical cameras based on the focalLength being set by the + * application.) This backward-compatible approach usually results in loss of optical + * zoom, to telephoto lens or to ultrawide lens.</li> + * <li>Alternatively, if supported by the device, + * {@link android.hardware.camera2.MultiResolutionImageReader } + * can be used to capture RAW images from one of the underlying physical cameras ( + * depending on current zoom level). Because different physical cameras may have + * different RAW characteristics, the application needs to use the characteristics + * and result metadata of the active physical camera for the relevant RAW metadata.</li> * </ul> * <p>The capture request and result metadata tags required for backward compatible camera * functionalities will be solely based on the logical camera capability. On the other diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java index 3e1deb27584e..1a15596af566 100644 --- a/core/java/android/hardware/camera2/CaptureResult.java +++ b/core/java/android/hardware/camera2/CaptureResult.java @@ -990,18 +990,18 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <table> * <thead> * <tr> - * <th align="center">State</th> - * <th align="center">Transition Cause</th> - * <th align="center">New State</th> - * <th align="center">Notes</th> + * <th style="text-align: center;">State</th> + * <th style="text-align: center;">Transition Cause</th> + * <th style="text-align: center;">New State</th> + * <th style="text-align: center;">Notes</th> * </tr> * </thead> * <tbody> * <tr> - * <td align="center">INACTIVE</td> - * <td align="center"></td> - * <td align="center">INACTIVE</td> - * <td align="center">Camera device auto exposure algorithm is disabled</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;"></td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Camera device auto exposure algorithm is disabled</td> * </tr> * </tbody> * </table> @@ -1009,120 +1009,120 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <table> * <thead> * <tr> - * <th align="center">State</th> - * <th align="center">Transition Cause</th> - * <th align="center">New State</th> - * <th align="center">Notes</th> + * <th style="text-align: center;">State</th> + * <th style="text-align: center;">Transition Cause</th> + * <th style="text-align: center;">New State</th> + * <th style="text-align: center;">Notes</th> * </tr> * </thead> * <tbody> * <tr> - * <td align="center">INACTIVE</td> - * <td align="center">Camera device initiates AE scan</td> - * <td align="center">SEARCHING</td> - * <td align="center">Values changing</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Camera device initiates AE scan</td> + * <td style="text-align: center;">SEARCHING</td> + * <td style="text-align: center;">Values changing</td> * </tr> * <tr> - * <td align="center">INACTIVE</td> - * <td align="center">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is ON</td> - * <td align="center">LOCKED</td> - * <td align="center">Values locked</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is ON</td> + * <td style="text-align: center;">LOCKED</td> + * <td style="text-align: center;">Values locked</td> * </tr> * <tr> - * <td align="center">SEARCHING</td> - * <td align="center">Camera device finishes AE scan</td> - * <td align="center">CONVERGED</td> - * <td align="center">Good values, not changing</td> + * <td style="text-align: center;">SEARCHING</td> + * <td style="text-align: center;">Camera device finishes AE scan</td> + * <td style="text-align: center;">CONVERGED</td> + * <td style="text-align: center;">Good values, not changing</td> * </tr> * <tr> - * <td align="center">SEARCHING</td> - * <td align="center">Camera device finishes AE scan</td> - * <td align="center">FLASH_REQUIRED</td> - * <td align="center">Converged but too dark w/o flash</td> + * <td style="text-align: center;">SEARCHING</td> + * <td style="text-align: center;">Camera device finishes AE scan</td> + * <td style="text-align: center;">FLASH_REQUIRED</td> + * <td style="text-align: center;">Converged but too dark w/o flash</td> * </tr> * <tr> - * <td align="center">SEARCHING</td> - * <td align="center">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is ON</td> - * <td align="center">LOCKED</td> - * <td align="center">Values locked</td> + * <td style="text-align: center;">SEARCHING</td> + * <td style="text-align: center;">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is ON</td> + * <td style="text-align: center;">LOCKED</td> + * <td style="text-align: center;">Values locked</td> * </tr> * <tr> - * <td align="center">CONVERGED</td> - * <td align="center">Camera device initiates AE scan</td> - * <td align="center">SEARCHING</td> - * <td align="center">Values changing</td> + * <td style="text-align: center;">CONVERGED</td> + * <td style="text-align: center;">Camera device initiates AE scan</td> + * <td style="text-align: center;">SEARCHING</td> + * <td style="text-align: center;">Values changing</td> * </tr> * <tr> - * <td align="center">CONVERGED</td> - * <td align="center">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is ON</td> - * <td align="center">LOCKED</td> - * <td align="center">Values locked</td> + * <td style="text-align: center;">CONVERGED</td> + * <td style="text-align: center;">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is ON</td> + * <td style="text-align: center;">LOCKED</td> + * <td style="text-align: center;">Values locked</td> * </tr> * <tr> - * <td align="center">FLASH_REQUIRED</td> - * <td align="center">Camera device initiates AE scan</td> - * <td align="center">SEARCHING</td> - * <td align="center">Values changing</td> + * <td style="text-align: center;">FLASH_REQUIRED</td> + * <td style="text-align: center;">Camera device initiates AE scan</td> + * <td style="text-align: center;">SEARCHING</td> + * <td style="text-align: center;">Values changing</td> * </tr> * <tr> - * <td align="center">FLASH_REQUIRED</td> - * <td align="center">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is ON</td> - * <td align="center">LOCKED</td> - * <td align="center">Values locked</td> + * <td style="text-align: center;">FLASH_REQUIRED</td> + * <td style="text-align: center;">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is ON</td> + * <td style="text-align: center;">LOCKED</td> + * <td style="text-align: center;">Values locked</td> * </tr> * <tr> - * <td align="center">LOCKED</td> - * <td align="center">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is OFF</td> - * <td align="center">SEARCHING</td> - * <td align="center">Values not good after unlock</td> + * <td style="text-align: center;">LOCKED</td> + * <td style="text-align: center;">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is OFF</td> + * <td style="text-align: center;">SEARCHING</td> + * <td style="text-align: center;">Values not good after unlock</td> * </tr> * <tr> - * <td align="center">LOCKED</td> - * <td align="center">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is OFF</td> - * <td align="center">CONVERGED</td> - * <td align="center">Values good after unlock</td> + * <td style="text-align: center;">LOCKED</td> + * <td style="text-align: center;">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is OFF</td> + * <td style="text-align: center;">CONVERGED</td> + * <td style="text-align: center;">Values good after unlock</td> * </tr> * <tr> - * <td align="center">LOCKED</td> - * <td align="center">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is OFF</td> - * <td align="center">FLASH_REQUIRED</td> - * <td align="center">Exposure good, but too dark</td> + * <td style="text-align: center;">LOCKED</td> + * <td style="text-align: center;">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is OFF</td> + * <td style="text-align: center;">FLASH_REQUIRED</td> + * <td style="text-align: center;">Exposure good, but too dark</td> * </tr> * <tr> - * <td align="center">PRECAPTURE</td> - * <td align="center">Sequence done. {@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is OFF</td> - * <td align="center">CONVERGED</td> - * <td align="center">Ready for high-quality capture</td> + * <td style="text-align: center;">PRECAPTURE</td> + * <td style="text-align: center;">Sequence done. {@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is OFF</td> + * <td style="text-align: center;">CONVERGED</td> + * <td style="text-align: center;">Ready for high-quality capture</td> * </tr> * <tr> - * <td align="center">PRECAPTURE</td> - * <td align="center">Sequence done. {@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is ON</td> - * <td align="center">LOCKED</td> - * <td align="center">Ready for high-quality capture</td> + * <td style="text-align: center;">PRECAPTURE</td> + * <td style="text-align: center;">Sequence done. {@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is ON</td> + * <td style="text-align: center;">LOCKED</td> + * <td style="text-align: center;">Ready for high-quality capture</td> * </tr> * <tr> - * <td align="center">LOCKED</td> - * <td align="center">aeLock is ON and aePrecaptureTrigger is START</td> - * <td align="center">LOCKED</td> - * <td align="center">Precapture trigger is ignored when AE is already locked</td> + * <td style="text-align: center;">LOCKED</td> + * <td style="text-align: center;">aeLock is ON and aePrecaptureTrigger is START</td> + * <td style="text-align: center;">LOCKED</td> + * <td style="text-align: center;">Precapture trigger is ignored when AE is already locked</td> * </tr> * <tr> - * <td align="center">LOCKED</td> - * <td align="center">aeLock is ON and aePrecaptureTrigger is CANCEL</td> - * <td align="center">LOCKED</td> - * <td align="center">Precapture trigger is ignored when AE is already locked</td> + * <td style="text-align: center;">LOCKED</td> + * <td style="text-align: center;">aeLock is ON and aePrecaptureTrigger is CANCEL</td> + * <td style="text-align: center;">LOCKED</td> + * <td style="text-align: center;">Precapture trigger is ignored when AE is already locked</td> * </tr> * <tr> - * <td align="center">Any state (excluding LOCKED)</td> - * <td align="center">{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} is START</td> - * <td align="center">PRECAPTURE</td> - * <td align="center">Start AE precapture metering sequence</td> + * <td style="text-align: center;">Any state (excluding LOCKED)</td> + * <td style="text-align: center;">{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} is START</td> + * <td style="text-align: center;">PRECAPTURE</td> + * <td style="text-align: center;">Start AE precapture metering sequence</td> * </tr> * <tr> - * <td align="center">Any state (excluding LOCKED)</td> - * <td align="center">{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} is CANCEL</td> - * <td align="center">INACTIVE</td> - * <td align="center">Currently active precapture metering sequence is canceled</td> + * <td style="text-align: center;">Any state (excluding LOCKED)</td> + * <td style="text-align: center;">{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} is CANCEL</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Currently active precapture metering sequence is canceled</td> * </tr> * </tbody> * </table> @@ -1138,54 +1138,54 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <table> * <thead> * <tr> - * <th align="center">State</th> - * <th align="center">Transition Cause</th> - * <th align="center">New State</th> - * <th align="center">Notes</th> + * <th style="text-align: center;">State</th> + * <th style="text-align: center;">Transition Cause</th> + * <th style="text-align: center;">New State</th> + * <th style="text-align: center;">Notes</th> * </tr> * </thead> * <tbody> * <tr> - * <td align="center">INACTIVE</td> - * <td align="center">Camera device finished AE scan</td> - * <td align="center">CONVERGED</td> - * <td align="center">Values are already good, transient states are skipped by camera device.</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Camera device finished AE scan</td> + * <td style="text-align: center;">CONVERGED</td> + * <td style="text-align: center;">Values are already good, transient states are skipped by camera device.</td> * </tr> * <tr> - * <td align="center">Any state (excluding LOCKED)</td> - * <td align="center">{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} is START, sequence done</td> - * <td align="center">FLASH_REQUIRED</td> - * <td align="center">Converged but too dark w/o flash after a precapture sequence, transient states are skipped by camera device.</td> + * <td style="text-align: center;">Any state (excluding LOCKED)</td> + * <td style="text-align: center;">{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} is START, sequence done</td> + * <td style="text-align: center;">FLASH_REQUIRED</td> + * <td style="text-align: center;">Converged but too dark w/o flash after a precapture sequence, transient states are skipped by camera device.</td> * </tr> * <tr> - * <td align="center">Any state (excluding LOCKED)</td> - * <td align="center">{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} is START, sequence done</td> - * <td align="center">CONVERGED</td> - * <td align="center">Converged after a precapture sequence, transient states are skipped by camera device.</td> + * <td style="text-align: center;">Any state (excluding LOCKED)</td> + * <td style="text-align: center;">{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} is START, sequence done</td> + * <td style="text-align: center;">CONVERGED</td> + * <td style="text-align: center;">Converged after a precapture sequence, transient states are skipped by camera device.</td> * </tr> * <tr> - * <td align="center">Any state (excluding LOCKED)</td> - * <td align="center">{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} is CANCEL, converged</td> - * <td align="center">FLASH_REQUIRED</td> - * <td align="center">Converged but too dark w/o flash after a precapture sequence is canceled, transient states are skipped by camera device.</td> + * <td style="text-align: center;">Any state (excluding LOCKED)</td> + * <td style="text-align: center;">{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} is CANCEL, converged</td> + * <td style="text-align: center;">FLASH_REQUIRED</td> + * <td style="text-align: center;">Converged but too dark w/o flash after a precapture sequence is canceled, transient states are skipped by camera device.</td> * </tr> * <tr> - * <td align="center">Any state (excluding LOCKED)</td> - * <td align="center">{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} is CANCEL, converged</td> - * <td align="center">CONVERGED</td> - * <td align="center">Converged after a precapture sequences canceled, transient states are skipped by camera device.</td> + * <td style="text-align: center;">Any state (excluding LOCKED)</td> + * <td style="text-align: center;">{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} is CANCEL, converged</td> + * <td style="text-align: center;">CONVERGED</td> + * <td style="text-align: center;">Converged after a precapture sequences canceled, transient states are skipped by camera device.</td> * </tr> * <tr> - * <td align="center">CONVERGED</td> - * <td align="center">Camera device finished AE scan</td> - * <td align="center">FLASH_REQUIRED</td> - * <td align="center">Converged but too dark w/o flash after a new scan, transient states are skipped by camera device.</td> + * <td style="text-align: center;">CONVERGED</td> + * <td style="text-align: center;">Camera device finished AE scan</td> + * <td style="text-align: center;">FLASH_REQUIRED</td> + * <td style="text-align: center;">Converged but too dark w/o flash after a new scan, transient states are skipped by camera device.</td> * </tr> * <tr> - * <td align="center">FLASH_REQUIRED</td> - * <td align="center">Camera device finished AE scan</td> - * <td align="center">CONVERGED</td> - * <td align="center">Converged after a new scan, transient states are skipped by camera device.</td> + * <td style="text-align: center;">FLASH_REQUIRED</td> + * <td style="text-align: center;">Camera device finished AE scan</td> + * <td style="text-align: center;">CONVERGED</td> + * <td style="text-align: center;">Converged after a new scan, transient states are skipped by camera device.</td> * </tr> * </tbody> * </table> @@ -1413,18 +1413,18 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <table> * <thead> * <tr> - * <th align="center">State</th> - * <th align="center">Transition Cause</th> - * <th align="center">New State</th> - * <th align="center">Notes</th> + * <th style="text-align: center;">State</th> + * <th style="text-align: center;">Transition Cause</th> + * <th style="text-align: center;">New State</th> + * <th style="text-align: center;">Notes</th> * </tr> * </thead> * <tbody> * <tr> - * <td align="center">INACTIVE</td> - * <td align="center"></td> - * <td align="center">INACTIVE</td> - * <td align="center">Never changes</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;"></td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Never changes</td> * </tr> * </tbody> * </table> @@ -1432,66 +1432,66 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <table> * <thead> * <tr> - * <th align="center">State</th> - * <th align="center">Transition Cause</th> - * <th align="center">New State</th> - * <th align="center">Notes</th> + * <th style="text-align: center;">State</th> + * <th style="text-align: center;">Transition Cause</th> + * <th style="text-align: center;">New State</th> + * <th style="text-align: center;">Notes</th> * </tr> * </thead> * <tbody> * <tr> - * <td align="center">INACTIVE</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">ACTIVE_SCAN</td> - * <td align="center">Start AF sweep, Lens now moving</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">ACTIVE_SCAN</td> + * <td style="text-align: center;">Start AF sweep, Lens now moving</td> * </tr> * <tr> - * <td align="center">ACTIVE_SCAN</td> - * <td align="center">AF sweep done</td> - * <td align="center">FOCUSED_LOCKED</td> - * <td align="center">Focused, Lens now locked</td> + * <td style="text-align: center;">ACTIVE_SCAN</td> + * <td style="text-align: center;">AF sweep done</td> + * <td style="text-align: center;">FOCUSED_LOCKED</td> + * <td style="text-align: center;">Focused, Lens now locked</td> * </tr> * <tr> - * <td align="center">ACTIVE_SCAN</td> - * <td align="center">AF sweep done</td> - * <td align="center">NOT_FOCUSED_LOCKED</td> - * <td align="center">Not focused, Lens now locked</td> + * <td style="text-align: center;">ACTIVE_SCAN</td> + * <td style="text-align: center;">AF sweep done</td> + * <td style="text-align: center;">NOT_FOCUSED_LOCKED</td> + * <td style="text-align: center;">Not focused, Lens now locked</td> * </tr> * <tr> - * <td align="center">ACTIVE_SCAN</td> - * <td align="center">AF_CANCEL</td> - * <td align="center">INACTIVE</td> - * <td align="center">Cancel/reset AF, Lens now locked</td> + * <td style="text-align: center;">ACTIVE_SCAN</td> + * <td style="text-align: center;">AF_CANCEL</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Cancel/reset AF, Lens now locked</td> * </tr> * <tr> - * <td align="center">FOCUSED_LOCKED</td> - * <td align="center">AF_CANCEL</td> - * <td align="center">INACTIVE</td> - * <td align="center">Cancel/reset AF</td> + * <td style="text-align: center;">FOCUSED_LOCKED</td> + * <td style="text-align: center;">AF_CANCEL</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Cancel/reset AF</td> * </tr> * <tr> - * <td align="center">FOCUSED_LOCKED</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">ACTIVE_SCAN</td> - * <td align="center">Start new sweep, Lens now moving</td> + * <td style="text-align: center;">FOCUSED_LOCKED</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">ACTIVE_SCAN</td> + * <td style="text-align: center;">Start new sweep, Lens now moving</td> * </tr> * <tr> - * <td align="center">NOT_FOCUSED_LOCKED</td> - * <td align="center">AF_CANCEL</td> - * <td align="center">INACTIVE</td> - * <td align="center">Cancel/reset AF</td> + * <td style="text-align: center;">NOT_FOCUSED_LOCKED</td> + * <td style="text-align: center;">AF_CANCEL</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Cancel/reset AF</td> * </tr> * <tr> - * <td align="center">NOT_FOCUSED_LOCKED</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">ACTIVE_SCAN</td> - * <td align="center">Start new sweep, Lens now moving</td> + * <td style="text-align: center;">NOT_FOCUSED_LOCKED</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">ACTIVE_SCAN</td> + * <td style="text-align: center;">Start new sweep, Lens now moving</td> * </tr> * <tr> - * <td align="center">Any state</td> - * <td align="center">Mode change</td> - * <td align="center">INACTIVE</td> - * <td align="center"></td> + * <td style="text-align: center;">Any state</td> + * <td style="text-align: center;">Mode change</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;"></td> * </tr> * </tbody> * </table> @@ -1504,36 +1504,36 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <table> * <thead> * <tr> - * <th align="center">State</th> - * <th align="center">Transition Cause</th> - * <th align="center">New State</th> - * <th align="center">Notes</th> + * <th style="text-align: center;">State</th> + * <th style="text-align: center;">Transition Cause</th> + * <th style="text-align: center;">New State</th> + * <th style="text-align: center;">Notes</th> * </tr> * </thead> * <tbody> * <tr> - * <td align="center">INACTIVE</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">FOCUSED_LOCKED</td> - * <td align="center">Focus is already good or good after a scan, lens is now locked.</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">FOCUSED_LOCKED</td> + * <td style="text-align: center;">Focus is already good or good after a scan, lens is now locked.</td> * </tr> * <tr> - * <td align="center">INACTIVE</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">NOT_FOCUSED_LOCKED</td> - * <td align="center">Focus failed after a scan, lens is now locked.</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">NOT_FOCUSED_LOCKED</td> + * <td style="text-align: center;">Focus failed after a scan, lens is now locked.</td> * </tr> * <tr> - * <td align="center">FOCUSED_LOCKED</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">FOCUSED_LOCKED</td> - * <td align="center">Focus is already good or good after a scan, lens is now locked.</td> + * <td style="text-align: center;">FOCUSED_LOCKED</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">FOCUSED_LOCKED</td> + * <td style="text-align: center;">Focus is already good or good after a scan, lens is now locked.</td> * </tr> * <tr> - * <td align="center">NOT_FOCUSED_LOCKED</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">FOCUSED_LOCKED</td> - * <td align="center">Focus is good after a scan, lens is not locked.</td> + * <td style="text-align: center;">NOT_FOCUSED_LOCKED</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">FOCUSED_LOCKED</td> + * <td style="text-align: center;">Focus is good after a scan, lens is not locked.</td> * </tr> * </tbody> * </table> @@ -1541,102 +1541,102 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <table> * <thead> * <tr> - * <th align="center">State</th> - * <th align="center">Transition Cause</th> - * <th align="center">New State</th> - * <th align="center">Notes</th> + * <th style="text-align: center;">State</th> + * <th style="text-align: center;">Transition Cause</th> + * <th style="text-align: center;">New State</th> + * <th style="text-align: center;">Notes</th> * </tr> * </thead> * <tbody> * <tr> - * <td align="center">INACTIVE</td> - * <td align="center">Camera device initiates new scan</td> - * <td align="center">PASSIVE_SCAN</td> - * <td align="center">Start AF scan, Lens now moving</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Camera device initiates new scan</td> + * <td style="text-align: center;">PASSIVE_SCAN</td> + * <td style="text-align: center;">Start AF scan, Lens now moving</td> * </tr> * <tr> - * <td align="center">INACTIVE</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">NOT_FOCUSED_LOCKED</td> - * <td align="center">AF state query, Lens now locked</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">NOT_FOCUSED_LOCKED</td> + * <td style="text-align: center;">AF state query, Lens now locked</td> * </tr> * <tr> - * <td align="center">PASSIVE_SCAN</td> - * <td align="center">Camera device completes current scan</td> - * <td align="center">PASSIVE_FOCUSED</td> - * <td align="center">End AF scan, Lens now locked</td> + * <td style="text-align: center;">PASSIVE_SCAN</td> + * <td style="text-align: center;">Camera device completes current scan</td> + * <td style="text-align: center;">PASSIVE_FOCUSED</td> + * <td style="text-align: center;">End AF scan, Lens now locked</td> * </tr> * <tr> - * <td align="center">PASSIVE_SCAN</td> - * <td align="center">Camera device fails current scan</td> - * <td align="center">PASSIVE_UNFOCUSED</td> - * <td align="center">End AF scan, Lens now locked</td> + * <td style="text-align: center;">PASSIVE_SCAN</td> + * <td style="text-align: center;">Camera device fails current scan</td> + * <td style="text-align: center;">PASSIVE_UNFOCUSED</td> + * <td style="text-align: center;">End AF scan, Lens now locked</td> * </tr> * <tr> - * <td align="center">PASSIVE_SCAN</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">FOCUSED_LOCKED</td> - * <td align="center">Immediate transition, if focus is good. Lens now locked</td> + * <td style="text-align: center;">PASSIVE_SCAN</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">FOCUSED_LOCKED</td> + * <td style="text-align: center;">Immediate transition, if focus is good. Lens now locked</td> * </tr> * <tr> - * <td align="center">PASSIVE_SCAN</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">NOT_FOCUSED_LOCKED</td> - * <td align="center">Immediate transition, if focus is bad. Lens now locked</td> + * <td style="text-align: center;">PASSIVE_SCAN</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">NOT_FOCUSED_LOCKED</td> + * <td style="text-align: center;">Immediate transition, if focus is bad. Lens now locked</td> * </tr> * <tr> - * <td align="center">PASSIVE_SCAN</td> - * <td align="center">AF_CANCEL</td> - * <td align="center">INACTIVE</td> - * <td align="center">Reset lens position, Lens now locked</td> + * <td style="text-align: center;">PASSIVE_SCAN</td> + * <td style="text-align: center;">AF_CANCEL</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Reset lens position, Lens now locked</td> * </tr> * <tr> - * <td align="center">PASSIVE_FOCUSED</td> - * <td align="center">Camera device initiates new scan</td> - * <td align="center">PASSIVE_SCAN</td> - * <td align="center">Start AF scan, Lens now moving</td> + * <td style="text-align: center;">PASSIVE_FOCUSED</td> + * <td style="text-align: center;">Camera device initiates new scan</td> + * <td style="text-align: center;">PASSIVE_SCAN</td> + * <td style="text-align: center;">Start AF scan, Lens now moving</td> * </tr> * <tr> - * <td align="center">PASSIVE_UNFOCUSED</td> - * <td align="center">Camera device initiates new scan</td> - * <td align="center">PASSIVE_SCAN</td> - * <td align="center">Start AF scan, Lens now moving</td> + * <td style="text-align: center;">PASSIVE_UNFOCUSED</td> + * <td style="text-align: center;">Camera device initiates new scan</td> + * <td style="text-align: center;">PASSIVE_SCAN</td> + * <td style="text-align: center;">Start AF scan, Lens now moving</td> * </tr> * <tr> - * <td align="center">PASSIVE_FOCUSED</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">FOCUSED_LOCKED</td> - * <td align="center">Immediate transition, lens now locked</td> + * <td style="text-align: center;">PASSIVE_FOCUSED</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">FOCUSED_LOCKED</td> + * <td style="text-align: center;">Immediate transition, lens now locked</td> * </tr> * <tr> - * <td align="center">PASSIVE_UNFOCUSED</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">NOT_FOCUSED_LOCKED</td> - * <td align="center">Immediate transition, lens now locked</td> + * <td style="text-align: center;">PASSIVE_UNFOCUSED</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">NOT_FOCUSED_LOCKED</td> + * <td style="text-align: center;">Immediate transition, lens now locked</td> * </tr> * <tr> - * <td align="center">FOCUSED_LOCKED</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">FOCUSED_LOCKED</td> - * <td align="center">No effect</td> + * <td style="text-align: center;">FOCUSED_LOCKED</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">FOCUSED_LOCKED</td> + * <td style="text-align: center;">No effect</td> * </tr> * <tr> - * <td align="center">FOCUSED_LOCKED</td> - * <td align="center">AF_CANCEL</td> - * <td align="center">INACTIVE</td> - * <td align="center">Restart AF scan</td> + * <td style="text-align: center;">FOCUSED_LOCKED</td> + * <td style="text-align: center;">AF_CANCEL</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Restart AF scan</td> * </tr> * <tr> - * <td align="center">NOT_FOCUSED_LOCKED</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">NOT_FOCUSED_LOCKED</td> - * <td align="center">No effect</td> + * <td style="text-align: center;">NOT_FOCUSED_LOCKED</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">NOT_FOCUSED_LOCKED</td> + * <td style="text-align: center;">No effect</td> * </tr> * <tr> - * <td align="center">NOT_FOCUSED_LOCKED</td> - * <td align="center">AF_CANCEL</td> - * <td align="center">INACTIVE</td> - * <td align="center">Restart AF scan</td> + * <td style="text-align: center;">NOT_FOCUSED_LOCKED</td> + * <td style="text-align: center;">AF_CANCEL</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Restart AF scan</td> * </tr> * </tbody> * </table> @@ -1644,102 +1644,102 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <table> * <thead> * <tr> - * <th align="center">State</th> - * <th align="center">Transition Cause</th> - * <th align="center">New State</th> - * <th align="center">Notes</th> + * <th style="text-align: center;">State</th> + * <th style="text-align: center;">Transition Cause</th> + * <th style="text-align: center;">New State</th> + * <th style="text-align: center;">Notes</th> * </tr> * </thead> * <tbody> * <tr> - * <td align="center">INACTIVE</td> - * <td align="center">Camera device initiates new scan</td> - * <td align="center">PASSIVE_SCAN</td> - * <td align="center">Start AF scan, Lens now moving</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Camera device initiates new scan</td> + * <td style="text-align: center;">PASSIVE_SCAN</td> + * <td style="text-align: center;">Start AF scan, Lens now moving</td> * </tr> * <tr> - * <td align="center">INACTIVE</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">NOT_FOCUSED_LOCKED</td> - * <td align="center">AF state query, Lens now locked</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">NOT_FOCUSED_LOCKED</td> + * <td style="text-align: center;">AF state query, Lens now locked</td> * </tr> * <tr> - * <td align="center">PASSIVE_SCAN</td> - * <td align="center">Camera device completes current scan</td> - * <td align="center">PASSIVE_FOCUSED</td> - * <td align="center">End AF scan, Lens now locked</td> + * <td style="text-align: center;">PASSIVE_SCAN</td> + * <td style="text-align: center;">Camera device completes current scan</td> + * <td style="text-align: center;">PASSIVE_FOCUSED</td> + * <td style="text-align: center;">End AF scan, Lens now locked</td> * </tr> * <tr> - * <td align="center">PASSIVE_SCAN</td> - * <td align="center">Camera device fails current scan</td> - * <td align="center">PASSIVE_UNFOCUSED</td> - * <td align="center">End AF scan, Lens now locked</td> + * <td style="text-align: center;">PASSIVE_SCAN</td> + * <td style="text-align: center;">Camera device fails current scan</td> + * <td style="text-align: center;">PASSIVE_UNFOCUSED</td> + * <td style="text-align: center;">End AF scan, Lens now locked</td> * </tr> * <tr> - * <td align="center">PASSIVE_SCAN</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">FOCUSED_LOCKED</td> - * <td align="center">Eventual transition once the focus is good. Lens now locked</td> + * <td style="text-align: center;">PASSIVE_SCAN</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">FOCUSED_LOCKED</td> + * <td style="text-align: center;">Eventual transition once the focus is good. Lens now locked</td> * </tr> * <tr> - * <td align="center">PASSIVE_SCAN</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">NOT_FOCUSED_LOCKED</td> - * <td align="center">Eventual transition if cannot find focus. Lens now locked</td> + * <td style="text-align: center;">PASSIVE_SCAN</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">NOT_FOCUSED_LOCKED</td> + * <td style="text-align: center;">Eventual transition if cannot find focus. Lens now locked</td> * </tr> * <tr> - * <td align="center">PASSIVE_SCAN</td> - * <td align="center">AF_CANCEL</td> - * <td align="center">INACTIVE</td> - * <td align="center">Reset lens position, Lens now locked</td> + * <td style="text-align: center;">PASSIVE_SCAN</td> + * <td style="text-align: center;">AF_CANCEL</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Reset lens position, Lens now locked</td> * </tr> * <tr> - * <td align="center">PASSIVE_FOCUSED</td> - * <td align="center">Camera device initiates new scan</td> - * <td align="center">PASSIVE_SCAN</td> - * <td align="center">Start AF scan, Lens now moving</td> + * <td style="text-align: center;">PASSIVE_FOCUSED</td> + * <td style="text-align: center;">Camera device initiates new scan</td> + * <td style="text-align: center;">PASSIVE_SCAN</td> + * <td style="text-align: center;">Start AF scan, Lens now moving</td> * </tr> * <tr> - * <td align="center">PASSIVE_UNFOCUSED</td> - * <td align="center">Camera device initiates new scan</td> - * <td align="center">PASSIVE_SCAN</td> - * <td align="center">Start AF scan, Lens now moving</td> + * <td style="text-align: center;">PASSIVE_UNFOCUSED</td> + * <td style="text-align: center;">Camera device initiates new scan</td> + * <td style="text-align: center;">PASSIVE_SCAN</td> + * <td style="text-align: center;">Start AF scan, Lens now moving</td> * </tr> * <tr> - * <td align="center">PASSIVE_FOCUSED</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">FOCUSED_LOCKED</td> - * <td align="center">Immediate trans. Lens now locked</td> + * <td style="text-align: center;">PASSIVE_FOCUSED</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">FOCUSED_LOCKED</td> + * <td style="text-align: center;">Immediate trans. Lens now locked</td> * </tr> * <tr> - * <td align="center">PASSIVE_UNFOCUSED</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">NOT_FOCUSED_LOCKED</td> - * <td align="center">Immediate trans. Lens now locked</td> + * <td style="text-align: center;">PASSIVE_UNFOCUSED</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">NOT_FOCUSED_LOCKED</td> + * <td style="text-align: center;">Immediate trans. Lens now locked</td> * </tr> * <tr> - * <td align="center">FOCUSED_LOCKED</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">FOCUSED_LOCKED</td> - * <td align="center">No effect</td> + * <td style="text-align: center;">FOCUSED_LOCKED</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">FOCUSED_LOCKED</td> + * <td style="text-align: center;">No effect</td> * </tr> * <tr> - * <td align="center">FOCUSED_LOCKED</td> - * <td align="center">AF_CANCEL</td> - * <td align="center">INACTIVE</td> - * <td align="center">Restart AF scan</td> + * <td style="text-align: center;">FOCUSED_LOCKED</td> + * <td style="text-align: center;">AF_CANCEL</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Restart AF scan</td> * </tr> * <tr> - * <td align="center">NOT_FOCUSED_LOCKED</td> - * <td align="center">AF_TRIGGER</td> - * <td align="center">NOT_FOCUSED_LOCKED</td> - * <td align="center">No effect</td> + * <td style="text-align: center;">NOT_FOCUSED_LOCKED</td> + * <td style="text-align: center;">AF_TRIGGER</td> + * <td style="text-align: center;">NOT_FOCUSED_LOCKED</td> + * <td style="text-align: center;">No effect</td> * </tr> * <tr> - * <td align="center">NOT_FOCUSED_LOCKED</td> - * <td align="center">AF_CANCEL</td> - * <td align="center">INACTIVE</td> - * <td align="center">Restart AF scan</td> + * <td style="text-align: center;">NOT_FOCUSED_LOCKED</td> + * <td style="text-align: center;">AF_CANCEL</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Restart AF scan</td> * </tr> * </tbody> * </table> @@ -1751,30 +1751,30 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <table> * <thead> * <tr> - * <th align="center">State</th> - * <th align="center">Transition Cause</th> - * <th align="center">New State</th> - * <th align="center">Notes</th> + * <th style="text-align: center;">State</th> + * <th style="text-align: center;">Transition Cause</th> + * <th style="text-align: center;">New State</th> + * <th style="text-align: center;">Notes</th> * </tr> * </thead> * <tbody> * <tr> - * <td align="center">any state</td> - * <td align="center">CAF-->AUTO mode switch</td> - * <td align="center">INACTIVE</td> - * <td align="center">Mode switch without trigger, initial state must be INACTIVE</td> + * <td style="text-align: center;">any state</td> + * <td style="text-align: center;">CAF-->AUTO mode switch</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Mode switch without trigger, initial state must be INACTIVE</td> * </tr> * <tr> - * <td align="center">any state</td> - * <td align="center">CAF-->AUTO mode switch with AF_TRIGGER</td> - * <td align="center">trigger-reachable states from INACTIVE</td> - * <td align="center">Mode switch with trigger, INACTIVE is skipped</td> + * <td style="text-align: center;">any state</td> + * <td style="text-align: center;">CAF-->AUTO mode switch with AF_TRIGGER</td> + * <td style="text-align: center;">trigger-reachable states from INACTIVE</td> + * <td style="text-align: center;">Mode switch with trigger, INACTIVE is skipped</td> * </tr> * <tr> - * <td align="center">any state</td> - * <td align="center">AUTO-->CAF mode switch</td> - * <td align="center">passively reachable states from INACTIVE</td> - * <td align="center">Mode switch without trigger, passive transient state is skipped</td> + * <td style="text-align: center;">any state</td> + * <td style="text-align: center;">AUTO-->CAF mode switch</td> + * <td style="text-align: center;">passively reachable states from INACTIVE</td> + * <td style="text-align: center;">Mode switch without trigger, passive transient state is skipped</td> * </tr> * </tbody> * </table> @@ -2053,18 +2053,18 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <table> * <thead> * <tr> - * <th align="center">State</th> - * <th align="center">Transition Cause</th> - * <th align="center">New State</th> - * <th align="center">Notes</th> + * <th style="text-align: center;">State</th> + * <th style="text-align: center;">Transition Cause</th> + * <th style="text-align: center;">New State</th> + * <th style="text-align: center;">Notes</th> * </tr> * </thead> * <tbody> * <tr> - * <td align="center">INACTIVE</td> - * <td align="center"></td> - * <td align="center">INACTIVE</td> - * <td align="center">Camera device auto white balance algorithm is disabled</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;"></td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Camera device auto white balance algorithm is disabled</td> * </tr> * </tbody> * </table> @@ -2072,54 +2072,54 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <table> * <thead> * <tr> - * <th align="center">State</th> - * <th align="center">Transition Cause</th> - * <th align="center">New State</th> - * <th align="center">Notes</th> + * <th style="text-align: center;">State</th> + * <th style="text-align: center;">Transition Cause</th> + * <th style="text-align: center;">New State</th> + * <th style="text-align: center;">Notes</th> * </tr> * </thead> * <tbody> * <tr> - * <td align="center">INACTIVE</td> - * <td align="center">Camera device initiates AWB scan</td> - * <td align="center">SEARCHING</td> - * <td align="center">Values changing</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Camera device initiates AWB scan</td> + * <td style="text-align: center;">SEARCHING</td> + * <td style="text-align: center;">Values changing</td> * </tr> * <tr> - * <td align="center">INACTIVE</td> - * <td align="center">{@link CaptureRequest#CONTROL_AWB_LOCK android.control.awbLock} is ON</td> - * <td align="center">LOCKED</td> - * <td align="center">Values locked</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">{@link CaptureRequest#CONTROL_AWB_LOCK android.control.awbLock} is ON</td> + * <td style="text-align: center;">LOCKED</td> + * <td style="text-align: center;">Values locked</td> * </tr> * <tr> - * <td align="center">SEARCHING</td> - * <td align="center">Camera device finishes AWB scan</td> - * <td align="center">CONVERGED</td> - * <td align="center">Good values, not changing</td> + * <td style="text-align: center;">SEARCHING</td> + * <td style="text-align: center;">Camera device finishes AWB scan</td> + * <td style="text-align: center;">CONVERGED</td> + * <td style="text-align: center;">Good values, not changing</td> * </tr> * <tr> - * <td align="center">SEARCHING</td> - * <td align="center">{@link CaptureRequest#CONTROL_AWB_LOCK android.control.awbLock} is ON</td> - * <td align="center">LOCKED</td> - * <td align="center">Values locked</td> + * <td style="text-align: center;">SEARCHING</td> + * <td style="text-align: center;">{@link CaptureRequest#CONTROL_AWB_LOCK android.control.awbLock} is ON</td> + * <td style="text-align: center;">LOCKED</td> + * <td style="text-align: center;">Values locked</td> * </tr> * <tr> - * <td align="center">CONVERGED</td> - * <td align="center">Camera device initiates AWB scan</td> - * <td align="center">SEARCHING</td> - * <td align="center">Values changing</td> + * <td style="text-align: center;">CONVERGED</td> + * <td style="text-align: center;">Camera device initiates AWB scan</td> + * <td style="text-align: center;">SEARCHING</td> + * <td style="text-align: center;">Values changing</td> * </tr> * <tr> - * <td align="center">CONVERGED</td> - * <td align="center">{@link CaptureRequest#CONTROL_AWB_LOCK android.control.awbLock} is ON</td> - * <td align="center">LOCKED</td> - * <td align="center">Values locked</td> + * <td style="text-align: center;">CONVERGED</td> + * <td style="text-align: center;">{@link CaptureRequest#CONTROL_AWB_LOCK android.control.awbLock} is ON</td> + * <td style="text-align: center;">LOCKED</td> + * <td style="text-align: center;">Values locked</td> * </tr> * <tr> - * <td align="center">LOCKED</td> - * <td align="center">{@link CaptureRequest#CONTROL_AWB_LOCK android.control.awbLock} is OFF</td> - * <td align="center">SEARCHING</td> - * <td align="center">Values not good after unlock</td> + * <td style="text-align: center;">LOCKED</td> + * <td style="text-align: center;">{@link CaptureRequest#CONTROL_AWB_LOCK android.control.awbLock} is OFF</td> + * <td style="text-align: center;">SEARCHING</td> + * <td style="text-align: center;">Values not good after unlock</td> * </tr> * </tbody> * </table> @@ -2132,24 +2132,24 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <table> * <thead> * <tr> - * <th align="center">State</th> - * <th align="center">Transition Cause</th> - * <th align="center">New State</th> - * <th align="center">Notes</th> + * <th style="text-align: center;">State</th> + * <th style="text-align: center;">Transition Cause</th> + * <th style="text-align: center;">New State</th> + * <th style="text-align: center;">Notes</th> * </tr> * </thead> * <tbody> * <tr> - * <td align="center">INACTIVE</td> - * <td align="center">Camera device finished AWB scan</td> - * <td align="center">CONVERGED</td> - * <td align="center">Values are already good, transient states are skipped by camera device.</td> + * <td style="text-align: center;">INACTIVE</td> + * <td style="text-align: center;">Camera device finished AWB scan</td> + * <td style="text-align: center;">CONVERGED</td> + * <td style="text-align: center;">Values are already good, transient states are skipped by camera device.</td> * </tr> * <tr> - * <td align="center">LOCKED</td> - * <td align="center">{@link CaptureRequest#CONTROL_AWB_LOCK android.control.awbLock} is OFF</td> - * <td align="center">CONVERGED</td> - * <td align="center">Values good after unlock, transient states are skipped by camera device.</td> + * <td style="text-align: center;">LOCKED</td> + * <td style="text-align: center;">{@link CaptureRequest#CONTROL_AWB_LOCK android.control.awbLock} is OFF</td> + * <td style="text-align: center;">CONVERGED</td> + * <td style="text-align: center;">Values good after unlock, transient states are skipped by camera device.</td> * </tr> * </tbody> * </table> diff --git a/core/java/android/net/Ikev2VpnProfile.java b/core/java/android/net/Ikev2VpnProfile.java index 647514486750..a20191cab774 100644 --- a/core/java/android/net/Ikev2VpnProfile.java +++ b/core/java/android/net/Ikev2VpnProfile.java @@ -1108,6 +1108,11 @@ public final class Ikev2VpnProfile extends PlatformVpnProfile { /** * Sets the enabled state of the automatic NAT-T keepalive timers * + * Note that if this builder was constructed with a {@link IkeTunnelConnectionParams}, + * but this is called with {@code true}, the framework will automatically choose the + * appropriate keepalive timer and ignore the settings in the session params embedded + * in the connection params. + * * @param isEnabled {@code true} to enable automatic keepalive timers, based on internal * platform signals. Defaults to {@code false}. * @return this {@link Builder} object to facilitate chaining of method calls diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java index 6dc80cf4c374..611df0a4ea90 100644 --- a/core/java/android/nfc/NfcAdapter.java +++ b/core/java/android/nfc/NfcAdapter.java @@ -26,8 +26,6 @@ import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SystemApi; import android.annotation.UserIdInt; import android.app.Activity; -import android.app.ActivityThread; -import android.app.OnActivityPausedListener; import android.app.PendingIntent; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; @@ -1570,17 +1568,11 @@ public final class NfcAdapter { if (activity == null || intent == null) { throw new NullPointerException(); } - if (!activity.isResumed()) { - throw new IllegalStateException("Foreground dispatch can only be enabled " + - "when your activity is resumed"); - } try { TechListParcel parcel = null; if (techLists != null && techLists.length > 0) { parcel = new TechListParcel(techLists); } - ActivityThread.currentActivityThread().registerOnActivityPausedListener(activity, - mForegroundDispatchListener); sService.setForegroundDispatch(intent, filters, parcel); } catch (RemoteException e) { attemptDeadServiceRecovery(e); @@ -1608,25 +1600,8 @@ public final class NfcAdapter { throw new UnsupportedOperationException(); } } - ActivityThread.currentActivityThread().unregisterOnActivityPausedListener(activity, - mForegroundDispatchListener); - disableForegroundDispatchInternal(activity, false); - } - - OnActivityPausedListener mForegroundDispatchListener = new OnActivityPausedListener() { - @Override - public void onPaused(Activity activity) { - disableForegroundDispatchInternal(activity, true); - } - }; - - void disableForegroundDispatchInternal(Activity activity, boolean force) { try { sService.setForegroundDispatch(null, null, null); - if (!force && !activity.isResumed()) { - throw new IllegalStateException("You must disable foreground dispatching " + - "while your activity is still resumed"); - } } catch (RemoteException e) { attemptDeadServiceRecovery(e); } diff --git a/core/java/android/os/BatteryManager.java b/core/java/android/os/BatteryManager.java index 76f857bd91b7..6bc0f6ea947c 100644 --- a/core/java/android/os/BatteryManager.java +++ b/core/java/android/os/BatteryManager.java @@ -147,6 +147,18 @@ public class BatteryManager { public static final String EXTRA_SEQUENCE = "seq"; /** + * Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}: + * Int value representing the battery charging cycle count. + */ + public static final String EXTRA_CYCLE_COUNT = "android.os.extra.CYCLE_COUNT"; + + /** + * Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}: + * Int value representing the battery charging status. + */ + public static final String EXTRA_CHARGING_STATUS = "android.os.extra.CHARGING_STATUS"; + + /** * Extra for {@link android.content.Intent#ACTION_BATTERY_LEVEL_CHANGED}: * Contains list of Bundles representing battery events * @hide @@ -190,6 +202,35 @@ public class BatteryManager { /** Power source is dock. */ public static final int BATTERY_PLUGGED_DOCK = OsProtoEnums.BATTERY_PLUGGED_DOCK; // = 8 + // values for "charge policy" property + /** + * Default policy (e.g. normal). + * @hide + */ + @SystemApi + public static final int CHARGING_POLICY_DEFAULT = OsProtoEnums.CHARGING_POLICY_DEFAULT; // = 1 + /** + * Optimized for battery health using static thresholds (e.g stop at 80%). + * @hide + */ + @SystemApi + public static final int CHARGING_POLICY_ADAPTIVE_AON = + OsProtoEnums.CHARGING_POLICY_ADAPTIVE_AON; // = 2 + /** + * Optimized for battery health using adaptive thresholds. + * @hide + */ + @SystemApi + public static final int CHARGING_POLICY_ADAPTIVE_AC = + OsProtoEnums.CHARGING_POLICY_ADAPTIVE_AC; // = 3 + /** + * Optimized for battery health, devices always connected to power. + * @hide + */ + @SystemApi + public static final int CHARGING_POLICY_ADAPTIVE_LONGLIFE = + OsProtoEnums.CHARGING_POLICY_ADAPTIVE_LONGLIFE; // = 4 + /** @hide */ public static final int BATTERY_PLUGGED_ANY = BATTERY_PLUGGED_AC | BATTERY_PLUGGED_USB | BATTERY_PLUGGED_WIRELESS @@ -254,6 +295,76 @@ public class BatteryManager { */ public static final int BATTERY_PROPERTY_STATUS = 6; + /** + * Battery manufacturing date is reported in epoch. The 0 timepoint + * begins at midnight Coordinated Universal Time (UTC) on January 1, 1970. + * It is a long integer in seconds. + * + * <p class="note"> + * The sender must hold the {@link android.Manifest.permission#BATTERY_STATS} permission. + * + * Example: <code> + * // The value returned from the API can be used to create a Date, used + * // to set the time on a calendar and coverted to a string. + * import java.util.Date; + * + * mBatteryManager = mContext.getSystemService(BatteryManager.class); + * final long manufacturingDate = + * mBatteryManager.getLongProperty(BatteryManager.BATTERY_PROPERTY_MANUFACTURING_DATE); + * Date date = new Date(manufacturingDate); + * Calendar calendar = Calendar.getInstance(); + * calendar.setTime(date); + * // Convert to yyyy-MM-dd HH:mm:ss format string + * SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + * String dateString = sdf.format(date); + * </code> + * @hide + */ + @RequiresPermission(permission.BATTERY_STATS) + @SystemApi + public static final int BATTERY_PROPERTY_MANUFACTURING_DATE = 7; + + /** + * The date of first usage is reported in epoch. The 0 timepoint + * begins at midnight Coordinated Universal Time (UTC) on January 1, 1970. + * It is a long integer in seconds. + * + * <p class="note"> + * The sender must hold the {@link android.Manifest.permission#BATTERY_STATS} permission. + * + * {@link BATTERY_PROPERTY_MANUFACTURING_DATE for sample code} + * @hide + */ + @RequiresPermission(permission.BATTERY_STATS) + @SystemApi + public static final int BATTERY_PROPERTY_FIRST_USAGE_DATE = 8; + + /** + * Battery charging policy from a CHARGING_POLICY_* value.. + * + * <p class="note"> + * The sender must hold the {@link android.Manifest.permission#BATTERY_STATS} permission. + * + * @hide + */ + @RequiresPermission(permission.BATTERY_STATS) + @SystemApi + public static final int BATTERY_PROPERTY_CHARGING_POLICY = 9; + + /** + * + * Percentage representing the measured battery state of health (remaining + * estimated full charge capacity relative to the rated capacity in %). + * + * <p class="note"> + * The sender must hold the {@link android.Manifest.permission#BATTERY_STATS} permission. + * + * @hide + */ + @RequiresPermission(permission.BATTERY_STATS) + @SystemApi + public static final int BATTERY_PROPERTY_STATE_OF_HEALTH = 10; + private final Context mContext; private final IBatteryStats mBatteryStats; private final IBatteryPropertiesRegistrar mBatteryPropertiesRegistrar; @@ -307,7 +418,6 @@ public class BatteryManager { try { BatteryProperty prop = new BatteryProperty(); - if (mBatteryPropertiesRegistrar.getProperty(id, prop) == 0) ret = prop.getLong(); else diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java index 0c9eaa41ade0..001a25d8be8f 100644 --- a/core/java/android/provider/Telephony.java +++ b/core/java/android/provider/Telephony.java @@ -4311,13 +4311,25 @@ public final class Telephony { * subscription and while is in voice call. * * Default value is empty string. - * + * @deprecated This column is no longer supported. Use + * {@link #COLUMN_ENABLED_MOBILE_DATA_POLICIES} instead. * @hide */ + @Deprecated public static final String COLUMN_DATA_ENABLED_OVERRIDE_RULES = "data_enabled_override_rules"; /** + * TelephonyProvider column name enabled_mobile_data_policies. + * A list of mobile data policies, each of which represented by an integer and joint by ",". + * + * Default value is empty string. + * @hide + */ + public static final String COLUMN_ENABLED_MOBILE_DATA_POLICIES = + "enabled_mobile_data_policies"; + + /** * TelephonyProvider column name for user displayed name. * <P>Type: TEXT (String)</P> * diff --git a/core/jni/android_media_MicrophoneInfo.cpp b/core/jni/android_media_MicrophoneInfo.cpp index 65e30d8b1ea3..18f81254af7d 100644 --- a/core/jni/android_media_MicrophoneInfo.cpp +++ b/core/jni/android_media_MicrophoneInfo.cpp @@ -92,6 +92,7 @@ jint convertMicrophoneInfoFromNative(JNIEnv *env, jobject *jMicrophoneInfo, env->DeleteLocalRef(jFrequencyResponse); } // Create a list of Pair for channel mapping. + jChannelMappings = env->NewObject(gArrayListClass, gArrayListCstor); const auto &channelMapping = micInfo.channel_mapping; for (size_t i = 0; i < std::size(channelMapping); i++) { int channelMappingType = channelMapping[i]; diff --git a/core/tests/companiontests/OWNERS b/core/tests/companiontests/OWNERS new file mode 100644 index 000000000000..734d8b6c5f43 --- /dev/null +++ b/core/tests/companiontests/OWNERS @@ -0,0 +1 @@ +include /core/java/android/companion/OWNERS
\ No newline at end of file diff --git a/media/java/android/media/MediaDrm.java b/media/java/android/media/MediaDrm.java index a3fa43d687c3..c8d44b2e850f 100644 --- a/media/java/android/media/MediaDrm.java +++ b/media/java/android/media/MediaDrm.java @@ -3049,7 +3049,13 @@ public final class MediaDrm implements AutoCloseable { /** - * Gets the {@link LogSessionId}. + * Sets the {@link LogSessionId}. + * + * <p>The implementation of this method varies by DRM provider; Please refer + * to your DRM provider documentation for more details on this method. + * + * @throws UnsupportedOperationException when the vendor plugin does not + * implement this method */ public void setLogSessionId(@NonNull LogSessionId logSessionId) { Objects.requireNonNull(logSessionId); diff --git a/media/java/android/media/RingtoneManager.java b/media/java/android/media/RingtoneManager.java index 27db41cb9f4e..171349a26569 100644 --- a/media/java/android/media/RingtoneManager.java +++ b/media/java/android/media/RingtoneManager.java @@ -841,7 +841,7 @@ public class RingtoneManager { if (ringtoneUri != null) { final Uri cacheUri = getCacheForType(type, context.getUserId()); try (InputStream in = openRingtone(context, ringtoneUri); - OutputStream out = resolver.openOutputStream(cacheUri)) { + OutputStream out = resolver.openOutputStream(cacheUri, "wt")) { FileUtils.copy(in, out); } catch (IOException e) { Log.w(TAG, "Failed to cache ringtone: " + e); diff --git a/packages/SettingsLib/ActivityEmbedding/src/com/android/settingslib/activityembedding/ActivityEmbeddingUtils.java b/packages/SettingsLib/ActivityEmbedding/src/com/android/settingslib/activityembedding/ActivityEmbeddingUtils.java index 2db0a8f4f911..33fc37ea0e6d 100644 --- a/packages/SettingsLib/ActivityEmbedding/src/com/android/settingslib/activityembedding/ActivityEmbeddingUtils.java +++ b/packages/SettingsLib/ActivityEmbedding/src/com/android/settingslib/activityembedding/ActivityEmbeddingUtils.java @@ -25,7 +25,7 @@ import android.text.TextUtils; import android.util.Log; import androidx.core.os.BuildCompat; -import androidx.window.embedding.SplitController; +import androidx.window.embedding.ActivityEmbeddingController; import com.android.settingslib.utils.BuildCompatUtils; @@ -86,7 +86,7 @@ public final class ActivityEmbeddingUtils { * @param activity Activity that needs the check */ public static boolean isActivityEmbedded(Activity activity) { - return SplitController.getInstance().isActivityEmbedded(activity); + return ActivityEmbeddingController.getInstance(activity).isActivityEmbedded(activity); } /** diff --git a/packages/SettingsLib/DeviceStateRotationLock/OWNERS b/packages/SettingsLib/DeviceStateRotationLock/OWNERS new file mode 100644 index 000000000000..091df2610866 --- /dev/null +++ b/packages/SettingsLib/DeviceStateRotationLock/OWNERS @@ -0,0 +1 @@ +include platform/frameworks/base:/packages/SettingsLib/src/com/android/settingslib/devicestate/OWNERS
\ No newline at end of file diff --git a/packages/SettingsLib/res/values/arrays.xml b/packages/SettingsLib/res/values/arrays.xml index 9108449bd8d8..4de23bae2a15 100644 --- a/packages/SettingsLib/res/values/arrays.xml +++ b/packages/SettingsLib/res/values/arrays.xml @@ -118,9 +118,9 @@ <!-- Titles for Bluetooth HCI Snoop Filtered Logging --> <string-array name="bt_hci_snoop_log_filters_entries"> - <item>Headers Filtered</item> - <item>A2DP Media Packets Filtered</item> - <item>RFCOMM Channel Filtered</item> + <item>Leave only ACL headers</item> + <item>Filter A2DP media packets</item> + <item>Filter RFCOMM channel</item> </string-array> <!-- Values for Bluetooth HCI Snoop Filtered Logging --> @@ -132,10 +132,10 @@ <!-- Titles for Bluetooth HCI Snoop Filtered Logging --> <string-array name="bt_hci_snoop_log_profile_filter_entries"> - <item>Disabled</item> - <item>Magic</item> - <item>Header</item> - <item>Full Filter</item> + <item>Disable</item> + <item>Fill with string of characters</item> + <item>Leave only header</item> + <item>Fully remove</item> </string-array> <!-- Values for Bluetooth HCI Snoop Filtered Logging --> diff --git a/packages/SettingsLib/res/values/styles.xml b/packages/SettingsLib/res/values/styles.xml index 5237b4fa1c3d..172aff76d481 100644 --- a/packages/SettingsLib/res/values/styles.xml +++ b/packages/SettingsLib/res/values/styles.xml @@ -14,7 +14,7 @@ ~ limitations under the License --> -<resources> +<resources xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> <style name="TextAppearanceSmall"> <item name="android:textAppearance">?android:attr/textAppearanceSmall</item> </style> @@ -73,7 +73,7 @@ </style> <style name="TextAppearanceBroadcastDialogButton" parent="@android:TextAppearance.DeviceDefault.Headline"> - <item name="android:textColor">?android:attr/textColorPrimary</item> + <item name="android:textColor">?androidprv:attr/textColorOnAccent</item> <item name="android:textSize">@dimen/broadcast_dialog_btn_text_size</item> </style> diff --git a/services/core/java/com/android/server/BatteryService.java b/services/core/java/com/android/server/BatteryService.java index 5122603ac2a4..3ff943dbf95c 100644 --- a/services/core/java/com/android/server/BatteryService.java +++ b/services/core/java/com/android/server/BatteryService.java @@ -149,6 +149,8 @@ public final class BatteryService extends SystemService { private int mLastMaxChargingCurrent; private int mLastMaxChargingVoltage; private int mLastChargeCounter; + private int mLastBatteryCycleCount; + private int mLastCharingState; private int mSequence = 1; @@ -503,7 +505,9 @@ public final class BatteryService extends SystemService { || mHealthInfo.maxChargingCurrentMicroamps != mLastMaxChargingCurrent || mHealthInfo.maxChargingVoltageMicrovolts != mLastMaxChargingVoltage || mHealthInfo.batteryChargeCounterUah != mLastChargeCounter - || mInvalidCharger != mLastInvalidCharger)) { + || mInvalidCharger != mLastInvalidCharger + || mHealthInfo.batteryCycleCount != mLastBatteryCycleCount + || mHealthInfo.chargingState != mLastCharingState)) { if (mPlugType != mLastPlugType) { if (mLastPlugType == BATTERY_PLUGGED_NONE) { @@ -677,6 +681,8 @@ public final class BatteryService extends SystemService { mLastChargeCounter = mHealthInfo.batteryChargeCounterUah; mLastBatteryLevelCritical = mBatteryLevelCritical; mLastInvalidCharger = mInvalidCharger; + mLastBatteryCycleCount = mHealthInfo.batteryCycleCount; + mLastCharingState = mHealthInfo.chargingState; } } @@ -708,6 +714,8 @@ public final class BatteryService extends SystemService { BatteryManager.EXTRA_MAX_CHARGING_VOLTAGE, mHealthInfo.maxChargingVoltageMicrovolts); intent.putExtra(BatteryManager.EXTRA_CHARGE_COUNTER, mHealthInfo.batteryChargeCounterUah); + intent.putExtra(BatteryManager.EXTRA_CYCLE_COUNT, mHealthInfo.batteryCycleCount); + intent.putExtra(BatteryManager.EXTRA_CHARGING_STATUS, mHealthInfo.chargingState); if (DEBUG) { Slog.d(TAG, "Sending ACTION_BATTERY_CHANGED. scale:" + BATTERY_SCALE + ", info:" + mHealthInfo.toString()); @@ -731,6 +739,8 @@ public final class BatteryService extends SystemService { event.putInt(BatteryManager.EXTRA_TEMPERATURE, mHealthInfo.batteryTemperatureTenthsCelsius); event.putInt(BatteryManager.EXTRA_CHARGE_COUNTER, mHealthInfo.batteryChargeCounterUah); event.putLong(BatteryManager.EXTRA_EVENT_TIMESTAMP, now); + event.putInt(BatteryManager.EXTRA_CYCLE_COUNT, mHealthInfo.batteryCycleCount); + event.putInt(BatteryManager.EXTRA_CHARGING_STATUS, mHealthInfo.chargingState); boolean queueWasEmpty = mBatteryLevelsEventQueue.isEmpty(); mBatteryLevelsEventQueue.add(event); @@ -1262,11 +1272,20 @@ public final class BatteryService extends SystemService { } } - // Reduced IBatteryPropertiesRegistrar that only implements getProperty for usage - // in BatteryManager. + // Reduced IBatteryPropertiesRegistrar that implements getProperty for usage + // in BatteryManager and enforce permissions. private final class BatteryPropertiesRegistrar extends IBatteryPropertiesRegistrar.Stub { @Override public int getProperty(int id, final BatteryProperty prop) throws RemoteException { + switch (id) { + case BatteryManager.BATTERY_PROPERTY_MANUFACTURING_DATE: + case BatteryManager.BATTERY_PROPERTY_FIRST_USAGE_DATE: + case BatteryManager.BATTERY_PROPERTY_CHARGING_POLICY: + case BatteryManager.BATTERY_PROPERTY_STATE_OF_HEALTH: + mContext.enforceCallingPermission( + android.Manifest.permission.BATTERY_STATS, null); + break; + } return mHealthServiceWrapper.getProperty(id, prop); } @Override diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 723df0e25ddf..ce9c067116ef 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -2821,6 +2821,8 @@ class StorageManagerService extends IStorageManager.Stub enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS); try { + int avgWriteAmount = 0; + int targetDirtyRatio = mTargetDirtyRatio; int latestWrite = mVold.getWriteAmount(); if (latestWrite == -1) { Slog.w(TAG, "Failed to get storage write record"); @@ -2833,11 +2835,12 @@ class StorageManagerService extends IStorageManager.Stub // (first boot after OTA), We skip the smart idle maintenance if (!needsCheckpoint() || !supportsBlockCheckpoint()) { if (!refreshLifetimeConstraint() || !checkChargeStatus()) { - return; + Slog.i(TAG, "Turn off gc_urgent based on checking lifetime and charge status"); + targetDirtyRatio = 100; + } else { + avgWriteAmount = getAverageWriteAmount(); } - int avgWriteAmount = getAverageWriteAmount(); - Slog.i(TAG, "Set smart idle maintenance: " + "latest write amount: " + latestWrite + ", average write amount: " + avgWriteAmount + ", min segment threshold: " + mMinSegmentsThreshold + @@ -2845,10 +2848,10 @@ class StorageManagerService extends IStorageManager.Stub ", segment reclaim weight: " + mSegmentReclaimWeight + ", period(min): " + sSmartIdleMaintPeriod + ", min gc sleep time(ms): " + mMinGCSleepTime + - ", target dirty ratio: " + mTargetDirtyRatio); + ", target dirty ratio: " + targetDirtyRatio); mVold.setGCUrgentPace(avgWriteAmount, mMinSegmentsThreshold, mDirtyReclaimRate, mSegmentReclaimWeight, sSmartIdleMaintPeriod, - mMinGCSleepTime, mTargetDirtyRatio); + mMinGCSleepTime, targetDirtyRatio); } else { Slog.i(TAG, "Skipping smart idle maintenance - block based checkpoint in progress"); } diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index c15e419c073c..1ce917cb7841 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -25,6 +25,8 @@ import static android.net.NetworkCapabilities.TRANSPORT_VPN; import static android.net.RouteInfo.RTN_THROW; import static android.net.RouteInfo.RTN_UNREACHABLE; import static android.net.VpnManager.NOTIFICATION_CHANNEL_VPN; +import static android.net.ipsec.ike.IkeSessionParams.ESP_ENCAP_TYPE_AUTO; +import static android.net.ipsec.ike.IkeSessionParams.ESP_IP_VERSION_AUTO; import static android.os.PowerWhitelistManager.REASON_VPN; import static android.os.UserHandle.PER_USER_RANGE; @@ -251,6 +253,14 @@ public class Vpn { */ private static final int STARTING_TOKEN = -1; + // TODO : read this from carrier config instead of a constant + @VisibleForTesting + public static final int AUTOMATIC_KEEPALIVE_DELAY_SECONDS = 30; + + // Default keepalive timeout for carrier config is 5 minutes. Mimic this. + @VisibleForTesting + static final int DEFAULT_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT = 5 * 60; + // TODO: create separate trackers for each unique VPN to support // automated reconnection @@ -3071,6 +3081,7 @@ public class Vpn { prepareStatusIntent(); } agentConnect(this::onValidationStatus); + mSession.setUnderpinnedNetwork(mNetworkAgent.getNetwork()); return; // Link properties are already sent. } else { // Underlying networks also set in agentConnect() @@ -3179,6 +3190,7 @@ public class Vpn { if (!removedAddrs.isEmpty()) { startNewNetworkAgent( mNetworkAgent, "MTU too low for IPv6; restarting network agent"); + mSession.setUnderpinnedNetwork(mNetworkAgent.getNetwork()); for (LinkAddress removed : removedAddrs) { mTunnelIface.removeAddress( @@ -3242,6 +3254,8 @@ public class Vpn { } mActiveNetwork = network; + mUnderlyingLinkProperties = null; + mUnderlyingNetworkCapabilities = null; mRetryCount = 0; startOrMigrateIkeSession(network); @@ -3251,14 +3265,22 @@ public class Vpn { private IkeSessionParams getIkeSessionParams(@NonNull Network underlyingNetwork) { final IkeTunnelConnectionParams ikeTunConnParams = mProfile.getIkeTunnelConnectionParams(); + final IkeSessionParams.Builder builder; if (ikeTunConnParams != null) { - final IkeSessionParams.Builder builder = - new IkeSessionParams.Builder(ikeTunConnParams.getIkeSessionParams()) - .setNetwork(underlyingNetwork); - return builder.build(); + builder = new IkeSessionParams.Builder(ikeTunConnParams.getIkeSessionParams()) + .setNetwork(underlyingNetwork); } else { - return VpnIkev2Utils.buildIkeSessionParams(mContext, mProfile, underlyingNetwork); + builder = VpnIkev2Utils.makeIkeSessionParamsBuilder(mContext, mProfile, + underlyingNetwork); + } + if (mProfile.isAutomaticNattKeepaliveTimerEnabled()) { + builder.setNattKeepAliveDelaySeconds(guessNattKeepaliveTimerForNetwork()); } + if (mProfile.isAutomaticIpVersionSelectionEnabled()) { + builder.setIpVersion(guessEspIpVersionForNetwork()); + builder.setEncapType(guessEspEncapTypeForNetwork()); + } + return builder.build(); } @NonNull @@ -3322,6 +3344,23 @@ public class Vpn { startIkeSession(underlyingNetwork); } + private int guessEspIpVersionForNetwork() { + // TODO : guess the IP version based on carrier if auto IP version selection is enabled + return ESP_IP_VERSION_AUTO; + } + + private int guessEspEncapTypeForNetwork() { + // TODO : guess the ESP encap type based on carrier if auto IP version selection is + // enabled + return ESP_ENCAP_TYPE_AUTO; + } + + private int guessNattKeepaliveTimerForNetwork() { + // TODO : guess the keepalive delay based on carrier if auto keepalive timer is + // enabled + return AUTOMATIC_KEEPALIVE_DELAY_SECONDS; + } + boolean maybeMigrateIkeSession(@NonNull Network underlyingNetwork) { if (mSession == null || !mMobikeEnabled) return false; @@ -3331,7 +3370,20 @@ public class Vpn { + mCurrentToken + " to network " + underlyingNetwork); - mSession.setNetwork(underlyingNetwork); + final int ipVersion = mProfile.isAutomaticIpVersionSelectionEnabled() + ? guessEspIpVersionForNetwork() : ESP_IP_VERSION_AUTO; + final int encapType = mProfile.isAutomaticIpVersionSelectionEnabled() + ? guessEspEncapTypeForNetwork() : ESP_ENCAP_TYPE_AUTO; + final int keepaliveDelaySeconds; + if (mProfile.isAutomaticNattKeepaliveTimerEnabled()) { + keepaliveDelaySeconds = guessNattKeepaliveTimerForNetwork(); + } else if (mProfile.getIkeTunnelConnectionParams() != null) { + keepaliveDelaySeconds = mProfile.getIkeTunnelConnectionParams() + .getIkeSessionParams().getNattKeepAliveDelaySeconds(); + } else { + keepaliveDelaySeconds = DEFAULT_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT; + } + mSession.setNetwork(underlyingNetwork, ipVersion, encapType, keepaliveDelaySeconds); return true; } @@ -4661,8 +4713,14 @@ public class Vpn { } /** Update the underlying network of the IKE Session */ - public void setNetwork(@NonNull Network network) { - mImpl.setNetwork(network); + public void setNetwork(@NonNull Network network, int ipVersion, int encapType, + int keepaliveDelaySeconds) { + mImpl.setNetwork(network, ipVersion, encapType, keepaliveDelaySeconds); + } + + /** Set the underpinned network */ + public void setUnderpinnedNetwork(@NonNull Network underpinnedNetwork) { + mImpl.setUnderpinnedNetwork(underpinnedNetwork); } /** Forcibly terminate the IKE Session */ diff --git a/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java b/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java index 857c86de57ca..a48c9fcd4181 100644 --- a/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java +++ b/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java @@ -99,7 +99,7 @@ import java.util.concurrent.Executor; public class VpnIkev2Utils { private static final String TAG = VpnIkev2Utils.class.getSimpleName(); - static IkeSessionParams buildIkeSessionParams( + static IkeSessionParams.Builder makeIkeSessionParamsBuilder( @NonNull Context context, @NonNull Ikev2VpnProfile profile, @NonNull Network network) { final IkeIdentification localId = parseIkeIdentification(profile.getUserIdentity()); final IkeIdentification remoteId = parseIkeIdentification(profile.getServerAddr()); @@ -117,7 +117,7 @@ public class VpnIkev2Utils { ikeOptionsBuilder.addSaProposal(ikeProposal); } - return ikeOptionsBuilder.build(); + return ikeOptionsBuilder; } static ChildSessionParams buildChildSessionParams(List<String> allowedAlgorithms) { diff --git a/services/core/java/com/android/server/display/OWNERS b/services/core/java/com/android/server/display/OWNERS index 8e3460175158..fcaa95731408 100644 --- a/services/core/java/com/android/server/display/OWNERS +++ b/services/core/java/com/android/server/display/OWNERS @@ -4,5 +4,7 @@ hackbod@google.com ogunwale@google.com santoscordon@google.com flc@google.com +wilczynskip@google.com +brup@google.com per-file ColorDisplayService.java=christyfranks@google.com diff --git a/services/core/java/com/android/server/health/HealthServiceWrapperAidl.java b/services/core/java/com/android/server/health/HealthServiceWrapperAidl.java index c4113198ae1d..1153cc37e3da 100644 --- a/services/core/java/com/android/server/health/HealthServiceWrapperAidl.java +++ b/services/core/java/com/android/server/health/HealthServiceWrapperAidl.java @@ -18,6 +18,7 @@ package com.android.server.health; import android.annotation.NonNull; import android.annotation.Nullable; +import android.hardware.health.BatteryHealthData; import android.hardware.health.HealthInfo; import android.hardware.health.IHealth; import android.os.BatteryManager; @@ -113,6 +114,7 @@ class HealthServiceWrapperAidl extends HealthServiceWrapper { private int getPropertyInternal(int id, BatteryProperty prop) throws RemoteException { IHealth service = mLastService.get(); if (service == null) throw new RemoteException("no health service"); + BatteryHealthData healthData; try { switch (id) { case BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER: @@ -133,6 +135,21 @@ class HealthServiceWrapperAidl extends HealthServiceWrapper { case BatteryManager.BATTERY_PROPERTY_ENERGY_COUNTER: prop.setLong(service.getEnergyCounterNwh()); break; + case BatteryManager.BATTERY_PROPERTY_MANUFACTURING_DATE: + healthData = service.getBatteryHealthData(); + prop.setLong(healthData.batteryManufacturingDateSeconds); + break; + case BatteryManager.BATTERY_PROPERTY_FIRST_USAGE_DATE: + healthData = service.getBatteryHealthData(); + prop.setLong(healthData.batteryFirstUsageSeconds); + break; + case BatteryManager.BATTERY_PROPERTY_CHARGING_POLICY: + prop.setLong(service.getChargingPolicy()); + break; + case BatteryManager.BATTERY_PROPERTY_STATE_OF_HEALTH: + healthData = service.getBatteryHealthData(); + prop.setLong(healthData.batteryStateOfHealth); + break; } } catch (UnsupportedOperationException e) { // Leave prop untouched. diff --git a/services/core/java/com/android/server/rollback/OWNERS b/services/core/java/com/android/server/rollback/OWNERS index 7feb85f929cd..daa02111f71f 100644 --- a/services/core/java/com/android/server/rollback/OWNERS +++ b/services/core/java/com/android/server/rollback/OWNERS @@ -1 +1,3 @@ -olilan@google.com +ancr@google.com +harshitmahajan@google.com +robertogil@google.com diff --git a/services/core/java/com/android/server/wm/OWNERS b/services/core/java/com/android/server/wm/OWNERS index 4f506a5dd945..07f3bc6a53f3 100644 --- a/services/core/java/com/android/server/wm/OWNERS +++ b/services/core/java/com/android/server/wm/OWNERS @@ -14,6 +14,7 @@ winsonc@google.com tigerhuang@google.com lihongyu@google.com mariiasand@google.com +rgl@google.com per-file BackgroundActivityStartController.java = set noparent per-file BackgroundActivityStartController.java = brufino@google.com, ogunwale@google.com, louischang@google.com, lus@google.com, rickywai@google.com diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 330c09876e1e..1b17c87e422d 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -1233,7 +1233,7 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { // Clear last paused activity if focused root task changed while sleeping, so that the // top activity of current focused task can be resumed. - if (mDisplayContent.isSleeping()) { + if (mDisplayContent.isSleeping() && currentFocusedTask != null) { currentFocusedTask.clearLastPausedActivity(); } diff --git a/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java b/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java index b921838e0bfc..4c0361d30d67 100644 --- a/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java +++ b/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java @@ -263,7 +263,7 @@ public class ShortcutManagerTestUtils { + instrumentation.getContext().getUserId() + " " + RoleManager.ROLE_HOME + " " + packageName + " 0"); waitUntil("Failed to get shortcut access", - () -> hasShortcutAccess(instrumentation, packageName), 20); + () -> hasShortcutAccess(instrumentation, packageName), 60); } public static void setDefaultLauncher(Instrumentation instrumentation, Context packageContext) { diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index ac148e7d05d7..8665858f4938 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -486,18 +486,14 @@ public class SubscriptionManager { public static final String TP_MESSAGE_REF = SimInfo.COLUMN_TP_MESSAGE_REF; /** - * TelephonyProvider column name data_enabled_override_rules. - * It's a list of rules for overriding data enabled settings. The syntax is - * For example, "mms=nonDefault" indicates enabling data for mms in non-default subscription. - * "default=nonDefault&inVoiceCall" indicates enabling data for internet in non-default - * subscription and while is in voice call. + * TelephonyProvider column name enabled_mobile_data_policies. + * A list of mobile data policies, each of which represented by an integer and joint by ",". * * Default value is empty string. - * * @hide */ - public static final String DATA_ENABLED_OVERRIDE_RULES = - SimInfo.COLUMN_DATA_ENABLED_OVERRIDE_RULES; + public static final String ENABLED_MOBILE_DATA_POLICIES = + SimInfo.COLUMN_ENABLED_MOBILE_DATA_POLICIES; /** @hide */ @Retention(RetentionPolicy.SOURCE) diff --git a/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java b/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java index 90ddb6ffb34a..d2a6bf288be4 100644 --- a/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java +++ b/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java @@ -31,6 +31,7 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -299,6 +300,8 @@ public final class BackgroundDexOptServiceIntegrationTests { // Test that background dexopt under low storage conditions downgrades unused packages. @Test + @Ignore("b/251438180: This test has been failing for a long time; temporarily disable it while" + + " we investigate this issue.") public void testBackgroundDexOptDowngradeSuccessful() throws IOException { // Should be more than DOWNGRADE_AFTER_DAYS. long deltaDays = DOWNGRADE_AFTER_DAYS + 1; |