merge in lmp-release history after reset to 567167ac6be36e732e98089d6e5d7d4f041f3323
diff --git a/camera/docs/CameraMetadataKeys.mako b/camera/docs/CameraMetadataKeys.mako
index 63811ce..f9286fa 100644
--- a/camera/docs/CameraMetadataKeys.mako
+++ b/camera/docs/CameraMetadataKeys.mako
@@ -24,21 +24,6 @@
      * modify the comment blocks at the start or end.
      *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~*/
 
-<%!
-  ##
-  ## Generate extra text blocks for the details field
-  def generate_extra_detail(entry):
-    def inner(text):
-      if entry.optional:
-        text += '\n\n<b>Optional</b> - This value may be {@code null} on some devices.\n'
-      if any(tag.name == 'FULL' for tag in entry.tags):
-        text += \
-          '\n<b>Full capability</b> - \n' + \
-          'Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the\n' + \
-          'android.info.supportedHardwareLevel key\n'
-      return text
-    return inner
-%>
 ##
 ## Generate a single key and docs
 <%def name="generate_key(entry)">\
@@ -52,7 +37,7 @@
     if entry.details:
         details = dedent(entry.details)
     # Unconditionally add extra information if necessary
-    extra_detail = generate_extra_detail(entry)("")
+    extra_detail = generate_extra_javadoc_detail(entry)("")
 
     concatenated_info = description + details + extra_detail
 %>\
diff --git a/camera/docs/docs.html b/camera/docs/docs.html
index 1addcdc..c9ae10f 100644
--- a/camera/docs/docs.html
+++ b/camera/docs/docs.html
@@ -60,6 +60,7 @@
     .entry_type_name_enum:after { color: #669900; font-weight: bold; content:" (enum)" }
     .entry_type_visibility { font-weight: bolder; padding-left:1em}
     .entry_type_synthetic { font-weight: bolder; color: #996600; }
+    .entry_type_hwlevel { font-weight: bolder; color: #000066; }
     .entry_type_deprecated { font-weight: bolder; color: #4D4D4D; }
     .entry_type_enum_name { font-family: monospace; font-weight: bolder; }
     .entry_type_enum_notes:before { content:" - " }
@@ -1092,6 +1093,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -1211,6 +1214,8 @@
               <span class="entry_type_visibility"> [public as colorSpaceTransform]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
                 <div class="entry_type_notes">3x3 rational matrix in row-major order</div>
 
@@ -1223,6 +1228,7 @@
             </td>
 
             <td class="entry_units">
+              Unitless scale factors
             </td>
 
             <td class="entry_range">
@@ -1269,6 +1275,8 @@
               <span class="entry_type_visibility"> [public as rggbChannelVector]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
                 <div class="entry_type_notes">A 1D array of floats for 4 color channel gains</div>
 
@@ -1281,6 +1289,7 @@
             </td>
 
             <td class="entry_units">
+              Unitless gain factors
             </td>
 
             <td class="entry_range">
@@ -1335,6 +1344,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -1364,6 +1375,7 @@
             </td>
 
             <td class="entry_range">
+              <p><a href="#static_android.colorCorrection.availableAberrationModes">android.<wbr/>color<wbr/>Correction.<wbr/>available<wbr/>Aberration<wbr/>Modes</a></p>
             </td>
 
             <td class="entry_tags">
@@ -1375,9 +1387,7 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>This must be set to a valid mode from
-<a href="#static_android.colorCorrection.availableAberrationModes">android.<wbr/>color<wbr/>Correction.<wbr/>available<wbr/>Aberration<wbr/>Modes</a>.<wbr/></p>
-<p>Chromatic (color) aberration is caused by the fact that different wavelengths of light
+              <p>Chromatic (color) aberration is caused by the fact that different wavelengths of light
 can not focus on the same point after exiting from the lens.<wbr/> This metadata defines
 the high level control of chromatic aberration correction algorithm,<wbr/> which aims to
 minimize the chromatic artifacts that may occur along the object boundaries in an
@@ -1387,6 +1397,7 @@
 use the highest-quality aberration correction algorithms,<wbr/> even if it slows down
 capture rate.<wbr/> FAST means the camera device will not slow down capture rate when
 applying aberration correction.<wbr/></p>
+<p>LEGACY devices will always be in FAST mode.<wbr/></p>
             </td>
           </tr>
 
@@ -1433,6 +1444,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -1552,6 +1565,8 @@
               <span class="entry_type_visibility"> [public as colorSpaceTransform]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
                 <div class="entry_type_notes">3x3 rational matrix in row-major order</div>
 
@@ -1564,6 +1579,7 @@
             </td>
 
             <td class="entry_units">
+              Unitless scale factors
             </td>
 
             <td class="entry_range">
@@ -1610,6 +1626,8 @@
               <span class="entry_type_visibility"> [public as rggbChannelVector]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
                 <div class="entry_type_notes">A 1D array of floats for 4 color channel gains</div>
 
@@ -1622,6 +1640,7 @@
             </td>
 
             <td class="entry_units">
+              Unitless gain factors
             </td>
 
             <td class="entry_range">
@@ -1676,6 +1695,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -1705,6 +1726,7 @@
             </td>
 
             <td class="entry_range">
+              <p><a href="#static_android.colorCorrection.availableAberrationModes">android.<wbr/>color<wbr/>Correction.<wbr/>available<wbr/>Aberration<wbr/>Modes</a></p>
             </td>
 
             <td class="entry_tags">
@@ -1716,9 +1738,7 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>This must be set to a valid mode from
-<a href="#static_android.colorCorrection.availableAberrationModes">android.<wbr/>color<wbr/>Correction.<wbr/>available<wbr/>Aberration<wbr/>Modes</a>.<wbr/></p>
-<p>Chromatic (color) aberration is caused by the fact that different wavelengths of light
+              <p>Chromatic (color) aberration is caused by the fact that different wavelengths of light
 can not focus on the same point after exiting from the lens.<wbr/> This metadata defines
 the high level control of chromatic aberration correction algorithm,<wbr/> which aims to
 minimize the chromatic artifacts that may occur along the object boundaries in an
@@ -1728,6 +1748,7 @@
 use the highest-quality aberration correction algorithms,<wbr/> even if it slows down
 capture rate.<wbr/> FAST means the camera device will not slow down capture rate when
 applying aberration correction.<wbr/></p>
+<p>LEGACY devices will always be in FAST mode.<wbr/></p>
             </td>
           </tr>
 
@@ -1778,6 +1799,8 @@
               <span class="entry_type_visibility"> [public as enumList]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
                 <div class="entry_type_notes">list of enums</div>
 
@@ -1785,15 +1808,15 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>The set of aberration correction modes supported by this camera device.<wbr/></p>
+              <p>List of aberration correction modes for <a href="#controls_android.colorCorrection.aberrationMode">android.<wbr/>color<wbr/>Correction.<wbr/>aberration<wbr/>Mode</a> that are
+supported by this camera device.<wbr/></p>
             </td>
 
             <td class="entry_units">
             </td>
 
             <td class="entry_range">
-              <p>The subset of aberration correction mode from those specified in
-<a href="#controls_android.colorCorrection.aberrationMode">android.<wbr/>color<wbr/>Correction.<wbr/>aberration<wbr/>Mode</a>.<wbr/></p>
+              <p>Any value listed in <a href="#controls_android.colorCorrection.aberrationMode">android.<wbr/>color<wbr/>Correction.<wbr/>aberration<wbr/>Mode</a></p>
             </td>
 
             <td class="entry_tags">
@@ -1808,11 +1831,12 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>This metadata lists the valid modes for <a href="#controls_android.colorCorrection.aberrationMode">android.<wbr/>color<wbr/>Correction.<wbr/>aberration<wbr/>Mode</a>.<wbr/>
-If no aberration correction modes are available for a device,<wbr/> this list will solely include
+              <p>This key lists the valid modes for <a href="#controls_android.colorCorrection.aberrationMode">android.<wbr/>color<wbr/>Correction.<wbr/>aberration<wbr/>Mode</a>.<wbr/>  If no
+aberration correction modes are available for a device,<wbr/> this list will solely include
 OFF mode.<wbr/></p>
-<p>For FULL capability device (<a href="#static_android.info.supportedHardwareLevel">android.<wbr/>info.<wbr/>supported<wbr/>Hardware<wbr/>Level</a> <code>==</code> FULL),<wbr/> OFF must be
-included.<wbr/></p>
+<p>For FULL capability device (<a href="#static_android.info.supportedHardwareLevel">android.<wbr/>info.<wbr/>supported<wbr/>Hardware<wbr/>Level</a> <code>==</code> FULL),<wbr/> OFF is
+always included.<wbr/></p>
+<p>LEGACY devices will always only support FAST mode.<wbr/></p>
             </td>
           </tr>
 
@@ -1864,6 +1888,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -1936,7 +1962,7 @@
 options for the antibanding mode.<wbr/> The
 <a href="#static_android.control.aeAvailableAntibandingModes">android.<wbr/>control.<wbr/>ae<wbr/>Available<wbr/>Antibanding<wbr/>Modes</a> key contains
 the available modes for a given camera device.<wbr/></p>
-<p>The default mode is AUTO,<wbr/> which must be supported by all
+<p>The default mode is AUTO,<wbr/> which is supported by all
 camera devices.<wbr/></p>
 <p>If manual exposure control is enabled (by setting
 <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> or <a href="#controls_android.control.mode">android.<wbr/>control.<wbr/>mode</a> to OFF),<wbr/>
@@ -1977,6 +2003,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -1988,7 +2016,7 @@
             </td>
 
             <td class="entry_units">
-              count of positive/<wbr/>negative EV steps
+              Compensation steps
             </td>
 
             <td class="entry_range">
@@ -2041,6 +2069,8 @@
               <span class="entry_type_visibility"> [public as boolean]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -2055,7 +2085,9 @@
 must not update the exposure and sensitivity parameters
 while the lock is active.<wbr/></p>
 <p><a href="#controls_android.control.aeExposureCompensation">android.<wbr/>control.<wbr/>ae<wbr/>Exposure<wbr/>Compensation</a> setting changes
-will still take effect while auto-exposure is locked.<wbr/></p></span>
+will still take effect while auto-exposure is locked.<wbr/></p>
+<p>Some rare LEGACY devices may not support
+this,<wbr/> in which case the value will always be overridden to OFF.<wbr/></p></span>
                   </li>
                 </ul>
 
@@ -2084,9 +2116,11 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Note that even when AE is locked,<wbr/> the flash may be
-fired if the <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> is ON_<wbr/>AUTO_<wbr/>FLASH /<wbr/> ON_<wbr/>ALWAYS_<wbr/>FLASH /<wbr/>
-ON_<wbr/>AUTO_<wbr/>FLASH_<wbr/>REDEYE.<wbr/></p>
+              <p>When set to <code>true</code> (ON),<wbr/> the AE algorithm is locked to its latest parameters,<wbr/>
+and will not change exposure settings until the lock is set to <code>false</code> (OFF).<wbr/></p>
+<p>Note that even when AE is locked,<wbr/> the flash may be fired if
+the <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> is ON_<wbr/>AUTO_<wbr/>FLASH /<wbr/>
+ON_<wbr/>ALWAYS_<wbr/>FLASH /<wbr/> ON_<wbr/>AUTO_<wbr/>FLASH_<wbr/>REDEYE.<wbr/></p>
 <p>When <a href="#controls_android.control.aeExposureCompensation">android.<wbr/>control.<wbr/>ae<wbr/>Exposure<wbr/>Compensation</a> is changed,<wbr/> even if the AE lock
 is ON,<wbr/> the camera device will still adjust its exposure value.<wbr/></p>
 <p>If AE precapture is triggered (see <a href="#controls_android.control.aePrecaptureTrigger">android.<wbr/>control.<wbr/>ae<wbr/>Precapture<wbr/>Trigger</a>)
@@ -2095,6 +2129,19 @@
 parameters.<wbr/> The flash may be fired if the <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a>
 is ON_<wbr/>AUTO_<wbr/>FLASH/<wbr/>ON_<wbr/>AUTO_<wbr/>FLASH_<wbr/>REDEYE and the scene is too dark.<wbr/> If the
 <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> is ON_<wbr/>ALWAYS_<wbr/>FLASH,<wbr/> the scene may become overexposed.<wbr/></p>
+<p>Since the camera device has a pipeline of in-flight requests,<wbr/> the settings that
+get locked do not necessarily correspond to the settings that were present in the
+latest capture result received from the camera device,<wbr/> since additional captures
+and AE updates may have occurred even before the result was sent out.<wbr/> If an
+application is switching between automatic and manual control and wishes to eliminate
+any flicker during the switch,<wbr/> the following procedure is recommended:</p>
+<ol>
+<li>Starting in auto-AE mode:</li>
+<li>Lock AE</li>
+<li>Wait for the first result to be output that has the AE locked</li>
+<li>Copy exposure settings from that result into a request,<wbr/> set the request to manual AE</li>
+<li>Submit the capture request,<wbr/> proceed to run manual AE as desired.<wbr/></li>
+</ol>
 <p>See <a href="#dynamic_android.control.aeState">android.<wbr/>control.<wbr/>ae<wbr/>State</a> for AE lock related state transition details.<wbr/></p>
             </td>
           </tr>
@@ -2115,6 +2162,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -2125,7 +2174,9 @@
 <a href="#controls_android.sensor.sensitivity">android.<wbr/>sensor.<wbr/>sensitivity</a> and
 <a href="#controls_android.sensor.frameDuration">android.<wbr/>sensor.<wbr/>frame<wbr/>Duration</a> are used by the camera
 device,<wbr/> along with android.<wbr/>flash.<wbr/>* fields,<wbr/> if there's
-a flash unit for this camera device.<wbr/></p></span>
+a flash unit for this camera device.<wbr/></p>
+<p>LEGACY devices do not support the OFF mode and will
+override attempts to use this value to ON.<wbr/></p></span>
                   </li>
                   <li>
                     <span class="entry_type_enum_name">ON</span>
@@ -2240,18 +2291,20 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>List of areas to use for
-metering.<wbr/></p>
+              <p>List of metering areas to use for auto-exposure adjustment.<wbr/></p>
             </td>
 
             <td class="entry_units">
+              Pixel coordinates within android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size
             </td>
 
             <td class="entry_range">
-              <p><code>area_<wbr/>count &lt;= <a href="#static_android.control.maxRegions">android.<wbr/>control.<wbr/>max<wbr/>Regions</a>[0]</code></p>
+              <p>Coordinates must be between <code>[(0,<wbr/>0),<wbr/> (width,<wbr/> height))</code> of
+<a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a></p>
             </td>
 
             <td class="entry_tags">
@@ -2266,23 +2319,30 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Optional.<wbr/> Not available if <a href="#static_android.control.maxRegionsAe">android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Ae</a> is 0.<wbr/>
+              <p>Not available if <a href="#static_android.control.maxRegionsAe">android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Ae</a> is 0.<wbr/>
 Otherwise will always be present.<wbr/></p>
+<p>The maximum number of regions supported by the device is determined by the value
+of <a href="#static_android.control.maxRegionsAe">android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Ae</a>.<wbr/></p>
 <p>The coordinate system is based on the active pixel array,<wbr/>
 with (0,<wbr/>0) being the top-left pixel in the active pixel array,<wbr/> and
 (<a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a>.<wbr/>width - 1,<wbr/>
 <a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a>.<wbr/>height - 1) being the
 bottom-right pixel in the active pixel array.<wbr/></p>
-<p>The weight must range from 0 to 1000,<wbr/> and represents a weight
+<p>The weight must be within <code>[0,<wbr/> 1000]</code>,<wbr/> and represents a weight
 for every pixel in the area.<wbr/> This means that a large metering area
 with the same weight as a smaller area will have more effect in
 the metering result.<wbr/> Metering areas can partially overlap and the
 camera device will add the weights in the overlap region.<wbr/></p>
-<p>If all regions have 0 weight,<wbr/> then no specific metering area
-needs to be used by the camera device.<wbr/> If the metering region is
-outside the used <a href="#controls_android.scaler.cropRegion">android.<wbr/>scaler.<wbr/>crop<wbr/>Region</a> returned in capture result metadata,<wbr/>
-the camera device will ignore the sections outside the region and output the
-used sections in the result metadata.<wbr/></p>
+<p>The weights are relative to weights of other exposure metering regions,<wbr/> so if only one
+region is used,<wbr/> all non-zero weights will have the same effect.<wbr/> A region with 0
+weight is ignored.<wbr/></p>
+<p>If all regions have 0 weight,<wbr/> then no specific metering area needs to be used by the
+camera device.<wbr/></p>
+<p>If the metering region is outside the used <a href="#controls_android.scaler.cropRegion">android.<wbr/>scaler.<wbr/>crop<wbr/>Region</a> returned in
+capture result metadata,<wbr/> the camera device will ignore the sections outside the crop
+region and output only the intersection rectangle as the metering region in the result
+metadata.<wbr/>  If the region is entirely outside the crop region,<wbr/> it will be ignored and
+not reported in the result metadata.<wbr/></p>
             </td>
           </tr>
 
@@ -2319,21 +2379,25 @@
               <span class="entry_type_visibility"> [public as rangeInt]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Range over which fps can be adjusted to
-maintain exposure.<wbr/></p>
+              <p>Range over which the auto-exposure routine can
+adjust the capture frame rate to maintain good
+exposure.<wbr/></p>
             </td>
 
             <td class="entry_units">
+              Frames per second (FPS)
             </td>
 
             <td class="entry_range">
-              <p><a href="#static_android.control.aeAvailableTargetFpsRanges">android.<wbr/>control.<wbr/>ae<wbr/>Available<wbr/>Target<wbr/>Fps<wbr/>Ranges</a></p>
+              <p>Any of the entries in <a href="#static_android.control.aeAvailableTargetFpsRanges">android.<wbr/>control.<wbr/>ae<wbr/>Available<wbr/>Target<wbr/>Fps<wbr/>Ranges</a></p>
             </td>
 
             <td class="entry_tags">
@@ -2349,7 +2413,8 @@
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
               <p>Only constrains auto-exposure (AE) algorithm,<wbr/> not
-manual control of <a href="#controls_android.sensor.exposureTime">android.<wbr/>sensor.<wbr/>exposure<wbr/>Time</a></p>
+manual control of <a href="#controls_android.sensor.exposureTime">android.<wbr/>sensor.<wbr/>exposure<wbr/>Time</a> and
+<a href="#controls_android.sensor.frameDuration">android.<wbr/>sensor.<wbr/>frame<wbr/>Duration</a>.<wbr/></p>
             </td>
           </tr>
 
@@ -2369,6 +2434,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[limited] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -2426,6 +2493,10 @@
 depends on the current AE mode and state; see
 <a href="#dynamic_android.control.aeState">android.<wbr/>control.<wbr/>ae<wbr/>State</a> for AE precapture state transition
 details.<wbr/></p>
+<p>On LEGACY-level devices,<wbr/> the precapture trigger is not supported;
+capturing a high-resolution JPEG image will automatically trigger a
+precapture sequence before the high-resolution capture,<wbr/> including
+potentially firing a pre-capture flash.<wbr/></p>
             </td>
           </tr>
 
@@ -2445,6 +2516,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -2616,18 +2689,20 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>List of areas to use for focus
-estimation.<wbr/></p>
+              <p>List of metering areas to use for auto-focus.<wbr/></p>
             </td>
 
             <td class="entry_units">
+              Pixel coordinates within android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size
             </td>
 
             <td class="entry_range">
-              <p><code>area_<wbr/>count &lt;= <a href="#static_android.control.maxRegions">android.<wbr/>control.<wbr/>max<wbr/>Regions</a>[2]</code></p>
+              <p>Coordinates must be between <code>[(0,<wbr/>0),<wbr/> (width,<wbr/> height))</code> of
+<a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a></p>
             </td>
 
             <td class="entry_tags">
@@ -2642,23 +2717,30 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Optional.<wbr/> Not available if <a href="#static_android.control.maxRegionsAf">android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Af</a> is 0.<wbr/>
+              <p>Not available if <a href="#static_android.control.maxRegionsAf">android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Af</a> is 0.<wbr/>
 Otherwise will always be present.<wbr/></p>
+<p>The maximum number of focus areas supported by the device is determined by the value
+of <a href="#static_android.control.maxRegionsAf">android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Af</a>.<wbr/></p>
 <p>The coordinate system is based on the active pixel array,<wbr/>
 with (0,<wbr/>0) being the top-left pixel in the active pixel array,<wbr/> and
 (<a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a>.<wbr/>width - 1,<wbr/>
 <a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a>.<wbr/>height - 1) being the
 bottom-right pixel in the active pixel array.<wbr/></p>
-<p>The weight must range from 0 to 1000,<wbr/> and represents a weight
+<p>The weight must be within <code>[0,<wbr/> 1000]</code>,<wbr/> and represents a weight
 for every pixel in the area.<wbr/> This means that a large metering area
 with the same weight as a smaller area will have more effect in
 the metering result.<wbr/> Metering areas can partially overlap and the
 camera device will add the weights in the overlap region.<wbr/></p>
-<p>If all regions have 0 weight,<wbr/> then no specific metering area
-needs to be used by the camera device.<wbr/> If the metering region is
-outside the used <a href="#controls_android.scaler.cropRegion">android.<wbr/>scaler.<wbr/>crop<wbr/>Region</a> returned in capture result metadata,<wbr/>
-the camera device will ignore the sections outside the region and output the
-used sections in the result metadata.<wbr/></p>
+<p>The weights are relative to weights of other metering regions,<wbr/> so if only one region
+is used,<wbr/> all non-zero weights will have the same effect.<wbr/> A region with 0 weight is
+ignored.<wbr/></p>
+<p>If all regions have 0 weight,<wbr/> then no specific metering area needs to be used by the
+camera device.<wbr/></p>
+<p>If the metering region is outside the used <a href="#controls_android.scaler.cropRegion">android.<wbr/>scaler.<wbr/>crop<wbr/>Region</a> returned in
+capture result metadata,<wbr/> the camera device will ignore the sections outside the crop
+region and output only the intersection rectangle as the metering region in the result
+metadata.<wbr/> If the region is entirely outside the crop region,<wbr/> it will be ignored and
+not reported in the result metadata.<wbr/></p>
             </td>
           </tr>
 
@@ -2691,6 +2773,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -2763,6 +2847,8 @@
               <span class="entry_type_visibility"> [public as boolean]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -2805,9 +2891,25 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Note that AWB lock is only meaningful when
+              <p>When set to <code>true</code> (ON),<wbr/> the AWB algorithm is locked to its latest parameters,<wbr/>
+and will not change color balance settings until the lock is set to <code>false</code> (OFF).<wbr/></p>
+<p>Since the camera device has a pipeline of in-flight requests,<wbr/> the settings that
+get locked do not necessarily correspond to the settings that were present in the
+latest capture result received from the camera device,<wbr/> since additional captures
+and AWB updates may have occurred even before the result was sent out.<wbr/> If an
+application is switching between automatic and manual control and wishes to eliminate
+any flicker during the switch,<wbr/> the following procedure is recommended:</p>
+<ol>
+<li>Starting in auto-AWB mode:</li>
+<li>Lock AWB</li>
+<li>Wait for the first result to be output that has the AWB locked</li>
+<li>Copy AWB settings from that result into a request,<wbr/> set the request to manual AWB</li>
+<li>Submit the capture request,<wbr/> proceed to run manual AWB as desired.<wbr/></li>
+</ol>
+<p>Note that AWB lock is only meaningful when
 <a href="#controls_android.control.awbMode">android.<wbr/>control.<wbr/>awb<wbr/>Mode</a> is in the AUTO mode; in other modes,<wbr/>
 AWB is already fixed to a specific setting.<wbr/></p>
+<p>Some LEGACY devices may not support ON; the value is then overridden to OFF.<wbr/></p>
             </td>
           </tr>
 
@@ -2827,6 +2929,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -3007,18 +3111,21 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>List of areas to use for illuminant
+              <p>List of metering areas to use for auto-white-balance illuminant
 estimation.<wbr/></p>
             </td>
 
             <td class="entry_units">
+              Pixel coordinates within android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size
             </td>
 
             <td class="entry_range">
-              <p><code>area_<wbr/>count &lt;= <a href="#static_android.control.maxRegions">android.<wbr/>control.<wbr/>max<wbr/>Regions</a>[1]</code></p>
+              <p>Coordinates must be between <code>[(0,<wbr/>0),<wbr/> (width,<wbr/> height))</code> of
+<a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a></p>
             </td>
 
             <td class="entry_tags">
@@ -3033,8 +3140,10 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Optional.<wbr/> Not available if <a href="#static_android.control.maxRegionsAwb">android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Awb</a> is 0.<wbr/>
+              <p>Not available if <a href="#static_android.control.maxRegionsAwb">android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Awb</a> is 0.<wbr/>
 Otherwise will always be present.<wbr/></p>
+<p>The maximum number of regions supported by the device is determined by the value
+of <a href="#static_android.control.maxRegionsAwb">android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Awb</a>.<wbr/></p>
 <p>The coordinate system is based on the active pixel array,<wbr/>
 with (0,<wbr/>0) being the top-left pixel in the active pixel array,<wbr/> and
 (<a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a>.<wbr/>width - 1,<wbr/>
@@ -3045,11 +3154,16 @@
 with the same weight as a smaller area will have more effect in
 the metering result.<wbr/> Metering areas can partially overlap and the
 camera device will add the weights in the overlap region.<wbr/></p>
-<p>If all regions have 0 weight,<wbr/> then no specific metering area
-needs to be used by the camera device.<wbr/> If the metering region is
-outside the used <a href="#controls_android.scaler.cropRegion">android.<wbr/>scaler.<wbr/>crop<wbr/>Region</a> returned in capture result metadata,<wbr/>
-the camera device will ignore the sections outside the region and output the
-used sections in the result metadata.<wbr/></p>
+<p>The weights are relative to weights of other white balance metering regions,<wbr/> so if
+only one region is used,<wbr/> all non-zero weights will have the same effect.<wbr/> A region with
+0 weight is ignored.<wbr/></p>
+<p>If all regions have 0 weight,<wbr/> then no specific metering area needs to be used by the
+camera device.<wbr/></p>
+<p>If the metering region is outside the used <a href="#controls_android.scaler.cropRegion">android.<wbr/>scaler.<wbr/>crop<wbr/>Region</a> returned in
+capture result metadata,<wbr/> the camera device will ignore the sections outside the crop
+region and output only the intersection rectangle as the metering region in the result
+metadata.<wbr/>  If the region is entirely outside the crop region,<wbr/> it will be ignored and
+not reported in the result metadata.<wbr/></p>
             </td>
           </tr>
 
@@ -3082,6 +3196,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -3145,7 +3261,6 @@
             </td>
 
             <td class="entry_range">
-              <p>All must be supported except for ZERO_<wbr/>SHUTTER_<wbr/>LAG and MANUAL.<wbr/></p>
             </td>
 
             <td class="entry_tags">
@@ -3164,7 +3279,7 @@
 <code><a href="#controls_android.control.mode">android.<wbr/>control.<wbr/>mode</a> != OFF</code> and any 3A routine is active.<wbr/></p>
 <p>ZERO_<wbr/>SHUTTER_<wbr/>LAG will be supported if <a href="#static_android.request.availableCapabilities">android.<wbr/>request.<wbr/>available<wbr/>Capabilities</a>
 contains ZSL.<wbr/> MANUAL will be supported if <a href="#static_android.request.availableCapabilities">android.<wbr/>request.<wbr/>available<wbr/>Capabilities</a>
-contains MANUAL_<wbr/>SENSOR.<wbr/></p>
+contains MANUAL_<wbr/>SENSOR.<wbr/> Other intent values are always supported.<wbr/></p>
             </td>
           </tr>
 
@@ -3184,6 +3299,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -3274,8 +3391,6 @@
 implementor of the camera device,<wbr/> and should not be
 depended on to be consistent (or present) across all
 devices.<wbr/></p>
-<p>A color effect will only be applied if
-<a href="#controls_android.control.mode">android.<wbr/>control.<wbr/>mode</a> != OFF.<wbr/></p>
             </td>
           </tr>
 
@@ -3295,6 +3410,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -3347,7 +3464,7 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Overall mode of 3A control
+              <p>Overall mode of 3A (auto-exposure,<wbr/> auto-white-balance,<wbr/> auto-focus) control
 routines.<wbr/></p>
             </td>
 
@@ -3355,7 +3472,6 @@
             </td>
 
             <td class="entry_range">
-              <p>all must be supported</p>
             </td>
 
             <td class="entry_tags">
@@ -3370,7 +3486,7 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>High-level 3A control.<wbr/> When set to OFF,<wbr/> all 3A control
+              <p>This is a top-level 3A control switch.<wbr/> When set to OFF,<wbr/> all 3A control
 by the camera device is disabled.<wbr/> The application must set the fields for
 capture parameters itself.<wbr/></p>
 <p>When set to AUTO,<wbr/> the individual algorithm controls in
@@ -3385,6 +3501,10 @@
 update,<wbr/> as if this frame is never captured.<wbr/> This mode can be used in the scenario
 where the application doesn't want a 3A manual control capture to affect
 the subsequent auto 3A capture results.<wbr/></p>
+<p>LEGACY mode devices will only support AUTO and USE_<wbr/>SCENE_<wbr/>MODE modes.<wbr/>
+LIMITED mode devices will only support OFF and OFF_<wbr/>KEEP_<wbr/>STATE if they
+support the MANUAL_<wbr/>SENSOR and MANUAL_<wbr/>POST_<wbr/>PROCSESING capabilities.<wbr/>
+FULL mode devices will always support OFF and OFF_<wbr/>KEEP_<wbr/>STATE.<wbr/></p>
             </td>
           </tr>
 
@@ -3404,6 +3524,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -3574,15 +3696,16 @@
                     <span class="entry_type_enum_name">HDR</span>
                     <span class="entry_type_enum_optional">[optional]</span>
                     <span class="entry_type_enum_optional">[hidden]</span>
-                    <span class="entry_type_enum_notes"><p>Turn on custom high dynamic range (HDR) mode.<wbr/></p></span>
+                    <span class="entry_type_enum_notes"><p>Turn on custom high dynamic range (HDR) mode.<wbr/></p>
+<p>This is intended for LEGACY mode devices only;
+HAL3+ camera devices should not implement this mode.<wbr/></p></span>
                   </li>
                 </ul>
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>A camera mode optimized for conditions typical in a particular
-capture setting.<wbr/></p>
+              <p>Control for which scene mode is currently active.<wbr/></p>
             </td>
 
             <td class="entry_units">
@@ -3604,12 +3727,12 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>This is the mode that that is active when
+              <p>Scene modes are custom camera modes optimized for a certain set of conditions and
+capture settings.<wbr/></p>
+<p>This is the mode that that is active when
 <code><a href="#controls_android.control.mode">android.<wbr/>control.<wbr/>mode</a> == USE_<wbr/>SCENE_<wbr/>MODE</code>.<wbr/> Aside from FACE_<wbr/>PRIORITY,<wbr/>
 these modes will disable <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a>,<wbr/>
-<a href="#controls_android.control.awbMode">android.<wbr/>control.<wbr/>awb<wbr/>Mode</a>,<wbr/> and <a href="#controls_android.control.afMode">android.<wbr/>control.<wbr/>af<wbr/>Mode</a> while in use.<wbr/>
-The scene modes available for a given camera device are listed in
-<a href="#static_android.control.availableSceneModes">android.<wbr/>control.<wbr/>available<wbr/>Scene<wbr/>Modes</a>.<wbr/></p>
+<a href="#controls_android.control.awbMode">android.<wbr/>control.<wbr/>awb<wbr/>Mode</a>,<wbr/> and <a href="#controls_android.control.afMode">android.<wbr/>control.<wbr/>af<wbr/>Mode</a> while in use.<wbr/></p>
 <p>The interpretation and implementation of these scene modes is left
 to the implementor of the camera device.<wbr/> Their behavior will not be
 consistent across all devices,<wbr/> and any given device may only implement
@@ -3650,6 +3773,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -3688,18 +3813,20 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Video stabilization automatically translates and scales images from the camera
-in order to stabilize motion between consecutive frames.<wbr/></p>
+              <p>Video stabilization automatically translates and scales images from
+the camera in order to stabilize motion between consecutive frames.<wbr/></p>
 <p>If enabled,<wbr/> video stabilization can modify the
 <a href="#controls_android.scaler.cropRegion">android.<wbr/>scaler.<wbr/>crop<wbr/>Region</a> to keep the video stream stabilized.<wbr/></p>
-<p>Switching between different video stabilization modes may take several frames
-to initialize,<wbr/> the camera device will report the current mode in capture result
-metadata.<wbr/> For example,<wbr/> When "ON" mode is requested,<wbr/> the video stabilization modes
-in the first several capture results may still be "OFF",<wbr/> and it will become "ON"
-when the initialization is done.<wbr/></p>
-<p>If a camera device supports both this mode and OIS (<a href="#controls_android.lens.opticalStabilizationMode">android.<wbr/>lens.<wbr/>optical<wbr/>Stabilization<wbr/>Mode</a>),<wbr/>
-turning both modes on may produce undesirable interaction,<wbr/> so it is recommended not to
-enable both at the same time.<wbr/></p>
+<p>Switching between different video stabilization modes may take several
+frames to initialize,<wbr/> the camera device will report the current mode
+in capture result metadata.<wbr/> For example,<wbr/> When "ON" mode is requested,<wbr/>
+the video stabilization modes in the first several capture results may
+still be "OFF",<wbr/> and it will become "ON" when the initialization is
+done.<wbr/></p>
+<p>If a camera device supports both this mode and OIS
+(<a href="#controls_android.lens.opticalStabilizationMode">android.<wbr/>lens.<wbr/>optical<wbr/>Stabilization<wbr/>Mode</a>),<wbr/> turning both modes on may
+produce undesirable interaction,<wbr/> so it is recommended not to enable
+both at the same time.<wbr/></p>
             </td>
           </tr>
 
@@ -3750,6 +3877,8 @@
               <span class="entry_type_visibility"> [public as enumList]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
                 <div class="entry_type_notes">list of enums</div>
 
@@ -3757,7 +3886,7 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>The set of auto-exposure antibanding modes that are
+              <p>List of auto-exposure antibanding modes for <a href="#controls_android.control.aeAntibandingMode">android.<wbr/>control.<wbr/>ae<wbr/>Antibanding<wbr/>Mode</a> that are
 supported by this camera device.<wbr/></p>
             </td>
 
@@ -3765,6 +3894,7 @@
             </td>
 
             <td class="entry_range">
+              <p>Any value listed in <a href="#controls_android.control.aeAntibandingMode">android.<wbr/>control.<wbr/>ae<wbr/>Antibanding<wbr/>Mode</a></p>
             </td>
 
             <td class="entry_tags">
@@ -3782,7 +3912,9 @@
               <p>Not all of the auto-exposure anti-banding modes may be
 supported by a given camera device.<wbr/> This field lists the
 valid anti-banding modes that the application may request
-for this camera device; they must include AUTO.<wbr/></p>
+for this camera device with the
+<a href="#controls_android.control.aeAntibandingMode">android.<wbr/>control.<wbr/>ae<wbr/>Antibanding<wbr/>Mode</a> control.<wbr/> This list
+always includes AUTO.<wbr/></p>
             </td>
           </tr>
 
@@ -3806,6 +3938,8 @@
               <span class="entry_type_visibility"> [public as enumList]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
                 <div class="entry_type_notes">list of enums</div>
 
@@ -3813,14 +3947,15 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>The set of auto-exposure modes that are supported by this
-camera device.<wbr/></p>
+              <p>List of auto-exposure modes for <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> that are supported by this camera
+device.<wbr/></p>
             </td>
 
             <td class="entry_units">
             </td>
 
             <td class="entry_range">
+              <p>Any value listed in <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a></p>
             </td>
 
             <td class="entry_tags">
@@ -3839,12 +3974,14 @@
 given camera device,<wbr/> especially if no flash unit is
 available.<wbr/> This entry lists the valid modes for
 <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> for this camera device.<wbr/></p>
-<p>All camera devices support ON,<wbr/> and all camera devices with
-flash units support ON_<wbr/>AUTO_<wbr/>FLASH and
-ON_<wbr/>ALWAYS_<wbr/>FLASH.<wbr/></p>
+<p>All camera devices support ON,<wbr/> and all camera devices with flash
+units support ON_<wbr/>AUTO_<wbr/>FLASH and ON_<wbr/>ALWAYS_<wbr/>FLASH.<wbr/></p>
 <p>FULL mode camera devices always support OFF mode,<wbr/>
 which enables application control of camera exposure time,<wbr/>
 sensitivity,<wbr/> and frame duration.<wbr/></p>
+<p>LEGACY mode camera devices never support OFF mode.<wbr/>
+LIMITED mode devices support OFF if they support the MANUAL_<wbr/>SENSOR
+capability.<wbr/></p>
             </td>
           </tr>
 
@@ -3855,7 +3992,7 @@
                 
           <tr class="entry" id="static_android.control.aeAvailableTargetFpsRanges">
             <td class="entry_name
-             " rowspan="1">
+             " rowspan="3">
               android.<wbr/>control.<wbr/>ae<wbr/>Available<wbr/>Target<wbr/>Fps<wbr/>Ranges
             </td>
             <td class="entry_type">
@@ -3868,6 +4005,8 @@
               <span class="entry_type_visibility"> [public as rangeInt]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
                 <div class="entry_type_notes">list of pairs of frame rates</div>
 
@@ -3875,11 +4014,12 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>List of frame rate ranges supported by the
-auto-exposure (AE) algorithm/<wbr/>hardware</p>
+              <p>List of frame rate ranges for <a href="#controls_android.control.aeTargetFpsRange">android.<wbr/>control.<wbr/>ae<wbr/>Target<wbr/>Fps<wbr/>Range</a> supported by
+this camera device.<wbr/></p>
             </td>
 
             <td class="entry_units">
+              Frames per second (FPS)
             </td>
 
             <td class="entry_range">
@@ -3892,6 +4032,15 @@
             </td>
 
           </tr>
+          <tr class="entries_header">
+            <th class="th_details" colspan="5">Details</th>
+          </tr>
+          <tr class="entry_cont">
+            <td class="entry_details" colspan="5">
+              <p>For devices at the LIMITED level or above,<wbr/> this list will include at least (30,<wbr/> 30) for
+constant-framerate recording.<wbr/></p>
+            </td>
+          </tr>
 
 
           <tr class="entry_spacer"><td class="entry_spacer" colspan="6"></td></tr>
@@ -3913,23 +4062,25 @@
               <span class="entry_type_visibility"> [public as rangeInt]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Maximum and minimum exposure compensation
-setting,<wbr/> in counts of
-<a href="#static_android.control.aeCompensationStep">android.<wbr/>control.<wbr/>ae<wbr/>Compensation<wbr/>Step</a>.<wbr/></p>
+              <p>Maximum and minimum exposure compensation values for
+<a href="#controls_android.control.aeExposureCompensation">android.<wbr/>control.<wbr/>ae<wbr/>Exposure<wbr/>Compensation</a>,<wbr/> in counts of <a href="#static_android.control.aeCompensationStep">android.<wbr/>control.<wbr/>ae<wbr/>Compensation<wbr/>Step</a>,<wbr/>
+that are supported by this camera device.<wbr/></p>
             </td>
 
             <td class="entry_units">
             </td>
 
             <td class="entry_range">
-              <p>At least (-2,<wbr/>2)/<wbr/>(exp compensation step
-size)</p>
+              <p><code>Min.<wbr/>exposure compensation * <a href="#static_android.control.aeCompensationStep">android.<wbr/>control.<wbr/>ae<wbr/>Compensation<wbr/>Step</a> &lt;= -2 EV</code></p>
+<p><code>Max.<wbr/>exposure compensation * <a href="#static_android.control.aeCompensationStep">android.<wbr/>control.<wbr/>ae<wbr/>Compensation<wbr/>Step</a> &gt;= 2 EV</code></p>
             </td>
 
             <td class="entry_tags">
@@ -3947,7 +4098,7 @@
                 
           <tr class="entry" id="static_android.control.aeCompensationStep">
             <td class="entry_name
-             " rowspan="1">
+             " rowspan="5">
               android.<wbr/>control.<wbr/>ae<wbr/>Compensation<wbr/>Step
             </td>
             <td class="entry_type">
@@ -3956,21 +4107,23 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Smallest step by which exposure compensation
-can be changed</p>
+              <p>Smallest step by which the exposure compensation
+can be changed.<wbr/></p>
             </td>
 
             <td class="entry_units">
+              Exposure Value (EV)
             </td>
 
             <td class="entry_range">
-              <p>&lt;= 1/<wbr/>2</p>
             </td>
 
             <td class="entry_tags">
@@ -3980,7 +4133,27 @@
             </td>
 
           </tr>
+          <tr class="entries_header">
+            <th class="th_details" colspan="5">Details</th>
+          </tr>
+          <tr class="entry_cont">
+            <td class="entry_details" colspan="5">
+              <p>This is the unit for <a href="#controls_android.control.aeExposureCompensation">android.<wbr/>control.<wbr/>ae<wbr/>Exposure<wbr/>Compensation</a>.<wbr/> For example,<wbr/> if this key has
+a value of <code>1/<wbr/>2</code>,<wbr/> then a setting of <code>-2</code> for <a href="#controls_android.control.aeExposureCompensation">android.<wbr/>control.<wbr/>ae<wbr/>Exposure<wbr/>Compensation</a> means
+that the target EV offset for the auto-exposure routine is -1 EV.<wbr/></p>
+<p>One unit of EV compensation changes the brightness of the captured image by a factor
+of two.<wbr/> +1 EV doubles the image brightness,<wbr/> while -1 EV halves the image brightness.<wbr/></p>
+            </td>
+          </tr>
 
+          <tr class="entries_header">
+            <th class="th_details" colspan="5">HAL Implementation Details</th>
+          </tr>
+          <tr class="entry_cont">
+            <td class="entry_details" colspan="5">
+              <p>This must be less than or equal to 1/<wbr/>2.<wbr/></p>
+            </td>
+          </tr>
 
           <tr class="entry_spacer"><td class="entry_spacer" colspan="6"></td></tr>
            <!-- end of entry -->
@@ -4001,6 +4174,8 @@
               <span class="entry_type_visibility"> [public as enumList]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
                 <div class="entry_type_notes">List of enums</div>
 
@@ -4008,14 +4183,15 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>List of auto-focus (AF) modes that can be
-selected with <a href="#controls_android.control.afMode">android.<wbr/>control.<wbr/>af<wbr/>Mode</a>.<wbr/></p>
+              <p>List of auto-focus (AF) modes for <a href="#controls_android.control.afMode">android.<wbr/>control.<wbr/>af<wbr/>Mode</a> that are
+supported by this camera device.<wbr/></p>
             </td>
 
             <td class="entry_units">
             </td>
 
             <td class="entry_range">
+              <p>Any value listed in <a href="#controls_android.control.afMode">android.<wbr/>control.<wbr/>af<wbr/>Mode</a></p>
             </td>
 
             <td class="entry_tags">
@@ -4036,6 +4212,9 @@
 <p>All LIMITED and FULL mode camera devices will support OFF mode,<wbr/> and all
 camera devices with adjustable focuser units
 (<code><a href="#static_android.lens.info.minimumFocusDistance">android.<wbr/>lens.<wbr/>info.<wbr/>minimum<wbr/>Focus<wbr/>Distance</a> &gt; 0</code>) will support AUTO mode.<wbr/></p>
+<p>LEGACY devices will support OFF mode only if they support
+focusing to infinity (by also setting <a href="#controls_android.lens.focusDistance">android.<wbr/>lens.<wbr/>focus<wbr/>Distance</a> to
+<code>0.<wbr/>0f</code>).<wbr/></p>
             </td>
           </tr>
 
@@ -4059,6 +4238,8 @@
               <span class="entry_type_visibility"> [public as enumList]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
                 <div class="entry_type_notes">List of enums (android.<wbr/>control.<wbr/>effect<wbr/>Mode).<wbr/></div>
 
@@ -4066,17 +4247,15 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>List containing the subset of color effects
-specified in <a href="#controls_android.control.effectMode">android.<wbr/>control.<wbr/>effect<wbr/>Mode</a> that is supported by
-this device.<wbr/></p>
+              <p>List of color effects for <a href="#controls_android.control.effectMode">android.<wbr/>control.<wbr/>effect<wbr/>Mode</a> that are supported by this camera
+device.<wbr/></p>
             </td>
 
             <td class="entry_units">
             </td>
 
             <td class="entry_range">
-              <p>Any subset of enums from those specified in
-<a href="#controls_android.control.effectMode">android.<wbr/>control.<wbr/>effect<wbr/>Mode</a>.<wbr/>  OFF must be included in any subset.<wbr/></p>
+              <p>Any value listed in <a href="#controls_android.control.effectMode">android.<wbr/>control.<wbr/>effect<wbr/>Mode</a></p>
             </td>
 
             <td class="entry_tags">
@@ -4092,13 +4271,14 @@
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
               <p>This list contains the color effect modes that can be applied to
-images produced by the camera device.<wbr/> Only modes that have
-been fully implemented for the current device may be included here.<wbr/>
+images produced by the camera device.<wbr/>
 Implementations are not expected to be consistent across all devices.<wbr/>
-If no color effect modes are available for a device,<wbr/> this should
-simply be set to OFF.<wbr/></p>
+If no color effect modes are available for a device,<wbr/> this will only list
+OFF.<wbr/></p>
 <p>A color effect will only be applied if
-<a href="#controls_android.control.mode">android.<wbr/>control.<wbr/>mode</a> != OFF.<wbr/></p>
+<a href="#controls_android.control.mode">android.<wbr/>control.<wbr/>mode</a> != OFF.<wbr/>  OFF is always included in this list.<wbr/></p>
+<p>This control has no effect on the operation of other control routines such
+as auto-exposure,<wbr/> white balance,<wbr/> or focus.<wbr/></p>
             </td>
           </tr>
 
@@ -4122,6 +4302,8 @@
               <span class="entry_type_visibility"> [public as enumList]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
                 <div class="entry_type_notes">List of enums (android.<wbr/>control.<wbr/>scene<wbr/>Mode).<wbr/></div>
 
@@ -4129,18 +4311,15 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>List containing a subset of scene modes
-specified in <a href="#controls_android.control.sceneMode">android.<wbr/>control.<wbr/>scene<wbr/>Mode</a>.<wbr/></p>
+              <p>List of scene modes for <a href="#controls_android.control.sceneMode">android.<wbr/>control.<wbr/>scene<wbr/>Mode</a> that are supported by this camera
+device.<wbr/></p>
             </td>
 
             <td class="entry_units">
             </td>
 
             <td class="entry_range">
-              <p>Any subset of the enums specified in <a href="#controls_android.control.sceneMode">android.<wbr/>control.<wbr/>scene<wbr/>Mode</a>
-not including DISABLED,<wbr/> or solely DISABLED if no
-scene modes are available.<wbr/> FACE_<wbr/>PRIORITY must be included
-if face detection is supported (i.<wbr/>e.<wbr/><code><a href="#static_android.statistics.info.maxFaceCount">android.<wbr/>statistics.<wbr/>info.<wbr/>max<wbr/>Face<wbr/>Count</a> &gt; 0</code>).<wbr/></p>
+              <p>Any value listed in <a href="#controls_android.control.sceneMode">android.<wbr/>control.<wbr/>scene<wbr/>Mode</a></p>
             </td>
 
             <td class="entry_tags">
@@ -4158,8 +4337,12 @@
               <p>This list contains scene modes that can be set for the camera device.<wbr/>
 Only scene modes that have been fully implemented for the
 camera device may be included here.<wbr/> Implementations are not expected
-to be consistent across all devices.<wbr/> If no scene modes are supported
-by the camera device,<wbr/> this will be set to <code>[DISABLED]</code>.<wbr/></p>
+to be consistent across all devices.<wbr/></p>
+<p>If no scene modes are supported by the camera device,<wbr/> this
+will be set to DISABLED.<wbr/> Otherwise DISABLED will not be listed.<wbr/></p>
+<p>FACE_<wbr/>PRIORITY is always listed if face detection is
+supported (i.<wbr/>e.<wbr/><code><a href="#static_android.statistics.info.maxFaceCount">android.<wbr/>statistics.<wbr/>info.<wbr/>max<wbr/>Face<wbr/>Count</a> &gt;
+0</code>).<wbr/></p>
             </td>
           </tr>
 
@@ -4170,7 +4353,7 @@
                 
           <tr class="entry" id="static_android.control.availableVideoStabilizationModes">
             <td class="entry_name
-             " rowspan="1">
+             " rowspan="3">
               android.<wbr/>control.<wbr/>available<wbr/>Video<wbr/>Stabilization<wbr/>Modes
             </td>
             <td class="entry_type">
@@ -4183,6 +4366,8 @@
               <span class="entry_type_visibility"> [public as enumList]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
                 <div class="entry_type_notes">List of enums.<wbr/></div>
 
@@ -4190,15 +4375,15 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>List of video stabilization modes that can
-be supported</p>
+              <p>List of video stabilization modes for <a href="#controls_android.control.videoStabilizationMode">android.<wbr/>control.<wbr/>video<wbr/>Stabilization<wbr/>Mode</a>
+that are supported by this camera device.<wbr/></p>
             </td>
 
             <td class="entry_units">
             </td>
 
             <td class="entry_range">
-              <p>OFF must be included</p>
+              <p>Any value listed in <a href="#controls_android.control.videoStabilizationMode">android.<wbr/>control.<wbr/>video<wbr/>Stabilization<wbr/>Mode</a></p>
             </td>
 
             <td class="entry_tags">
@@ -4208,6 +4393,14 @@
             </td>
 
           </tr>
+          <tr class="entries_header">
+            <th class="th_details" colspan="5">Details</th>
+          </tr>
+          <tr class="entry_cont">
+            <td class="entry_details" colspan="5">
+              <p>OFF will always be listed.<wbr/></p>
+            </td>
+          </tr>
 
 
           <tr class="entry_spacer"><td class="entry_spacer" colspan="6"></td></tr>
@@ -4229,6 +4422,8 @@
               <span class="entry_type_visibility"> [public as enumList]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
                 <div class="entry_type_notes">List of enums</div>
 
@@ -4236,14 +4431,15 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>The set of auto-white-balance modes (<a href="#controls_android.control.awbMode">android.<wbr/>control.<wbr/>awb<wbr/>Mode</a>)
-that are supported by this camera device.<wbr/></p>
+              <p>List of auto-white-balance modes for <a href="#controls_android.control.awbMode">android.<wbr/>control.<wbr/>awb<wbr/>Mode</a> that are supported by this
+camera device.<wbr/></p>
             </td>
 
             <td class="entry_units">
             </td>
 
             <td class="entry_range">
+              <p>Any value listed in <a href="#controls_android.control.awbMode">android.<wbr/>control.<wbr/>awb<wbr/>Mode</a></p>
             </td>
 
             <td class="entry_tags">
@@ -4262,9 +4458,10 @@
 given camera device.<wbr/> This entry lists the valid modes for
 <a href="#controls_android.control.awbMode">android.<wbr/>control.<wbr/>awb<wbr/>Mode</a> for this camera device.<wbr/></p>
 <p>All camera devices will support ON mode.<wbr/></p>
-<p>FULL mode camera devices will always support OFF mode,<wbr/>
-which enables application control of white balance,<wbr/> by using
-<a href="#controls_android.colorCorrection.transform">android.<wbr/>color<wbr/>Correction.<wbr/>transform</a> and <a href="#controls_android.colorCorrection.gains">android.<wbr/>color<wbr/>Correction.<wbr/>gains</a>(<a href="#controls_android.colorCorrection.mode">android.<wbr/>color<wbr/>Correction.<wbr/>mode</a> must be set to TRANSFORM_<wbr/>MATRIX).<wbr/></p>
+<p>Camera devices that support the MANUAL_<wbr/>POST_<wbr/>PROCESSING capability will always support OFF
+mode,<wbr/> which enables application control of white balance,<wbr/> by using
+<a href="#controls_android.colorCorrection.transform">android.<wbr/>color<wbr/>Correction.<wbr/>transform</a> and <a href="#controls_android.colorCorrection.gains">android.<wbr/>color<wbr/>Correction.<wbr/>gains</a>(<a href="#controls_android.colorCorrection.mode">android.<wbr/>color<wbr/>Correction.<wbr/>mode</a> must be set to TRANSFORM_<wbr/>MATRIX).<wbr/> This includes all FULL
+mode camera devices.<wbr/></p>
             </td>
           </tr>
 
@@ -4288,6 +4485,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -4325,7 +4524,7 @@
                 
           <tr class="entry" id="static_android.control.maxRegionsAe">
             <td class="entry_name
-             " rowspan="3">
+             " rowspan="5">
               android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Ae
             </td>
             <td class="entry_type">
@@ -4335,16 +4534,16 @@
 
               <span class="entry_type_synthetic">[synthetic] </span>
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>List of the maximum number of regions that can be used for metering in
-auto-exposure (AE);
-this corresponds to the the maximum number of elements in
-<a href="#controls_android.control.aeRegions">android.<wbr/>control.<wbr/>ae<wbr/>Regions</a>.<wbr/></p>
+              <p>The maximum number of metering regions that can be used by the auto-exposure (AE)
+routine.<wbr/></p>
             </td>
 
             <td class="entry_units">
@@ -4359,6 +4558,15 @@
             </td>
 
           </tr>
+          <tr class="entries_header">
+            <th class="th_details" colspan="5">Details</th>
+          </tr>
+          <tr class="entry_cont">
+            <td class="entry_details" colspan="5">
+              <p>This corresponds to the the maximum allowed number of elements in
+<a href="#controls_android.control.aeRegions">android.<wbr/>control.<wbr/>ae<wbr/>Regions</a>.<wbr/></p>
+            </td>
+          </tr>
 
           <tr class="entries_header">
             <th class="th_details" colspan="5">HAL Implementation Details</th>
@@ -4376,7 +4584,7 @@
                 
           <tr class="entry" id="static_android.control.maxRegionsAwb">
             <td class="entry_name
-             " rowspan="3">
+             " rowspan="5">
               android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Awb
             </td>
             <td class="entry_type">
@@ -4386,16 +4594,16 @@
 
               <span class="entry_type_synthetic">[synthetic] </span>
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>List of the maximum number of regions that can be used for metering in
-auto-white balance (AWB);
-this corresponds to the the maximum number of elements in
-<a href="#controls_android.control.awbRegions">android.<wbr/>control.<wbr/>awb<wbr/>Regions</a>.<wbr/></p>
+              <p>The maximum number of metering regions that can be used by the auto-white balance (AWB)
+routine.<wbr/></p>
             </td>
 
             <td class="entry_units">
@@ -4409,6 +4617,15 @@
             </td>
 
           </tr>
+          <tr class="entries_header">
+            <th class="th_details" colspan="5">Details</th>
+          </tr>
+          <tr class="entry_cont">
+            <td class="entry_details" colspan="5">
+              <p>This corresponds to the the maximum allowed number of elements in
+<a href="#controls_android.control.awbRegions">android.<wbr/>control.<wbr/>awb<wbr/>Regions</a>.<wbr/></p>
+            </td>
+          </tr>
 
           <tr class="entries_header">
             <th class="th_details" colspan="5">HAL Implementation Details</th>
@@ -4426,7 +4643,7 @@
                 
           <tr class="entry" id="static_android.control.maxRegionsAf">
             <td class="entry_name
-             " rowspan="3">
+             " rowspan="5">
               android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Af
             </td>
             <td class="entry_type">
@@ -4436,16 +4653,15 @@
 
               <span class="entry_type_synthetic">[synthetic] </span>
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>List of the maximum number of regions that can be used for metering in
-auto-focus (AF);
-this corresponds to the the maximum number of elements in
-<a href="#controls_android.control.afRegions">android.<wbr/>control.<wbr/>af<wbr/>Regions</a>.<wbr/></p>
+              <p>The maximum number of metering regions that can be used by the auto-focus (AF) routine.<wbr/></p>
             </td>
 
             <td class="entry_units">
@@ -4460,6 +4676,15 @@
             </td>
 
           </tr>
+          <tr class="entries_header">
+            <th class="th_details" colspan="5">Details</th>
+          </tr>
+          <tr class="entry_cont">
+            <td class="entry_details" colspan="5">
+              <p>This corresponds to the the maximum allowed number of elements in
+<a href="#controls_android.control.afRegions">android.<wbr/>control.<wbr/>af<wbr/>Regions</a>.<wbr/></p>
+            </td>
+          </tr>
 
           <tr class="entries_header">
             <th class="th_details" colspan="5">HAL Implementation Details</th>
@@ -4490,6 +4715,8 @@
               <span class="entry_type_visibility"> [system]</span>
 
 
+              <span class="entry_type_hwlevel">[limited] </span>
+
 
 
 
@@ -4575,6 +4802,8 @@
               <span class="entry_type_visibility"> [hidden as highSpeedVideoConfiguration]</span>
 
 
+              <span class="entry_type_hwlevel">[limited] </span>
+
 
 
 
@@ -4685,6 +4914,7 @@
               <span class="entry_type_visibility"> [system]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -4735,6 +4965,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -4807,7 +5039,7 @@
 options for the antibanding mode.<wbr/> The
 <a href="#static_android.control.aeAvailableAntibandingModes">android.<wbr/>control.<wbr/>ae<wbr/>Available<wbr/>Antibanding<wbr/>Modes</a> key contains
 the available modes for a given camera device.<wbr/></p>
-<p>The default mode is AUTO,<wbr/> which must be supported by all
+<p>The default mode is AUTO,<wbr/> which is supported by all
 camera devices.<wbr/></p>
 <p>If manual exposure control is enabled (by setting
 <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> or <a href="#controls_android.control.mode">android.<wbr/>control.<wbr/>mode</a> to OFF),<wbr/>
@@ -4848,6 +5080,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -4859,7 +5093,7 @@
             </td>
 
             <td class="entry_units">
-              count of positive/<wbr/>negative EV steps
+              Compensation steps
             </td>
 
             <td class="entry_range">
@@ -4912,6 +5146,8 @@
               <span class="entry_type_visibility"> [public as boolean]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -4926,7 +5162,9 @@
 must not update the exposure and sensitivity parameters
 while the lock is active.<wbr/></p>
 <p><a href="#controls_android.control.aeExposureCompensation">android.<wbr/>control.<wbr/>ae<wbr/>Exposure<wbr/>Compensation</a> setting changes
-will still take effect while auto-exposure is locked.<wbr/></p></span>
+will still take effect while auto-exposure is locked.<wbr/></p>
+<p>Some rare LEGACY devices may not support
+this,<wbr/> in which case the value will always be overridden to OFF.<wbr/></p></span>
                   </li>
                 </ul>
 
@@ -4955,9 +5193,11 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Note that even when AE is locked,<wbr/> the flash may be
-fired if the <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> is ON_<wbr/>AUTO_<wbr/>FLASH /<wbr/> ON_<wbr/>ALWAYS_<wbr/>FLASH /<wbr/>
-ON_<wbr/>AUTO_<wbr/>FLASH_<wbr/>REDEYE.<wbr/></p>
+              <p>When set to <code>true</code> (ON),<wbr/> the AE algorithm is locked to its latest parameters,<wbr/>
+and will not change exposure settings until the lock is set to <code>false</code> (OFF).<wbr/></p>
+<p>Note that even when AE is locked,<wbr/> the flash may be fired if
+the <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> is ON_<wbr/>AUTO_<wbr/>FLASH /<wbr/>
+ON_<wbr/>ALWAYS_<wbr/>FLASH /<wbr/> ON_<wbr/>AUTO_<wbr/>FLASH_<wbr/>REDEYE.<wbr/></p>
 <p>When <a href="#controls_android.control.aeExposureCompensation">android.<wbr/>control.<wbr/>ae<wbr/>Exposure<wbr/>Compensation</a> is changed,<wbr/> even if the AE lock
 is ON,<wbr/> the camera device will still adjust its exposure value.<wbr/></p>
 <p>If AE precapture is triggered (see <a href="#controls_android.control.aePrecaptureTrigger">android.<wbr/>control.<wbr/>ae<wbr/>Precapture<wbr/>Trigger</a>)
@@ -4966,6 +5206,19 @@
 parameters.<wbr/> The flash may be fired if the <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a>
 is ON_<wbr/>AUTO_<wbr/>FLASH/<wbr/>ON_<wbr/>AUTO_<wbr/>FLASH_<wbr/>REDEYE and the scene is too dark.<wbr/> If the
 <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> is ON_<wbr/>ALWAYS_<wbr/>FLASH,<wbr/> the scene may become overexposed.<wbr/></p>
+<p>Since the camera device has a pipeline of in-flight requests,<wbr/> the settings that
+get locked do not necessarily correspond to the settings that were present in the
+latest capture result received from the camera device,<wbr/> since additional captures
+and AE updates may have occurred even before the result was sent out.<wbr/> If an
+application is switching between automatic and manual control and wishes to eliminate
+any flicker during the switch,<wbr/> the following procedure is recommended:</p>
+<ol>
+<li>Starting in auto-AE mode:</li>
+<li>Lock AE</li>
+<li>Wait for the first result to be output that has the AE locked</li>
+<li>Copy exposure settings from that result into a request,<wbr/> set the request to manual AE</li>
+<li>Submit the capture request,<wbr/> proceed to run manual AE as desired.<wbr/></li>
+</ol>
 <p>See <a href="#dynamic_android.control.aeState">android.<wbr/>control.<wbr/>ae<wbr/>State</a> for AE lock related state transition details.<wbr/></p>
             </td>
           </tr>
@@ -4986,6 +5239,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -4996,7 +5251,9 @@
 <a href="#controls_android.sensor.sensitivity">android.<wbr/>sensor.<wbr/>sensitivity</a> and
 <a href="#controls_android.sensor.frameDuration">android.<wbr/>sensor.<wbr/>frame<wbr/>Duration</a> are used by the camera
 device,<wbr/> along with android.<wbr/>flash.<wbr/>* fields,<wbr/> if there's
-a flash unit for this camera device.<wbr/></p></span>
+a flash unit for this camera device.<wbr/></p>
+<p>LEGACY devices do not support the OFF mode and will
+override attempts to use this value to ON.<wbr/></p></span>
                   </li>
                   <li>
                     <span class="entry_type_enum_name">ON</span>
@@ -5111,18 +5368,20 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>List of areas to use for
-metering.<wbr/></p>
+              <p>List of metering areas to use for auto-exposure adjustment.<wbr/></p>
             </td>
 
             <td class="entry_units">
+              Pixel coordinates within android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size
             </td>
 
             <td class="entry_range">
-              <p><code>area_<wbr/>count &lt;= <a href="#static_android.control.maxRegions">android.<wbr/>control.<wbr/>max<wbr/>Regions</a>[0]</code></p>
+              <p>Coordinates must be between <code>[(0,<wbr/>0),<wbr/> (width,<wbr/> height))</code> of
+<a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a></p>
             </td>
 
             <td class="entry_tags">
@@ -5137,23 +5396,30 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Optional.<wbr/> Not available if <a href="#static_android.control.maxRegionsAe">android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Ae</a> is 0.<wbr/>
+              <p>Not available if <a href="#static_android.control.maxRegionsAe">android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Ae</a> is 0.<wbr/>
 Otherwise will always be present.<wbr/></p>
+<p>The maximum number of regions supported by the device is determined by the value
+of <a href="#static_android.control.maxRegionsAe">android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Ae</a>.<wbr/></p>
 <p>The coordinate system is based on the active pixel array,<wbr/>
 with (0,<wbr/>0) being the top-left pixel in the active pixel array,<wbr/> and
 (<a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a>.<wbr/>width - 1,<wbr/>
 <a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a>.<wbr/>height - 1) being the
 bottom-right pixel in the active pixel array.<wbr/></p>
-<p>The weight must range from 0 to 1000,<wbr/> and represents a weight
+<p>The weight must be within <code>[0,<wbr/> 1000]</code>,<wbr/> and represents a weight
 for every pixel in the area.<wbr/> This means that a large metering area
 with the same weight as a smaller area will have more effect in
 the metering result.<wbr/> Metering areas can partially overlap and the
 camera device will add the weights in the overlap region.<wbr/></p>
-<p>If all regions have 0 weight,<wbr/> then no specific metering area
-needs to be used by the camera device.<wbr/> If the metering region is
-outside the used <a href="#controls_android.scaler.cropRegion">android.<wbr/>scaler.<wbr/>crop<wbr/>Region</a> returned in capture result metadata,<wbr/>
-the camera device will ignore the sections outside the region and output the
-used sections in the result metadata.<wbr/></p>
+<p>The weights are relative to weights of other exposure metering regions,<wbr/> so if only one
+region is used,<wbr/> all non-zero weights will have the same effect.<wbr/> A region with 0
+weight is ignored.<wbr/></p>
+<p>If all regions have 0 weight,<wbr/> then no specific metering area needs to be used by the
+camera device.<wbr/></p>
+<p>If the metering region is outside the used <a href="#controls_android.scaler.cropRegion">android.<wbr/>scaler.<wbr/>crop<wbr/>Region</a> returned in
+capture result metadata,<wbr/> the camera device will ignore the sections outside the crop
+region and output only the intersection rectangle as the metering region in the result
+metadata.<wbr/>  If the region is entirely outside the crop region,<wbr/> it will be ignored and
+not reported in the result metadata.<wbr/></p>
             </td>
           </tr>
 
@@ -5190,21 +5456,25 @@
               <span class="entry_type_visibility"> [public as rangeInt]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Range over which fps can be adjusted to
-maintain exposure.<wbr/></p>
+              <p>Range over which the auto-exposure routine can
+adjust the capture frame rate to maintain good
+exposure.<wbr/></p>
             </td>
 
             <td class="entry_units">
+              Frames per second (FPS)
             </td>
 
             <td class="entry_range">
-              <p><a href="#static_android.control.aeAvailableTargetFpsRanges">android.<wbr/>control.<wbr/>ae<wbr/>Available<wbr/>Target<wbr/>Fps<wbr/>Ranges</a></p>
+              <p>Any of the entries in <a href="#static_android.control.aeAvailableTargetFpsRanges">android.<wbr/>control.<wbr/>ae<wbr/>Available<wbr/>Target<wbr/>Fps<wbr/>Ranges</a></p>
             </td>
 
             <td class="entry_tags">
@@ -5220,7 +5490,8 @@
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
               <p>Only constrains auto-exposure (AE) algorithm,<wbr/> not
-manual control of <a href="#controls_android.sensor.exposureTime">android.<wbr/>sensor.<wbr/>exposure<wbr/>Time</a></p>
+manual control of <a href="#controls_android.sensor.exposureTime">android.<wbr/>sensor.<wbr/>exposure<wbr/>Time</a> and
+<a href="#controls_android.sensor.frameDuration">android.<wbr/>sensor.<wbr/>frame<wbr/>Duration</a>.<wbr/></p>
             </td>
           </tr>
 
@@ -5240,6 +5511,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[limited] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -5297,6 +5570,10 @@
 depends on the current AE mode and state; see
 <a href="#dynamic_android.control.aeState">android.<wbr/>control.<wbr/>ae<wbr/>State</a> for AE precapture state transition
 details.<wbr/></p>
+<p>On LEGACY-level devices,<wbr/> the precapture trigger is not supported;
+capturing a high-resolution JPEG image will automatically trigger a
+precapture sequence before the high-resolution capture,<wbr/> including
+potentially firing a pre-capture flash.<wbr/></p>
             </td>
           </tr>
 
@@ -5316,6 +5593,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[limited] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -5581,6 +5860,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -5752,18 +6033,20 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>List of areas to use for focus
-estimation.<wbr/></p>
+              <p>List of metering areas to use for auto-focus.<wbr/></p>
             </td>
 
             <td class="entry_units">
+              Pixel coordinates within android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size
             </td>
 
             <td class="entry_range">
-              <p><code>area_<wbr/>count &lt;= <a href="#static_android.control.maxRegions">android.<wbr/>control.<wbr/>max<wbr/>Regions</a>[2]</code></p>
+              <p>Coordinates must be between <code>[(0,<wbr/>0),<wbr/> (width,<wbr/> height))</code> of
+<a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a></p>
             </td>
 
             <td class="entry_tags">
@@ -5778,23 +6061,30 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Optional.<wbr/> Not available if <a href="#static_android.control.maxRegionsAf">android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Af</a> is 0.<wbr/>
+              <p>Not available if <a href="#static_android.control.maxRegionsAf">android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Af</a> is 0.<wbr/>
 Otherwise will always be present.<wbr/></p>
+<p>The maximum number of focus areas supported by the device is determined by the value
+of <a href="#static_android.control.maxRegionsAf">android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Af</a>.<wbr/></p>
 <p>The coordinate system is based on the active pixel array,<wbr/>
 with (0,<wbr/>0) being the top-left pixel in the active pixel array,<wbr/> and
 (<a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a>.<wbr/>width - 1,<wbr/>
 <a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a>.<wbr/>height - 1) being the
 bottom-right pixel in the active pixel array.<wbr/></p>
-<p>The weight must range from 0 to 1000,<wbr/> and represents a weight
+<p>The weight must be within <code>[0,<wbr/> 1000]</code>,<wbr/> and represents a weight
 for every pixel in the area.<wbr/> This means that a large metering area
 with the same weight as a smaller area will have more effect in
 the metering result.<wbr/> Metering areas can partially overlap and the
 camera device will add the weights in the overlap region.<wbr/></p>
-<p>If all regions have 0 weight,<wbr/> then no specific metering area
-needs to be used by the camera device.<wbr/> If the metering region is
-outside the used <a href="#controls_android.scaler.cropRegion">android.<wbr/>scaler.<wbr/>crop<wbr/>Region</a> returned in capture result metadata,<wbr/>
-the camera device will ignore the sections outside the region and output the
-used sections in the result metadata.<wbr/></p>
+<p>The weights are relative to weights of other metering regions,<wbr/> so if only one region
+is used,<wbr/> all non-zero weights will have the same effect.<wbr/> A region with 0 weight is
+ignored.<wbr/></p>
+<p>If all regions have 0 weight,<wbr/> then no specific metering area needs to be used by the
+camera device.<wbr/></p>
+<p>If the metering region is outside the used <a href="#controls_android.scaler.cropRegion">android.<wbr/>scaler.<wbr/>crop<wbr/>Region</a> returned in
+capture result metadata,<wbr/> the camera device will ignore the sections outside the crop
+region and output only the intersection rectangle as the metering region in the result
+metadata.<wbr/> If the region is entirely outside the crop region,<wbr/> it will be ignored and
+not reported in the result metadata.<wbr/></p>
             </td>
           </tr>
 
@@ -5827,6 +6117,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -5899,6 +6191,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -5958,7 +6252,9 @@
                     <span class="entry_type_enum_notes"><p>AF finished a passive scan without finding focus,<wbr/>
 and may restart scanning at any time.<wbr/></p>
 <p>Only used by CONTINUOUS_<wbr/>* AF modes.<wbr/> This is a transient state,<wbr/> the camera
-device may skip reporting this state in capture result.<wbr/></p></span>
+device may skip reporting this state in capture result.<wbr/></p>
+<p>LEGACY camera devices do not support this state.<wbr/> When a passive
+scan has finished,<wbr/> it will always go to PASSIVE_<wbr/>FOCUSED.<wbr/></p></span>
                   </li>
                 </ul>
 
@@ -6383,6 +6679,7 @@
               <span class="entry_type_visibility"> [system]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -6432,6 +6729,8 @@
               <span class="entry_type_visibility"> [public as boolean]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -6474,9 +6773,25 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Note that AWB lock is only meaningful when
+              <p>When set to <code>true</code> (ON),<wbr/> the AWB algorithm is locked to its latest parameters,<wbr/>
+and will not change color balance settings until the lock is set to <code>false</code> (OFF).<wbr/></p>
+<p>Since the camera device has a pipeline of in-flight requests,<wbr/> the settings that
+get locked do not necessarily correspond to the settings that were present in the
+latest capture result received from the camera device,<wbr/> since additional captures
+and AWB updates may have occurred even before the result was sent out.<wbr/> If an
+application is switching between automatic and manual control and wishes to eliminate
+any flicker during the switch,<wbr/> the following procedure is recommended:</p>
+<ol>
+<li>Starting in auto-AWB mode:</li>
+<li>Lock AWB</li>
+<li>Wait for the first result to be output that has the AWB locked</li>
+<li>Copy AWB settings from that result into a request,<wbr/> set the request to manual AWB</li>
+<li>Submit the capture request,<wbr/> proceed to run manual AWB as desired.<wbr/></li>
+</ol>
+<p>Note that AWB lock is only meaningful when
 <a href="#controls_android.control.awbMode">android.<wbr/>control.<wbr/>awb<wbr/>Mode</a> is in the AUTO mode; in other modes,<wbr/>
 AWB is already fixed to a specific setting.<wbr/></p>
+<p>Some LEGACY devices may not support ON; the value is then overridden to OFF.<wbr/></p>
             </td>
           </tr>
 
@@ -6496,6 +6811,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -6676,18 +6993,21 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>List of areas to use for illuminant
+              <p>List of metering areas to use for auto-white-balance illuminant
 estimation.<wbr/></p>
             </td>
 
             <td class="entry_units">
+              Pixel coordinates within android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size
             </td>
 
             <td class="entry_range">
-              <p><code>area_<wbr/>count &lt;= <a href="#static_android.control.maxRegions">android.<wbr/>control.<wbr/>max<wbr/>Regions</a>[1]</code></p>
+              <p>Coordinates must be between <code>[(0,<wbr/>0),<wbr/> (width,<wbr/> height))</code> of
+<a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a></p>
             </td>
 
             <td class="entry_tags">
@@ -6702,8 +7022,10 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Optional.<wbr/> Not available if <a href="#static_android.control.maxRegionsAwb">android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Awb</a> is 0.<wbr/>
+              <p>Not available if <a href="#static_android.control.maxRegionsAwb">android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Awb</a> is 0.<wbr/>
 Otherwise will always be present.<wbr/></p>
+<p>The maximum number of regions supported by the device is determined by the value
+of <a href="#static_android.control.maxRegionsAwb">android.<wbr/>control.<wbr/>max<wbr/>Regions<wbr/>Awb</a>.<wbr/></p>
 <p>The coordinate system is based on the active pixel array,<wbr/>
 with (0,<wbr/>0) being the top-left pixel in the active pixel array,<wbr/> and
 (<a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a>.<wbr/>width - 1,<wbr/>
@@ -6714,11 +7036,16 @@
 with the same weight as a smaller area will have more effect in
 the metering result.<wbr/> Metering areas can partially overlap and the
 camera device will add the weights in the overlap region.<wbr/></p>
-<p>If all regions have 0 weight,<wbr/> then no specific metering area
-needs to be used by the camera device.<wbr/> If the metering region is
-outside the used <a href="#controls_android.scaler.cropRegion">android.<wbr/>scaler.<wbr/>crop<wbr/>Region</a> returned in capture result metadata,<wbr/>
-the camera device will ignore the sections outside the region and output the
-used sections in the result metadata.<wbr/></p>
+<p>The weights are relative to weights of other white balance metering regions,<wbr/> so if
+only one region is used,<wbr/> all non-zero weights will have the same effect.<wbr/> A region with
+0 weight is ignored.<wbr/></p>
+<p>If all regions have 0 weight,<wbr/> then no specific metering area needs to be used by the
+camera device.<wbr/></p>
+<p>If the metering region is outside the used <a href="#controls_android.scaler.cropRegion">android.<wbr/>scaler.<wbr/>crop<wbr/>Region</a> returned in
+capture result metadata,<wbr/> the camera device will ignore the sections outside the crop
+region and output only the intersection rectangle as the metering region in the result
+metadata.<wbr/>  If the region is entirely outside the crop region,<wbr/> it will be ignored and
+not reported in the result metadata.<wbr/></p>
             </td>
           </tr>
 
@@ -6751,6 +7078,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -6814,7 +7143,6 @@
             </td>
 
             <td class="entry_range">
-              <p>All must be supported except for ZERO_<wbr/>SHUTTER_<wbr/>LAG and MANUAL.<wbr/></p>
             </td>
 
             <td class="entry_tags">
@@ -6833,7 +7161,7 @@
 <code><a href="#controls_android.control.mode">android.<wbr/>control.<wbr/>mode</a> != OFF</code> and any 3A routine is active.<wbr/></p>
 <p>ZERO_<wbr/>SHUTTER_<wbr/>LAG will be supported if <a href="#static_android.request.availableCapabilities">android.<wbr/>request.<wbr/>available<wbr/>Capabilities</a>
 contains ZSL.<wbr/> MANUAL will be supported if <a href="#static_android.request.availableCapabilities">android.<wbr/>request.<wbr/>available<wbr/>Capabilities</a>
-contains MANUAL_<wbr/>SENSOR.<wbr/></p>
+contains MANUAL_<wbr/>SENSOR.<wbr/> Other intent values are always supported.<wbr/></p>
             </td>
           </tr>
 
@@ -6853,6 +7181,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[limited] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -7037,6 +7367,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -7127,8 +7459,6 @@
 implementor of the camera device,<wbr/> and should not be
 depended on to be consistent (or present) across all
 devices.<wbr/></p>
-<p>A color effect will only be applied if
-<a href="#controls_android.control.mode">android.<wbr/>control.<wbr/>mode</a> != OFF.<wbr/></p>
             </td>
           </tr>
 
@@ -7148,6 +7478,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -7200,7 +7532,7 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Overall mode of 3A control
+              <p>Overall mode of 3A (auto-exposure,<wbr/> auto-white-balance,<wbr/> auto-focus) control
 routines.<wbr/></p>
             </td>
 
@@ -7208,7 +7540,6 @@
             </td>
 
             <td class="entry_range">
-              <p>all must be supported</p>
             </td>
 
             <td class="entry_tags">
@@ -7223,7 +7554,7 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>High-level 3A control.<wbr/> When set to OFF,<wbr/> all 3A control
+              <p>This is a top-level 3A control switch.<wbr/> When set to OFF,<wbr/> all 3A control
 by the camera device is disabled.<wbr/> The application must set the fields for
 capture parameters itself.<wbr/></p>
 <p>When set to AUTO,<wbr/> the individual algorithm controls in
@@ -7238,6 +7569,10 @@
 update,<wbr/> as if this frame is never captured.<wbr/> This mode can be used in the scenario
 where the application doesn't want a 3A manual control capture to affect
 the subsequent auto 3A capture results.<wbr/></p>
+<p>LEGACY mode devices will only support AUTO and USE_<wbr/>SCENE_<wbr/>MODE modes.<wbr/>
+LIMITED mode devices will only support OFF and OFF_<wbr/>KEEP_<wbr/>STATE if they
+support the MANUAL_<wbr/>SENSOR and MANUAL_<wbr/>POST_<wbr/>PROCSESING capabilities.<wbr/>
+FULL mode devices will always support OFF and OFF_<wbr/>KEEP_<wbr/>STATE.<wbr/></p>
             </td>
           </tr>
 
@@ -7257,6 +7592,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -7427,15 +7764,16 @@
                     <span class="entry_type_enum_name">HDR</span>
                     <span class="entry_type_enum_optional">[optional]</span>
                     <span class="entry_type_enum_optional">[hidden]</span>
-                    <span class="entry_type_enum_notes"><p>Turn on custom high dynamic range (HDR) mode.<wbr/></p></span>
+                    <span class="entry_type_enum_notes"><p>Turn on custom high dynamic range (HDR) mode.<wbr/></p>
+<p>This is intended for LEGACY mode devices only;
+HAL3+ camera devices should not implement this mode.<wbr/></p></span>
                   </li>
                 </ul>
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>A camera mode optimized for conditions typical in a particular
-capture setting.<wbr/></p>
+              <p>Control for which scene mode is currently active.<wbr/></p>
             </td>
 
             <td class="entry_units">
@@ -7457,12 +7795,12 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>This is the mode that that is active when
+              <p>Scene modes are custom camera modes optimized for a certain set of conditions and
+capture settings.<wbr/></p>
+<p>This is the mode that that is active when
 <code><a href="#controls_android.control.mode">android.<wbr/>control.<wbr/>mode</a> == USE_<wbr/>SCENE_<wbr/>MODE</code>.<wbr/> Aside from FACE_<wbr/>PRIORITY,<wbr/>
 these modes will disable <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a>,<wbr/>
-<a href="#controls_android.control.awbMode">android.<wbr/>control.<wbr/>awb<wbr/>Mode</a>,<wbr/> and <a href="#controls_android.control.afMode">android.<wbr/>control.<wbr/>af<wbr/>Mode</a> while in use.<wbr/>
-The scene modes available for a given camera device are listed in
-<a href="#static_android.control.availableSceneModes">android.<wbr/>control.<wbr/>available<wbr/>Scene<wbr/>Modes</a>.<wbr/></p>
+<a href="#controls_android.control.awbMode">android.<wbr/>control.<wbr/>awb<wbr/>Mode</a>,<wbr/> and <a href="#controls_android.control.afMode">android.<wbr/>control.<wbr/>af<wbr/>Mode</a> while in use.<wbr/></p>
 <p>The interpretation and implementation of these scene modes is left
 to the implementor of the camera device.<wbr/> Their behavior will not be
 consistent across all devices,<wbr/> and any given device may only implement
@@ -7503,6 +7841,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -7541,18 +7881,20 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Video stabilization automatically translates and scales images from the camera
-in order to stabilize motion between consecutive frames.<wbr/></p>
+              <p>Video stabilization automatically translates and scales images from
+the camera in order to stabilize motion between consecutive frames.<wbr/></p>
 <p>If enabled,<wbr/> video stabilization can modify the
 <a href="#controls_android.scaler.cropRegion">android.<wbr/>scaler.<wbr/>crop<wbr/>Region</a> to keep the video stream stabilized.<wbr/></p>
-<p>Switching between different video stabilization modes may take several frames
-to initialize,<wbr/> the camera device will report the current mode in capture result
-metadata.<wbr/> For example,<wbr/> When "ON" mode is requested,<wbr/> the video stabilization modes
-in the first several capture results may still be "OFF",<wbr/> and it will become "ON"
-when the initialization is done.<wbr/></p>
-<p>If a camera device supports both this mode and OIS (<a href="#controls_android.lens.opticalStabilizationMode">android.<wbr/>lens.<wbr/>optical<wbr/>Stabilization<wbr/>Mode</a>),<wbr/>
-turning both modes on may produce undesirable interaction,<wbr/> so it is recommended not to
-enable both at the same time.<wbr/></p>
+<p>Switching between different video stabilization modes may take several
+frames to initialize,<wbr/> the camera device will report the current mode
+in capture result metadata.<wbr/> For example,<wbr/> When "ON" mode is requested,<wbr/>
+the video stabilization modes in the first several capture results may
+still be "OFF",<wbr/> and it will become "ON" when the initialization is
+done.<wbr/></p>
+<p>If a camera device supports both this mode and OIS
+(<a href="#controls_android.lens.opticalStabilizationMode">android.<wbr/>lens.<wbr/>optical<wbr/>Stabilization<wbr/>Mode</a>),<wbr/> turning both modes on may
+produce undesirable interaction,<wbr/> so it is recommended not to enable
+both at the same time.<wbr/></p>
             </td>
           </tr>
 
@@ -7606,6 +7948,7 @@
 
 
 
+
                 <ul class="entry_type_enum">
                   <li>
                     <span class="entry_type_enum_name">FAST</span>
@@ -7688,6 +8031,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -7717,6 +8062,7 @@
             </td>
 
             <td class="entry_range">
+              <p><a href="#static_android.edge.availableEdgeModes">android.<wbr/>edge.<wbr/>available<wbr/>Edge<wbr/>Modes</a></p>
             </td>
 
             <td class="entry_tags">
@@ -7731,9 +8077,8 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Edge/<wbr/>sharpness/<wbr/>detail enhancement.<wbr/> OFF means no
-enhancement will be applied by the camera device.<wbr/></p>
-<p>This must be set to one of the modes listed in <a href="#static_android.edge.availableEdgeModes">android.<wbr/>edge.<wbr/>available<wbr/>Edge<wbr/>Modes</a>.<wbr/></p>
+              <p>Edge enhancement improves sharpness and details in the captured image.<wbr/> OFF means
+no enhancement will be applied by the camera device.<wbr/></p>
 <p>FAST/<wbr/>HIGH_<wbr/>QUALITY both mean camera device determined enhancement
 will be applied.<wbr/> HIGH_<wbr/>QUALITY mode indicates that the
 camera device will use the highest-quality enhancement algorithms,<wbr/>
@@ -7761,6 +8106,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -7830,6 +8176,8 @@
               <span class="entry_type_visibility"> [public as enumList]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
                 <div class="entry_type_notes">list of enums</div>
 
@@ -7837,13 +8185,15 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>The set of edge enhancement modes supported by this camera device.<wbr/></p>
+              <p>List of edge enhancement modes for <a href="#controls_android.edge.mode">android.<wbr/>edge.<wbr/>mode</a> that are supported by this camera
+device.<wbr/></p>
             </td>
 
             <td class="entry_units">
             </td>
 
             <td class="entry_range">
+              <p>Any value listed in <a href="#controls_android.edge.mode">android.<wbr/>edge.<wbr/>mode</a></p>
             </td>
 
             <td class="entry_tags">
@@ -7858,8 +8208,7 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>This tag lists the valid modes for <a href="#controls_android.edge.mode">android.<wbr/>edge.<wbr/>mode</a>.<wbr/></p>
-<p>Full-capability camera devices must always support OFF and FAST.<wbr/></p>
+              <p>Full-capability camera devices must always support OFF; all devices will list FAST.<wbr/></p>
             </td>
           </tr>
 
@@ -7906,6 +8255,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -7935,6 +8286,7 @@
             </td>
 
             <td class="entry_range">
+              <p><a href="#static_android.edge.availableEdgeModes">android.<wbr/>edge.<wbr/>available<wbr/>Edge<wbr/>Modes</a></p>
             </td>
 
             <td class="entry_tags">
@@ -7949,9 +8301,8 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Edge/<wbr/>sharpness/<wbr/>detail enhancement.<wbr/> OFF means no
-enhancement will be applied by the camera device.<wbr/></p>
-<p>This must be set to one of the modes listed in <a href="#static_android.edge.availableEdgeModes">android.<wbr/>edge.<wbr/>available<wbr/>Edge<wbr/>Modes</a>.<wbr/></p>
+              <p>Edge enhancement improves sharpness and details in the captured image.<wbr/> OFF means
+no enhancement will be applied by the camera device.<wbr/></p>
 <p>FAST/<wbr/>HIGH_<wbr/>QUALITY both mean camera device determined enhancement
 will be applied.<wbr/> HIGH_<wbr/>QUALITY mode indicates that the
 camera device will use the highest-quality enhancement algorithms,<wbr/>
@@ -8011,6 +8362,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -8062,6 +8414,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -8110,6 +8463,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -8213,6 +8568,8 @@
               <span class="entry_type_visibility"> [public as boolean]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -8228,7 +8585,7 @@
 
             <td class="entry_description">
               <p>Whether this camera device has a
-flash.<wbr/></p>
+flash unit.<wbr/></p>
             </td>
 
             <td class="entry_units">
@@ -8249,8 +8606,9 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>If no flash,<wbr/> none of the flash controls do
-anything.<wbr/> All other metadata should return 0.<wbr/></p>
+              <p>Will be <code>false</code> if no flash is available.<wbr/></p>
+<p>If there is no flash unit,<wbr/> none of the flash controls do
+anything.<wbr/></p>
             </td>
           </tr>
 
@@ -8273,6 +8631,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -8327,6 +8686,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -8369,6 +8729,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -8438,6 +8799,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -8489,6 +8851,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -8537,6 +8900,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -8611,6 +8976,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[limited] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -8664,6 +9031,16 @@
               <p>When the camera device doesn't have flash unit
 (i.<wbr/>e.<wbr/> <code><a href="#static_android.flash.info.available">android.<wbr/>flash.<wbr/>info.<wbr/>available</a> == false</code>),<wbr/> this state will always be UNAVAILABLE.<wbr/>
 Other states indicate the current flash status.<wbr/></p>
+<p>In certain conditions,<wbr/> this will be available on LEGACY devices:</p>
+<ul>
+<li>Flash-less cameras always return UNAVAILABLE.<wbr/></li>
+<li>Using <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> <code>==</code> ON_<wbr/>ALWAYS_<wbr/>FLASH
+   will always return FIRED.<wbr/></li>
+<li>Using <a href="#controls_android.flash.mode">android.<wbr/>flash.<wbr/>mode</a> <code>==</code> TORCH
+   will always return FIRED.<wbr/></li>
+</ul>
+<p>In all other conditions the state will not be available on
+LEGACY devices (i.<wbr/>e.<wbr/> it will be <code>null</code>).<wbr/></p>
             </td>
           </tr>
 
@@ -8717,6 +9094,7 @@
 
 
 
+
                 <ul class="entry_type_enum">
                   <li>
                     <span class="entry_type_enum_name">OFF</span>
@@ -8742,13 +9120,14 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Set operational mode for hot pixel correction.<wbr/></p>
+              <p>Operational mode for hot pixel correction.<wbr/></p>
             </td>
 
             <td class="entry_units">
             </td>
 
             <td class="entry_range">
+              <p><a href="#static_android.hotPixel.availableHotPixelModes">android.<wbr/>hot<wbr/>Pixel.<wbr/>available<wbr/>Hot<wbr/>Pixel<wbr/>Modes</a></p>
             </td>
 
             <td class="entry_tags">
@@ -8764,11 +9143,9 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Valid modes for this camera device are listed in
-<a href="#static_android.hotPixel.availableHotPixelModes">android.<wbr/>hot<wbr/>Pixel.<wbr/>available<wbr/>Hot<wbr/>Pixel<wbr/>Modes</a>.<wbr/></p>
-<p>Hotpixel correction interpolates out,<wbr/> or otherwise removes,<wbr/> pixels
-that do not accurately encode the incoming light (i.<wbr/>e.<wbr/> pixels that
-are stuck at an arbitrary value).<wbr/></p>
+              <p>Hotpixel correction interpolates out,<wbr/> or otherwise removes,<wbr/> pixels
+that do not accurately measure the incoming light (i.<wbr/>e.<wbr/> pixels that
+are stuck at an arbitrary value or are oversensitive).<wbr/></p>
             </td>
           </tr>
 
@@ -8820,13 +9197,14 @@
 
 
 
+
                 <div class="entry_type_notes">list of enums</div>
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>The set of hot pixel correction modes that are supported by this
+              <p>List of hot pixel correction modes for <a href="#controls_android.hotPixel.mode">android.<wbr/>hot<wbr/>Pixel.<wbr/>mode</a> that are supported by this
 camera device.<wbr/></p>
             </td>
 
@@ -8834,6 +9212,7 @@
             </td>
 
             <td class="entry_range">
+              <p>Any value listed in <a href="#controls_android.hotPixel.mode">android.<wbr/>hot<wbr/>Pixel.<wbr/>mode</a></p>
             </td>
 
             <td class="entry_tags">
@@ -8849,8 +9228,7 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>This tag lists valid modes for <a href="#controls_android.hotPixel.mode">android.<wbr/>hot<wbr/>Pixel.<wbr/>mode</a>.<wbr/></p>
-<p>FULL mode camera devices will always support FAST.<wbr/></p>
+              <p>FULL mode camera devices will always support FAST.<wbr/></p>
             </td>
           </tr>
 
@@ -8908,6 +9286,7 @@
 
 
 
+
                 <ul class="entry_type_enum">
                   <li>
                     <span class="entry_type_enum_name">OFF</span>
@@ -8933,13 +9312,14 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Set operational mode for hot pixel correction.<wbr/></p>
+              <p>Operational mode for hot pixel correction.<wbr/></p>
             </td>
 
             <td class="entry_units">
             </td>
 
             <td class="entry_range">
+              <p><a href="#static_android.hotPixel.availableHotPixelModes">android.<wbr/>hot<wbr/>Pixel.<wbr/>available<wbr/>Hot<wbr/>Pixel<wbr/>Modes</a></p>
             </td>
 
             <td class="entry_tags">
@@ -8955,11 +9335,9 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Valid modes for this camera device are listed in
-<a href="#static_android.hotPixel.availableHotPixelModes">android.<wbr/>hot<wbr/>Pixel.<wbr/>available<wbr/>Hot<wbr/>Pixel<wbr/>Modes</a>.<wbr/></p>
-<p>Hotpixel correction interpolates out,<wbr/> or otherwise removes,<wbr/> pixels
-that do not accurately encode the incoming light (i.<wbr/>e.<wbr/> pixels that
-are stuck at an arbitrary value).<wbr/></p>
+              <p>Hotpixel correction interpolates out,<wbr/> or otherwise removes,<wbr/> pixels
+that do not accurately measure the incoming light (i.<wbr/>e.<wbr/> pixels that
+are stuck at an arbitrary value or are oversensitive).<wbr/></p>
             </td>
           </tr>
 
@@ -9002,7 +9380,7 @@
                 
           <tr class="entry" id="controls_android.jpeg.gpsLocation">
             <td class="entry_name
-             " rowspan="1">
+             " rowspan="3">
               android.<wbr/>jpeg.<wbr/>gps<wbr/>Location
             </td>
             <td class="entry_type">
@@ -9012,6 +9390,8 @@
 
               <span class="entry_type_synthetic">[synthetic] </span>
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -9031,6 +9411,16 @@
             </td>
 
           </tr>
+          <tr class="entries_header">
+            <th class="th_details" colspan="5">Details</th>
+          </tr>
+          <tr class="entry_cont">
+            <td class="entry_details" colspan="5">
+              <p>Setting a location object in a request will include the GPS coordinates of the location
+into any JPEG images captured based on the request.<wbr/> These coordinates can then be
+viewed by anyone who receives the JPEG image.<wbr/></p>
+            </td>
+          </tr>
 
 
           <tr class="entry_spacer"><td class="entry_spacer" colspan="6"></td></tr>
@@ -9052,6 +9442,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
                 <div class="entry_type_notes">latitude,<wbr/> longitude,<wbr/> altitude.<wbr/> First two in degrees,<wbr/> the third in meters</div>
 
@@ -9060,7 +9452,7 @@
 
             <td class="entry_description">
               <p>GPS coordinates to include in output JPEG
-EXIF</p>
+EXIF.<wbr/></p>
             </td>
 
             <td class="entry_units">
@@ -9094,6 +9486,8 @@
               <span class="entry_type_visibility"> [hidden as string]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -9101,7 +9495,7 @@
 
             <td class="entry_description">
               <p>32 characters describing GPS algorithm to
-include in EXIF</p>
+include in EXIF.<wbr/></p>
             </td>
 
             <td class="entry_units">
@@ -9135,6 +9529,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -9142,7 +9538,7 @@
 
             <td class="entry_description">
               <p>Time GPS fix was made to include in
-EXIF</p>
+EXIF.<wbr/></p>
             </td>
 
             <td class="entry_units">
@@ -9167,7 +9563,7 @@
                 
           <tr class="entry" id="controls_android.jpeg.orientation">
             <td class="entry_name
-             " rowspan="1">
+             " rowspan="3">
               android.<wbr/>jpeg.<wbr/>orientation
             </td>
             <td class="entry_type">
@@ -9176,14 +9572,15 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Orientation of JPEG image to
-write</p>
+              <p>The orientation for a JPEG image.<wbr/></p>
             </td>
 
             <td class="entry_units">
@@ -9201,6 +9598,40 @@
             </td>
 
           </tr>
+          <tr class="entries_header">
+            <th class="th_details" colspan="5">Details</th>
+          </tr>
+          <tr class="entry_cont">
+            <td class="entry_details" colspan="5">
+              <p>The clockwise rotation angle in degrees,<wbr/> relative to the orientation
+to the camera,<wbr/> that the JPEG picture needs to be rotated by,<wbr/> to be viewed
+upright.<wbr/></p>
+<p>Camera devices may either encode this value into the JPEG EXIF header,<wbr/> or
+rotate the image data to match this orientation.<wbr/></p>
+<p>Note that this orientation is relative to the orientation of the camera sensor,<wbr/> given
+by <a href="#static_android.sensor.orientation">android.<wbr/>sensor.<wbr/>orientation</a>.<wbr/></p>
+<p>To translate from the device orientation given by the Android sensor APIs,<wbr/> the following
+sample code may be used:</p>
+<pre><code>private int getJpegOrientation(CameraCharacteristics c,<wbr/> int deviceOrientation) {
+    if (deviceOrientation == android.<wbr/>view.<wbr/>Orientation<wbr/>Event<wbr/>Listener.<wbr/>ORIENTATION_<wbr/>UNKNOWN) return 0;
+    int sensorOrientation = c.<wbr/>get(Camera<wbr/>Characteristics.<wbr/>SENSOR_<wbr/>ORIENTATION);
+
+    //<wbr/> Round device orientation to a multiple of 90
+    deviceOrientation = (deviceOrientation + 45) /<wbr/> 90 * 90;
+
+    //<wbr/> Reverse device orientation for front-facing cameras
+    boolean facingFront = c.<wbr/>get(Camera<wbr/>Characteristics.<wbr/>LENS_<wbr/>FACING) == Camera<wbr/>Characteristics.<wbr/>LENS_<wbr/>FACING_<wbr/>FRONT;
+    if (facingFront) deviceOrientation = -deviceOrientation;
+
+    //<wbr/> Calculate desired JPEG orientation relative to camera orientation to make
+    //<wbr/> the image upright relative to the device orientation
+    int jpegOrientation = (sensorOrientation + deviceOrientation + 360) % 360;
+
+    return jpegOrientation;
+}
+</code></pre>
+            </td>
+          </tr>
 
 
           <tr class="entry_spacer"><td class="entry_spacer" colspan="6"></td></tr>
@@ -9218,6 +9649,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -9267,6 +9700,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -9312,6 +9747,8 @@
               <span class="entry_type_visibility"> [public as size]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -9325,7 +9762,7 @@
             </td>
 
             <td class="entry_range">
-              <p>Size must be one of the size from <a href="#static_android.jpeg.availableThumbnailSizes">android.<wbr/>jpeg.<wbr/>available<wbr/>Thumbnail<wbr/>Sizes</a></p>
+              <p><a href="#static_android.jpeg.availableThumbnailSizes">android.<wbr/>jpeg.<wbr/>available<wbr/>Thumbnail<wbr/>Sizes</a></p>
             </td>
 
             <td class="entry_tags">
@@ -9342,8 +9779,8 @@
             <td class="entry_details" colspan="5">
               <p>When set to (0,<wbr/> 0) value,<wbr/> the JPEG EXIF will not contain thumbnail,<wbr/>
 but the captured JPEG will still be a valid image.<wbr/></p>
-<p>When a jpeg image capture is issued,<wbr/> the thumbnail size selected should have
-the same aspect ratio as the jpeg image.<wbr/></p>
+<p>For best results,<wbr/> when issuing a request for a JPEG image,<wbr/> the thumbnail size selected
+should have the same aspect ratio as the main JPEG output.<wbr/></p>
 <p>If the thumbnail image aspect ratio differs from the JPEG primary image aspect
 ratio,<wbr/> the camera device creates the thumbnail by cropping it from the primary image.<wbr/>
 For example,<wbr/> if the primary image has 4:3 aspect ratio,<wbr/> the thumbnail image has
@@ -9411,21 +9848,22 @@
               <span class="entry_type_visibility"> [public as size]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Supported resolutions for the JPEG thumbnail.<wbr/></p>
+              <p>List of JPEG thumbnail sizes for <a href="#controls_android.jpeg.thumbnailSize">android.<wbr/>jpeg.<wbr/>thumbnail<wbr/>Size</a> supported by this
+camera device.<wbr/></p>
             </td>
 
             <td class="entry_units">
             </td>
 
             <td class="entry_range">
-              <p>Will include at least one valid resolution,<wbr/> plus
-(0,<wbr/>0) for no thumbnail generation,<wbr/> and each size will be distinct.<wbr/></p>
             </td>
 
             <td class="entry_tags">
@@ -9440,7 +9878,9 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Below condiditions will be satisfied for this size list:</p>
+              <p>This list will include at least one non-zero resolution,<wbr/> plus <code>(0,<wbr/>0)</code> for indicating no
+thumbnail should be generated.<wbr/></p>
+<p>Below condiditions will be satisfied for this size list:</p>
 <ul>
 <li>The sizes will be sorted by increasing pixel area (width x height).<wbr/>
 If several resolutions have the same area,<wbr/> they will be sorted by increasing width.<wbr/></li>
@@ -9451,7 +9891,7 @@
 <li>Each output JPEG size in <a href="#static_android.scaler.availableStreamConfigurations">android.<wbr/>scaler.<wbr/>available<wbr/>Stream<wbr/>Configurations</a> will have at least
 one corresponding size that has the same aspect ratio in availableThumbnailSizes,<wbr/>
 and vice versa.<wbr/></li>
-<li>All non (0,<wbr/> 0) sizes will have non-zero widths and heights.<wbr/></li>
+<li>All non-<code>(0,<wbr/> 0)</code> sizes will have non-zero widths and heights.<wbr/></li>
 </ul>
             </td>
           </tr>
@@ -9475,6 +9915,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -9538,7 +9979,7 @@
                 
           <tr class="entry" id="dynamic_android.jpeg.gpsLocation">
             <td class="entry_name
-             " rowspan="1">
+             " rowspan="3">
               android.<wbr/>jpeg.<wbr/>gps<wbr/>Location
             </td>
             <td class="entry_type">
@@ -9548,6 +9989,8 @@
 
               <span class="entry_type_synthetic">[synthetic] </span>
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -9567,6 +10010,16 @@
             </td>
 
           </tr>
+          <tr class="entries_header">
+            <th class="th_details" colspan="5">Details</th>
+          </tr>
+          <tr class="entry_cont">
+            <td class="entry_details" colspan="5">
+              <p>Setting a location object in a request will include the GPS coordinates of the location
+into any JPEG images captured based on the request.<wbr/> These coordinates can then be
+viewed by anyone who receives the JPEG image.<wbr/></p>
+            </td>
+          </tr>
 
 
           <tr class="entry_spacer"><td class="entry_spacer" colspan="6"></td></tr>
@@ -9588,6 +10041,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
                 <div class="entry_type_notes">latitude,<wbr/> longitude,<wbr/> altitude.<wbr/> First two in degrees,<wbr/> the third in meters</div>
 
@@ -9596,7 +10051,7 @@
 
             <td class="entry_description">
               <p>GPS coordinates to include in output JPEG
-EXIF</p>
+EXIF.<wbr/></p>
             </td>
 
             <td class="entry_units">
@@ -9630,6 +10085,8 @@
               <span class="entry_type_visibility"> [hidden as string]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -9637,7 +10094,7 @@
 
             <td class="entry_description">
               <p>32 characters describing GPS algorithm to
-include in EXIF</p>
+include in EXIF.<wbr/></p>
             </td>
 
             <td class="entry_units">
@@ -9671,6 +10128,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -9678,7 +10137,7 @@
 
             <td class="entry_description">
               <p>Time GPS fix was made to include in
-EXIF</p>
+EXIF.<wbr/></p>
             </td>
 
             <td class="entry_units">
@@ -9703,7 +10162,7 @@
                 
           <tr class="entry" id="dynamic_android.jpeg.orientation">
             <td class="entry_name
-             " rowspan="1">
+             " rowspan="3">
               android.<wbr/>jpeg.<wbr/>orientation
             </td>
             <td class="entry_type">
@@ -9712,14 +10171,15 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Orientation of JPEG image to
-write</p>
+              <p>The orientation for a JPEG image.<wbr/></p>
             </td>
 
             <td class="entry_units">
@@ -9737,6 +10197,40 @@
             </td>
 
           </tr>
+          <tr class="entries_header">
+            <th class="th_details" colspan="5">Details</th>
+          </tr>
+          <tr class="entry_cont">
+            <td class="entry_details" colspan="5">
+              <p>The clockwise rotation angle in degrees,<wbr/> relative to the orientation
+to the camera,<wbr/> that the JPEG picture needs to be rotated by,<wbr/> to be viewed
+upright.<wbr/></p>
+<p>Camera devices may either encode this value into the JPEG EXIF header,<wbr/> or
+rotate the image data to match this orientation.<wbr/></p>
+<p>Note that this orientation is relative to the orientation of the camera sensor,<wbr/> given
+by <a href="#static_android.sensor.orientation">android.<wbr/>sensor.<wbr/>orientation</a>.<wbr/></p>
+<p>To translate from the device orientation given by the Android sensor APIs,<wbr/> the following
+sample code may be used:</p>
+<pre><code>private int getJpegOrientation(CameraCharacteristics c,<wbr/> int deviceOrientation) {
+    if (deviceOrientation == android.<wbr/>view.<wbr/>Orientation<wbr/>Event<wbr/>Listener.<wbr/>ORIENTATION_<wbr/>UNKNOWN) return 0;
+    int sensorOrientation = c.<wbr/>get(Camera<wbr/>Characteristics.<wbr/>SENSOR_<wbr/>ORIENTATION);
+
+    //<wbr/> Round device orientation to a multiple of 90
+    deviceOrientation = (deviceOrientation + 45) /<wbr/> 90 * 90;
+
+    //<wbr/> Reverse device orientation for front-facing cameras
+    boolean facingFront = c.<wbr/>get(Camera<wbr/>Characteristics.<wbr/>LENS_<wbr/>FACING) == Camera<wbr/>Characteristics.<wbr/>LENS_<wbr/>FACING_<wbr/>FRONT;
+    if (facingFront) deviceOrientation = -deviceOrientation;
+
+    //<wbr/> Calculate desired JPEG orientation relative to camera orientation to make
+    //<wbr/> the image upright relative to the device orientation
+    int jpegOrientation = (sensorOrientation + deviceOrientation + 360) % 360;
+
+    return jpegOrientation;
+}
+</code></pre>
+            </td>
+          </tr>
 
 
           <tr class="entry_spacer"><td class="entry_spacer" colspan="6"></td></tr>
@@ -9754,6 +10248,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -9806,6 +10302,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -9859,6 +10356,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -9904,6 +10403,8 @@
               <span class="entry_type_visibility"> [public as size]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -9917,7 +10418,7 @@
             </td>
 
             <td class="entry_range">
-              <p>Size must be one of the size from <a href="#static_android.jpeg.availableThumbnailSizes">android.<wbr/>jpeg.<wbr/>available<wbr/>Thumbnail<wbr/>Sizes</a></p>
+              <p><a href="#static_android.jpeg.availableThumbnailSizes">android.<wbr/>jpeg.<wbr/>available<wbr/>Thumbnail<wbr/>Sizes</a></p>
             </td>
 
             <td class="entry_tags">
@@ -9934,8 +10435,8 @@
             <td class="entry_details" colspan="5">
               <p>When set to (0,<wbr/> 0) value,<wbr/> the JPEG EXIF will not contain thumbnail,<wbr/>
 but the captured JPEG will still be a valid image.<wbr/></p>
-<p>When a jpeg image capture is issued,<wbr/> the thumbnail size selected should have
-the same aspect ratio as the jpeg image.<wbr/></p>
+<p>For best results,<wbr/> when issuing a request for a JPEG image,<wbr/> the thumbnail size selected
+should have the same aspect ratio as the main JPEG output.<wbr/></p>
 <p>If the thumbnail image aspect ratio differs from the JPEG primary image aspect
 ratio,<wbr/> the camera device creates the thumbnail by cropping it from the primary image.<wbr/>
 For example,<wbr/> if the primary image has 4:3 aspect ratio,<wbr/> the thumbnail image has
@@ -10004,18 +10505,20 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>The ratio of lens focal length to the effective
-aperture diameter.<wbr/></p>
+              <p>The desired lens aperture size,<wbr/> as a ratio of lens focal length to the
+effective aperture diameter.<wbr/></p>
             </td>
 
             <td class="entry_units">
-              f-number (f/<wbr/>NNN)
+              The f-number (f/<wbr/>N)
             </td>
 
             <td class="entry_range">
@@ -10034,9 +10537,8 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>This will only be supported on the camera devices that
-have variable aperture lens.<wbr/> The aperture value can only be
-one of the values listed in <a href="#static_android.lens.info.availableApertures">android.<wbr/>lens.<wbr/>info.<wbr/>available<wbr/>Apertures</a>.<wbr/></p>
+              <p>Setting this value is only supported on the camera devices that have a variable
+aperture lens.<wbr/></p>
 <p>When this is supported and <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> is OFF,<wbr/>
 this can be set along with <a href="#controls_android.sensor.exposureTime">android.<wbr/>sensor.<wbr/>exposure<wbr/>Time</a>,<wbr/>
 <a href="#controls_android.sensor.sensitivity">android.<wbr/>sensor.<wbr/>sensitivity</a>,<wbr/> and <a href="#controls_android.sensor.frameDuration">android.<wbr/>sensor.<wbr/>frame<wbr/>Duration</a>
@@ -10068,17 +10570,19 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>State of lens neutral density filter(s).<wbr/></p>
+              <p>The desired setting for the lens neutral density filter(s).<wbr/></p>
             </td>
 
             <td class="entry_units">
-              Steps of Exposure Value (EV).<wbr/>
+              Exposure Value (EV)
             </td>
 
             <td class="entry_range">
@@ -10097,9 +10601,7 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>This will not be supported on most camera devices.<wbr/> On devices
-where this is supported,<wbr/> this may only be set to one of the
-values included in <a href="#static_android.lens.info.availableFilterDensities">android.<wbr/>lens.<wbr/>info.<wbr/>available<wbr/>Filter<wbr/>Densities</a>.<wbr/></p>
+              <p>This control will not be supported on most camera devices.<wbr/></p>
 <p>Lens filters are typically used to lower the amount of light the
 sensor is exposed to (measured in steps of EV).<wbr/> As used here,<wbr/> an EV
 step is the standard logarithmic representation,<wbr/> which are
@@ -10130,17 +10632,19 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>The current lens focal length; used for optical zoom.<wbr/></p>
+              <p>The desired lens focal length; used for optical zoom.<wbr/></p>
             </td>
 
             <td class="entry_units">
-              focal length in mm
+              Millimeters
             </td>
 
             <td class="entry_range">
@@ -10167,7 +10671,7 @@
 frames before the lens can change to the requested focal length.<wbr/>
 While the focal length is still changing,<wbr/> <a href="#dynamic_android.lens.state">android.<wbr/>lens.<wbr/>state</a> will
 be set to MOVING.<wbr/></p>
-<p>This is expected not to be supported on most devices.<wbr/></p>
+<p>Optical zoom will not be supported on most devices.<wbr/></p>
             </td>
           </tr>
 
@@ -10187,18 +10691,20 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Distance to plane of sharpest focus,<wbr/>
+              <p>Desired distance to plane of sharpest focus,<wbr/>
 measured from frontmost surface of the lens.<wbr/></p>
             </td>
 
             <td class="entry_units">
-              See android.<wbr/>lens.<wbr/>info.<wbr/>focus<wbr/>Distance<wbr/>Calibration for details.<wbr/>
+              See android.<wbr/>lens.<wbr/>info.<wbr/>focus<wbr/>Distance<wbr/>Calibration for details
             </td>
 
             <td class="entry_range">
@@ -10218,12 +10724,17 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>0 means infinity focus.<wbr/> Used value will be clamped
-to [0,<wbr/> <a href="#static_android.lens.info.minimumFocusDistance">android.<wbr/>lens.<wbr/>info.<wbr/>minimum<wbr/>Focus<wbr/>Distance</a>].<wbr/></p>
+              <p>This control can be used for setting manual focus,<wbr/> on devices that support
+the MANUAL_<wbr/>SENSOR capability and have a variable-focus lens (see
+<a href="#static_android.lens.info.minimumFocusDistance">android.<wbr/>lens.<wbr/>info.<wbr/>minimum<wbr/>Focus<wbr/>Distance</a>).<wbr/></p>
+<p>A value of <code>0.<wbr/>0f</code> means infinity focus.<wbr/> The value set will be clamped to
+<code>[0.<wbr/>0f,<wbr/> <a href="#static_android.lens.info.minimumFocusDistance">android.<wbr/>lens.<wbr/>info.<wbr/>minimum<wbr/>Focus<wbr/>Distance</a>]</code>.<wbr/></p>
 <p>Like <a href="#controls_android.lens.focalLength">android.<wbr/>lens.<wbr/>focal<wbr/>Length</a>,<wbr/> this setting won't be applied
 instantaneously,<wbr/> and it may take several frames before the lens
 can move to the requested focus distance.<wbr/> While the lens is still moving,<wbr/>
 <a href="#dynamic_android.lens.state">android.<wbr/>lens.<wbr/>state</a> will be set to MOVING.<wbr/></p>
+<p>LEGACY devices support at most setting this to <code>0.<wbr/>0f</code>
+for infinity focus.<wbr/></p>
             </td>
           </tr>
 
@@ -10243,6 +10754,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[limited] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -10294,9 +10807,9 @@
 capture result metadata.<wbr/> For example,<wbr/> When "ON" mode is requested,<wbr/> the
 optical stabilization modes in the first several capture results may still
 be "OFF",<wbr/> and it will become "ON" when the initialization is done.<wbr/></p>
-<p>If a camera device supports both OIS and EIS (<a href="#controls_android.control.videoStabilizationMode">android.<wbr/>control.<wbr/>video<wbr/>Stabilization<wbr/>Mode</a>),<wbr/>
-turning both modes on may produce undesirable interaction,<wbr/> so it is recommended not
-to enable both at the same time.<wbr/></p>
+<p>If a camera device supports both OIS and digital image stabilization
+(<a href="#controls_android.control.videoStabilizationMode">android.<wbr/>control.<wbr/>video<wbr/>Stabilization<wbr/>Mode</a>),<wbr/> turning both modes on may produce undesirable
+interaction,<wbr/> so it is recommended not to enable both at the same time.<wbr/></p>
 <p>Not all devices will support OIS; see
 <a href="#static_android.lens.info.availableOpticalStabilization">android.<wbr/>lens.<wbr/>info.<wbr/>available<wbr/>Optical<wbr/>Stabilization</a> for
 available controls.<wbr/></p>
@@ -10352,21 +10865,23 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>List of supported aperture
-values.<wbr/></p>
+              <p>List of aperture size values for <a href="#controls_android.lens.aperture">android.<wbr/>lens.<wbr/>aperture</a> that are
+supported by this camera device.<wbr/></p>
             </td>
 
             <td class="entry_units">
+              The aperture f-number
             </td>
 
             <td class="entry_range">
-              <p>one entry required,<wbr/> &gt; 0</p>
             </td>
 
             <td class="entry_tags">
@@ -10381,9 +10896,9 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>If the camera device doesn't support variable apertures,<wbr/>
-listed value will be the fixed aperture.<wbr/></p>
-<p>If the camera device supports variable apertures,<wbr/> the aperture value
+              <p>If the camera device doesn't support a variable lens aperture,<wbr/>
+this list will contain only one value,<wbr/> which is the fixed aperture size.<wbr/></p>
+<p>If the camera device supports a variable aperture,<wbr/> the aperture values
 in this list will be sorted in ascending order.<wbr/></p>
             </td>
           </tr>
@@ -10408,21 +10923,24 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>List of supported neutral density filter values for
-<a href="#controls_android.lens.filterDensity">android.<wbr/>lens.<wbr/>filter<wbr/>Density</a>.<wbr/></p>
+              <p>List of neutral density filter values for
+<a href="#controls_android.lens.filterDensity">android.<wbr/>lens.<wbr/>filter<wbr/>Density</a> that are supported by this camera device.<wbr/></p>
             </td>
 
             <td class="entry_units">
+              Exposure value (EV)
             </td>
 
             <td class="entry_range">
-              <p>At least one value is required.<wbr/> Values must be &gt;= 0.<wbr/></p>
+              <p>Values are &gt;= 0</p>
             </td>
 
             <td class="entry_tags">
@@ -10437,10 +10955,9 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>If changing <a href="#controls_android.lens.filterDensity">android.<wbr/>lens.<wbr/>filter<wbr/>Density</a> is not supported,<wbr/>
-availableFilterDensities must contain only 0.<wbr/> Otherwise,<wbr/> this
-list contains only the exact filter density values available on
-this camera device.<wbr/></p>
+              <p>If a neutral density filter is not supported by this camera device,<wbr/>
+this list will contain only 0.<wbr/> Otherwise,<wbr/> this list will include every
+filter density supported by the camera device,<wbr/> in ascending order.<wbr/></p>
             </td>
           </tr>
 
@@ -10464,6 +10981,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
                 <div class="entry_type_notes">The list of available focal lengths</div>
 
@@ -10471,16 +10990,16 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>The available focal lengths for this device for use with
-<a href="#controls_android.lens.focalLength">android.<wbr/>lens.<wbr/>focal<wbr/>Length</a>.<wbr/></p>
+              <p>List of focal lengths for <a href="#controls_android.lens.focalLength">android.<wbr/>lens.<wbr/>focal<wbr/>Length</a> that are supported by this camera
+device.<wbr/></p>
             </td>
 
             <td class="entry_units">
+              Millimeters
             </td>
 
             <td class="entry_range">
-              <p>Each value in this list must be &gt; 0.<wbr/> This list must
-contain at least one value.<wbr/></p>
+              <p>Values are &gt; 0</p>
             </td>
 
             <td class="entry_tags">
@@ -10496,10 +11015,10 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>If optical zoom is not supported,<wbr/> this will only report
-a single value corresponding to the static focal length of the
-device.<wbr/> Otherwise,<wbr/> this will report every focal length supported
-by the device.<wbr/></p>
+              <p>If optical zoom is not supported,<wbr/> this list will only contain
+a single value corresponding to the fixed focal length of the
+device.<wbr/> Otherwise,<wbr/> this list will include every focal length supported
+by the camera device,<wbr/> in ascending order.<wbr/></p>
             </td>
           </tr>
 
@@ -10523,6 +11042,8 @@
               <span class="entry_type_visibility"> [public as enumList]</span>
 
 
+              <span class="entry_type_hwlevel">[limited] </span>
+
 
                 <div class="entry_type_notes">list of enums</div>
 
@@ -10530,15 +11051,15 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>List containing a subset of the optical image
-stabilization (OIS) modes specified in
-<a href="#controls_android.lens.opticalStabilizationMode">android.<wbr/>lens.<wbr/>optical<wbr/>Stabilization<wbr/>Mode</a>.<wbr/></p>
+              <p>List of optical image stabilization (OIS) modes for
+<a href="#controls_android.lens.opticalStabilizationMode">android.<wbr/>lens.<wbr/>optical<wbr/>Stabilization<wbr/>Mode</a> that are supported by this camera device.<wbr/></p>
             </td>
 
             <td class="entry_units">
             </td>
 
             <td class="entry_range">
+              <p>Any value listed in <a href="#controls_android.lens.opticalStabilizationMode">android.<wbr/>lens.<wbr/>optical<wbr/>Stabilization<wbr/>Mode</a></p>
             </td>
 
             <td class="entry_tags">
@@ -10553,7 +11074,7 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>If OIS is not implemented for a given camera device,<wbr/> this will
+              <p>If OIS is not supported by a given camera device,<wbr/> this list will
 contain only OFF.<wbr/></p>
             </td>
           </tr>
@@ -10574,22 +11095,24 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[limited] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Optional.<wbr/> Hyperfocal distance for this lens.<wbr/></p>
+              <p>Hyperfocal distance for this lens.<wbr/></p>
             </td>
 
             <td class="entry_units">
-              See android.<wbr/>lens.<wbr/>info.<wbr/>focus<wbr/>Distance<wbr/>Calibration for details.<wbr/>
+              See android.<wbr/>lens.<wbr/>info.<wbr/>focus<wbr/>Distance<wbr/>Calibration for details
             </td>
 
             <td class="entry_range">
-              <p>If lens is fixed focus,<wbr/> &gt;= 0.<wbr/> If lens has focuser unit,<wbr/> the range is
-<code>(0,<wbr/> <a href="#static_android.lens.info.minimumFocusDistance">android.<wbr/>lens.<wbr/>info.<wbr/>minimum<wbr/>Focus<wbr/>Distance</a>]</code></p>
+              <p>If lens is fixed focus,<wbr/> &gt;= 0.<wbr/> If lens has focuser unit,<wbr/> the value is
+within <code>(0.<wbr/>0f,<wbr/> <a href="#static_android.lens.info.minimumFocusDistance">android.<wbr/>lens.<wbr/>info.<wbr/>minimum<wbr/>Focus<wbr/>Distance</a>]</code></p>
             </td>
 
             <td class="entry_tags">
@@ -10622,6 +11145,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[limited] </span>
+
 
 
 
@@ -10629,11 +11154,11 @@
 
             <td class="entry_description">
               <p>Shortest distance from frontmost surface
-of the lens that can be focused correctly.<wbr/></p>
+of the lens that can be brought into sharp focus.<wbr/></p>
             </td>
 
             <td class="entry_units">
-              See android.<wbr/>lens.<wbr/>info.<wbr/>focus<wbr/>Distance<wbr/>Calibration for details.<wbr/>
+              See android.<wbr/>lens.<wbr/>info.<wbr/>focus<wbr/>Distance<wbr/>Calibration for details
             </td>
 
             <td class="entry_range">
@@ -10652,7 +11177,7 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>If the lens is fixed-focus,<wbr/> this should be
+              <p>If the lens is fixed-focus,<wbr/> this will be
 0.<wbr/></p>
             </td>
           </tr>
@@ -10689,6 +11214,8 @@
               <span class="entry_type_visibility"> [hidden as size]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
                 <div class="entry_type_notes">width and height (N,<wbr/> M) of lens shading map provided by the camera device.<wbr/></div>
 
@@ -10739,6 +11266,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[limited] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -10802,6 +11331,15 @@
 focus related metadata entries,<wbr/> i.<wbr/>e.<wbr/> <a href="#controls_android.lens.focusDistance">android.<wbr/>lens.<wbr/>focus<wbr/>Distance</a>,<wbr/>
 <a href="#dynamic_android.lens.focusRange">android.<wbr/>lens.<wbr/>focus<wbr/>Range</a>,<wbr/> <a href="#static_android.lens.info.hyperfocalDistance">android.<wbr/>lens.<wbr/>info.<wbr/>hyperfocal<wbr/>Distance</a>,<wbr/> and
 <a href="#static_android.lens.info.minimumFocusDistance">android.<wbr/>lens.<wbr/>info.<wbr/>minimum<wbr/>Focus<wbr/>Distance</a>.<wbr/></p>
+<p>APPROXIMATE and CALIBRATED devices report the focus metadata in
+units of diopters (1/<wbr/>meter),<wbr/> so <code>0.<wbr/>0f</code> represents focusing at infinity,<wbr/>
+and increasing positive numbers represent focusing closer and closer
+to the camera device.<wbr/> The focus distance control also uses diopters
+on these devices.<wbr/></p>
+<p>UNCALIBRATED devices do not use units that are directly comparable
+to any real physical measurement,<wbr/> but <code>0.<wbr/>0f</code> still represents farthest
+focus,<wbr/> and <a href="#static_android.lens.info.minimumFocusDistance">android.<wbr/>lens.<wbr/>info.<wbr/>minimum<wbr/>Focus<wbr/>Distance</a> represents the
+nearest focus the device can achieve.<wbr/></p>
             </td>
           </tr>
 
@@ -10838,6 +11376,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -10890,6 +11430,7 @@
 
 
 
+
                 <div class="entry_type_notes">degrees.<wbr/> First defines the angle of separation between the perpendicular to the screen and the camera optical axis.<wbr/> The second then defines the clockwise rotation of the optical axis from native device up.<wbr/></div>
 
 
@@ -10955,6 +11496,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -11019,18 +11561,20 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>The ratio of lens focal length to the effective
-aperture diameter.<wbr/></p>
+              <p>The desired lens aperture size,<wbr/> as a ratio of lens focal length to the
+effective aperture diameter.<wbr/></p>
             </td>
 
             <td class="entry_units">
-              f-number (f/<wbr/>NNN)
+              The f-number (f/<wbr/>N)
             </td>
 
             <td class="entry_range">
@@ -11049,9 +11593,8 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>This will only be supported on the camera devices that
-have variable aperture lens.<wbr/> The aperture value can only be
-one of the values listed in <a href="#static_android.lens.info.availableApertures">android.<wbr/>lens.<wbr/>info.<wbr/>available<wbr/>Apertures</a>.<wbr/></p>
+              <p>Setting this value is only supported on the camera devices that have a variable
+aperture lens.<wbr/></p>
 <p>When this is supported and <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> is OFF,<wbr/>
 this can be set along with <a href="#controls_android.sensor.exposureTime">android.<wbr/>sensor.<wbr/>exposure<wbr/>Time</a>,<wbr/>
 <a href="#controls_android.sensor.sensitivity">android.<wbr/>sensor.<wbr/>sensitivity</a>,<wbr/> and <a href="#controls_android.sensor.frameDuration">android.<wbr/>sensor.<wbr/>frame<wbr/>Duration</a>
@@ -11083,17 +11626,19 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>State of lens neutral density filter(s).<wbr/></p>
+              <p>The desired setting for the lens neutral density filter(s).<wbr/></p>
             </td>
 
             <td class="entry_units">
-              Steps of Exposure Value (EV).<wbr/>
+              Exposure Value (EV)
             </td>
 
             <td class="entry_range">
@@ -11112,9 +11657,7 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>This will not be supported on most camera devices.<wbr/> On devices
-where this is supported,<wbr/> this may only be set to one of the
-values included in <a href="#static_android.lens.info.availableFilterDensities">android.<wbr/>lens.<wbr/>info.<wbr/>available<wbr/>Filter<wbr/>Densities</a>.<wbr/></p>
+              <p>This control will not be supported on most camera devices.<wbr/></p>
 <p>Lens filters are typically used to lower the amount of light the
 sensor is exposed to (measured in steps of EV).<wbr/> As used here,<wbr/> an EV
 step is the standard logarithmic representation,<wbr/> which are
@@ -11145,17 +11688,19 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>The current lens focal length; used for optical zoom.<wbr/></p>
+              <p>The desired lens focal length; used for optical zoom.<wbr/></p>
             </td>
 
             <td class="entry_units">
-              focal length in mm
+              Millimeters
             </td>
 
             <td class="entry_range">
@@ -11182,7 +11727,7 @@
 frames before the lens can change to the requested focal length.<wbr/>
 While the focal length is still changing,<wbr/> <a href="#dynamic_android.lens.state">android.<wbr/>lens.<wbr/>state</a> will
 be set to MOVING.<wbr/></p>
-<p>This is expected not to be supported on most devices.<wbr/></p>
+<p>Optical zoom will not be supported on most devices.<wbr/></p>
             </td>
           </tr>
 
@@ -11202,18 +11747,20 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Distance to plane of sharpest focus,<wbr/>
+              <p>Desired distance to plane of sharpest focus,<wbr/>
 measured from frontmost surface of the lens.<wbr/></p>
             </td>
 
             <td class="entry_units">
-              See android.<wbr/>lens.<wbr/>info.<wbr/>focus<wbr/>Distance<wbr/>Calibration for details.<wbr/>
+              See android.<wbr/>lens.<wbr/>info.<wbr/>focus<wbr/>Distance<wbr/>Calibration for details
             </td>
 
             <td class="entry_range">
@@ -11256,6 +11803,8 @@
               <span class="entry_type_visibility"> [public as pairFloatFloat]</span>
 
 
+              <span class="entry_type_hwlevel">[limited] </span>
+
 
                 <div class="entry_type_notes">Range of scene distances that are in focus</div>
 
@@ -11268,8 +11817,8 @@
             </td>
 
             <td class="entry_units">
-              pair of focus distances in diopters: (near,<wbr/>
-          far),<wbr/> see android.<wbr/>lens.<wbr/>info.<wbr/>focus<wbr/>Distance<wbr/>Calibration for details.<wbr/>
+              A pair of focus distances in diopters: (near,<wbr/>
+          far); see android.<wbr/>lens.<wbr/>info.<wbr/>focus<wbr/>Distance<wbr/>Calibration for details.<wbr/>
             </td>
 
             <td class="entry_range">
@@ -11309,6 +11858,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[limited] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -11360,9 +11911,9 @@
 capture result metadata.<wbr/> For example,<wbr/> When "ON" mode is requested,<wbr/> the
 optical stabilization modes in the first several capture results may still
 be "OFF",<wbr/> and it will become "ON" when the initialization is done.<wbr/></p>
-<p>If a camera device supports both OIS and EIS (<a href="#controls_android.control.videoStabilizationMode">android.<wbr/>control.<wbr/>video<wbr/>Stabilization<wbr/>Mode</a>),<wbr/>
-turning both modes on may produce undesirable interaction,<wbr/> so it is recommended not
-to enable both at the same time.<wbr/></p>
+<p>If a camera device supports both OIS and digital image stabilization
+(<a href="#controls_android.control.videoStabilizationMode">android.<wbr/>control.<wbr/>video<wbr/>Stabilization<wbr/>Mode</a>),<wbr/> turning both modes on may produce undesirable
+interaction,<wbr/> so it is recommended not to enable both at the same time.<wbr/></p>
 <p>Not all devices will support OIS; see
 <a href="#static_android.lens.info.availableOpticalStabilization">android.<wbr/>lens.<wbr/>info.<wbr/>available<wbr/>Optical<wbr/>Stabilization</a> for
 available controls.<wbr/></p>
@@ -11385,6 +11936,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[limited] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -11496,6 +12049,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -11525,6 +12080,7 @@
             </td>
 
             <td class="entry_range">
+              <p><a href="#static_android.noiseReduction.availableNoiseReductionModes">android.<wbr/>noise<wbr/>Reduction.<wbr/>available<wbr/>Noise<wbr/>Reduction<wbr/>Modes</a></p>
             </td>
 
             <td class="entry_tags">
@@ -11539,10 +12095,9 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Noise filtering control.<wbr/> OFF means no noise reduction
-will be applied by the camera device.<wbr/></p>
-<p>This must be set to a valid mode from
-<a href="#static_android.noiseReduction.availableNoiseReductionModes">android.<wbr/>noise<wbr/>Reduction.<wbr/>available<wbr/>Noise<wbr/>Reduction<wbr/>Modes</a>.<wbr/></p>
+              <p>The noise reduction algorithm attempts to improve image quality by removing
+excessive noise added by the capture process,<wbr/> especially in dark conditions.<wbr/>
+OFF means no noise reduction will be applied by the camera device.<wbr/></p>
 <p>FAST/<wbr/>HIGH_<wbr/>QUALITY both mean camera device determined noise filtering
 will be applied.<wbr/> HIGH_<wbr/>QUALITY mode indicates that the camera device
 will use the highest-quality noise filtering algorithms,<wbr/>
@@ -11570,6 +12125,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -11640,6 +12196,8 @@
               <span class="entry_type_visibility"> [public as enumList]</span>
 
 
+              <span class="entry_type_hwlevel">[limited] </span>
+
 
                 <div class="entry_type_notes">list of enums</div>
 
@@ -11647,13 +12205,15 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>The set of noise reduction modes supported by this camera device.<wbr/></p>
+              <p>List of noise reduction modes for <a href="#controls_android.noiseReduction.mode">android.<wbr/>noise<wbr/>Reduction.<wbr/>mode</a> that are supported
+by this camera device.<wbr/></p>
             </td>
 
             <td class="entry_units">
             </td>
 
             <td class="entry_range">
+              <p>Any value listed in <a href="#controls_android.noiseReduction.mode">android.<wbr/>noise<wbr/>Reduction.<wbr/>mode</a></p>
             </td>
 
             <td class="entry_tags">
@@ -11668,8 +12228,8 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>This tag lists the valid modes for <a href="#controls_android.noiseReduction.mode">android.<wbr/>noise<wbr/>Reduction.<wbr/>mode</a>.<wbr/></p>
-<p>Full-capability camera devices must always support OFF and FAST.<wbr/></p>
+              <p>Full-capability camera devices will always support OFF and FAST.<wbr/></p>
+<p>Legacy-capability camera devices will only support FAST mode.<wbr/></p>
             </td>
           </tr>
 
@@ -11716,6 +12276,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -11745,6 +12307,7 @@
             </td>
 
             <td class="entry_range">
+              <p><a href="#static_android.noiseReduction.availableNoiseReductionModes">android.<wbr/>noise<wbr/>Reduction.<wbr/>available<wbr/>Noise<wbr/>Reduction<wbr/>Modes</a></p>
             </td>
 
             <td class="entry_tags">
@@ -11759,10 +12322,9 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Noise filtering control.<wbr/> OFF means no noise reduction
-will be applied by the camera device.<wbr/></p>
-<p>This must be set to a valid mode from
-<a href="#static_android.noiseReduction.availableNoiseReductionModes">android.<wbr/>noise<wbr/>Reduction.<wbr/>available<wbr/>Noise<wbr/>Reduction<wbr/>Modes</a>.<wbr/></p>
+              <p>The noise reduction algorithm attempts to improve image quality by removing
+excessive noise added by the capture process,<wbr/> especially in dark conditions.<wbr/>
+OFF means no noise reduction will be applied by the camera device.<wbr/></p>
 <p>FAST/<wbr/>HIGH_<wbr/>QUALITY both mean camera device determined noise filtering
 will be applied.<wbr/> HIGH_<wbr/>QUALITY mode indicates that the camera device
 will use the highest-quality noise filtering algorithms,<wbr/>
@@ -11820,6 +12382,7 @@
               <span class="entry_type_visibility"> [system]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -11876,6 +12439,7 @@
               <span class="entry_type_visibility"> [system]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -11929,6 +12493,7 @@
               <span class="entry_type_visibility"> [system]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -11984,6 +12549,7 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -12073,6 +12639,7 @@
               <span class="entry_type_visibility"> [hidden as boolean]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -12187,6 +12754,7 @@
               <span class="entry_type_visibility"> [system]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -12233,6 +12801,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -12278,6 +12847,7 @@
               <span class="entry_type_visibility"> [system]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -12333,6 +12903,7 @@
 
 
 
+
                 <ul class="entry_type_enum">
                   <li>
                     <span class="entry_type_enum_name">NONE</span>
@@ -12395,6 +12966,7 @@
               <span class="entry_type_visibility"> [system]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -12452,6 +13024,7 @@
               <span class="entry_type_visibility"> [system]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -12540,6 +13113,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -12611,6 +13186,8 @@
 
               <span class="entry_type_synthetic">[synthetic] </span>
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -12650,6 +13227,8 @@
 <li>ImageFormat#RAW10</li>
 <li>Opaque <code>RAW</code></li>
 </ul>
+<p>LEGACY mode devices (<a href="#static_android.info.supportedHardwareLevel">android.<wbr/>info.<wbr/>supported<wbr/>Hardware<wbr/>Level</a> <code>==</code> LEGACY)
+never support raw streams.<wbr/></p>
             </td>
           </tr>
 
@@ -12670,6 +13249,8 @@
 
               <span class="entry_type_synthetic">[synthetic] </span>
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -12715,6 +13296,7 @@
 </ul>
 <p>For full guarantees,<wbr/> query StreamConfigurationMap#getOutputStallDuration with
 a processed format -- it will return 0 for a non-stalling stream.<wbr/></p>
+<p>LEGACY devices will support at least 2 processing/<wbr/>non-stalling streams.<wbr/></p>
             </td>
           </tr>
 
@@ -12735,6 +13317,8 @@
 
               <span class="entry_type_synthetic">[synthetic] </span>
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -12769,9 +13353,10 @@
 CPU resources that will consume more power.<wbr/> The image format for this kind of an output stream can
 be any non-<code>RAW</code> and supported format provided by <a href="#static_android.scaler.streamConfigurationMap">android.<wbr/>scaler.<wbr/>stream<wbr/>Configuration<wbr/>Map</a>.<wbr/></p>
 <p>A processed and stalling format is defined as any non-RAW format with a stallDurations &gt; 0.<wbr/>
-Typically only the <code>JPEG</code> format (ImageFormat#JPEG)</p>
+Typically only the <code>JPEG</code> format (ImageFormat#JPEG) is a stalling format.<wbr/></p>
 <p>For full guarantees,<wbr/> query StreamConfigurationMap#getOutputStallDuration with
 a processed format -- it will return a non-0 value for a stalling stream.<wbr/></p>
+<p>LEGACY devices will support up to 1 processing/<wbr/>stalling stream.<wbr/></p>
             </td>
           </tr>
 
@@ -12796,6 +13381,7 @@
               <span class="entry_type_visibility"> [system]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -12848,6 +13434,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
@@ -12902,6 +13490,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -12969,6 +13559,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -13027,6 +13618,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -13163,7 +13756,7 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>List of capabilities that the camera device
+              <p>List of capabilities that this camera device
 advertises as fully supporting.<wbr/></p>
             </td>
 
@@ -13198,7 +13791,7 @@
 <li>MANUAL_<wbr/>POST_<wbr/>PROCESSING</li>
 </ul>
 <p>Other capabilities may be available on either FULL or LIMITED
-devices,<wbr/> but the application should query this field to be sure.<wbr/></p>
+devices,<wbr/> but the application should query this key to be sure.<wbr/></p>
             </td>
           </tr>
 
@@ -13245,6 +13838,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -13315,6 +13910,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -13342,13 +13939,13 @@
             <td class="entry_details" colspan="5">
               <p>Attempting to get a key from a CaptureResult that is not
 listed here will always return a <code>null</code> value.<wbr/> Getting a key from
-a CaptureResult that is listed here must never return a <code>null</code>
+a CaptureResult that is listed here will generally never return a <code>null</code>
 value.<wbr/></p>
 <p>The following keys may return <code>null</code> unless they are enabled:</p>
 <ul>
 <li><a href="#dynamic_android.statistics.lensShadingMap">android.<wbr/>statistics.<wbr/>lens<wbr/>Shading<wbr/>Map</a> (non-null iff <a href="#controls_android.statistics.lensShadingMapMode">android.<wbr/>statistics.<wbr/>lens<wbr/>Shading<wbr/>Map<wbr/>Mode</a> == ON)</li>
 </ul>
-<p>(Those sometimes-null keys should nevertheless be listed here
+<p>(Those sometimes-null keys will nevertheless be listed here
 if they are available.<wbr/>)</p>
 <p>This field can be used to query the feature set of a camera device
 at a more granular level than capabilities.<wbr/> This is especially
@@ -13395,6 +13992,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -13432,7 +14031,7 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Tags listed here must always have an entry in the static info metadata,<wbr/>
+              <p>Keys listed here must always have an entry in the static info metadata,<wbr/>
 even if that size is 0 elements.<wbr/> Only array-type tags (e.<wbr/>g.<wbr/> lists,<wbr/>
 matrices,<wbr/> strings) are allowed to have 0 elements.<wbr/></p>
 <p>Vendor tags must not be listed here.<wbr/> Use the vendor tag metadata
@@ -13489,6 +14088,7 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -13542,6 +14142,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -13584,6 +14185,7 @@
 
 
 
+
                 <ul class="entry_type_enum">
                   <li>
                     <span class="entry_type_enum_name">NONE</span>
@@ -13646,6 +14248,7 @@
               <span class="entry_type_visibility"> [system]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -13702,6 +14305,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -13797,18 +14402,19 @@
               <span class="entry_type_visibility"> [public as rectangle]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>The region of the sensor to read out for this capture.<wbr/></p>
+              <p>The desired region of the sensor to read out for this capture.<wbr/></p>
             </td>
 
             <td class="entry_units">
-              (x,<wbr/>y) of top-left corner,<wbr/> width and height of region
-          in pixels; (0,<wbr/>0) is top-left corner of
+              Pixel coordinates relative to
           android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size
             </td>
 
@@ -13827,7 +14433,8 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>The crop region coordinate system is based off
+              <p>This control can be used to implement digital zoom.<wbr/></p>
+<p>The crop region coordinate system is based off
 <a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a>,<wbr/> with <code>(0,<wbr/> 0)</code> being the
 top-left corner of the sensor active array.<wbr/></p>
 <p>Output streams use this rectangle to produce their output,<wbr/>
@@ -13923,6 +14530,7 @@
               <span class="entry_type_visibility"> [hidden as imageFormat]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -14069,6 +14677,7 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -14081,7 +14690,7 @@
             </td>
 
             <td class="entry_units">
-              ns
+              Nanoseconds
             </td>
 
             <td class="entry_range">
@@ -14131,6 +14740,7 @@
               <span class="entry_type_visibility"> [hidden as size]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -14183,7 +14793,7 @@
                 
           <tr class="entry" id="static_android.scaler.availableMaxDigitalZoom">
             <td class="entry_name
-             " rowspan="1">
+             " rowspan="3">
               android.<wbr/>scaler.<wbr/>available<wbr/>Max<wbr/>Digital<wbr/>Zoom
             </td>
             <td class="entry_type">
@@ -14192,6 +14802,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -14200,16 +14812,11 @@
             <td class="entry_description">
               <p>The maximum ratio between both active area width
 and crop region width,<wbr/> and active area height and
-crop region height.<wbr/></p>
-<p>This represents the maximum amount of zooming possible by
-the camera device,<wbr/> or equivalently,<wbr/> the minimum cropping
-window size.<wbr/></p>
-<p>Crop regions that have a width or height that is smaller
-than this ratio allows will be rounded up to the minimum
-allowed size by the camera device.<wbr/></p>
+crop region height,<wbr/> for <a href="#controls_android.scaler.cropRegion">android.<wbr/>scaler.<wbr/>crop<wbr/>Region</a>.<wbr/></p>
             </td>
 
             <td class="entry_units">
+              Zoom scale factor
             </td>
 
             <td class="entry_range">
@@ -14223,6 +14830,19 @@
             </td>
 
           </tr>
+          <tr class="entries_header">
+            <th class="th_details" colspan="5">Details</th>
+          </tr>
+          <tr class="entry_cont">
+            <td class="entry_details" colspan="5">
+              <p>This represents the maximum amount of zooming possible by
+the camera device,<wbr/> or equivalently,<wbr/> the minimum cropping
+window size.<wbr/></p>
+<p>Crop regions that have a width or height that is smaller
+than this ratio allows will be rounded up to the minimum
+allowed size by the camera device.<wbr/></p>
+            </td>
+          </tr>
 
 
           <tr class="entry_spacer"><td class="entry_spacer" colspan="6"></td></tr>
@@ -14245,6 +14865,7 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -14258,12 +14879,11 @@
             </td>
 
             <td class="entry_units">
-              ns
+              Nanoseconds
             </td>
 
             <td class="entry_range">
               <p><span class="entry_range_deprecated">Deprecated</span>. Do not use.</p>
-              <p>TODO: Remove property.<wbr/></p>
             </td>
 
             <td class="entry_tags">
@@ -14307,6 +14927,7 @@
               <span class="entry_type_visibility"> [hidden as size]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -14325,7 +14946,6 @@
 
             <td class="entry_range">
               <p><span class="entry_range_deprecated">Deprecated</span>. Do not use.</p>
-              <p>TODO: Remove property.<wbr/></p>
             </td>
 
             <td class="entry_tags">
@@ -14392,6 +15012,7 @@
               <span class="entry_type_visibility"> [system]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -14405,12 +15026,11 @@
             </td>
 
             <td class="entry_units">
-              ns
+              Nanoseconds
             </td>
 
             <td class="entry_range">
               <p><span class="entry_range_deprecated">Deprecated</span>. Do not use.</p>
-              <p>TODO: Remove property.<wbr/></p>
             </td>
 
             <td class="entry_tags">
@@ -14454,6 +15074,7 @@
               <span class="entry_type_visibility"> [system as size]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
 
@@ -14471,8 +15092,6 @@
 
             <td class="entry_range">
               <p><span class="entry_range_deprecated">Deprecated</span>. Do not use.</p>
-              <p>TODO: Remove property.<wbr/>
-Must include: - sensor maximum resolution.<wbr/></p>
             </td>
 
             <td class="entry_tags">
@@ -14500,6 +15119,8 @@
               <span class="entry_type_visibility"> [hidden as imageFormat]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
@@ -14638,6 +15259,8 @@
               <span class="entry_type_visibility"> [hidden as streamConfiguration]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -14823,6 +15446,8 @@
               <span class="entry_type_visibility"> [hidden as streamConfigurationDuration]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -14887,6 +15512,8 @@
               <span class="entry_type_visibility"> [hidden as streamConfigurationDuration]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -15001,6 +15628,8 @@
 
               <span class="entry_type_synthetic">[synthetic] </span>
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -15163,6 +15792,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -15206,7 +15837,7 @@
 is inside of the active array.<wbr/> The camera device will apply the same crop region and
 return the final used crop region in capture result metadata <a href="#controls_android.scaler.cropRegion">android.<wbr/>scaler.<wbr/>crop<wbr/>Region</a>.<wbr/></p>
 <p>FULL capability devices (<a href="#static_android.info.supportedHardwareLevel">android.<wbr/>info.<wbr/>supported<wbr/>Hardware<wbr/>Level</a> <code>==</code> FULL) will support
-FREEFORM cropping.<wbr/></p>
+FREEFORM cropping.<wbr/> LEGACY capability devices will only support CENTER_<wbr/>ONLY cropping.<wbr/></p>
             </td>
           </tr>
 
@@ -15257,18 +15888,19 @@
               <span class="entry_type_visibility"> [public as rectangle]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>The region of the sensor to read out for this capture.<wbr/></p>
+              <p>The desired region of the sensor to read out for this capture.<wbr/></p>
             </td>
 
             <td class="entry_units">
-              (x,<wbr/>y) of top-left corner,<wbr/> width and height of region
-          in pixels; (0,<wbr/>0) is top-left corner of
+              Pixel coordinates relative to
           android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size
             </td>
 
@@ -15287,7 +15919,8 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>The crop region coordinate system is based off
+              <p>This control can be used to implement digital zoom.<wbr/></p>
+<p>The crop region coordinate system is based off
 <a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a>,<wbr/> with <code>(0,<wbr/> 0)</code> being the
 top-left corner of the sensor active array.<wbr/></p>
 <p>Output streams use this rectangle to produce their output,<wbr/>
@@ -15383,6 +16016,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
@@ -15394,7 +16029,7 @@
             </td>
 
             <td class="entry_units">
-              nanoseconds
+              Nanoseconds
             </td>
 
             <td class="entry_range">
@@ -15413,8 +16048,11 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>If the sensor can't expose this exact duration,<wbr/> it should shorten the
-duration exposed to the nearest possible value (rather than expose longer).<wbr/></p>
+              <p>If the sensor can't expose this exact duration,<wbr/> it will shorten the
+duration exposed to the nearest possible value (rather than expose longer).<wbr/>
+The final exposure time used will be available in the output capture result.<wbr/></p>
+<p>This control is only effective if <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> or <a href="#controls_android.control.mode">android.<wbr/>control.<wbr/>mode</a> is set to
+OFF; otherwise the auto-exposure algorithm will override this value.<wbr/></p>
             </td>
           </tr>
 
@@ -15434,6 +16072,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
@@ -15445,7 +16085,7 @@
             </td>
 
             <td class="entry_units">
-              nanoseconds
+              Nanoseconds
             </td>
 
             <td class="entry_range">
@@ -15535,6 +16175,8 @@
 delivered.<wbr/></p>
 <p>For more details about stalling,<wbr/> see
 StreamConfigurationMap#getOutputStallDuration(int,<wbr/>Size).<wbr/></p>
+<p>This control is only effective if <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> or <a href="#controls_android.control.mode">android.<wbr/>control.<wbr/>mode</a> is set to
+OFF; otherwise the auto-exposure algorithm will override this value.<wbr/></p>
             </td>
           </tr>
 
@@ -15563,6 +16205,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
@@ -15636,6 +16280,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -15647,9 +16292,6 @@
             </td>
 
             <td class="entry_range">
-              <p>Optional.<wbr/>
-Must be supported if <a href="#static_android.sensor.availableTestPatternModes">android.<wbr/>sensor.<wbr/>available<wbr/>Test<wbr/>Pattern<wbr/>Modes</a> contains
-SOLID_<wbr/>COLOR.<wbr/></p>
             </td>
 
             <td class="entry_tags">
@@ -15696,6 +16338,7 @@
 
 
 
+
                 <ul class="entry_type_enum">
                   <li>
                     <span class="entry_type_enum_name">OFF</span>
@@ -15799,8 +16442,7 @@
             </td>
 
             <td class="entry_range">
-              <p>Optional.<wbr/> Defaults to OFF.<wbr/> Value must be one of
-<a href="#static_android.sensor.availableTestPatternModes">android.<wbr/>sensor.<wbr/>available<wbr/>Test<wbr/>Pattern<wbr/>Modes</a></p>
+              <p><a href="#static_android.sensor.availableTestPatternModes">android.<wbr/>sensor.<wbr/>available<wbr/>Test<wbr/>Pattern<wbr/>Modes</a></p>
             </td>
 
             <td class="entry_tags">
@@ -15818,6 +16460,7 @@
 <p>For example,<wbr/> if manual flash is enabled,<wbr/> flash firing should still
 occur (and that the test pattern remain unmodified,<wbr/> since the flash
 would not actually affect it).<wbr/></p>
+<p>Defaults to OFF.<wbr/></p>
             </td>
           </tr>
 
@@ -15869,7 +16512,7 @@
                 
           <tr class="entry" id="static_android.sensor.info.activeArraySize">
             <td class="entry_name
-             " rowspan="3">
+             " rowspan="5">
               android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size
             </td>
             <td class="entry_type">
@@ -15882,6 +16525,8 @@
               <span class="entry_type_visibility"> [public as rectangle]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
                 <div class="entry_type_notes">Four ints defining the active pixel rectangle</div>
 
@@ -15889,17 +16534,16 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Area of raw data which corresponds to only
+              <p>The area of the image sensor which corresponds to
 active pixels.<wbr/></p>
             </td>
 
             <td class="entry_units">
+              Pixel coordinates on the image sensor
             </td>
 
             <td class="entry_range">
-              <p>This array contains <code>(xmin,<wbr/> ymin,<wbr/> width,<wbr/> height)</code>.<wbr/> The <code>(xmin,<wbr/> ymin)</code> must be
-&gt;= <code>(0,<wbr/>0)</code>.<wbr/> The <code>(width,<wbr/> height)</code> must be &lt;=
-<code><a href="#static_android.sensor.info.pixelArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>pixel<wbr/>Array<wbr/>Size</a></code>.<wbr/></p>
+              
             </td>
 
             <td class="entry_tags">
@@ -15914,11 +16558,29 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>It is smaller or equal to
-sensor full pixel array,<wbr/> which could include the black calibration pixels.<wbr/></p>
+              <p>This is the region of the sensor that actually receives light from the scene.<wbr/>
+Therefore,<wbr/> the size of this region determines the maximum field of view and the maximum
+number of pixels that an image from this sensor can contain.<wbr/></p>
+<p>The rectangle is defined in terms of the full pixel array; (0,<wbr/>0) is the top-left of the
+full pixel array,<wbr/> and the size of the full pixel array is given by
+<a href="#static_android.sensor.info.pixelArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>pixel<wbr/>Array<wbr/>Size</a>.<wbr/></p>
+<p>Most other keys listing pixel coordinates have their coordinate systems based on the
+active array,<wbr/> with <code>(0,<wbr/> 0)</code> being the top-left of the active array rectangle.<wbr/></p>
+<p>The active array may be smaller than the full pixel array,<wbr/> since the full array may
+include black calibration pixels or other inactive regions.<wbr/></p>
             </td>
           </tr>
 
+          <tr class="entries_header">
+            <th class="th_details" colspan="5">HAL Implementation Details</th>
+          </tr>
+          <tr class="entry_cont">
+            <td class="entry_details" colspan="5">
+              <p>This array contains <code>(xmin,<wbr/> ymin,<wbr/> width,<wbr/> height)</code>.<wbr/> The <code>(xmin,<wbr/> ymin)</code> must be
+&gt;= <code>(0,<wbr/>0)</code>.<wbr/>
+The <code>(width,<wbr/> height)</code> must be &lt;= <code><a href="#static_android.sensor.info.pixelArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>pixel<wbr/>Array<wbr/>Size</a></code>.<wbr/></p>
+            </td>
+          </tr>
 
           <tr class="entry_spacer"><td class="entry_spacer" colspan="6"></td></tr>
            <!-- end of entry -->
@@ -15939,6 +16601,8 @@
               <span class="entry_type_visibility"> [public as rangeInt]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
                 <div class="entry_type_notes">Range of supported sensitivities</div>
 
@@ -15946,7 +16610,8 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Range of valid sensitivities.<wbr/></p>
+              <p>Range of sensitivities for <a href="#controls_android.sensor.sensitivity">android.<wbr/>sensor.<wbr/>sensitivity</a> supported by this
+camera device.<wbr/></p>
             </td>
 
             <td class="entry_units">
@@ -15969,9 +16634,7 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>The minimum and maximum valid values for the
-<a href="#controls_android.sensor.sensitivity">android.<wbr/>sensor.<wbr/>sensitivity</a> control.<wbr/></p>
-<p>The values are the standard ISO sensitivity values,<wbr/>
+              <p>The values are the standard ISO sensitivity values,<wbr/>
 as defined in ISO 12232:2006.<wbr/></p>
             </td>
           </tr>
@@ -15992,6 +16655,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -16044,7 +16709,7 @@
                 
           <tr class="entry" id="static_android.sensor.info.exposureTimeRange">
             <td class="entry_name
-             " rowspan="5">
+             " rowspan="3">
               android.<wbr/>sensor.<wbr/>info.<wbr/>exposure<wbr/>Time<wbr/>Range
             </td>
             <td class="entry_type">
@@ -16057,6 +16722,8 @@
               <span class="entry_type_visibility"> [public as rangeLong]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
                 <div class="entry_type_notes">nanoseconds</div>
 
@@ -16064,17 +16731,18 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Range of valid exposure
-times used by <a href="#controls_android.sensor.exposureTime">android.<wbr/>sensor.<wbr/>exposure<wbr/>Time</a>.<wbr/></p>
+              <p>The range of image exposure times for <a href="#controls_android.sensor.exposureTime">android.<wbr/>sensor.<wbr/>exposure<wbr/>Time</a> supported
+by this camera device.<wbr/></p>
             </td>
 
             <td class="entry_units">
+              Nanoseconds
             </td>
 
             <td class="entry_range">
-              <p>Min &lt;= 100e3 (100 us).<wbr/> For FULL capability devices
-(<a href="#static_android.info.supportedHardwareLevel">android.<wbr/>info.<wbr/>supported<wbr/>Hardware<wbr/>Level</a> == FULL),<wbr/> Max SHOULD be
-&gt;= 1e9 (1sec),<wbr/> MUST be &gt;= 100e6 (100ms)</p>
+              <p>The minimum exposure time will be less than 100 us.<wbr/> For FULL
+capability devices (<a href="#static_android.info.supportedHardwareLevel">android.<wbr/>info.<wbr/>supported<wbr/>Hardware<wbr/>Level</a> == FULL),<wbr/>
+the maximum exposure time will be greater than 100ms.<wbr/></p>
             </td>
 
             <td class="entry_tags">
@@ -16084,16 +16752,6 @@
             </td>
 
           </tr>
-          <tr class="entries_header">
-            <th class="th_details" colspan="5">Details</th>
-          </tr>
-          <tr class="entry_cont">
-            <td class="entry_details" colspan="5">
-              <p>The min value will be &lt;= 100e3 (100 us).<wbr/> For FULL
-capability devices (<a href="#static_android.info.supportedHardwareLevel">android.<wbr/>info.<wbr/>supported<wbr/>Hardware<wbr/>Level</a> == FULL),<wbr/>
-max will be &gt;= 100e6 (100ms)</p>
-            </td>
-          </tr>
 
           <tr class="entries_header">
             <th class="th_details" colspan="5">HAL Implementation Details</th>
@@ -16101,8 +16759,8 @@
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
               <p>For FULL capability devices (<a href="#static_android.info.supportedHardwareLevel">android.<wbr/>info.<wbr/>supported<wbr/>Hardware<wbr/>Level</a> == FULL),<wbr/>
-The maximum of the range SHOULD be at least
-1 second (1e9),<wbr/> MUST be at least 100ms.<wbr/></p>
+The maximum of the range SHOULD be at least 1 second (1e9),<wbr/> MUST be at least
+100ms.<wbr/></p>
             </td>
           </tr>
 
@@ -16121,24 +16779,25 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Maximum possible frame duration (minimum frame
-rate).<wbr/></p>
+              <p>The maximum possible frame duration (minimum frame rate) for
+<a href="#controls_android.sensor.frameDuration">android.<wbr/>sensor.<wbr/>frame<wbr/>Duration</a> that is supported this camera device.<wbr/></p>
             </td>
 
             <td class="entry_units">
-              nanoseconds
+              Nanoseconds
             </td>
 
             <td class="entry_range">
               <p>For FULL capability devices
-(<a href="#static_android.info.supportedHardwareLevel">android.<wbr/>info.<wbr/>supported<wbr/>Hardware<wbr/>Level</a> == FULL),<wbr/> Max SHOULD be
-&gt;= 1e9 (1sec),<wbr/> MUST be &gt;= 100e6 (100ms)</p>
+(<a href="#static_android.info.supportedHardwareLevel">android.<wbr/>info.<wbr/>supported<wbr/>Hardware<wbr/>Level</a> == FULL),<wbr/> at least 100ms.<wbr/></p>
             </td>
 
             <td class="entry_tags">
@@ -16153,16 +16812,11 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>The largest possible <a href="#controls_android.sensor.frameDuration">android.<wbr/>sensor.<wbr/>frame<wbr/>Duration</a>
-that will be accepted by the camera device.<wbr/> Attempting to use
-frame durations beyond the maximum will result in the frame duration
-being clipped to the maximum.<wbr/> See that control
-for a full definition of frame durations.<wbr/></p>
-<p>Refer to
-StreamConfigurationMap#getOutputMinFrameDuration(int,<wbr/>Size)
-for the minimum frame duration values.<wbr/></p>
-<p>For FULL capability devices (<a href="#static_android.info.supportedHardwareLevel">android.<wbr/>info.<wbr/>supported<wbr/>Hardware<wbr/>Level</a> == FULL),<wbr/>
-max will be &gt;= 100e6 (100ms).<wbr/></p>
+              <p>Attempting to use frame durations beyond the maximum will result in the frame
+duration being clipped to the maximum.<wbr/> See that control for a full definition of frame
+durations.<wbr/></p>
+<p>Refer to StreamConfigurationMap#getOutputMinFrameDuration(int,<wbr/>Size) for the minimum
+frame duration values.<wbr/></p>
             </td>
           </tr>
 
@@ -16206,8 +16860,10 @@
               <span class="entry_type_visibility"> [public as sizeF]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
 
-                <div class="entry_type_notes">width x height in millimeters</div>
+
+                <div class="entry_type_notes">width x height</div>
 
 
             </td> <!-- entry_type -->
@@ -16218,6 +16874,7 @@
             </td>
 
             <td class="entry_units">
+              Millimeters
             </td>
 
             <td class="entry_range">
@@ -16269,17 +16926,20 @@
               <span class="entry_type_visibility"> [public as size]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Dimensions of full pixel array,<wbr/> possibly
+              <p>Dimensions of the full pixel array,<wbr/> possibly
 including black calibration pixels.<wbr/></p>
             </td>
 
             <td class="entry_units">
+              Pixels
             </td>
 
             <td class="entry_range">
@@ -16305,6 +16965,9 @@
 raw size listed in <a href="#static_android.scaler.streamConfigurationMap">android.<wbr/>scaler.<wbr/>stream<wbr/>Configuration<wbr/>Map</a>.<wbr/>
 If a size corresponding to pixelArraySize is listed,<wbr/> the resulting
 raw sensor image will include black pixels.<wbr/></p>
+<p>Some parts of the full pixel array may not receive light from the scene,<wbr/>
+or are otherwise inactive.<wbr/>  The <a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a> key
+defines the rectangle of active pixels that actually forms an image.<wbr/></p>
             </td>
           </tr>
 
@@ -16327,6 +16990,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -16356,7 +17020,7 @@
 sample values from the sensor.<wbr/>  This is typically caused by the
 sensor becoming highly non-linear or clipping.<wbr/> The minimum for
 each channel is specified by the offset in the
-<a href="#static_android.sensor.blackLevelPattern">android.<wbr/>sensor.<wbr/>black<wbr/>Level<wbr/>Pattern</a> tag.<wbr/></p>
+<a href="#static_android.sensor.blackLevelPattern">android.<wbr/>sensor.<wbr/>black<wbr/>Level<wbr/>Pattern</a> key.<wbr/></p>
 <p>The white level is typically determined either by sensor bit depth
 (8-14 bits is expected),<wbr/> or by the point where the sensor response
 becomes too non-linear to be useful.<wbr/>  The default value for this is
@@ -16390,6 +17054,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -16462,6 +17128,7 @@
 
 
 
+
                 <ul class="entry_type_enum">
                   <li>
                     <span class="entry_type_enum_name">DAYLIGHT</span>
@@ -16573,10 +17240,10 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>The values in this tag correspond to the values defined for the
+              <p>The values in this key correspond to the values defined for the
 EXIF LightSource tag.<wbr/> These illuminants are standard light sources
 that are often used calibrating camera devices.<wbr/></p>
-<p>If this tag is present,<wbr/> then <a href="#static_android.sensor.colorTransform1">android.<wbr/>sensor.<wbr/>color<wbr/>Transform1</a>,<wbr/>
+<p>If this key is present,<wbr/> then <a href="#static_android.sensor.colorTransform1">android.<wbr/>sensor.<wbr/>color<wbr/>Transform1</a>,<wbr/>
 <a href="#static_android.sensor.calibrationTransform1">android.<wbr/>sensor.<wbr/>calibration<wbr/>Transform1</a>,<wbr/> and
 <a href="#static_android.sensor.forwardMatrix1">android.<wbr/>sensor.<wbr/>forward<wbr/>Matrix1</a> will also be present.<wbr/></p>
 <p>Some devices may choose to provide a second set of calibration
@@ -16629,6 +17296,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -16642,6 +17310,7 @@
             </td>
 
             <td class="entry_range">
+              <p>Any value listed in <a href="#static_android.sensor.referenceIlluminant1">android.<wbr/>sensor.<wbr/>reference<wbr/>Illuminant1</a></p>
             </td>
 
             <td class="entry_tags">
@@ -16656,10 +17325,8 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>See <a href="#static_android.sensor.referenceIlluminant1">android.<wbr/>sensor.<wbr/>reference<wbr/>Illuminant1</a> for more details.<wbr/>
-Valid values for this are the same as those given for the first
-reference illuminant.<wbr/></p>
-<p>If this tag is present,<wbr/> then <a href="#static_android.sensor.colorTransform2">android.<wbr/>sensor.<wbr/>color<wbr/>Transform2</a>,<wbr/>
+              <p>See <a href="#static_android.sensor.referenceIlluminant1">android.<wbr/>sensor.<wbr/>reference<wbr/>Illuminant1</a> for more details.<wbr/></p>
+<p>If this key is present,<wbr/> then <a href="#static_android.sensor.colorTransform2">android.<wbr/>sensor.<wbr/>color<wbr/>Transform2</a>,<wbr/>
 <a href="#static_android.sensor.calibrationTransform2">android.<wbr/>sensor.<wbr/>calibration<wbr/>Transform2</a>,<wbr/> and
 <a href="#static_android.sensor.forwardMatrix2">android.<wbr/>sensor.<wbr/>forward<wbr/>Matrix2</a> will also be present.<wbr/></p>
             </td>
@@ -16686,6 +17353,7 @@
 
 
 
+
                 <div class="entry_type_notes">3x3 matrix in row-major-order</div>
 
 
@@ -16746,6 +17414,7 @@
 
 
 
+
                 <div class="entry_type_notes">3x3 matrix in row-major-order</div>
 
 
@@ -16809,6 +17478,7 @@
 
 
 
+
                 <div class="entry_type_notes">3x3 matrix in row-major-order</div>
 
 
@@ -16873,6 +17543,7 @@
 
 
 
+
                 <div class="entry_type_notes">3x3 matrix in row-major-order</div>
 
 
@@ -16939,6 +17610,7 @@
 
 
 
+
                 <div class="entry_type_notes">3x3 matrix in row-major-order</div>
 
 
@@ -17001,6 +17673,7 @@
 
 
 
+
                 <div class="entry_type_notes">3x3 matrix in row-major-order</div>
 
 
@@ -17063,6 +17736,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -17105,6 +17779,7 @@
 
 
 
+
                 <div class="entry_type_notes">2x2 raw count block</div>
 
 
@@ -17134,11 +17809,11 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>This tag specifies the zero light value for each of the CFA mosaic
+              <p>This key specifies the zero light value for each of the CFA mosaic
 channels in the camera sensor.<wbr/>  The maximal value output by the
 sensor is represented by the value in <a href="#static_android.sensor.info.whiteLevel">android.<wbr/>sensor.<wbr/>info.<wbr/>white<wbr/>Level</a>.<wbr/></p>
 <p>The values are given in the same order as channels listed for the CFA
-layout tag (see <a href="#static_android.sensor.info.colorFilterArrangement">android.<wbr/>sensor.<wbr/>info.<wbr/>color<wbr/>Filter<wbr/>Arrangement</a>),<wbr/> i.<wbr/>e.<wbr/> the
+layout key (see <a href="#static_android.sensor.info.colorFilterArrangement">android.<wbr/>sensor.<wbr/>info.<wbr/>color<wbr/>Filter<wbr/>Arrangement</a>),<wbr/> i.<wbr/>e.<wbr/> the
 nth value given corresponds to the black level offset for the nth
 color channel listed in the CFA.<wbr/></p>
             </td>
@@ -17169,6 +17844,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
@@ -17212,7 +17889,7 @@
                 
           <tr class="entry" id="static_android.sensor.orientation">
             <td class="entry_name
-             " rowspan="1">
+             " rowspan="3">
               android.<wbr/>sensor.<wbr/>orientation
             </td>
             <td class="entry_type">
@@ -17221,26 +17898,25 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Clockwise angle through which the output
-image needs to be rotated to be upright on the device
-screen in its native orientation.<wbr/> Also defines the
-direction of rolling shutter readout,<wbr/> which is from top
-to bottom in the sensor's coordinate system</p>
+              <p>Clockwise angle through which the output image needs to be rotated to be
+upright on the device screen in its native orientation.<wbr/></p>
             </td>
 
             <td class="entry_units">
-              degrees clockwise rotation,<wbr/> only multiples of
+              Degrees of clockwise rotation; always a multiple of
           90
             </td>
 
             <td class="entry_range">
-              <p>0,<wbr/>90,<wbr/>180,<wbr/>270</p>
+              <p>0,<wbr/> 90,<wbr/> 180,<wbr/> 270</p>
             </td>
 
             <td class="entry_tags">
@@ -17250,6 +17926,15 @@
             </td>
 
           </tr>
+          <tr class="entries_header">
+            <th class="th_details" colspan="5">Details</th>
+          </tr>
+          <tr class="entry_cont">
+            <td class="entry_details" colspan="5">
+              <p>Also defines the direction of rolling shutter readout,<wbr/> which is from top to bottom in
+the sensor's coordinate system.<wbr/></p>
+            </td>
+          </tr>
 
 
           <tr class="entry_spacer"><td class="entry_spacer" colspan="6"></td></tr>
@@ -17272,6 +17957,7 @@
 
 
 
+
                 <div class="entry_type_notes">Number of samples for hue,<wbr/> saturation,<wbr/> and value</div>
 
 
@@ -17317,7 +18003,7 @@
                 
           <tr class="entry" id="static_android.sensor.availableTestPatternModes">
             <td class="entry_name
-             " rowspan="3">
+             " rowspan="5">
               android.<wbr/>sensor.<wbr/>available<wbr/>Test<wbr/>Pattern<wbr/>Modes
             </td>
             <td class="entry_type">
@@ -17331,20 +18017,22 @@
 
 
 
+
                 <div class="entry_type_notes">list of enums</div>
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Lists the supported sensor test pattern modes for <a href="#controls_android.sensor.testPatternMode">android.<wbr/>sensor.<wbr/>test<wbr/>Pattern<wbr/>Mode</a>.<wbr/></p>
+              <p>List of sensor test pattern modes for <a href="#controls_android.sensor.testPatternMode">android.<wbr/>sensor.<wbr/>test<wbr/>Pattern<wbr/>Mode</a>
+supported by this camera device.<wbr/></p>
             </td>
 
             <td class="entry_units">
             </td>
 
             <td class="entry_range">
-              <p>Always includes OFF if defined.<wbr/> All custom modes must be &gt;= CUSTOM1</p>
+              <p>Any value listed in <a href="#controls_android.sensor.testPatternMode">android.<wbr/>sensor.<wbr/>test<wbr/>Pattern<wbr/>Mode</a></p>
             </td>
 
             <td class="entry_tags">
@@ -17356,10 +18044,18 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Optional.<wbr/> Defaults to [OFF].<wbr/></p>
+              <p>Defaults to OFF,<wbr/> and always includes OFF if defined.<wbr/></p>
             </td>
           </tr>
 
+          <tr class="entries_header">
+            <th class="th_details" colspan="5">HAL Implementation Details</th>
+          </tr>
+          <tr class="entry_cont">
+            <td class="entry_details" colspan="5">
+              <p>All custom modes must be &gt;= CUSTOM1.<wbr/></p>
+            </td>
+          </tr>
 
           <tr class="entry_spacer"><td class="entry_spacer" colspan="6"></td></tr>
            <!-- end of entry -->
@@ -17403,6 +18099,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
@@ -17414,7 +18112,7 @@
             </td>
 
             <td class="entry_units">
-              nanoseconds
+              Nanoseconds
             </td>
 
             <td class="entry_range">
@@ -17433,8 +18131,11 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>If the sensor can't expose this exact duration,<wbr/> it should shorten the
-duration exposed to the nearest possible value (rather than expose longer).<wbr/></p>
+              <p>If the sensor can't expose this exact duration,<wbr/> it will shorten the
+duration exposed to the nearest possible value (rather than expose longer).<wbr/>
+The final exposure time used will be available in the output capture result.<wbr/></p>
+<p>This control is only effective if <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> or <a href="#controls_android.control.mode">android.<wbr/>control.<wbr/>mode</a> is set to
+OFF; otherwise the auto-exposure algorithm will override this value.<wbr/></p>
             </td>
           </tr>
 
@@ -17454,6 +18155,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
@@ -17465,7 +18168,7 @@
             </td>
 
             <td class="entry_units">
-              nanoseconds
+              Nanoseconds
             </td>
 
             <td class="entry_range">
@@ -17555,6 +18258,8 @@
 delivered.<wbr/></p>
 <p>For more details about stalling,<wbr/> see
 StreamConfigurationMap#getOutputStallDuration(int,<wbr/>Size).<wbr/></p>
+<p>This control is only effective if <a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> or <a href="#controls_android.control.mode">android.<wbr/>control.<wbr/>mode</a> is set to
+OFF; otherwise the auto-exposure algorithm will override this value.<wbr/></p>
             </td>
           </tr>
 
@@ -17583,6 +18288,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
@@ -17649,6 +18356,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -17660,7 +18369,7 @@
             </td>
 
             <td class="entry_units">
-              nanoseconds
+              Nanoseconds
             </td>
 
             <td class="entry_range">
@@ -17729,6 +18438,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -17739,7 +18449,7 @@
             </td>
 
             <td class="entry_units">
-              celsius
+              Celsius
             </td>
 
             <td class="entry_range">
@@ -17777,6 +18487,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -17832,6 +18543,7 @@
 
 
 
+
                 <div class="entry_type_notes">Pairs of noise model coefficients</div>
 
 
@@ -17859,10 +18571,10 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>This tag contains two noise model coefficients for each CFA channel
+              <p>This key contains two noise model coefficients for each CFA channel
 corresponding to the sensor amplification (S) and sensor readout
 noise (O).<wbr/>  These are given as pairs of coefficients for each channel
-in the same order as channels listed for the CFA layout tag
+in the same order as channels listed for the CFA layout key
 (see <a href="#static_android.sensor.info.colorFilterArrangement">android.<wbr/>sensor.<wbr/>info.<wbr/>color<wbr/>Filter<wbr/>Arrangement</a>).<wbr/>  This is
 represented as an array of Pair&lt;Double,<wbr/> Double&gt;,<wbr/> where
 the first member of the Pair at index n is the S coefficient and the
@@ -17911,6 +18623,7 @@
 
 
 
+
                 <div class="entry_type_notes">Mapping for hue,<wbr/> saturation,<wbr/> and value</div>
 
 
@@ -17923,8 +18636,8 @@
 
             <td class="entry_units">
               
-          Hue shift is given in degrees; saturation and value scale factors are
-          unitless.<wbr/>
+          The hue shift is given in degrees; saturation and value scale factors are
+          unitless and are between 0 and 1 inclusive
           
             </td>
 
@@ -17947,7 +18660,7 @@
 <a href="#static_android.sensor.profileHueSatMapDimensions">android.<wbr/>sensor.<wbr/>profile<wbr/>Hue<wbr/>Sat<wbr/>Map<wbr/>Dimensions</a>.<wbr/></p>
 <p>Each entry of this map contains three floats corresponding to the
 hue shift,<wbr/> saturation scale,<wbr/> and value scale,<wbr/> respectively; where the
-hue shift has the lowest index.<wbr/> The map entries are stored in the tag
+hue shift has the lowest index.<wbr/> The map entries are stored in the key
 in nested loop order,<wbr/> with the value divisions in the outer loop,<wbr/> the
 hue divisions in the middle loop,<wbr/> and the saturation divisions in the
 inner loop.<wbr/> All zero input saturation entries are required to have a
@@ -17976,6 +18689,7 @@
 
 
 
+
                 <div class="entry_type_notes">Samples defining a spline for a tone-mapping curve</div>
 
 
@@ -18006,7 +18720,7 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>This tag contains a default tone curve that can be applied while
+              <p>This key contains a default tone curve that can be applied while
 processing the image as a starting point for user adjustments.<wbr/>
 The curve is specified as a list of value pairs in linear gamma.<wbr/>
 The curve is interpolated using a cubic spline.<wbr/></p>
@@ -18032,6 +18746,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -18125,6 +18840,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -18136,9 +18852,6 @@
             </td>
 
             <td class="entry_range">
-              <p>Optional.<wbr/>
-Must be supported if <a href="#static_android.sensor.availableTestPatternModes">android.<wbr/>sensor.<wbr/>available<wbr/>Test<wbr/>Pattern<wbr/>Modes</a> contains
-SOLID_<wbr/>COLOR.<wbr/></p>
             </td>
 
             <td class="entry_tags">
@@ -18185,6 +18898,7 @@
 
 
 
+
                 <ul class="entry_type_enum">
                   <li>
                     <span class="entry_type_enum_name">OFF</span>
@@ -18288,8 +19002,7 @@
             </td>
 
             <td class="entry_range">
-              <p>Optional.<wbr/> Defaults to OFF.<wbr/> Value must be one of
-<a href="#static_android.sensor.availableTestPatternModes">android.<wbr/>sensor.<wbr/>available<wbr/>Test<wbr/>Pattern<wbr/>Modes</a></p>
+              <p><a href="#static_android.sensor.availableTestPatternModes">android.<wbr/>sensor.<wbr/>available<wbr/>Test<wbr/>Pattern<wbr/>Modes</a></p>
             </td>
 
             <td class="entry_tags">
@@ -18307,6 +19020,7 @@
 <p>For example,<wbr/> if manual flash is enabled,<wbr/> flash firing should still
 occur (and that the test pattern remain unmodified,<wbr/> since the flash
 would not actually affect it).<wbr/></p>
+<p>Defaults to OFF.<wbr/></p>
             </td>
           </tr>
 
@@ -18338,6 +19052,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[limited] </span>
+
 
 
 
@@ -18349,7 +19065,7 @@
             </td>
 
             <td class="entry_units">
-              nanoseconds
+              Nanoseconds
             </td>
 
             <td class="entry_range">
@@ -18369,9 +19085,10 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>This is the exposure time skew (in the unit of nanosecond) between the first and
-last row exposure start times.<wbr/> The first row and the last row are the first
-and last rows inside of the <a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a>.<wbr/></p>
+              <p>This is the exposure time skew between the first and last
+row exposure start times.<wbr/> The first row and the last row are
+the first and last rows inside of the
+<a href="#static_android.sensor.info.activeArraySize">android.<wbr/>sensor.<wbr/>info.<wbr/>active<wbr/>Array<wbr/>Size</a>.<wbr/></p>
 <p>For typical camera sensors that use rolling shutters,<wbr/> this is also equivalent
 to the frame readout time.<wbr/></p>
             </td>
@@ -18434,6 +19151,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -18478,27 +19197,26 @@
               <p>When set to OFF mode,<wbr/> no lens shading correction will be applied by the
 camera device,<wbr/> and an identity lens shading map data will be provided
 if <code><a href="#controls_android.statistics.lensShadingMapMode">android.<wbr/>statistics.<wbr/>lens<wbr/>Shading<wbr/>Map<wbr/>Mode</a> == ON</code>.<wbr/> For example,<wbr/> for lens
-shading map with size specified as <code><a href="#static_android.lens.info.shadingMapSize">android.<wbr/>lens.<wbr/>info.<wbr/>shading<wbr/>Map<wbr/>Size</a> = [ 4,<wbr/> 3 ]</code>,<wbr/>
-the output <a href="#dynamic_android.statistics.lensShadingMap">android.<wbr/>statistics.<wbr/>lens<wbr/>Shading<wbr/>Map</a> for this case will be an identity map
-shown below:</p>
+shading map with size of <code>[ 4,<wbr/> 3 ]</code>,<wbr/>
+the output <a href="#dynamic_android.statistics.lensShadingCorrectionMap">android.<wbr/>statistics.<wbr/>lens<wbr/>Shading<wbr/>Correction<wbr/>Map</a> for this case will be an identity
+map shown below:</p>
 <pre><code>[ 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>
-    1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>
-  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>
-    1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>
-  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>   1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>
-    1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0 ]
+ 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>
+ 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>
+ 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>
+ 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>
+ 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0 ]
 </code></pre>
-<p>When set to other modes,<wbr/> lens shading correction will be applied by the
-camera device.<wbr/> Applications can request lens shading map data by setting
-<a href="#controls_android.statistics.lensShadingMapMode">android.<wbr/>statistics.<wbr/>lens<wbr/>Shading<wbr/>Map<wbr/>Mode</a> to ON,<wbr/> and then the camera device will provide
-lens shading map data in <a href="#dynamic_android.statistics.lensShadingMap">android.<wbr/>statistics.<wbr/>lens<wbr/>Shading<wbr/>Map</a>,<wbr/> with size specified
-by <a href="#static_android.lens.info.shadingMapSize">android.<wbr/>lens.<wbr/>info.<wbr/>shading<wbr/>Map<wbr/>Size</a>; the returned shading map data will be the one
-applied by the camera device for this capture request.<wbr/></p>
-<p>The shading map data may depend on the auto-exposure (AE) and AWB statistics,<wbr/> therefore the reliability
-of the map data may be affected by the AE and AWB algorithms.<wbr/> When AE and AWB are in
-AUTO modes(<a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> <code>!=</code> OFF and <a href="#controls_android.control.awbMode">android.<wbr/>control.<wbr/>awb<wbr/>Mode</a> <code>!=</code> OFF),<wbr/>
-to get best results,<wbr/> it is recommended that the applications wait for the AE and AWB to
-be converged before using the returned shading map data.<wbr/></p>
+<p>When set to other modes,<wbr/> lens shading correction will be applied by the camera
+device.<wbr/> Applications can request lens shading map data by setting
+<a href="#controls_android.statistics.lensShadingMapMode">android.<wbr/>statistics.<wbr/>lens<wbr/>Shading<wbr/>Map<wbr/>Mode</a> to ON,<wbr/> and then the camera device will provide lens
+shading map data in <a href="#dynamic_android.statistics.lensShadingCorrectionMap">android.<wbr/>statistics.<wbr/>lens<wbr/>Shading<wbr/>Correction<wbr/>Map</a>; the returned shading map
+data will be the one applied by the camera device for this capture request.<wbr/></p>
+<p>The shading map data may depend on the auto-exposure (AE) and AWB statistics,<wbr/> therefore
+the reliability of the map data may be affected by the AE and AWB algorithms.<wbr/> When AE and
+AWB are in AUTO modes(<a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> <code>!=</code> OFF and <a href="#controls_android.control.awbMode">android.<wbr/>control.<wbr/>awb<wbr/>Mode</a> <code>!=</code>
+OFF),<wbr/> to get best results,<wbr/> it is recommended that the applications wait for the AE and AWB
+to be converged before using the returned shading map data.<wbr/></p>
             </td>
           </tr>
 
@@ -18521,6 +19239,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -18587,6 +19306,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -18631,27 +19352,26 @@
               <p>When set to OFF mode,<wbr/> no lens shading correction will be applied by the
 camera device,<wbr/> and an identity lens shading map data will be provided
 if <code><a href="#controls_android.statistics.lensShadingMapMode">android.<wbr/>statistics.<wbr/>lens<wbr/>Shading<wbr/>Map<wbr/>Mode</a> == ON</code>.<wbr/> For example,<wbr/> for lens
-shading map with size specified as <code><a href="#static_android.lens.info.shadingMapSize">android.<wbr/>lens.<wbr/>info.<wbr/>shading<wbr/>Map<wbr/>Size</a> = [ 4,<wbr/> 3 ]</code>,<wbr/>
-the output <a href="#dynamic_android.statistics.lensShadingMap">android.<wbr/>statistics.<wbr/>lens<wbr/>Shading<wbr/>Map</a> for this case will be an identity map
-shown below:</p>
+shading map with size of <code>[ 4,<wbr/> 3 ]</code>,<wbr/>
+the output <a href="#dynamic_android.statistics.lensShadingCorrectionMap">android.<wbr/>statistics.<wbr/>lens<wbr/>Shading<wbr/>Correction<wbr/>Map</a> for this case will be an identity
+map shown below:</p>
 <pre><code>[ 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>
-    1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>
-  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>
-    1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>
-  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>   1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>
-    1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0 ]
+ 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>
+ 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>
+ 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>
+ 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>
+ 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/>  1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0,<wbr/> 1.<wbr/>0 ]
 </code></pre>
-<p>When set to other modes,<wbr/> lens shading correction will be applied by the
-camera device.<wbr/> Applications can request lens shading map data by setting
-<a href="#controls_android.statistics.lensShadingMapMode">android.<wbr/>statistics.<wbr/>lens<wbr/>Shading<wbr/>Map<wbr/>Mode</a> to ON,<wbr/> and then the camera device will provide
-lens shading map data in <a href="#dynamic_android.statistics.lensShadingMap">android.<wbr/>statistics.<wbr/>lens<wbr/>Shading<wbr/>Map</a>,<wbr/> with size specified
-by <a href="#static_android.lens.info.shadingMapSize">android.<wbr/>lens.<wbr/>info.<wbr/>shading<wbr/>Map<wbr/>Size</a>; the returned shading map data will be the one
-applied by the camera device for this capture request.<wbr/></p>
-<p>The shading map data may depend on the auto-exposure (AE) and AWB statistics,<wbr/> therefore the reliability
-of the map data may be affected by the AE and AWB algorithms.<wbr/> When AE and AWB are in
-AUTO modes(<a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> <code>!=</code> OFF and <a href="#controls_android.control.awbMode">android.<wbr/>control.<wbr/>awb<wbr/>Mode</a> <code>!=</code> OFF),<wbr/>
-to get best results,<wbr/> it is recommended that the applications wait for the AE and AWB to
-be converged before using the returned shading map data.<wbr/></p>
+<p>When set to other modes,<wbr/> lens shading correction will be applied by the camera
+device.<wbr/> Applications can request lens shading map data by setting
+<a href="#controls_android.statistics.lensShadingMapMode">android.<wbr/>statistics.<wbr/>lens<wbr/>Shading<wbr/>Map<wbr/>Mode</a> to ON,<wbr/> and then the camera device will provide lens
+shading map data in <a href="#dynamic_android.statistics.lensShadingCorrectionMap">android.<wbr/>statistics.<wbr/>lens<wbr/>Shading<wbr/>Correction<wbr/>Map</a>; the returned shading map
+data will be the one applied by the camera device for this capture request.<wbr/></p>
+<p>The shading map data may depend on the auto-exposure (AE) and AWB statistics,<wbr/> therefore
+the reliability of the map data may be affected by the AE and AWB algorithms.<wbr/> When AE and
+AWB are in AUTO modes(<a href="#controls_android.control.aeMode">android.<wbr/>control.<wbr/>ae<wbr/>Mode</a> <code>!=</code> OFF and <a href="#controls_android.control.awbMode">android.<wbr/>control.<wbr/>awb<wbr/>Mode</a> <code>!=</code>
+OFF),<wbr/> to get best results,<wbr/> it is recommended that the applications wait for the AE and AWB
+to be converged before using the returned shading map data.<wbr/></p>
             </td>
           </tr>
 
@@ -18694,7 +19414,7 @@
                 
           <tr class="entry" id="controls_android.statistics.faceDetectMode">
             <td class="entry_name
-             " rowspan="3">
+             " rowspan="5">
               android.<wbr/>statistics.<wbr/>face<wbr/>Detect<wbr/>Mode
             </td>
             <td class="entry_type">
@@ -18703,6 +19423,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -18714,27 +19436,21 @@
                   <li>
                     <span class="entry_type_enum_name">SIMPLE</span>
                     <span class="entry_type_enum_optional">[optional]</span>
-                    <span class="entry_type_enum_notes"><p>Return face rectangle and confidence values only.<wbr/></p>
-<p>In this mode,<wbr/> only <a href="#dynamic_android.statistics.faceRectangles">android.<wbr/>statistics.<wbr/>face<wbr/>Rectangles</a> and
-<a href="#dynamic_android.statistics.faceScores">android.<wbr/>statistics.<wbr/>face<wbr/>Scores</a> outputs are valid.<wbr/></p></span>
+                    <span class="entry_type_enum_notes"><p>Return face rectangle and confidence values only.<wbr/></p></span>
                   </li>
                   <li>
                     <span class="entry_type_enum_name">FULL</span>
                     <span class="entry_type_enum_optional">[optional]</span>
                     <span class="entry_type_enum_notes"><p>Return all face
 metadata.<wbr/></p>
-<p>In this mode,<wbr/>
-<a href="#dynamic_android.statistics.faceRectangles">android.<wbr/>statistics.<wbr/>face<wbr/>Rectangles</a>,<wbr/>
-<a href="#dynamic_android.statistics.faceScores">android.<wbr/>statistics.<wbr/>face<wbr/>Scores</a>,<wbr/>
-<a href="#dynamic_android.statistics.faceIds">android.<wbr/>statistics.<wbr/>face<wbr/>Ids</a>,<wbr/> and
-<a href="#dynamic_android.statistics.faceLandmarks">android.<wbr/>statistics.<wbr/>face<wbr/>Landmarks</a> outputs are valid.<wbr/></p></span>
+<p>In this mode,<wbr/> face rectangles,<wbr/> scores,<wbr/> landmarks,<wbr/> and face IDs are all valid.<wbr/></p></span>
                   </li>
                 </ul>
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Control for the face detector
+              <p>Operating mode for the face detector
 unit.<wbr/></p>
             </td>
 
@@ -18759,11 +19475,21 @@
             <td class="entry_details" colspan="5">
               <p>Whether face detection is enabled,<wbr/> and whether it
 should output just the basic fields or the full set of
-fields.<wbr/> Value must be one of the
-<a href="#static_android.statistics.info.availableFaceDetectModes">android.<wbr/>statistics.<wbr/>info.<wbr/>available<wbr/>Face<wbr/>Detect<wbr/>Modes</a>.<wbr/></p>
+fields.<wbr/></p>
             </td>
           </tr>
 
+          <tr class="entries_header">
+            <th class="th_details" colspan="5">HAL Implementation Details</th>
+          </tr>
+          <tr class="entry_cont">
+            <td class="entry_details" colspan="5">
+              <p>SIMPLE mode must fill in <a href="#dynamic_android.statistics.faceRectangles">android.<wbr/>statistics.<wbr/>face<wbr/>Rectangles</a> and
+<a href="#dynamic_android.statistics.faceScores">android.<wbr/>statistics.<wbr/>face<wbr/>Scores</a>.<wbr/>
+FULL mode must also fill in <a href="#dynamic_android.statistics.faceIds">android.<wbr/>statistics.<wbr/>face<wbr/>Ids</a>,<wbr/> and
+<a href="#dynamic_android.statistics.faceLandmarks">android.<wbr/>statistics.<wbr/>face<wbr/>Landmarks</a>.<wbr/></p>
+            </td>
+          </tr>
 
           <tr class="entry_spacer"><td class="entry_spacer" colspan="6"></td></tr>
            <!-- end of entry -->
@@ -18782,6 +19508,7 @@
 
 
 
+
                 <ul class="entry_type_enum">
                   <li>
                     <span class="entry_type_enum_name">OFF</span>
@@ -18830,6 +19557,7 @@
 
 
 
+
                 <ul class="entry_type_enum">
                   <li>
                     <span class="entry_type_enum_name">OFF</span>
@@ -18878,6 +19606,7 @@
 
 
 
+
                 <ul class="entry_type_enum">
                   <li>
                     <span class="entry_type_enum_name">OFF</span>
@@ -18892,13 +19621,14 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Operating mode for hotpixel map generation.<wbr/></p>
+              <p>Operating mode for hot pixel map generation.<wbr/></p>
             </td>
 
             <td class="entry_units">
             </td>
 
             <td class="entry_range">
+              <p><a href="#static_android.statistics.info.availableHotPixelMapModes">android.<wbr/>statistics.<wbr/>info.<wbr/>available<wbr/>Hot<wbr/>Pixel<wbr/>Map<wbr/>Modes</a></p>
             </td>
 
             <td class="entry_tags">
@@ -18914,9 +19644,8 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>If set to ON,<wbr/> a hotpixel map is returned in <a href="#dynamic_android.statistics.hotPixelMap">android.<wbr/>statistics.<wbr/>hot<wbr/>Pixel<wbr/>Map</a>.<wbr/>
-If set to OFF,<wbr/> no hotpixel map will be returned.<wbr/></p>
-<p>This must be set to a valid mode from <a href="#static_android.statistics.info.availableHotPixelMapModes">android.<wbr/>statistics.<wbr/>info.<wbr/>available<wbr/>Hot<wbr/>Pixel<wbr/>Map<wbr/>Modes</a>.<wbr/></p>
+              <p>If set to <code>true</code>,<wbr/> a hot pixel map is returned in <a href="#dynamic_android.statistics.hotPixelMap">android.<wbr/>statistics.<wbr/>hot<wbr/>Pixel<wbr/>Map</a>.<wbr/>
+If set to <code>false</code>,<wbr/> no hot pixel map will be returned.<wbr/></p>
             </td>
           </tr>
 
@@ -18936,6 +19665,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -18963,6 +19694,9 @@
             </td>
 
             <td class="entry_tags">
+              <ul class="entry_tags">
+                  <li><a href="#tag_RAW">RAW</a></li>
+              </ul>
             </td>
 
           </tr>
@@ -18974,6 +19708,7 @@
               <p>When set to ON,<wbr/>
 <a href="#dynamic_android.statistics.lensShadingMap">android.<wbr/>statistics.<wbr/>lens<wbr/>Shading<wbr/>Map</a> will be provided in
 the output result metadata.<wbr/></p>
+<p>ON is always supported on devices with the RAW capability.<wbr/></p>
             </td>
           </tr>
 
@@ -19026,6 +19761,8 @@
               <span class="entry_type_visibility"> [public as enumList]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
                 <div class="entry_type_notes">List of enums from android.<wbr/>statistics.<wbr/>face<wbr/>Detect<wbr/>Mode</div>
 
@@ -19033,18 +19770,15 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>The face detection modes that are available
-for this camera device.<wbr/></p>
+              <p>List of face detection modes for <a href="#controls_android.statistics.faceDetectMode">android.<wbr/>statistics.<wbr/>face<wbr/>Detect<wbr/>Mode</a> that are
+supported by this camera device.<wbr/></p>
             </td>
 
             <td class="entry_units">
-              List of enum:
-            OFF
-            SIMPLE
-            FULL
             </td>
 
             <td class="entry_range">
+              <p>Any value listed in <a href="#controls_android.statistics.faceDetectMode">android.<wbr/>statistics.<wbr/>face<wbr/>Detect<wbr/>Mode</a></p>
             </td>
 
             <td class="entry_tags">
@@ -19057,12 +19791,6 @@
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
               <p>OFF is always supported.<wbr/></p>
-<p>SIMPLE means the device supports the
-<a href="#dynamic_android.statistics.faceRectangles">android.<wbr/>statistics.<wbr/>face<wbr/>Rectangles</a> and
-<a href="#dynamic_android.statistics.faceScores">android.<wbr/>statistics.<wbr/>face<wbr/>Scores</a> outputs.<wbr/></p>
-<p>FULL means the device additionally supports the
-<a href="#dynamic_android.statistics.faceIds">android.<wbr/>statistics.<wbr/>face<wbr/>Ids</a> and
-<a href="#dynamic_android.statistics.faceLandmarks">android.<wbr/>statistics.<wbr/>face<wbr/>Landmarks</a> outputs.<wbr/></p>
             </td>
           </tr>
 
@@ -19085,6 +19813,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -19123,6 +19852,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -19137,8 +19868,9 @@
             </td>
 
             <td class="entry_range">
-              <p>&gt;= 4 if <a href="#static_android.statistics.info.availableFaceDetectModes">android.<wbr/>statistics.<wbr/>info.<wbr/>available<wbr/>Face<wbr/>Detect<wbr/>Modes</a> lists
-modes besides OFF,<wbr/> otherwise 0</p>
+              <p>0 for cameras without available face detection; otherwise:
+<code>&gt;=4</code> for LIMITED or FULL hwlevel devices or
+<code>&gt;0</code> for LEGACY devices.<wbr/></p>
             </td>
 
             <td class="entry_tags">
@@ -19168,6 +19900,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -19208,6 +19941,7 @@
 
 
 
+
             </td> <!-- entry_type -->
 
             <td class="entry_description">
@@ -19250,6 +19984,7 @@
 
 
 
+
                 <div class="entry_type_notes">width x height</div>
 
 
@@ -19296,19 +20031,22 @@
 
 
 
+
                 <div class="entry_type_notes">list of enums</div>
 
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>The set of hot pixel map output modes supported by this camera device.<wbr/></p>
+              <p>List of hot pixel map output modes for <a href="#controls_android.statistics.hotPixelMapMode">android.<wbr/>statistics.<wbr/>hot<wbr/>Pixel<wbr/>Map<wbr/>Mode</a> that are
+supported by this camera device.<wbr/></p>
             </td>
 
             <td class="entry_units">
             </td>
 
             <td class="entry_range">
+              <p>Any value listed in <a href="#controls_android.statistics.hotPixelMapMode">android.<wbr/>statistics.<wbr/>hot<wbr/>Pixel<wbr/>Map<wbr/>Mode</a></p>
             </td>
 
             <td class="entry_tags">
@@ -19324,10 +20062,9 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>This tag lists valid output modes for <a href="#controls_android.statistics.hotPixelMapMode">android.<wbr/>statistics.<wbr/>hot<wbr/>Pixel<wbr/>Map<wbr/>Mode</a>.<wbr/></p>
-<p>If no hotpixel map is available for this camera device,<wbr/> this will contain
-only OFF.<wbr/>  If the hotpixel map is available,<wbr/> this will include both
-the ON and OFF options.<wbr/></p>
+              <p>If no hotpixel map output is available for this camera device,<wbr/> this will contain only
+<code>false</code>.<wbr/></p>
+<p>ON is always supported on devices with the RAW capability.<wbr/></p>
             </td>
           </tr>
 
@@ -19368,7 +20105,7 @@
                 
           <tr class="entry" id="dynamic_android.statistics.faceDetectMode">
             <td class="entry_name
-             " rowspan="3">
+             " rowspan="5">
               android.<wbr/>statistics.<wbr/>face<wbr/>Detect<wbr/>Mode
             </td>
             <td class="entry_type">
@@ -19377,6 +20114,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -19388,27 +20127,21 @@
                   <li>
                     <span class="entry_type_enum_name">SIMPLE</span>
                     <span class="entry_type_enum_optional">[optional]</span>
-                    <span class="entry_type_enum_notes"><p>Return face rectangle and confidence values only.<wbr/></p>
-<p>In this mode,<wbr/> only <a href="#dynamic_android.statistics.faceRectangles">android.<wbr/>statistics.<wbr/>face<wbr/>Rectangles</a> and
-<a href="#dynamic_android.statistics.faceScores">android.<wbr/>statistics.<wbr/>face<wbr/>Scores</a> outputs are valid.<wbr/></p></span>
+                    <span class="entry_type_enum_notes"><p>Return face rectangle and confidence values only.<wbr/></p></span>
                   </li>
                   <li>
                     <span class="entry_type_enum_name">FULL</span>
                     <span class="entry_type_enum_optional">[optional]</span>
                     <span class="entry_type_enum_notes"><p>Return all face
 metadata.<wbr/></p>
-<p>In this mode,<wbr/>
-<a href="#dynamic_android.statistics.faceRectangles">android.<wbr/>statistics.<wbr/>face<wbr/>Rectangles</a>,<wbr/>
-<a href="#dynamic_android.statistics.faceScores">android.<wbr/>statistics.<wbr/>face<wbr/>Scores</a>,<wbr/>
-<a href="#dynamic_android.statistics.faceIds">android.<wbr/>statistics.<wbr/>face<wbr/>Ids</a>,<wbr/> and
-<a href="#dynamic_android.statistics.faceLandmarks">android.<wbr/>statistics.<wbr/>face<wbr/>Landmarks</a> outputs are valid.<wbr/></p></span>
+<p>In this mode,<wbr/> face rectangles,<wbr/> scores,<wbr/> landmarks,<wbr/> and face IDs are all valid.<wbr/></p></span>
                   </li>
                 </ul>
 
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Control for the face detector
+              <p>Operating mode for the face detector
 unit.<wbr/></p>
             </td>
 
@@ -19433,11 +20166,21 @@
             <td class="entry_details" colspan="5">
               <p>Whether face detection is enabled,<wbr/> and whether it
 should output just the basic fields or the full set of
-fields.<wbr/> Value must be one of the
-<a href="#static_android.statistics.info.availableFaceDetectModes">android.<wbr/>statistics.<wbr/>info.<wbr/>available<wbr/>Face<wbr/>Detect<wbr/>Modes</a>.<wbr/></p>
+fields.<wbr/></p>
             </td>
           </tr>
 
+          <tr class="entries_header">
+            <th class="th_details" colspan="5">HAL Implementation Details</th>
+          </tr>
+          <tr class="entry_cont">
+            <td class="entry_details" colspan="5">
+              <p>SIMPLE mode must fill in <a href="#dynamic_android.statistics.faceRectangles">android.<wbr/>statistics.<wbr/>face<wbr/>Rectangles</a> and
+<a href="#dynamic_android.statistics.faceScores">android.<wbr/>statistics.<wbr/>face<wbr/>Scores</a>.<wbr/>
+FULL mode must also fill in <a href="#dynamic_android.statistics.faceIds">android.<wbr/>statistics.<wbr/>face<wbr/>Ids</a>,<wbr/> and
+<a href="#dynamic_android.statistics.faceLandmarks">android.<wbr/>statistics.<wbr/>face<wbr/>Landmarks</a>.<wbr/></p>
+            </td>
+          </tr>
 
           <tr class="entry_spacer"><td class="entry_spacer" colspan="6"></td></tr>
            <!-- end of entry -->
@@ -19458,6 +20201,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -19512,6 +20257,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
                 <div class="entry_type_notes">(leftEyeX,<wbr/> leftEyeY,<wbr/> rightEyeX,<wbr/> rightEyeY,<wbr/> mouthX,<wbr/> mouthY)</div>
 
@@ -19567,6 +20314,8 @@
               <span class="entry_type_visibility"> [hidden as rectangle]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
                 <div class="entry_type_notes">(xmin,<wbr/> ymin,<wbr/> xmax,<wbr/> ymax).<wbr/> (0,<wbr/>0) is top-left of active pixel area</div>
 
@@ -19622,6 +20371,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -19685,6 +20436,8 @@
 
               <span class="entry_type_synthetic">[synthetic] </span>
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
 
@@ -19692,7 +20445,7 @@
 
             <td class="entry_description">
               <p>List of the faces detected through camera face detection
-in this result.<wbr/></p>
+in this capture.<wbr/></p>
             </td>
 
             <td class="entry_units">
@@ -19735,6 +20488,7 @@
 
 
 
+
                 <div class="entry_type_notes">count of pixels for each color channel that fall into each histogram bucket,<wbr/> scaled to be between 0 and maxHistogramCount</div>
 
 
@@ -19788,6 +20542,7 @@
 
 
 
+
                 <ul class="entry_type_enum">
                   <li>
                     <span class="entry_type_enum_name">OFF</span>
@@ -19839,6 +20594,7 @@
 
 
 
+
                 <div class="entry_type_notes">estimated sharpness for each region of the input image.<wbr/> Normalized to be between 0 and maxSharpnessMapValue.<wbr/> Higher values mean sharper (better focused)</div>
 
 
@@ -19890,6 +20646,7 @@
 
 
 
+
                 <ul class="entry_type_enum">
                   <li>
                     <span class="entry_type_enum_name">OFF</span>
@@ -19936,6 +20693,8 @@
               <span class="entry_type_visibility"> [public as lensShadingMap]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
@@ -20022,6 +20781,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
                 <div class="entry_type_notes">2D array of float gain factors per channel to correct lens shading</div>
 
@@ -20127,6 +20888,7 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
                 <div class="entry_type_notes">A 1D array of floats for 4 color channel gains</div>
@@ -20187,6 +20949,7 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+
               <span class="entry_type_deprecated">[deprecated] </span>
 
                 <div class="entry_type_notes">3x3 rational matrix in row-major order</div>
@@ -20247,6 +21010,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -20323,6 +21088,7 @@
 
 
 
+
                 <ul class="entry_type_enum">
                   <li>
                     <span class="entry_type_enum_name">OFF</span>
@@ -20337,13 +21103,14 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>Operating mode for hotpixel map generation.<wbr/></p>
+              <p>Operating mode for hot pixel map generation.<wbr/></p>
             </td>
 
             <td class="entry_units">
             </td>
 
             <td class="entry_range">
+              <p><a href="#static_android.statistics.info.availableHotPixelMapModes">android.<wbr/>statistics.<wbr/>info.<wbr/>available<wbr/>Hot<wbr/>Pixel<wbr/>Map<wbr/>Modes</a></p>
             </td>
 
             <td class="entry_tags">
@@ -20359,9 +21126,8 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>If set to ON,<wbr/> a hotpixel map is returned in <a href="#dynamic_android.statistics.hotPixelMap">android.<wbr/>statistics.<wbr/>hot<wbr/>Pixel<wbr/>Map</a>.<wbr/>
-If set to OFF,<wbr/> no hotpixel map will be returned.<wbr/></p>
-<p>This must be set to a valid mode from <a href="#static_android.statistics.info.availableHotPixelMapModes">android.<wbr/>statistics.<wbr/>info.<wbr/>available<wbr/>Hot<wbr/>Pixel<wbr/>Map<wbr/>Modes</a>.<wbr/></p>
+              <p>If set to <code>true</code>,<wbr/> a hot pixel map is returned in <a href="#dynamic_android.statistics.hotPixelMap">android.<wbr/>statistics.<wbr/>hot<wbr/>Pixel<wbr/>Map</a>.<wbr/>
+If set to <code>false</code>,<wbr/> no hot pixel map will be returned.<wbr/></p>
             </td>
           </tr>
 
@@ -20386,6 +21152,7 @@
 
 
 
+
                 <div class="entry_type_notes">list of coordinates based on android.<wbr/>sensor.<wbr/>pixel<wbr/>Array<wbr/>Size</div>
 
 
@@ -20456,6 +21223,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -20483,6 +21252,9 @@
             </td>
 
             <td class="entry_tags">
+              <ul class="entry_tags">
+                  <li><a href="#tag_RAW">RAW</a></li>
+              </ul>
             </td>
 
           </tr>
@@ -20494,6 +21266,7 @@
               <p>When set to ON,<wbr/>
 <a href="#dynamic_android.statistics.lensShadingMap">android.<wbr/>statistics.<wbr/>lens<wbr/>Shading<wbr/>Map</a> will be provided in
 the output result metadata.<wbr/></p>
+<p>ON is always supported on devices with the RAW capability.<wbr/></p>
             </td>
           </tr>
 
@@ -20549,6 +21322,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
                 <div class="entry_type_notes">1D array of float pairs (P_<wbr/>IN,<wbr/> P_<wbr/>OUT).<wbr/> The maximum number of pairs is specified by android.<wbr/>tonemap.<wbr/>max<wbr/>Curve<wbr/>Points.<wbr/></div>
 
@@ -20562,11 +21337,9 @@
             </td>
 
             <td class="entry_units">
-              same as android.<wbr/>tonemap.<wbr/>curve<wbr/>Red
             </td>
 
             <td class="entry_range">
-              <p>same as <a href="#controls_android.tonemap.curveRed">android.<wbr/>tonemap.<wbr/>curve<wbr/>Red</a></p>
             </td>
 
             <td class="entry_tags">
@@ -20602,6 +21375,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
                 <div class="entry_type_notes">1D array of float pairs (P_<wbr/>IN,<wbr/> P_<wbr/>OUT).<wbr/> The maximum number of pairs is specified by android.<wbr/>tonemap.<wbr/>max<wbr/>Curve<wbr/>Points.<wbr/></div>
 
@@ -20615,11 +21390,9 @@
             </td>
 
             <td class="entry_units">
-              same as android.<wbr/>tonemap.<wbr/>curve<wbr/>Red
             </td>
 
             <td class="entry_range">
-              <p>same as <a href="#controls_android.tonemap.curveRed">android.<wbr/>tonemap.<wbr/>curve<wbr/>Red</a></p>
             </td>
 
             <td class="entry_tags">
@@ -20655,6 +21428,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
                 <div class="entry_type_notes">1D array of float pairs (P_<wbr/>IN,<wbr/> P_<wbr/>OUT).<wbr/> The maximum number of pairs is specified by android.<wbr/>tonemap.<wbr/>max<wbr/>Curve<wbr/>Points.<wbr/></div>
 
@@ -20688,8 +21463,8 @@
 <pre><code><a href="#controls_android.tonemap.curveRed">android.<wbr/>tonemap.<wbr/>curve<wbr/>Red</a> =
   [ P0in,<wbr/> P0out,<wbr/> P1in,<wbr/> P1out,<wbr/> P2in,<wbr/> P2out,<wbr/> P3in,<wbr/> P3out,<wbr/> ...,<wbr/> PNin,<wbr/> PNout ]
 2 &lt;= N &lt;= <a href="#static_android.tonemap.maxCurvePoints">android.<wbr/>tonemap.<wbr/>max<wbr/>Curve<wbr/>Points</a></code></pre>
-<p>These are sorted in order of increasing <code>Pin</code>; it is always
-guaranteed that input values 0.<wbr/>0 and 1.<wbr/>0 are included in the list to
+<p>These are sorted in order of increasing <code>Pin</code>; it is
+required that input values 0.<wbr/>0 and 1.<wbr/>0 are included in the list to
 define a complete mapping.<wbr/> For input values between control points,<wbr/>
 the camera device must linearly interpolate between the control
 points.<wbr/></p>
@@ -20755,6 +21530,8 @@
 
               <span class="entry_type_synthetic">[synthetic] </span>
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
@@ -20851,6 +21628,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -20886,6 +21665,7 @@
             </td>
 
             <td class="entry_range">
+              <p><a href="#static_android.tonemap.availableToneMapModes">android.<wbr/>tonemap.<wbr/>available<wbr/>Tone<wbr/>Map<wbr/>Modes</a></p>
             </td>
 
             <td class="entry_tags">
@@ -20908,8 +21688,6 @@
 tables,<wbr/> selective chroma enhancement,<wbr/> or other non-linear color
 transforms will be disabled when <a href="#controls_android.tonemap.mode">android.<wbr/>tonemap.<wbr/>mode</a> is
 CONTRAST_<wbr/>CURVE.<wbr/></p>
-<p>This must be set to a valid mode in
-<a href="#static_android.tonemap.availableToneMapModes">android.<wbr/>tonemap.<wbr/>available<wbr/>Tone<wbr/>Map<wbr/>Modes</a>.<wbr/></p>
 <p>When using either FAST or HIGH_<wbr/>QUALITY,<wbr/> the camera device will
 emit its own tonemap curve in <a href="#controls_android.tonemap.curve">android.<wbr/>tonemap.<wbr/>curve</a>.<wbr/>
 These values are always available,<wbr/> and as close as possible to the
@@ -20963,6 +21741,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
@@ -20977,7 +21757,6 @@
             </td>
 
             <td class="entry_range">
-              <p>&gt;= 64</p>
             </td>
 
             <td class="entry_tags">
@@ -20989,10 +21768,9 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>If the actual number of points provided by the application (in
-<a href="#controls_android.tonemap.curve">android.<wbr/>tonemap.<wbr/>curve</a>*)  is less than max,<wbr/> the camera device will
-resample the curve to its internal representation,<wbr/> using linear
-interpolation.<wbr/></p>
+              <p>If the actual number of points provided by the application (in <a href="#controls_android.tonemap.curve">android.<wbr/>tonemap.<wbr/>curve</a>*) is
+less than this maximum,<wbr/> the camera device will resample the curve to its internal
+representation,<wbr/> using linear interpolation.<wbr/></p>
 <p>The output curves in the result metadata may have a different number
 of points than the input curves,<wbr/> and will represent the actual
 hardware curves used as closely as possible when linearly interpolated.<wbr/></p>
@@ -21027,6 +21805,8 @@
               <span class="entry_type_visibility"> [public as enumList]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
                 <div class="entry_type_notes">list of enums</div>
 
@@ -21034,13 +21814,15 @@
             </td> <!-- entry_type -->
 
             <td class="entry_description">
-              <p>The set of tonemapping modes supported by this camera device.<wbr/></p>
+              <p>List of tonemapping modes for <a href="#controls_android.tonemap.mode">android.<wbr/>tonemap.<wbr/>mode</a> that are supported by this camera
+device.<wbr/></p>
             </td>
 
             <td class="entry_units">
             </td>
 
             <td class="entry_range">
+              <p>Any value listed in <a href="#controls_android.tonemap.mode">android.<wbr/>tonemap.<wbr/>mode</a></p>
             </td>
 
             <td class="entry_tags">
@@ -21052,9 +21834,8 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>This tag lists the valid modes for <a href="#controls_android.tonemap.mode">android.<wbr/>tonemap.<wbr/>mode</a>.<wbr/></p>
-<p>Full-capability camera devices must always support CONTRAST_<wbr/>CURVE and
-FAST.<wbr/></p>
+              <p>Camera devices that support the MANUAL_<wbr/>POST_<wbr/>PROCESSING capability will always list
+CONTRAST_<wbr/>CURVE and FAST.<wbr/> This includes all FULL level devices.<wbr/></p>
             </td>
           </tr>
 
@@ -21105,6 +21886,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
                 <div class="entry_type_notes">1D array of float pairs (P_<wbr/>IN,<wbr/> P_<wbr/>OUT).<wbr/> The maximum number of pairs is specified by android.<wbr/>tonemap.<wbr/>max<wbr/>Curve<wbr/>Points.<wbr/></div>
 
@@ -21118,11 +21901,9 @@
             </td>
 
             <td class="entry_units">
-              same as android.<wbr/>tonemap.<wbr/>curve<wbr/>Red
             </td>
 
             <td class="entry_range">
-              <p>same as <a href="#controls_android.tonemap.curveRed">android.<wbr/>tonemap.<wbr/>curve<wbr/>Red</a></p>
             </td>
 
             <td class="entry_tags">
@@ -21158,6 +21939,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
                 <div class="entry_type_notes">1D array of float pairs (P_<wbr/>IN,<wbr/> P_<wbr/>OUT).<wbr/> The maximum number of pairs is specified by android.<wbr/>tonemap.<wbr/>max<wbr/>Curve<wbr/>Points.<wbr/></div>
 
@@ -21171,11 +21954,9 @@
             </td>
 
             <td class="entry_units">
-              same as android.<wbr/>tonemap.<wbr/>curve<wbr/>Red
             </td>
 
             <td class="entry_range">
-              <p>same as <a href="#controls_android.tonemap.curveRed">android.<wbr/>tonemap.<wbr/>curve<wbr/>Red</a></p>
             </td>
 
             <td class="entry_tags">
@@ -21211,6 +21992,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
                 <div class="entry_type_notes">1D array of float pairs (P_<wbr/>IN,<wbr/> P_<wbr/>OUT).<wbr/> The maximum number of pairs is specified by android.<wbr/>tonemap.<wbr/>max<wbr/>Curve<wbr/>Points.<wbr/></div>
 
@@ -21244,8 +22027,8 @@
 <pre><code><a href="#controls_android.tonemap.curveRed">android.<wbr/>tonemap.<wbr/>curve<wbr/>Red</a> =
   [ P0in,<wbr/> P0out,<wbr/> P1in,<wbr/> P1out,<wbr/> P2in,<wbr/> P2out,<wbr/> P3in,<wbr/> P3out,<wbr/> ...,<wbr/> PNin,<wbr/> PNout ]
 2 &lt;= N &lt;= <a href="#static_android.tonemap.maxCurvePoints">android.<wbr/>tonemap.<wbr/>max<wbr/>Curve<wbr/>Points</a></code></pre>
-<p>These are sorted in order of increasing <code>Pin</code>; it is always
-guaranteed that input values 0.<wbr/>0 and 1.<wbr/>0 are included in the list to
+<p>These are sorted in order of increasing <code>Pin</code>; it is
+required that input values 0.<wbr/>0 and 1.<wbr/>0 are included in the list to
 define a complete mapping.<wbr/> For input values between control points,<wbr/>
 the camera device must linearly interpolate between the control
 points.<wbr/></p>
@@ -21311,6 +22094,8 @@
 
               <span class="entry_type_synthetic">[synthetic] </span>
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
 
@@ -21407,6 +22192,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -21442,6 +22229,7 @@
             </td>
 
             <td class="entry_range">
+              <p><a href="#static_android.tonemap.availableToneMapModes">android.<wbr/>tonemap.<wbr/>available<wbr/>Tone<wbr/>Map<wbr/>Modes</a></p>
             </td>
 
             <td class="entry_tags">
@@ -21464,8 +22252,6 @@
 tables,<wbr/> selective chroma enhancement,<wbr/> or other non-linear color
 transforms will be disabled when <a href="#controls_android.tonemap.mode">android.<wbr/>tonemap.<wbr/>mode</a> is
 CONTRAST_<wbr/>CURVE.<wbr/></p>
-<p>This must be set to a valid mode in
-<a href="#static_android.tonemap.availableToneMapModes">android.<wbr/>tonemap.<wbr/>available<wbr/>Tone<wbr/>Map<wbr/>Modes</a>.<wbr/></p>
 <p>When using either FAST or HIGH_<wbr/>QUALITY,<wbr/> the camera device will
 emit its own tonemap curve in <a href="#controls_android.tonemap.curve">android.<wbr/>tonemap.<wbr/>curve</a>.<wbr/>
 These values are always available,<wbr/> and as close as possible to the
@@ -21526,6 +22312,7 @@
 
 
 
+
                 <ul class="entry_type_enum">
                   <li>
                     <span class="entry_type_enum_name">OFF</span>
@@ -21606,6 +22393,7 @@
 
 
 
+
                 <ul class="entry_type_enum">
                   <li>
                     <span class="entry_type_enum_name">OFF</span>
@@ -21690,6 +22478,7 @@
 
 
 
+
                 <ul class="entry_type_enum">
                   <li>
                     <span class="entry_type_enum_name">TRANSMIT</span>
@@ -21762,6 +22551,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -21789,7 +22580,6 @@
             </td>
 
             <td class="entry_range">
-              <p>Default value is LIMITED.<wbr/></p>
             </td>
 
             <td class="entry_tags">
@@ -21801,8 +22591,8 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>Camera devices will come in two flavors: LIMITED and FULL.<wbr/></p>
-<p>A FULL device has the most support possible and will support below capabilities:</p>
+              <p>Camera devices will come in three flavors: LEGACY,<wbr/> LIMITED and FULL.<wbr/></p>
+<p>A FULL device will support below capabilities:</p>
 <ul>
 <li>30fps at maximum resolution (== sensor resolution) is preferred,<wbr/> more than 20fps is required.<wbr/></li>
 <li>Per frame control (<a href="#static_android.sync.maxLatency">android.<wbr/>sync.<wbr/>max<wbr/>Latency</a> <code>==</code> PER_<wbr/>FRAME_<wbr/>CONTROL)</li>
@@ -21816,8 +22606,20 @@
 </ul>
 <p>A LIMITED device may have some or none of the above characteristics.<wbr/>
 To find out more refer to <a href="#static_android.request.availableCapabilities">android.<wbr/>request.<wbr/>available<wbr/>Capabilities</a>.<wbr/></p>
+<p>Some features are not part of any particular hardware level or capability and must be
+queried separately.<wbr/> These include:</p>
+<ul>
+<li>Calibrated timestamps (<a href="#static_android.sensor.info.timestampSource">android.<wbr/>sensor.<wbr/>info.<wbr/>timestamp<wbr/>Source</a> <code>==</code> REALTIME)</li>
+<li>Precision lens control (<a href="#static_android.lens.info.focusDistanceCalibration">android.<wbr/>lens.<wbr/>info.<wbr/>focus<wbr/>Distance<wbr/>Calibration</a> <code>==</code> CALIBRATED)</li>
+<li>Face detection (<a href="#static_android.statistics.info.availableFaceDetectModes">android.<wbr/>statistics.<wbr/>info.<wbr/>available<wbr/>Face<wbr/>Detect<wbr/>Modes</a>)</li>
+<li>Optical or electrical image stabilization
+  (<a href="#static_android.lens.info.availableOpticalStabilization">android.<wbr/>lens.<wbr/>info.<wbr/>available<wbr/>Optical<wbr/>Stabilization</a>,<wbr/>
+   <a href="#static_android.control.availableVideoStabilizationModes">android.<wbr/>control.<wbr/>available<wbr/>Video<wbr/>Stabilization<wbr/>Modes</a>)</li>
+</ul>
 <p>A LEGACY device does not support per-frame control,<wbr/> manual sensor control,<wbr/> manual
 post-processing,<wbr/> arbitrary cropping regions,<wbr/> and has relaxed performance constraints.<wbr/></p>
+<p>Each higher level supports everything the lower level supports
+in this order: FULL <code>&gt;</code> LIMITED <code>&gt;</code> LEGACY.<wbr/></p>
             </td>
           </tr>
 
@@ -21834,6 +22636,9 @@
 older or inexpensive devices.<wbr/> Full is a strict superset of
 limited,<wbr/> and they share the same essential operational flow.<wbr/></p>
 <p>For full details refer to "S3.<wbr/> Operational Modes" in camera3.<wbr/>h</p>
+<p>Camera HAL3+ must not implement LEGACY mode.<wbr/> It is there
+for backwards compatibility in the <code>android.<wbr/>hardware.<wbr/>camera2</code>
+user-facing API only.<wbr/></p>
             </td>
           </tr>
 
@@ -21884,6 +22689,8 @@
               <span class="entry_type_visibility"> [public as boolean]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -21920,9 +22727,9 @@
           </tr>
           <tr class="entry_cont">
             <td class="entry_details" colspan="5">
-              <p>When set to ON,<wbr/> the values used for black-level
+              <p>When set to <code>true</code> (ON),<wbr/> the values used for black-level
 compensation will not change until the lock is set to
-OFF.<wbr/></p>
+<code>false</code> (OFF).<wbr/></p>
 <p>Since changes to certain capture parameters (such as
 exposure time) may require resetting of black level
 compensation,<wbr/> the camera device must report whether setting
@@ -22014,6 +22821,8 @@
               <span class="entry_type_visibility"> [public as boolean]</span>
 
 
+              <span class="entry_type_hwlevel">[full] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -22118,6 +22927,8 @@
               <span class="entry_type_visibility"> [hidden]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -22283,6 +23094,8 @@
               <span class="entry_type_visibility"> [public]</span>
 
 
+              <span class="entry_type_hwlevel">[legacy] </span>
+
 
 
                 <ul class="entry_type_enum">
@@ -22319,11 +23132,11 @@
             </td>
 
             <td class="entry_units">
-              number of processed requests
+              Frame counts
             </td>
 
             <td class="entry_range">
-              <p>&gt;= -1</p>
+              <p>A positive value,<wbr/> PER_<wbr/>FRAME_<wbr/>CONTROL,<wbr/> or UNKNOWN.<wbr/></p>
             </td>
 
             <td class="entry_tags">
@@ -22546,6 +23359,7 @@
           <li><a href="#controls_android.statistics.hotPixelMapMode">android.statistics.hotPixelMapMode</a> (controls)</li>
           <li><a href="#static_android.statistics.info.availableHotPixelMapModes">android.statistics.info.availableHotPixelMapModes</a> (static)</li>
           <li><a href="#dynamic_android.statistics.hotPixelMap">android.statistics.hotPixelMap</a> (dynamic)</li>
+          <li><a href="#controls_android.statistics.lensShadingMapMode">android.statistics.lensShadingMapMode</a> (controls)</li>
           <li><a href="#dynamic_android.hotPixel.mode">android.hotPixel.mode</a> (dynamic)</li>
         </ul>
       </li> <!-- tag_RAW -->
diff --git a/camera/docs/html.mako b/camera/docs/html.mako
index b94ca31..9e8d4c8 100644
--- a/camera/docs/html.mako
+++ b/camera/docs/html.mako
@@ -61,6 +61,7 @@
     .entry_type_name_enum:after { color: #669900; font-weight: bold; content:" (enum)" }
     .entry_type_visibility { font-weight: bolder; padding-left:1em}
     .entry_type_synthetic { font-weight: bolder; color: #996600; }
+    .entry_type_hwlevel { font-weight: bolder; color: #000066; }
     .entry_type_deprecated { font-weight: bolder; color: #4D4D4D; }
     .entry_type_enum_name { font-family: monospace; font-weight: bolder; }
     .entry_type_enum_notes:before { content:" - " }
@@ -261,6 +262,10 @@
               <span class="entry_type_synthetic">[synthetic] </span>
               % endif
 
+              % if prop.hwlevel:
+              <span class="entry_type_hwlevel">[${prop.hwlevel}] </span>
+              % endif
+
               % if prop.deprecated:
               <span class="entry_type_deprecated">[deprecated] </span>
               % endif
diff --git a/camera/docs/metadata_helpers.py b/camera/docs/metadata_helpers.py
index f0828ac..83e46c9 100644
--- a/camera/docs/metadata_helpers.py
+++ b/camera/docs/metadata_helpers.py
@@ -659,6 +659,46 @@
   cname = csym(enum_entry.name)
   return cname[cname.find('_') + 1:] + '_' + enum_value.name
 
+def generate_extra_javadoc_detail(entry):
+  """
+  Returns a function to add extra details for an entry into a string for inclusion into
+  javadoc. Adds information about units, the list of enum values for this key, and the valid
+  range.
+  """
+  def inner(text):
+    if entry.units:
+      text += '\n\n<b>Units</b>: %s\n' % (dedent(entry.units))
+    if entry.enum and not (entry.typedef and entry.typedef.languages.get('java')):
+      text += '\n\n<b>Possible values:</b>\n<ul>\n'
+      for value in entry.enum.values:
+        if not value.hidden:
+          text += '  <li>{@link #%s %s}</li>\n' % ( jenum_value(entry, value ), value.name )
+      text += '</ul>\n'
+    if entry.range:
+      if entry.enum and not (entry.typedef and entry.typedef.languages.get('java')):
+        text += '\n\n<b>Available values for this device:</b><br>\n'
+      else:
+        text += '\n\n<b>Range of valid values:</b><br>\n'
+      text += '%s\n' % (dedent(entry.range))
+    if entry.hwlevel != 'legacy': # covers any of (None, 'limited', 'full')
+      text += '\n\n<b>Optional</b> - This value may be {@code null} on some devices.\n'
+    if entry.hwlevel == 'full':
+      text += \
+        '\n<b>Full capability</b> - \n' + \
+        'Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the\n' + \
+        'android.info.supportedHardwareLevel key\n'
+    if entry.hwlevel == 'limited':
+      text += \
+        '\n<b>Limited capability</b> - \n' + \
+        'Present on all camera devices that report being at least {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED HARDWARE_LEVEL_LIMITED} devices in the\n' + \
+        'android.info.supportedHardwareLevel key\n'
+    if entry.hwlevel == 'legacy':
+      text += "\nThis key is available on all devices."
+
+    return text
+  return inner
+
+
 def javadoc(metadata, indent = 4):
   """
   Returns a function to format a markdown syntax text block as a
@@ -733,7 +773,7 @@
       # Indent each line
       # Add ' * ' to it for stylistic reasons
       # Strip right side of trailing whitespace
-      return (comment_prefix + line.lstrip()).rstrip()
+      return (comment_prefix + line).rstrip()
 
     # Process each line with above filter
     javatext = "\n".join(line_filter(i) for i in javatext.split("\n")) + "\n"
diff --git a/camera/docs/metadata_model.py b/camera/docs/metadata_model.py
index b546517..e4e1810 100644
--- a/camera/docs/metadata_model.py
+++ b/camera/docs/metadata_model.py
@@ -1030,6 +1030,10 @@
                list of entries (in C code). In general a synthetic entry is
                glued together at the Java layer from multiple visibiltity=hidden
                entries.
+    hwlevel: The lowest hardware level at which the entry is guaranteed
+             to be supported by the camera device. All devices with higher
+             hwlevels will also include this entry. None means that the
+             entry is optional on any hardware level.
     deprecated: Marks an entry as @Deprecated in the Java layer; if within an
                unreleased version this needs to be removed altogether. If applied
                to an entry from an older release, then this means the entry
@@ -1090,6 +1094,7 @@
                   'public'
       synthetic: A bool to mark whether this entry is visible only at the Java
                  layer (True), or at both layers (False = default).
+      hwlevel: A string of the HW level (one of 'legacy', 'limited', 'full')
       deprecated: A bool to mark whether this is @Deprecated at the Java layer
                  (default = False).
       optional: A bool to mark whether optional for non-full hardware devices
@@ -1130,9 +1135,14 @@
     return self._synthetic
 
   @property
+  def hwlevel(self):
+    return self._hwlevel
+
+  @property
   def deprecated(self):
     return self._deprecated
 
+  # TODO: optional should just return hwlevel is None
   @property
   def optional(self):
     return self._optional
@@ -1254,6 +1264,7 @@
 
     self._visibility = kwargs.get('visibility')
     self._synthetic = kwargs.get('synthetic', False)
+    self._hwlevel = kwargs.get('hwlevel')
     self._deprecated = kwargs.get('deprecated', False)
     self._optional = kwargs.get('optional')
 
@@ -1453,6 +1464,7 @@
                     'type_notes',
                     'visibility',
                     'synthetic',
+                    'hwlevel',
                     'deprecated',
                     'optional',
                     'typedef'
diff --git a/camera/docs/metadata_parser_xml.py b/camera/docs/metadata_parser_xml.py
index fb83490..b72c683 100755
--- a/camera/docs/metadata_parser_xml.py
+++ b/camera/docs/metadata_parser_xml.py
@@ -180,6 +180,11 @@
     d['synthetic'] = entry.get('synthetic') == 'true'
 
     #
+    # Hardware Level (one of limited, legacy, full)
+    #
+    d['hwlevel'] = entry.get('hwlevel')
+
+    #
     # Deprecated ?
     #
     d['deprecated'] = entry.get('deprecated') == 'true'
diff --git a/camera/docs/metadata_properties.xml b/camera/docs/metadata_properties.xml
index 8e8a757..c3a8eb4 100644
--- a/camera/docs/metadata_properties.xml
+++ b/camera/docs/metadata_properties.xml
@@ -120,7 +120,7 @@
   <namespace name="android">
     <section name="colorCorrection">
       <controls>
-        <entry name="mode" type="byte" visibility="public" enum="true">
+        <entry name="mode" type="byte" visibility="public" enum="true" hwlevel="full">
           <enum>
             <value>TRANSFORM_MATRIX
               <notes>Use the android.colorCorrection.transform matrix
@@ -220,7 +220,7 @@
         </entry>
         <entry name="transform" type="rational" visibility="public"
                type_notes="3x3 rational matrix in row-major order"
-               container="array" typedef="colorSpaceTransform" >
+               container="array" typedef="colorSpaceTransform" hwlevel="full">
           <array>
             <size>3</size>
             <size>3</size>
@@ -228,6 +228,7 @@
           <description>A color transform matrix to use to transform
           from sensor RGB color space to output linear sRGB color space.
           </description>
+          <units>Unitless scale factors</units>
           <details>This matrix is either set by the camera device when the request
           android.colorCorrection.mode is not TRANSFORM_MATRIX, or
           directly by the application in the request when the
@@ -242,12 +243,13 @@
         </entry>
         <entry name="gains" type="float" visibility="public"
                type_notes="A 1D array of floats for 4 color channel gains"
-               container="array" typedef="rggbChannelVector" >
+               container="array" typedef="rggbChannelVector" hwlevel="full">
           <array>
             <size>4</size>
           </array>
           <description>Gains applying to Bayer raw color channels for
           white-balance.</description>
+          <units>Unitless gain factors</units>
           <details>
           These per-channel gains are either set by the camera device
           when the request android.colorCorrection.mode is not
@@ -269,7 +271,7 @@
           `G_odd` equal to `G_even` in the output result metadata.
           </hal_details>
         </entry>
-        <entry name="aberrationMode" type="byte" visibility="public" enum="true">
+        <entry name="aberrationMode" type="byte" visibility="public" enum="true" hwlevel="legacy">
           <enum>
             <value>OFF
               <notes>
@@ -292,10 +294,8 @@
           <description>
             Mode of operation for the chromatic aberration correction algorithm.
           </description>
+          <range>android.colorCorrection.availableAberrationModes</range>
           <details>
-            This must be set to a valid mode from
-            android.colorCorrection.availableAberrationModes.
-
             Chromatic (color) aberration is caused by the fact that different wavelengths of light
             can not focus on the same point after exiting from the lens. This metadata defines
             the high level control of chromatic aberration correction algorithm, which aims to
@@ -307,6 +307,8 @@
             use the highest-quality aberration correction algorithms, even if it slows down
             capture rate. FAST means the camera device will not slow down capture rate when
             applying aberration correction.
+
+            LEGACY devices will always be in FAST mode.
           </details>
         </entry>
       </controls>
@@ -322,24 +324,24 @@
       </dynamic>
       <static>
         <entry name="availableAberrationModes" type="byte" visibility="public"
-        type_notes="list of enums" container="array" typedef="enumList">
+        type_notes="list of enums" container="array" typedef="enumList" hwlevel="legacy">
           <array>
             <size>n</size>
           </array>
           <description>
-            The set of aberration correction modes supported by this camera device.
+            List of aberration correction modes for android.colorCorrection.aberrationMode that are
+            supported by this camera device.
           </description>
-          <range>
-            The subset of aberration correction mode from those specified in
-            android.colorCorrection.aberrationMode.
-          </range>
+          <range>Any value listed in android.colorCorrection.aberrationMode</range>
           <details>
-            This metadata lists the valid modes for android.colorCorrection.aberrationMode.
-            If no aberration correction modes are available for a device, this list will solely include
+            This key lists the valid modes for android.colorCorrection.aberrationMode.  If no
+            aberration correction modes are available for a device, this list will solely include
             OFF mode.
 
-            For FULL capability device (android.info.supportedHardwareLevel `==` FULL), OFF must be
-            included.
+            For FULL capability device (android.info.supportedHardwareLevel `==` FULL), OFF is
+            always included.
+
+            LEGACY devices will always only support FAST mode.
           </details>
           <tag id="V1" />
         </entry>
@@ -348,7 +350,7 @@
     <section name="control">
       <controls>
         <entry name="aeAntibandingMode" type="byte" visibility="public"
-               enum="true" >
+               enum="true" hwlevel="legacy">
           <enum>
             <value>OFF
               <notes>
@@ -407,7 +409,7 @@
             android.control.aeAvailableAntibandingModes key contains
             the available modes for a given camera device.
 
-            The default mode is AUTO, which must be supported by all
+            The default mode is AUTO, which is supported by all
             camera devices.
 
             If manual exposure control is enabled (by setting
@@ -429,10 +431,10 @@
           </hal_details>
           <tag id="BC" />
         </entry>
-        <entry name="aeExposureCompensation" type="int32" visibility="public">
+        <entry name="aeExposureCompensation" type="int32" visibility="public" hwlevel="legacy">
           <description>Adjustment to auto-exposure (AE) target image
           brightness.</description>
-          <units>count of positive/negative EV steps</units>
+          <units>Compensation steps</units>
           <range>android.control.aeCompensationRange</range>
           <details>
           The adjustment is measured as a count of steps, with the
@@ -456,7 +458,7 @@
           <tag id="BC" />
         </entry>
         <entry name="aeLock" type="byte" visibility="public" enum="true"
-               typedef="boolean">
+               typedef="boolean" hwlevel="legacy">
           <enum>
             <value>OFF
             <notes>Auto-exposure lock is disabled; the AE algorithm
@@ -468,13 +470,20 @@
 
             android.control.aeExposureCompensation setting changes
             will still take effect while auto-exposure is locked.
+
+            Some rare LEGACY devices may not support
+            this, in which case the value will always be overridden to OFF.
             </notes></value>
           </enum>
           <description>Whether auto-exposure (AE) is currently locked to its latest
           calculated values.</description>
-          <details>Note that even when AE is locked, the flash may be
-          fired if the android.control.aeMode is ON_AUTO_FLASH / ON_ALWAYS_FLASH /
-          ON_AUTO_FLASH_REDEYE.
+          <details>
+          When set to `true` (ON), the AE algorithm is locked to its latest parameters,
+          and will not change exposure settings until the lock is set to `false` (OFF).
+
+          Note that even when AE is locked, the flash may be fired if
+          the android.control.aeMode is ON_AUTO_FLASH /
+          ON_ALWAYS_FLASH / ON_AUTO_FLASH_REDEYE.
 
           When android.control.aeExposureCompensation is changed, even if the AE lock
           is ON, the camera device will still adjust its exposure value.
@@ -486,11 +495,24 @@
           is ON_AUTO_FLASH/ON_AUTO_FLASH_REDEYE and the scene is too dark. If the
           android.control.aeMode is ON_ALWAYS_FLASH, the scene may become overexposed.
 
+          Since the camera device has a pipeline of in-flight requests, the settings that
+          get locked do not necessarily correspond to the settings that were present in the
+          latest capture result received from the camera device, since additional captures
+          and AE updates may have occurred even before the result was sent out. If an
+          application is switching between automatic and manual control and wishes to eliminate
+          any flicker during the switch, the following procedure is recommended:
+
+            1. Starting in auto-AE mode:
+            2. Lock AE
+            3. Wait for the first result to be output that has the AE locked
+            4. Copy exposure settings from that result into a request, set the request to manual AE
+            5. Submit the capture request, proceed to run manual AE as desired.
+
           See android.control.aeState for AE lock related state transition details.
           </details>
           <tag id="BC" />
         </entry>
-        <entry name="aeMode" type="byte" visibility="public" enum="true">
+        <entry name="aeMode" type="byte" visibility="public" enum="true" hwlevel="legacy">
           <enum>
             <value>OFF
               <notes>
@@ -501,6 +523,9 @@
                 android.sensor.frameDuration are used by the camera
                 device, along with android.flash.* fields, if there's
                 a flash unit for this camera device.
+
+                LEGACY devices do not support the OFF mode and will
+                override attempts to use this value to ON.
               </notes>
             </value>
             <value>ON
@@ -588,30 +613,41 @@
             <size>5</size>
             <size>area_count</size>
           </array>
-          <description>List of areas to use for
-          metering.</description>
-          <range>`area_count &lt;= android.control.maxRegions[0]`</range>
+          <description>List of metering areas to use for auto-exposure adjustment.</description>
+          <units>Pixel coordinates within android.sensor.info.activeArraySize</units>
+          <range>Coordinates must be between `[(0,0), (width, height))` of
+          android.sensor.info.activeArraySize</range>
           <details>
-              Optional. Not available if android.control.maxRegionsAe is 0.
+              Not available if android.control.maxRegionsAe is 0.
               Otherwise will always be present.
 
+              The maximum number of regions supported by the device is determined by the value
+              of android.control.maxRegionsAe.
+
               The coordinate system is based on the active pixel array,
               with (0,0) being the top-left pixel in the active pixel array, and
               (android.sensor.info.activeArraySize.width - 1,
               android.sensor.info.activeArraySize.height - 1) being the
               bottom-right pixel in the active pixel array.
 
-              The weight must range from 0 to 1000, and represents a weight
+              The weight must be within `[0, 1000]`, and represents a weight
               for every pixel in the area. This means that a large metering area
               with the same weight as a smaller area will have more effect in
               the metering result. Metering areas can partially overlap and the
               camera device will add the weights in the overlap region.
 
-              If all regions have 0 weight, then no specific metering area
-              needs to be used by the camera device. If the metering region is
-              outside the used android.scaler.cropRegion returned in capture result metadata,
-              the camera device will ignore the sections outside the region and output the
-              used sections in the result metadata.
+              The weights are relative to weights of other exposure metering regions, so if only one
+              region is used, all non-zero weights will have the same effect. A region with 0
+              weight is ignored.
+
+              If all regions have 0 weight, then no specific metering area needs to be used by the
+              camera device.
+
+              If the metering region is outside the used android.scaler.cropRegion returned in
+              capture result metadata, the camera device will ignore the sections outside the crop
+              region and output only the intersection rectangle as the metering region in the result
+              metadata.  If the region is entirely outside the crop region, it will be ignored and
+              not reported in the result metadata.
           </details>
           <hal_details>
               The HAL level representation of MeteringRectangle[] is a
@@ -624,19 +660,22 @@
           <tag id="BC" />
         </entry>
         <entry name="aeTargetFpsRange" type="int32" visibility="public"
-               container="array" typedef="rangeInt">
+               container="array" typedef="rangeInt" hwlevel="legacy">
           <array>
             <size>2</size>
           </array>
-          <description>Range over which fps can be adjusted to
-          maintain exposure.</description>
-          <range>android.control.aeAvailableTargetFpsRanges</range>
+          <description>Range over which the auto-exposure routine can
+          adjust the capture frame rate to maintain good
+          exposure.</description>
+          <units>Frames per second (FPS)</units>
+          <range>Any of the entries in android.control.aeAvailableTargetFpsRanges</range>
           <details>Only constrains auto-exposure (AE) algorithm, not
-          manual control of android.sensor.exposureTime</details>
+          manual control of android.sensor.exposureTime and
+          android.sensor.frameDuration.</details>
           <tag id="BC" />
         </entry>
         <entry name="aePrecaptureTrigger" type="byte" visibility="public"
-               enum="true">
+               enum="true" hwlevel="limited">
           <enum>
             <value>IDLE
               <notes>The trigger is idle.</notes>
@@ -669,10 +708,17 @@
           The exact effect of auto-exposure (AE) precapture trigger
           depends on the current AE mode and state; see
           android.control.aeState for AE precapture state transition
-          details.</details>
+          details.
+
+          On LEGACY-level devices, the precapture trigger is not supported;
+          capturing a high-resolution JPEG image will automatically trigger a
+          precapture sequence before the high-resolution capture, including
+          potentially firing a pre-capture flash.
+          </details>
           <tag id="BC" />
         </entry>
-        <entry name="afMode" type="byte" visibility="public" enum="true">
+        <entry name="afMode" type="byte" visibility="public" enum="true"
+               hwlevel="legacy">
           <enum>
             <value>OFF
             <notes>The auto-focus routine does not control the lens;
@@ -799,30 +845,41 @@
             <size>5</size>
             <size>area_count</size>
           </array>
-          <description>List of areas to use for focus
-          estimation.</description>
-          <range>`area_count &lt;= android.control.maxRegions[2]`</range>
+          <description>List of metering areas to use for auto-focus.</description>
+          <units>Pixel coordinates within android.sensor.info.activeArraySize</units>
+          <range>Coordinates must be between `[(0,0), (width, height))` of
+          android.sensor.info.activeArraySize</range>
           <details>
-              Optional. Not available if android.control.maxRegionsAf is 0.
+              Not available if android.control.maxRegionsAf is 0.
               Otherwise will always be present.
 
+              The maximum number of focus areas supported by the device is determined by the value
+              of android.control.maxRegionsAf.
+
               The coordinate system is based on the active pixel array,
               with (0,0) being the top-left pixel in the active pixel array, and
               (android.sensor.info.activeArraySize.width - 1,
               android.sensor.info.activeArraySize.height - 1) being the
               bottom-right pixel in the active pixel array.
 
-              The weight must range from 0 to 1000, and represents a weight
+              The weight must be within `[0, 1000]`, and represents a weight
               for every pixel in the area. This means that a large metering area
               with the same weight as a smaller area will have more effect in
               the metering result. Metering areas can partially overlap and the
               camera device will add the weights in the overlap region.
 
-              If all regions have 0 weight, then no specific metering area
-              needs to be used by the camera device. If the metering region is
-              outside the used android.scaler.cropRegion returned in capture result metadata,
-              the camera device will ignore the sections outside the region and output the
-              used sections in the result metadata.
+              The weights are relative to weights of other metering regions, so if only one region
+              is used, all non-zero weights will have the same effect. A region with 0 weight is
+              ignored.
+
+              If all regions have 0 weight, then no specific metering area needs to be used by the
+              camera device.
+
+              If the metering region is outside the used android.scaler.cropRegion returned in
+              capture result metadata, the camera device will ignore the sections outside the crop
+              region and output only the intersection rectangle as the metering region in the result
+              metadata. If the region is entirely outside the crop region, it will be ignored and
+              not reported in the result metadata.
           </details>
           <hal_details>
               The HAL level representation of MeteringRectangle[] is a
@@ -834,7 +891,8 @@
           </hal_details>
           <tag id="BC" />
         </entry>
-        <entry name="afTrigger" type="byte" visibility="public" enum="true">
+        <entry name="afTrigger" type="byte" visibility="public" enum="true"
+               hwlevel="legacy">
           <enum>
             <value>IDLE
               <notes>The trigger is idle.</notes>
@@ -869,7 +927,7 @@
           <tag id="BC" />
         </entry>
         <entry name="awbLock" type="byte" visibility="public" enum="true"
-               typedef="boolean">
+               typedef="boolean" hwlevel="legacy">
           <enum>
             <value>OFF
             <notes>Auto-white balance lock is disabled; the AWB
@@ -882,12 +940,33 @@
           </enum>
           <description>Whether auto-white balance (AWB) is currently locked to its
           latest calculated values.</description>
-          <details>Note that AWB lock is only meaningful when
+          <details>
+          When set to `true` (ON), the AWB algorithm is locked to its latest parameters,
+          and will not change color balance settings until the lock is set to `false` (OFF).
+
+          Since the camera device has a pipeline of in-flight requests, the settings that
+          get locked do not necessarily correspond to the settings that were present in the
+          latest capture result received from the camera device, since additional captures
+          and AWB updates may have occurred even before the result was sent out. If an
+          application is switching between automatic and manual control and wishes to eliminate
+          any flicker during the switch, the following procedure is recommended:
+
+            1. Starting in auto-AWB mode:
+            2. Lock AWB
+            3. Wait for the first result to be output that has the AWB locked
+            4. Copy AWB settings from that result into a request, set the request to manual AWB
+            5. Submit the capture request, proceed to run manual AWB as desired.
+
+          Note that AWB lock is only meaningful when
           android.control.awbMode is in the AUTO mode; in other modes,
-          AWB is already fixed to a specific setting.</details>
+          AWB is already fixed to a specific setting.
+
+          Some LEGACY devices may not support ON; the value is then overridden to OFF.
+          </details>
           <tag id="BC" />
         </entry>
-        <entry name="awbMode" type="byte" visibility="public" enum="true">
+        <entry name="awbMode" type="byte" visibility="public" enum="true"
+               hwlevel="legacy">
           <enum>
             <value>OFF
             <notes>
@@ -1051,13 +1130,18 @@
             <size>5</size>
             <size>area_count</size>
           </array>
-          <description>List of areas to use for illuminant
+          <description>List of metering areas to use for auto-white-balance illuminant
           estimation.</description>
-          <range>`area_count &lt;= android.control.maxRegions[1]`</range>
+          <units>Pixel coordinates within android.sensor.info.activeArraySize</units>
+          <range>Coordinates must be between `[(0,0), (width, height))` of
+          android.sensor.info.activeArraySize</range>
           <details>
-              Optional. Not available if android.control.maxRegionsAwb is 0.
+              Not available if android.control.maxRegionsAwb is 0.
               Otherwise will always be present.
 
+              The maximum number of regions supported by the device is determined by the value
+              of android.control.maxRegionsAwb.
+
               The coordinate system is based on the active pixel array,
               with (0,0) being the top-left pixel in the active pixel array, and
               (android.sensor.info.activeArraySize.width - 1,
@@ -1070,11 +1154,18 @@
               the metering result. Metering areas can partially overlap and the
               camera device will add the weights in the overlap region.
 
-              If all regions have 0 weight, then no specific metering area
-              needs to be used by the camera device. If the metering region is
-              outside the used android.scaler.cropRegion returned in capture result metadata,
-              the camera device will ignore the sections outside the region and output the
-              used sections in the result metadata.
+              The weights are relative to weights of other white balance metering regions, so if
+              only one region is used, all non-zero weights will have the same effect. A region with
+              0 weight is ignored.
+
+              If all regions have 0 weight, then no specific metering area needs to be used by the
+              camera device.
+
+              If the metering region is outside the used android.scaler.cropRegion returned in
+              capture result metadata, the camera device will ignore the sections outside the crop
+              region and output only the intersection rectangle as the metering region in the result
+              metadata.  If the region is entirely outside the crop region, it will be ignored and
+              not reported in the result metadata.
           </details>
           <hal_details>
               The HAL level representation of MeteringRectangle[] is a
@@ -1086,7 +1177,8 @@
           </hal_details>
           <tag id="BC" />
         </entry>
-        <entry name="captureIntent" type="byte" visibility="public" enum="true">
+        <entry name="captureIntent" type="byte" visibility="public" enum="true"
+               hwlevel="legacy">
           <enum>
             <value>CUSTOM
             <notes>The goal of this request doesn't fall into the other
@@ -1132,16 +1224,17 @@
           auto-focus, auto-white balance) routines about the purpose
           of this capture, to help the camera device to decide optimal 3A
           strategy.</description>
-          <range>All must be supported except for ZERO_SHUTTER_LAG and MANUAL.</range>
           <details>This control (except for MANUAL) is only effective if
           `android.control.mode != OFF` and any 3A routine is active.
 
           ZERO_SHUTTER_LAG will be supported if android.request.availableCapabilities
           contains ZSL. MANUAL will be supported if android.request.availableCapabilities
-          contains MANUAL_SENSOR.</details>
+          contains MANUAL_SENSOR. Other intent values are always supported.
+          </details>
           <tag id="BC" />
         </entry>
-        <entry name="effectMode" type="byte" visibility="public" enum="true">
+        <entry name="effectMode" type="byte" visibility="public" enum="true"
+               hwlevel="legacy">
           <enum>
             <value>OFF
               <notes>
@@ -1209,13 +1302,11 @@
           implementor of the camera device, and should not be
           depended on to be consistent (or present) across all
           devices.
-
-          A color effect will only be applied if
-          android.control.mode != OFF.
           </details>
           <tag id="BC" />
         </entry>
-        <entry name="mode" type="byte" visibility="public" enum="true">
+        <entry name="mode" type="byte" visibility="public" enum="true"
+               hwlevel="legacy">
           <enum>
             <value>OFF
             <notes>Full application control of pipeline.
@@ -1261,10 +1352,10 @@
             discarded by the camera device.
             </notes></value>
           </enum>
-          <description>Overall mode of 3A control
+          <description>Overall mode of 3A (auto-exposure, auto-white-balance, auto-focus) control
           routines.</description>
-          <range>all must be supported</range>
-          <details>High-level 3A control. When set to OFF, all 3A control
+          <details>
+          This is a top-level 3A control switch. When set to OFF, all 3A control
           by the camera device is disabled. The application must set the fields for
           capture parameters itself.
 
@@ -1282,10 +1373,16 @@
           update, as if this frame is never captured. This mode can be used in the scenario
           where the application doesn't want a 3A manual control capture to affect
           the subsequent auto 3A capture results.
+
+          LEGACY mode devices will only support AUTO and USE_SCENE_MODE modes.
+          LIMITED mode devices will only support OFF and OFF_KEEP_STATE if they
+          support the MANUAL_SENSOR and MANUAL_POST_PROCSESING capabilities.
+          FULL mode devices will always support OFF and OFF_KEEP_STATE.
           </details>
           <tag id="BC" />
         </entry>
-        <entry name="sceneMode" type="byte" visibility="public" enum="true">
+        <entry name="sceneMode" type="byte" visibility="public" enum="true"
+               hwlevel="legacy">
           <enum>
             <value id="0">DISABLED
               <notes>
@@ -1461,21 +1558,24 @@
             <value optional="true" hidden="true">HDR
               <notes>
               Turn on custom high dynamic range (HDR) mode.
+
+              This is intended for LEGACY mode devices only;
+              HAL3+ camera devices should not implement this mode.
               </notes>
             </value>
           </enum>
           <description>
-          A camera mode optimized for conditions typical in a particular
-          capture setting.
+          Control for which scene mode is currently active.
           </description>
           <range>android.control.availableSceneModes</range>
           <details>
+          Scene modes are custom camera modes optimized for a certain set of conditions and
+          capture settings.
+
           This is the mode that that is active when
           `android.control.mode == USE_SCENE_MODE`. Aside from FACE_PRIORITY,
           these modes will disable android.control.aeMode,
           android.control.awbMode, and android.control.afMode while in use.
-          The scene modes available for a given camera device are listed in
-          android.control.availableSceneModes.
 
           The interpretation and implementation of these scene modes is left
           to the implementor of the camera device. Their behavior will not be
@@ -1498,7 +1598,7 @@
           <tag id="BC" />
         </entry>
         <entry name="videoStabilizationMode" type="byte" visibility="public"
-               enum="true">
+               enum="true" hwlevel="legacy">
           <enum>
             <value>OFF
             <notes>
@@ -1512,104 +1612,141 @@
           <description>Whether video stabilization is
           active.</description>
           <details>
-          Video stabilization automatically translates and scales images from the camera
-          in order to stabilize motion between consecutive frames.
+          Video stabilization automatically translates and scales images from
+          the camera in order to stabilize motion between consecutive frames.
 
           If enabled, video stabilization can modify the
           android.scaler.cropRegion to keep the video stream stabilized.
 
-          Switching between different video stabilization modes may take several frames
-          to initialize, the camera device will report the current mode in capture result
-          metadata. For example, When "ON" mode is requested, the video stabilization modes
-          in the first several capture results may still be "OFF", and it will become "ON"
-          when the initialization is done.
+          Switching between different video stabilization modes may take several
+          frames to initialize, the camera device will report the current mode
+          in capture result metadata. For example, When "ON" mode is requested,
+          the video stabilization modes in the first several capture results may
+          still be "OFF", and it will become "ON" when the initialization is
+          done.
 
-          If a camera device supports both this mode and OIS (android.lens.opticalStabilizationMode),
-          turning both modes on may produce undesirable interaction, so it is recommended not to
-          enable both at the same time.
+          If a camera device supports both this mode and OIS
+          (android.lens.opticalStabilizationMode), turning both modes on may
+          produce undesirable interaction, so it is recommended not to enable
+          both at the same time.
           </details>
           <tag id="BC" />
         </entry>
       </controls>
       <static>
         <entry name="aeAvailableAntibandingModes" type="byte" visibility="public"
-               type_notes="list of enums" container="array" typedef="enumList" >
+               type_notes="list of enums" container="array" typedef="enumList"
+               hwlevel="legacy">
           <array>
             <size>n</size>
           </array>
           <description>
-            The set of auto-exposure antibanding modes that are
+            List of auto-exposure antibanding modes for android.control.aeAntibandingMode that are
             supported by this camera device.
           </description>
+          <range>Any value listed in android.control.aeAntibandingMode</range>
           <details>
             Not all of the auto-exposure anti-banding modes may be
             supported by a given camera device. This field lists the
             valid anti-banding modes that the application may request
-            for this camera device; they must include AUTO.
+            for this camera device with the
+            android.control.aeAntibandingMode control. This list
+            always includes AUTO.
           </details>
           <tag id="BC" />
         </entry>
         <entry name="aeAvailableModes" type="byte" visibility="public"
-               type_notes="list of enums" container="array" typedef="enumList">
+               type_notes="list of enums" container="array" typedef="enumList"
+               hwlevel="legacy">
           <array>
             <size>n</size>
           </array>
           <description>
-            The set of auto-exposure modes that are supported by this
-            camera device.
+            List of auto-exposure modes for android.control.aeMode that are supported by this camera
+            device.
           </description>
+          <range>Any value listed in android.control.aeMode</range>
           <details>
             Not all the auto-exposure modes may be supported by a
             given camera device, especially if no flash unit is
             available. This entry lists the valid modes for
             android.control.aeMode for this camera device.
 
-            All camera devices support ON, and all camera devices with
-            flash units support ON_AUTO_FLASH and
-            ON_ALWAYS_FLASH.
+            All camera devices support ON, and all camera devices with flash
+            units support ON_AUTO_FLASH and ON_ALWAYS_FLASH.
 
             FULL mode camera devices always support OFF mode,
             which enables application control of camera exposure time,
             sensitivity, and frame duration.
+
+            LEGACY mode camera devices never support OFF mode.
+            LIMITED mode devices support OFF if they support the MANUAL_SENSOR
+            capability.
           </details>
           <tag id="BC" />
         </entry>
         <entry name="aeAvailableTargetFpsRanges" type="int32" visibility="public"
                type_notes="list of pairs of frame rates"
-               container="array" typedef="rangeInt">
+               container="array" typedef="rangeInt"
+               hwlevel="legacy">
           <array>
             <size>2</size>
             <size>n</size>
           </array>
-          <description>List of frame rate ranges supported by the
-          auto-exposure (AE) algorithm/hardware</description>
+          <description>List of frame rate ranges for android.control.aeTargetFpsRange supported by
+          this camera device.</description>
+          <units>Frames per second (FPS)</units>
+          <details>
+          For devices at the LIMITED level or above, this list will include at least (30, 30) for
+          constant-framerate recording.
+          </details>
           <tag id="BC" />
         </entry>
         <entry name="aeCompensationRange" type="int32" visibility="public"
-               container="array" typedef="rangeInt">
+               container="array" typedef="rangeInt"
+               hwlevel="legacy">
           <array>
             <size>2</size>
           </array>
-          <description>Maximum and minimum exposure compensation
-          setting, in counts of
-          android.control.aeCompensationStep.</description>
-          <range>At least (-2,2)/(exp compensation step
-          size)</range>
+          <description>Maximum and minimum exposure compensation values for
+          android.control.aeExposureCompensation, in counts of android.control.aeCompensationStep,
+          that are supported by this camera device.</description>
+          <range>
+            `Min.exposure compensation * android.control.aeCompensationStep &lt;= -2 EV`
+
+            `Max.exposure compensation * android.control.aeCompensationStep &gt;= 2 EV`
+          </range>
           <tag id="BC" />
         </entry>
-        <entry name="aeCompensationStep" type="rational" visibility="public">
-          <description>Smallest step by which exposure compensation
-          can be changed</description>
-          <range>&lt;= 1/2</range>
+        <entry name="aeCompensationStep" type="rational" visibility="public"
+               hwlevel="legacy">
+          <description>Smallest step by which the exposure compensation
+          can be changed.</description>
+          <units>Exposure Value (EV)</units>
+          <details>
+          This is the unit for android.control.aeExposureCompensation. For example, if this key has
+          a value of `1/2`, then a setting of `-2` for android.control.aeExposureCompensation means
+          that the target EV offset for the auto-exposure routine is -1 EV.
+
+          One unit of EV compensation changes the brightness of the captured image by a factor
+          of two. +1 EV doubles the image brightness, while -1 EV halves the image brightness.
+          </details>
+          <hal_details>
+            This must be less than or equal to 1/2.
+          </hal_details>
           <tag id="BC" />
         </entry>
         <entry name="afAvailableModes" type="byte" visibility="public"
-        type_notes="List of enums" container="array" typedef="enumList">
+               type_notes="List of enums" container="array" typedef="enumList"
+               hwlevel="legacy">
           <array>
             <size>n</size>
           </array>
-          <description>List of auto-focus (AF) modes that can be
-          selected with android.control.afMode.</description>
+          <description>
+          List of auto-focus (AF) modes for android.control.afMode that are
+          supported by this camera device.
+          </description>
+          <range>Any value listed in android.control.afMode</range>
           <details>
           Not all the auto-focus modes may be supported by a
           given camera device. This entry lists the valid modes for
@@ -1618,81 +1755,92 @@
           All LIMITED and FULL mode camera devices will support OFF mode, and all
           camera devices with adjustable focuser units
           (`android.lens.info.minimumFocusDistance &gt; 0`) will support AUTO mode.
+
+          LEGACY devices will support OFF mode only if they support
+          focusing to infinity (by also setting android.lens.focusDistance to
+          `0.0f`).
           </details>
           <tag id="BC" />
         </entry>
         <entry name="availableEffects" type="byte" visibility="public"
                type_notes="List of enums (android.control.effectMode)." container="array"
-               typedef="enumList">
+               typedef="enumList" hwlevel="legacy">
           <array>
             <size>n</size>
           </array>
           <description>
-          List containing the subset of color effects
-          specified in android.control.effectMode that is supported by
-          this device.
+          List of color effects for android.control.effectMode that are supported by this camera
+          device.
           </description>
-          <range>
-          Any subset of enums from those specified in
-          android.control.effectMode.  OFF must be included in any subset.
-          </range>
+          <range>Any value listed in android.control.effectMode</range>
           <details>
           This list contains the color effect modes that can be applied to
-          images produced by the camera device. Only modes that have
-          been fully implemented for the current device may be included here.
+          images produced by the camera device.
           Implementations are not expected to be consistent across all devices.
-          If no color effect modes are available for a device, this should
-          simply be set to OFF.
+          If no color effect modes are available for a device, this will only list
+          OFF.
 
           A color effect will only be applied if
-          android.control.mode != OFF.
+          android.control.mode != OFF.  OFF is always included in this list.
+
+          This control has no effect on the operation of other control routines such
+          as auto-exposure, white balance, or focus.
           </details>
           <tag id="BC" />
         </entry>
         <entry name="availableSceneModes" type="byte" visibility="public"
                type_notes="List of enums (android.control.sceneMode)."
-               container="array" typedef="enumList">
+               container="array" typedef="enumList" hwlevel="legacy">
           <array>
             <size>n</size>
           </array>
           <description>
-          List containing a subset of scene modes
-          specified in android.control.sceneMode.
+          List of scene modes for android.control.sceneMode that are supported by this camera
+          device.
           </description>
-          <range>
-          Any subset of the enums specified in android.control.sceneMode
-          not including DISABLED, or solely DISABLED if no
-          scene modes are available. FACE_PRIORITY must be included
-          if face detection is supported (i.e.`android.statistics.info.maxFaceCount &gt; 0`).
-          </range>
+          <range>Any value listed in android.control.sceneMode</range>
           <details>
           This list contains scene modes that can be set for the camera device.
           Only scene modes that have been fully implemented for the
           camera device may be included here. Implementations are not expected
-          to be consistent across all devices. If no scene modes are supported
-          by the camera device, this will be set to `[DISABLED]`.
+          to be consistent across all devices.
+
+          If no scene modes are supported by the camera device, this
+          will be set to DISABLED. Otherwise DISABLED will not be listed.
+
+          FACE_PRIORITY is always listed if face detection is
+          supported (i.e.`android.statistics.info.maxFaceCount &gt;
+          0`).
           </details>
           <tag id="BC" />
         </entry>
         <entry name="availableVideoStabilizationModes" type="byte"
                visibility="public" type_notes="List of enums." container="array"
-               typedef="enumList">
+               typedef="enumList" hwlevel="legacy">
           <array>
             <size>n</size>
           </array>
-          <description>List of video stabilization modes that can
-          be supported</description>
-          <range>OFF must be included</range>
+          <description>
+          List of video stabilization modes for android.control.videoStabilizationMode
+          that are supported by this camera device.
+          </description>
+          <range>Any value listed in android.control.videoStabilizationMode</range>
+          <details>
+          OFF will always be listed.
+          </details>
           <tag id="BC" />
         </entry>
         <entry name="awbAvailableModes" type="byte" visibility="public"
                type_notes="List of enums"
-               container="array" typedef="enumList">
+               container="array" typedef="enumList" hwlevel="legacy">
           <array>
             <size>n</size>
           </array>
-          <description>The set of auto-white-balance modes (android.control.awbMode)
-          that are supported by this camera device.</description>
+          <description>
+          List of auto-white-balance modes for android.control.awbMode that are supported by this
+          camera device.
+          </description>
+          <range>Any value listed in android.control.awbMode</range>
           <details>
           Not all the auto-white-balance modes may be supported by a
           given camera device. This entry lists the valid modes for
@@ -1700,14 +1848,16 @@
 
           All camera devices will support ON mode.
 
-          FULL mode camera devices will always support OFF mode,
-          which enables application control of white balance, by using
+          Camera devices that support the MANUAL_POST_PROCESSING capability will always support OFF
+          mode, which enables application control of white balance, by using
           android.colorCorrection.transform and android.colorCorrection.gains
-          (android.colorCorrection.mode must be set to TRANSFORM_MATRIX).
+          (android.colorCorrection.mode must be set to TRANSFORM_MATRIX). This includes all FULL
+          mode camera devices.
           </details>
           <tag id="BC" />
         </entry>
-        <entry name="maxRegions" type="int32" visibility="hidden" container="array">
+        <entry name="maxRegions" type="int32" visibility="hidden"
+               container="array" hwlevel="legacy">
           <array>
             <size>3</size>
           </array>
@@ -1724,52 +1874,57 @@
           `(AE, AWB, AF)`.</range>
           <tag id="BC" />
         </entry>
-        <entry name="maxRegionsAe" type="int32" visibility="public" synthetic="true">
+        <entry name="maxRegionsAe" type="int32" visibility="public"
+               synthetic="true" hwlevel="legacy">
           <description>
-          List of the maximum number of regions that can be used for metering in
-          auto-exposure (AE);
-          this corresponds to the the maximum number of elements in
+          The maximum number of metering regions that can be used by the auto-exposure (AE)
+          routine.
+          </description>
+          <range>Value will be &amp;gt;= 0. For FULL-capability devices, this
+          value will be &amp;gt;= 1.
+          </range>
+          <details>
+          This corresponds to the the maximum allowed number of elements in
           android.control.aeRegions.
-          </description>
-          <range>
-          Value will be &amp;gt;= 0. For FULL-capability devices, this
-          value will be &amp;gt;= 1.
-          </range>
+          </details>
           <hal_details>This entry is private to the framework. Fill in
           maxRegions to have this entry be automatically populated.
           </hal_details>
         </entry>
-        <entry name="maxRegionsAwb" type="int32" visibility="public" synthetic="true">
+        <entry name="maxRegionsAwb" type="int32" visibility="public"
+               synthetic="true" hwlevel="legacy">
           <description>
-          List of the maximum number of regions that can be used for metering in
-          auto-white balance (AWB);
-          this corresponds to the the maximum number of elements in
+          The maximum number of metering regions that can be used by the auto-white balance (AWB)
+          routine.
+          </description>
+          <range>Value will be &amp;gt;= 0.
+          </range>
+          <details>
+          This corresponds to the the maximum allowed number of elements in
           android.control.awbRegions.
-          </description>
-          <range>
-          Value will be &amp;gt;= 0.
-          </range>
+          </details>
           <hal_details>This entry is private to the framework. Fill in
           maxRegions to have this entry be automatically populated.
           </hal_details>
         </entry>
-        <entry name="maxRegionsAf" type="int32" visibility="public" synthetic="true">
+        <entry name="maxRegionsAf" type="int32" visibility="public"
+               synthetic="true" hwlevel="legacy">
           <description>
-          List of the maximum number of regions that can be used for metering in
-          auto-focus (AF);
-          this corresponds to the the maximum number of elements in
-          android.control.afRegions.
+          The maximum number of metering regions that can be used by the auto-focus (AF) routine.
           </description>
-          <range>
-          Value will be &amp;gt;= 0. For FULL-capability devices, this
+          <range>Value will be &amp;gt;= 0. For FULL-capability devices, this
           value will be &amp;gt;= 1.
           </range>
+          <details>
+          This corresponds to the the maximum allowed number of elements in
+          android.control.afRegions.
+          </details>
           <hal_details>This entry is private to the framework. Fill in
           maxRegions to have this entry be automatically populated.
           </hal_details>
         </entry>
         <entry name="sceneModeOverrides" type="byte" visibility="system"
-               container="array">
+               container="array" hwlevel="limited">
           <array>
             <size>3</size>
             <size>length(availableSceneModes)</size>
@@ -1839,7 +1994,8 @@
         </clone>
         <clone entry="android.control.aePrecaptureTrigger" kind="controls">
         </clone>
-        <entry name="aeState" type="byte" visibility="public" enum="true">
+        <entry name="aeState" type="byte" visibility="public" enum="true"
+               hwlevel="limited">
           <enum>
             <value>INACTIVE
             <notes>AE is off or recently reset.
@@ -1937,7 +2093,8 @@
         </clone>
         <clone entry="android.control.afTrigger" kind="controls">
         </clone>
-        <entry name="afState" type="byte" visibility="public" enum="true">
+        <entry name="afState" type="byte" visibility="public" enum="true"
+               hwlevel="legacy">
           <enum>
             <value>INACTIVE
             <notes>AF is off or has not yet tried to scan/been asked
@@ -1993,7 +2150,11 @@
             and may restart scanning at any time.
 
             Only used by CONTINUOUS_* AF modes. This is a transient state, the camera
-            device may skip reporting this state in capture result.</notes></value>
+            device may skip reporting this state in capture result.
+
+            LEGACY camera devices do not support this state. When a passive
+            scan has finished, it will always go to PASSIVE_FOCUSED.
+            </notes></value>
           </enum>
           <description>Current state of auto-focus (AF) algorithm.</description>
           <details>
@@ -2116,7 +2277,8 @@
         </clone>
         <clone entry="android.control.captureIntent" kind="controls">
         </clone>
-        <entry name="awbState" type="byte" visibility="public" enum="true">
+        <entry name="awbState" type="byte" visibility="public" enum="true"
+               hwlevel="limited">
           <enum>
             <value>INACTIVE
             <notes>AWB is not in auto mode, or has not yet started metering.
@@ -2197,7 +2359,7 @@
       </dynamic>
       <static>
         <entry name="availableHighSpeedVideoConfigurations" type="int32" visibility="hidden"
-               container="array" typedef="highSpeedVideoConfiguration">
+               container="array" typedef="highSpeedVideoConfiguration" hwlevel="limited">
           <array>
             <size>4</size>
             <size>n</size>
@@ -2266,7 +2428,7 @@
     </section>
     <section name="edge">
       <controls>
-        <entry name="mode" type="byte" visibility="public" enum="true">
+        <entry name="mode" type="byte" visibility="public" enum="true" hwlevel="full">
           <enum>
             <value>OFF
             <notes>No edge enhancement is applied.</notes></value>
@@ -2279,10 +2441,9 @@
           </enum>
           <description>Operation mode for edge
           enhancement.</description>
-          <details>Edge/sharpness/detail enhancement. OFF means no
-          enhancement will be applied by the camera device.
-
-          This must be set to one of the modes listed in android.edge.availableEdgeModes.
+          <range>android.edge.availableEdgeModes</range>
+          <details>Edge enhancement improves sharpness and details in the captured image. OFF means
+          no enhancement will be applied by the camera device.
 
           FAST/HIGH_QUALITY both mean camera device determined enhancement
           will be applied. HIGH_QUALITY mode indicates that the
@@ -2300,17 +2461,18 @@
       </controls>
       <static>
         <entry name="availableEdgeModes" type="byte" visibility="public"
-        type_notes="list of enums" container="array" typedef="enumList">
+               type_notes="list of enums" container="array" typedef="enumList"
+               hwlevel="full">
           <array>
             <size>n</size>
           </array>
           <description>
-          The set of edge enhancement modes supported by this camera device.
+          List of edge enhancement modes for android.edge.mode that are supported by this camera
+          device.
           </description>
+          <range>Any value listed in android.edge.mode</range>
           <details>
-          This tag lists the valid modes for android.edge.mode.
-
-          Full-capability camera devices must always support OFF and FAST.
+          Full-capability camera devices must always support OFF; all devices will list FAST.
           </details>
           <tag id="V1" />
         </entry>
@@ -2341,7 +2503,7 @@
           duration).</details>
           <tag id="FUTURE" />
         </entry>
-        <entry name="mode" type="byte" visibility="public" enum="true">
+        <entry name="mode" type="byte" visibility="public" enum="true" hwlevel="legacy">
           <enum>
             <value>OFF
               <notes>
@@ -2386,15 +2548,19 @@
       </controls>
       <static>
         <namespace name="info">
-          <entry name="available" type="byte" visibility="public" enum="true" typedef="boolean">
+          <entry name="available" type="byte" visibility="public" enum="true"
+                 typedef="boolean" hwlevel="legacy">
             <enum>
               <value>FALSE</value>
               <value>TRUE</value>
             </enum>
             <description>Whether this camera device has a
-            flash.</description>
-            <details>If no flash, none of the flash controls do
-            anything. All other metadata should return 0.</details>
+            flash unit.</description>
+            <details>
+            Will be `false` if no flash is available.
+
+            If there is no flash unit, none of the flash controls do
+            anything.</details>
             <tag id="BC" />
           </entry>
           <entry name="chargeDuration" type="int64">
@@ -2428,7 +2594,8 @@
         <clone entry="android.flash.firingTime" kind="controls">
         </clone>
         <clone entry="android.flash.mode" kind="controls"></clone>
-        <entry name="state" type="byte" visibility="public" enum="true">
+        <entry name="state" type="byte" visibility="public" enum="true"
+               hwlevel="limited">
           <enum>
             <value>UNAVAILABLE
             <notes>No flash on camera.</notes></value>
@@ -2451,6 +2618,17 @@
           When the camera device doesn't have flash unit
           (i.e. `android.flash.info.available == false`), this state will always be UNAVAILABLE.
           Other states indicate the current flash status.
+
+          In certain conditions, this will be available on LEGACY devices:
+
+           * Flash-less cameras always return UNAVAILABLE.
+           * Using android.control.aeMode `==` ON_ALWAYS_FLASH
+             will always return FIRED.
+           * Using android.flash.mode `==` TORCH
+             will always return FIRED.
+
+          In all other conditions the state will not be available on
+          LEGACY devices (i.e. it will be `null`).
           </details>
         </entry>
       </dynamic>
@@ -2487,15 +2665,13 @@
             </value>
           </enum>
           <description>
-          Set operational mode for hot pixel correction.
+          Operational mode for hot pixel correction.
           </description>
+          <range>android.hotPixel.availableHotPixelModes</range>
           <details>
-          Valid modes for this camera device are listed in
-          android.hotPixel.availableHotPixelModes.
-
           Hotpixel correction interpolates out, or otherwise removes, pixels
-          that do not accurately encode the incoming light (i.e. pixels that
-          are stuck at an arbitrary value).
+          that do not accurately measure the incoming light (i.e. pixels that
+          are stuck at an arbitrary value or are oversensitive).
           </details>
           <tag id="V1" />
           <tag id="RAW" />
@@ -2508,12 +2684,11 @@
             <size>n</size>
           </array>
           <description>
-          The set of hot pixel correction modes that are supported by this
+          List of hot pixel correction modes for android.hotPixel.mode that are supported by this
           camera device.
           </description>
+          <range>Any value listed in android.hotPixel.mode</range>
           <details>
-          This tag lists valid modes for android.hotPixel.mode.
-
           FULL mode camera devices will always support FAST.
           </details>
           <hal_details>
@@ -2534,67 +2709,103 @@
     <section name="jpeg">
       <controls>
         <entry name="gpsLocation" type="byte" visibility="public" synthetic="true"
-        typedef="location">
+        typedef="location" hwlevel="legacy">
           <description>
           A location object to use when generating image GPS metadata.
           </description>
+          <details>
+          Setting a location object in a request will include the GPS coordinates of the location
+          into any JPEG images captured based on the request. These coordinates can then be
+          viewed by anyone who receives the JPEG image.
+          </details>
         </entry>
         <entry name="gpsCoordinates" type="double" visibility="hidden"
         type_notes="latitude, longitude, altitude. First two in degrees, the third in meters"
-        container="array">
+        container="array" hwlevel="legacy">
           <array>
             <size>3</size>
           </array>
           <description>GPS coordinates to include in output JPEG
-          EXIF</description>
+          EXIF.</description>
           <range>(-180 - 180], [-90,90], [-inf, inf]</range>
           <tag id="BC" />
         </entry>
         <entry name="gpsProcessingMethod" type="byte" visibility="hidden"
-               typedef="string">
+               typedef="string" hwlevel="legacy">
           <description>32 characters describing GPS algorithm to
-          include in EXIF</description>
+          include in EXIF.</description>
           <units>UTF-8 null-terminated string</units>
           <tag id="BC" />
         </entry>
-        <entry name="gpsTimestamp" type="int64" visibility="hidden">
+        <entry name="gpsTimestamp" type="int64" visibility="hidden" hwlevel="legacy">
           <description>Time GPS fix was made to include in
-          EXIF</description>
+          EXIF.</description>
           <units>UTC in seconds since January 1, 1970</units>
           <tag id="BC" />
         </entry>
-        <entry name="orientation" type="int32" visibility="public">
-          <description>Orientation of JPEG image to
-          write</description>
+        <entry name="orientation" type="int32" visibility="public" hwlevel="legacy">
+          <description>The orientation for a JPEG image.</description>
           <units>Degrees in multiples of 90</units>
           <range>0, 90, 180, 270</range>
+          <details>
+          The clockwise rotation angle in degrees, relative to the orientation
+          to the camera, that the JPEG picture needs to be rotated by, to be viewed
+          upright.
+
+          Camera devices may either encode this value into the JPEG EXIF header, or
+          rotate the image data to match this orientation.
+
+          Note that this orientation is relative to the orientation of the camera sensor, given
+          by android.sensor.orientation.
+
+          To translate from the device orientation given by the Android sensor APIs, the following
+          sample code may be used:
+
+              private int getJpegOrientation(CameraCharacteristics c, int deviceOrientation) {
+                  if (deviceOrientation == android.view.OrientationEventListener.ORIENTATION_UNKNOWN) return 0;
+                  int sensorOrientation = c.get(CameraCharacteristics.SENSOR_ORIENTATION);
+
+                  // Round device orientation to a multiple of 90
+                  deviceOrientation = (deviceOrientation + 45) / 90 * 90;
+
+                  // Reverse device orientation for front-facing cameras
+                  boolean facingFront = c.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT;
+                  if (facingFront) deviceOrientation = -deviceOrientation;
+
+                  // Calculate desired JPEG orientation relative to camera orientation to make
+                  // the image upright relative to the device orientation
+                  int jpegOrientation = (sensorOrientation + deviceOrientation + 360) % 360;
+
+                  return jpegOrientation;
+              }
+          </details>
           <tag id="BC" />
         </entry>
-        <entry name="quality" type="byte" visibility="public">
+        <entry name="quality" type="byte" visibility="public" hwlevel="legacy">
           <description>Compression quality of the final JPEG
           image.</description>
           <range>1-100; larger is higher quality</range>
           <details>85-95 is typical usage range.</details>
           <tag id="BC" />
         </entry>
-        <entry name="thumbnailQuality" type="byte" visibility="public">
+        <entry name="thumbnailQuality" type="byte" visibility="public" hwlevel="legacy">
           <description>Compression quality of JPEG
           thumbnail.</description>
           <range>1-100; larger is higher quality</range>
           <tag id="BC" />
         </entry>
         <entry name="thumbnailSize" type="int32" visibility="public"
-        container="array" typedef="size">
+        container="array" typedef="size" hwlevel="legacy">
           <array>
             <size>2</size>
           </array>
           <description>Resolution of embedded JPEG thumbnail.</description>
-          <range>Size must be one of the size from android.jpeg.availableThumbnailSizes</range>
+          <range>android.jpeg.availableThumbnailSizes</range>
           <details>When set to (0, 0) value, the JPEG EXIF will not contain thumbnail,
           but the captured JPEG will still be a valid image.
 
-          When a jpeg image capture is issued, the thumbnail size selected should have
-          the same aspect ratio as the jpeg image.
+          For best results, when issuing a request for a JPEG image, the thumbnail size selected
+          should have the same aspect ratio as the main JPEG output.
 
           If the thumbnail image aspect ratio differs from the JPEG primary image aspect
           ratio, the camera device creates the thumbnail by cropping it from the primary image.
@@ -2614,15 +2825,18 @@
       </controls>
       <static>
         <entry name="availableThumbnailSizes" type="int32" visibility="public"
-        container="array" typedef="size">
+        container="array" typedef="size" hwlevel="legacy">
           <array>
             <size>2</size>
             <size>n</size>
           </array>
-          <description>Supported resolutions for the JPEG thumbnail.</description>
-          <range>Will include at least one valid resolution, plus
-          (0,0) for no thumbnail generation, and each size will be distinct.</range>
-          <details>Below condiditions will be satisfied for this size list:
+          <description>List of JPEG thumbnail sizes for android.jpeg.thumbnailSize supported by this
+          camera device.</description>
+          <details>
+          This list will include at least one non-zero resolution, plus `(0,0)` for indicating no
+          thumbnail should be generated.
+
+          Below condiditions will be satisfied for this size list:
 
           * The sizes will be sorted by increasing pixel area (width x height).
           If several resolutions have the same area, they will be sorted by increasing width.
@@ -2633,7 +2847,7 @@
           * Each output JPEG size in android.scaler.availableStreamConfigurations will have at least
           one corresponding size that has the same aspect ratio in availableThumbnailSizes,
           and vice versa.
-          * All non (0, 0) sizes will have non-zero widths and heights.</details>
+          * All non-`(0, 0)` sizes will have non-zero widths and heights.</details>
           <tag id="BC" />
         </entry>
         <entry name="maxSize" type="int32" visibility="system">
@@ -2681,14 +2895,13 @@
     </section>
     <section name="lens">
       <controls>
-        <entry name="aperture" type="float" visibility="public">
-          <description>The ratio of lens focal length to the effective
-          aperture diameter.</description>
-          <units>f-number (f/NNN)</units>
+        <entry name="aperture" type="float" visibility="public" hwlevel="full">
+          <description>The desired lens aperture size, as a ratio of lens focal length to the
+          effective aperture diameter.</description>
+          <units>The f-number (f/N)</units>
           <range>android.lens.info.availableApertures</range>
-          <details>This will only be supported on the camera devices that
-          have variable aperture lens. The aperture value can only be
-          one of the values listed in android.lens.info.availableApertures.
+          <details>Setting this value is only supported on the camera devices that have a variable
+          aperture lens.
 
           When this is supported and android.control.aeMode is OFF,
           this can be set along with android.sensor.exposureTime,
@@ -2706,16 +2919,14 @@
           back to the user in the corresponding result.</details>
           <tag id="V1" />
         </entry>
-        <entry name="filterDensity" type="float" visibility="public">
+        <entry name="filterDensity" type="float" visibility="public" hwlevel="full">
           <description>
-          State of lens neutral density filter(s).
+          The desired setting for the lens neutral density filter(s).
           </description>
-          <units>Steps of Exposure Value (EV).</units>
+          <units>Exposure Value (EV)</units>
           <range>android.lens.info.availableFilterDensities</range>
           <details>
-          This will not be supported on most camera devices. On devices
-          where this is supported, this may only be set to one of the
-          values included in android.lens.info.availableFilterDensities.
+          This control will not be supported on most camera devices.
 
           Lens filters are typically used to lower the amount of light the
           sensor is exposed to (measured in steps of EV). As used here, an EV
@@ -2732,11 +2943,11 @@
           </details>
           <tag id="V1" />
         </entry>
-        <entry name="focalLength" type="float" visibility="public">
+        <entry name="focalLength" type="float" visibility="public" hwlevel="legacy">
           <description>
-          The current lens focal length; used for optical zoom.
+          The desired lens focal length; used for optical zoom.
           </description>
-          <units>focal length in mm</units>
+          <units>Millimeters</units>
           <range>android.lens.info.availableFocalLengths</range>
           <details>
           This setting controls the physical focal length of the camera
@@ -2749,28 +2960,36 @@
           While the focal length is still changing, android.lens.state will
           be set to MOVING.
 
-          This is expected not to be supported on most devices.
+          Optical zoom will not be supported on most devices.
           </details>
           <tag id="V1" />
         </entry>
-        <entry name="focusDistance" type="float" visibility="public">
-          <description>Distance to plane of sharpest focus,
+        <entry name="focusDistance" type="float" visibility="public" hwlevel="full">
+          <description>Desired distance to plane of sharpest focus,
           measured from frontmost surface of the lens.</description>
-          <units>See android.lens.info.focusDistanceCalibration for details.</units>
+          <units>See android.lens.info.focusDistanceCalibration for details</units>
           <range>&amp;gt;= 0</range>
-          <details>0 means infinity focus. Used value will be clamped
-          to [0, android.lens.info.minimumFocusDistance].
+          <details>
+          This control can be used for setting manual focus, on devices that support
+          the MANUAL_SENSOR capability and have a variable-focus lens (see
+          android.lens.info.minimumFocusDistance).
+
+          A value of `0.0f` means infinity focus. The value set will be clamped to
+          `[0.0f, android.lens.info.minimumFocusDistance]`.
 
           Like android.lens.focalLength, this setting won't be applied
           instantaneously, and it may take several frames before the lens
           can move to the requested focus distance. While the lens is still moving,
           android.lens.state will be set to MOVING.
+
+          LEGACY devices support at most setting this to `0.0f`
+          for infinity focus.
           </details>
           <tag id="BC" />
           <tag id="V1" />
         </entry>
         <entry name="opticalStabilizationMode" type="byte" visibility="public"
-        enum="true">
+        enum="true" hwlevel="limited">
           <enum>
             <value>OFF
               <notes>Optical stabilization is unavailable.</notes>
@@ -2798,9 +3017,9 @@
           optical stabilization modes in the first several capture results may still
           be "OFF", and it will become "ON" when the initialization is done.
 
-          If a camera device supports both OIS and EIS (android.control.videoStabilizationMode),
-          turning both modes on may produce undesirable interaction, so it is recommended not
-          to enable both at the same time.
+          If a camera device supports both OIS and digital image stabilization
+          (android.control.videoStabilizationMode), turning both modes on may produce undesirable
+          interaction, so it is recommended not to enable both at the same time.
 
           Not all devices will support OIS; see
           android.lens.info.availableOpticalStabilization for
@@ -2812,96 +3031,98 @@
       <static>
         <namespace name="info">
           <entry name="availableApertures" type="float" visibility="public"
-          container="array">
+          container="array" hwlevel="full">
             <array>
               <size>n</size>
             </array>
-            <description>List of supported aperture
-            values.</description>
-            <range>one entry required, &amp;gt; 0</range>
-            <details>If the camera device doesn't support variable apertures,
-            listed value will be the fixed aperture.
+            <description>List of aperture size values for android.lens.aperture that are
+            supported by this camera device.</description>
+            <units>The aperture f-number</units>
+            <details>If the camera device doesn't support a variable lens aperture,
+            this list will contain only one value, which is the fixed aperture size.
 
-            If the camera device supports variable apertures, the aperture value
+            If the camera device supports a variable aperture, the aperture values
             in this list will be sorted in ascending order.</details>
             <tag id="V1" />
           </entry>
           <entry name="availableFilterDensities" type="float" visibility="public"
-          container="array">
+          container="array" hwlevel="full">
             <array>
               <size>n</size>
             </array>
             <description>
-            List of supported neutral density filter values for
-            android.lens.filterDensity.
+            List of neutral density filter values for
+            android.lens.filterDensity that are supported by this camera device.
             </description>
+            <units>Exposure value (EV)</units>
             <range>
-            At least one value is required. Values must be &amp;gt;= 0.
+            Values are &amp;gt;= 0
             </range>
             <details>
-            If changing android.lens.filterDensity is not supported,
-            availableFilterDensities must contain only 0. Otherwise, this
-            list contains only the exact filter density values available on
-            this camera device.
+            If a neutral density filter is not supported by this camera device,
+            this list will contain only 0. Otherwise, this list will include every
+            filter density supported by the camera device, in ascending order.
             </details>
             <tag id="V1" />
           </entry>
           <entry name="availableFocalLengths" type="float" visibility="public"
           type_notes="The list of available focal lengths"
-          container="array">
+          container="array" hwlevel="legacy">
             <array>
               <size>n</size>
             </array>
             <description>
-            The available focal lengths for this device for use with
-            android.lens.focalLength.
+            List of focal lengths for android.lens.focalLength that are supported by this camera
+            device.
             </description>
+            <units>Millimeters</units>
             <range>
-            Each value in this list must be &amp;gt; 0. This list must
-            contain at least one value.
+            Values are &amp;gt; 0
             </range>
             <details>
-            If optical zoom is not supported, this will only report
-            a single value corresponding to the static focal length of the
-            device. Otherwise, this will report every focal length supported
-            by the device.
+            If optical zoom is not supported, this list will only contain
+            a single value corresponding to the fixed focal length of the
+            device. Otherwise, this list will include every focal length supported
+            by the camera device, in ascending order.
             </details>
             <tag id="BC" />
             <tag id="V1" />
           </entry>
           <entry name="availableOpticalStabilization" type="byte"
           visibility="public" type_notes="list of enums" container="array"
-          typedef="enumList">
+          typedef="enumList" hwlevel="limited">
             <array>
               <size>n</size>
             </array>
             <description>
-            List containing a subset of the optical image
-            stabilization (OIS) modes specified in
-            android.lens.opticalStabilizationMode.
+            List of optical image stabilization (OIS) modes for
+            android.lens.opticalStabilizationMode that are supported by this camera device.
             </description>
+            <range>Any value listed in android.lens.opticalStabilizationMode</range>
             <details>
-            If OIS is not implemented for a given camera device, this will
+            If OIS is not supported by a given camera device, this list will
             contain only OFF.
             </details>
             <tag id="V1" />
           </entry>
-          <entry name="hyperfocalDistance" type="float" visibility="public" optional="true">
-            <description>Optional. Hyperfocal distance for this lens.</description>
-            <units>See android.lens.info.focusDistanceCalibration for details.</units>
-            <range>If lens is fixed focus, &amp;gt;= 0. If lens has focuser unit, the range is
-            `(0, android.lens.info.minimumFocusDistance]`</range>
+          <entry name="hyperfocalDistance" type="float" visibility="public" optional="true"
+                 hwlevel="limited">
+            <description>Hyperfocal distance for this lens.</description>
+            <units>See android.lens.info.focusDistanceCalibration for details</units>
+            <range>If lens is fixed focus, &amp;gt;= 0. If lens has focuser unit, the value is
+            within `(0.0f, android.lens.info.minimumFocusDistance]`</range>
             <details>
             If the lens is not fixed focus, the camera device will report this
             field when android.lens.info.focusDistanceCalibration is APPROXIMATE or CALIBRATED.
             </details>
           </entry>
-          <entry name="minimumFocusDistance" type="float" visibility="public" optional="true">
+          <entry name="minimumFocusDistance" type="float" visibility="public" optional="true"
+                 hwlevel="limited">
             <description>Shortest distance from frontmost surface
-            of the lens that can be focused correctly.</description>
-            <units>See android.lens.info.focusDistanceCalibration for details.</units>
+            of the lens that can be brought into sharp focus.</description>
+            <units>See android.lens.info.focusDistanceCalibration for details</units>
             <range>&amp;gt;= 0</range>
-            <details>If the lens is fixed-focus, this should be
+            <details>If the lens is fixed-focus, this will be
             0.</details>
             <hal_details>Mandatory for FULL devices; LIMITED devices
             must always set this value to 0 for fixed-focus; and may omit
@@ -2913,7 +3134,7 @@
           </entry>
           <entry name="shadingMapSize" type="int32" visibility="hidden"
                  type_notes="width and height (N, M) of lens shading map provided by the camera device."
-                 container="array" typedef="size">
+                 container="array" typedef="size" hwlevel="full">
             <array>
               <size>2</size>
             </array>
@@ -2925,7 +3146,8 @@
             </details>
             <tag id="V1" />
           </entry>
-          <entry name="focusDistanceCalibration" type="byte" visibility="public" enum="true">
+          <entry name="focusDistanceCalibration" type="byte" visibility="public"
+                 enum="true" hwlevel="limited">
             <enum>
               <value>UNCALIBRATED
                 <notes>
@@ -2970,6 +3192,17 @@
             focus related metadata entries, i.e. android.lens.focusDistance,
             android.lens.focusRange, android.lens.info.hyperfocalDistance, and
             android.lens.info.minimumFocusDistance.
+
+            APPROXIMATE and CALIBRATED devices report the focus metadata in
+            units of diopters (1/meter), so `0.0f` represents focusing at infinity,
+            and increasing positive numbers represent focusing closer and closer
+            to the camera device. The focus distance control also uses diopters
+            on these devices.
+
+            UNCALIBRATED devices do not use units that are directly comparable
+            to any real physical measurement, but `0.0f` still represents farthest
+            focus, and android.lens.info.minimumFocusDistance represents the
+            nearest focus the device can achieve.
             </details>
             <hal_details>
             For devices advertise APPROXIMATE quality or higher, diopters 0 (infinity
@@ -2983,7 +3216,7 @@
           <tag id="V1" />
         </entry>
         </namespace>
-        <entry name="facing" type="byte" visibility="public" enum="true">
+        <entry name="facing" type="byte" visibility="public" enum="true" hwlevel="legacy">
           <enum>
             <value>FRONT
             <notes>
@@ -3047,14 +3280,14 @@
         </clone>
         <entry name="focusRange" type="float" visibility="public"
         type_notes="Range of scene distances that are in focus"
-        container="array" typedef="pairFloatFloat">
+        container="array" typedef="pairFloatFloat" hwlevel="limited">
           <array>
             <size>2</size>
           </array>
           <description>The range of scene distances that are in
           sharp focus (depth of field).</description>
-          <units>pair of focus distances in diopters: (near,
-          far), see android.lens.info.focusDistanceCalibration for details.</units>
+          <units>A pair of focus distances in diopters: (near,
+          far); see android.lens.info.focusDistanceCalibration for details.</units>
           <range>&amp;gt;=0</range>
           <details>If variable focus not supported, can still report
           fixed depth of field range</details>
@@ -3064,7 +3297,7 @@
         kind="controls">
           <tag id="V1" />
         </clone>
-        <entry name="state" type="byte" visibility="public" enum="true">
+        <entry name="state" type="byte" visibility="public" enum="true" hwlevel="limited">
           <enum>
             <value>STATIONARY
               <notes>
@@ -3111,7 +3344,7 @@
     </section>
     <section name="noiseReduction">
       <controls>
-        <entry name="mode" type="byte" visibility="public" enum="true">
+        <entry name="mode" type="byte" visibility="public" enum="true" hwlevel="full">
           <enum>
             <value>OFF
             <notes>No noise reduction is applied.</notes></value>
@@ -3123,17 +3356,17 @@
             relative to sensor output.</notes></value>
           </enum>
           <description>Mode of operation for the noise reduction algorithm.</description>
-          <details>Noise filtering control. OFF means no noise reduction
-          will be applied by the camera device.
-
-          This must be set to a valid mode from
-          android.noiseReduction.availableNoiseReductionModes.
+          <range>android.noiseReduction.availableNoiseReductionModes</range>
+          <details>The noise reduction algorithm attempts to improve image quality by removing
+          excessive noise added by the capture process, especially in dark conditions.
+          OFF means no noise reduction will be applied by the camera device.
 
           FAST/HIGH_QUALITY both mean camera device determined noise filtering
           will be applied. HIGH_QUALITY mode indicates that the camera device
           will use the highest-quality noise filtering algorithms,
           even if it slows down capture rate. FAST means the camera device will not
-          slow down capture rate when applying noise filtering.</details>
+          slow down capture rate when applying noise filtering.
+          </details>
           <tag id="V1" />
         </entry>
         <entry name="strength" type="byte">
@@ -3146,17 +3379,19 @@
       </controls>
       <static>
         <entry name="availableNoiseReductionModes" type="byte" visibility="public"
-        type_notes="list of enums" container="array" typedef="enumList">
+        type_notes="list of enums" container="array" typedef="enumList" hwlevel="limited">
           <array>
             <size>n</size>
           </array>
           <description>
-          The set of noise reduction modes supported by this camera device.
+          List of noise reduction modes for android.noiseReduction.mode that are supported
+          by this camera device.
           </description>
+          <range>Any value listed in android.noiseReduction.mode</range>
           <details>
-          This tag lists the valid modes for android.noiseReduction.mode.
+          Full-capability camera devices will always support OFF and FAST.
 
-          Full-capability camera devices must always support OFF and FAST.
+          Legacy-capability camera devices will only support FAST mode.
           </details>
           <tag id="V1" />
         </entry>
@@ -3353,7 +3588,7 @@
       </controls>
       <static>
         <entry name="maxNumOutputStreams" type="int32" visibility="hidden"
-        container="array">
+        container="array" hwlevel="legacy">
           <array>
             <size>3</size>
           </array>
@@ -3391,7 +3626,7 @@
           </details>
           <tag id="BC" />
         </entry>
-        <entry name="maxNumOutputRaw" type="int32" visibility="public" synthetic="true">
+        <entry name="maxNumOutputRaw" type="int32" visibility="public" synthetic="true" hwlevel="legacy">
           <description>The maximum numbers of different types of output streams
           that can be configured and used simultaneously by a camera device
           for any `RAW` formats.
@@ -3413,9 +3648,12 @@
           * ImageFormat#RAW_SENSOR
           * ImageFormat#RAW10
           * Opaque `RAW`
+
+          LEGACY mode devices (android.info.supportedHardwareLevel `==` LEGACY)
+          never support raw streams.
           </details>
         </entry>
-        <entry name="maxNumOutputProc" type="int32" visibility="public" synthetic="true">
+        <entry name="maxNumOutputProc" type="int32" visibility="public" synthetic="true" hwlevel="legacy">
           <description>The maximum numbers of different types of output streams
           that can be configured and used simultaneously by a camera device
           for any processed (but not-stalling) formats.
@@ -3444,9 +3682,11 @@
 
           For full guarantees, query StreamConfigurationMap#getOutputStallDuration with
           a processed format -- it will return 0 for a non-stalling stream.
+
+          LEGACY devices will support at least 2 processing/non-stalling streams.
           </details>
         </entry>
-        <entry name="maxNumOutputProcStalling" type="int32" visibility="public" synthetic="true">
+        <entry name="maxNumOutputProcStalling" type="int32" visibility="public" synthetic="true" hwlevel="legacy">
           <description>The maximum numbers of different types of output streams
           that can be configured and used simultaneously by a camera device
           for any processed (and stalling) formats.
@@ -3464,10 +3704,12 @@
           be any non-`RAW` and supported format provided by android.scaler.streamConfigurationMap.
 
           A processed and stalling format is defined as any non-RAW format with a stallDurations &amp;gt; 0.
-          Typically only the `JPEG` format (ImageFormat#JPEG)
+          Typically only the `JPEG` format (ImageFormat#JPEG) is a stalling format.
 
           For full guarantees, query StreamConfigurationMap#getOutputStallDuration with
           a processed format -- it will return a non-0 value for a stalling stream.
+
+          LEGACY devices will support up to 1 processing/stalling stream.
           </details>
         </entry>
         <entry name="maxNumReprocessStreams" type="int32" visibility="system"
@@ -3485,7 +3727,7 @@
           </details>
           <tag id="HAL2" />
         </entry>
-        <entry name="maxNumInputStreams" type="int32" visibility="hidden">
+        <entry name="maxNumInputStreams" type="int32" visibility="hidden" hwlevel="full">
           <description>
           The maximum numbers of any type of input streams
           that can be configured and used simultaneously by a camera device.
@@ -3521,7 +3763,7 @@
         kind="controls"></clone>
         <clone entry="android.request.outputStreams"
         kind="controls"></clone>
-        <entry name="pipelineDepth" type="byte" visibility="public">
+        <entry name="pipelineDepth" type="byte" visibility="public" hwlevel="legacy">
           <description>Specifies the number of pipeline stages the frame went
           through from when it was exposed to when the final completed result
           was available to the framework.</description>
@@ -3539,7 +3781,7 @@
         </entry>
       </dynamic>
       <static>
-        <entry name="pipelineMaxDepth" type="byte" visibility="public">
+        <entry name="pipelineMaxDepth" type="byte" visibility="public" hwlevel="legacy">
           <description>Specifies the number of maximum pipeline stages a frame
           has to go through from when it's exposed to when it's available
           to the framework.</description>
@@ -3584,7 +3826,7 @@
           </details>
         </entry>
         <entry name="availableCapabilities" type="byte" visibility="public"
-          enum="true" container="array">
+          enum="true" container="array" hwlevel="legacy">
           <array>
             <size>n</size>
           </array>
@@ -3700,7 +3942,7 @@
               </notes>
             </value>
           </enum>
-          <description>List of capabilities that the camera device
+          <description>List of capabilities that this camera device
           advertises as fully supporting.</description>
           <details>
           A capability is a contract that the camera device makes in order
@@ -3722,7 +3964,7 @@
           * MANUAL_POST_PROCESSING
 
           Other capabilities may be available on either FULL or LIMITED
-          devices, but the application should query this field to be sure.
+          devices, but the application should query this key to be sure.
           </details>
           <hal_details>
           Additional constraint details per-capability will be available
@@ -3748,7 +3990,7 @@
           </hal_details>
         </entry>
         <entry name="availableRequestKeys" type="int32" visibility="hidden"
-          container="array">
+          container="array" hwlevel="legacy">
           <array>
             <size>n</size>
           </array>
@@ -3779,7 +4021,7 @@
           </hal_details>
         </entry>
         <entry name="availableResultKeys" type="int32" visibility="hidden"
-          container="array">
+          container="array" hwlevel="legacy">
           <array>
             <size>n</size>
           </array>
@@ -3788,14 +4030,14 @@
 
           <details>Attempting to get a key from a CaptureResult that is not
           listed here will always return a `null` value. Getting a key from
-          a CaptureResult that is listed here must never return a `null`
+          a CaptureResult that is listed here will generally never return a `null`
           value.
 
           The following keys may return `null` unless they are enabled:
 
           * android.statistics.lensShadingMap (non-null iff android.statistics.lensShadingMapMode == ON)
 
-          (Those sometimes-null keys should nevertheless be listed here
+          (Those sometimes-null keys will nevertheless be listed here
           if they are available.)
 
           This field can be used to query the feature set of a camera device
@@ -3822,7 +4064,7 @@
           </hal_details>
         </entry>
         <entry name="availableCharacteristicsKeys" type="int32" visibility="hidden"
-          container="array">
+          container="array" hwlevel="legacy">
           <array>
             <size>n</size>
           </array>
@@ -3834,7 +4076,7 @@
           details.
           </details>
           <hal_details>
-          Tags listed here must always have an entry in the static info metadata,
+          Keys listed here must always have an entry in the static info metadata,
           even if that size is 0 elements. Only array-type tags (e.g. lists,
           matrices, strings) are allowed to have 0 elements.
 
@@ -3856,15 +4098,16 @@
     <section name="scaler">
       <controls>
         <entry name="cropRegion" type="int32" visibility="public"
-               container="array" typedef="rectangle">
+               container="array" typedef="rectangle" hwlevel="legacy">
           <array>
             <size>4</size>
           </array>
-          <description>The region of the sensor to read out for this capture.</description>
-          <units>(x,y) of top-left corner, width and height of region
-          in pixels; (0,0) is top-left corner of
+          <description>The desired region of the sensor to read out for this capture.</description>
+          <units>Pixel coordinates relative to
           android.sensor.info.activeArraySize</units>
           <details>
+            This control can be used to implement digital zoom.
+
             The crop region coordinate system is based off
             android.sensor.info.activeArraySize, with `(0, 0)` being the
             top-left corner of the sensor active array.
@@ -4021,7 +4264,7 @@
           <description>The minimum frame duration that is supported
           for each resolution in android.scaler.availableJpegSizes.
           </description>
-          <units>ns</units>
+          <units>Nanoseconds</units>
           <range>TODO: Remove property.</range>
           <details>
           This corresponds to the minimum steady-state frame duration when only
@@ -4052,11 +4295,15 @@
           </hal_details>
           <tag id="BC" />
         </entry>
-        <entry name="availableMaxDigitalZoom" type="float" visibility="public">
+        <entry name="availableMaxDigitalZoom" type="float" visibility="public"
+              hwlevel="legacy">
           <description>The maximum ratio between both active area width
           and crop region width, and active area height and
-          crop region height.
-
+          crop region height, for android.scaler.cropRegion.
+          </description>
+          <units>Zoom scale factor</units>
+          <range>&amp;gt;=1</range>
+          <details>
           This represents the maximum amount of zooming possible by
           the camera device, or equivalently, the minimum cropping
           window size.
@@ -4064,8 +4311,7 @@
           Crop regions that have a width or height that is smaller
           than this ratio allows will be rounded up to the minimum
           allowed size by the camera device.
-          </description>
-          <range>&amp;gt;=1</range>
+          </details>
           <tag id="BC" />
         </entry>
         <entry name="availableProcessedMinDurations" type="int64" visibility="hidden" deprecated="true"
@@ -4077,8 +4323,7 @@
           android.scaler.availableProcessedSizes), this property lists the
           minimum supportable frame duration for that size.
           </description>
-          <units>ns</units>
-          <range>TODO: Remove property.</range>
+          <units>Nanoseconds</units>
           <details>
           This should correspond to the frame duration when only that processed
           stream is active, with all processing (typically in android.*.mode)
@@ -4099,7 +4344,6 @@
           processed output streams, such as YV12, NV12, and
           platform opaque YUV/RGB streams to the GPU or video
           encoders.</description>
-          <range>TODO: Remove property.</range>
           <details>
           The resolutions are listed as `(width, height)` pairs.
 
@@ -4139,8 +4383,7 @@
           android.scaler.availableRawSizes), this property lists the minimum
           supportable frame duration for that size.
           </description>
-          <units>ns</units>
-          <range>TODO: Remove property.</range>
+          <units>Nanoseconds</units>
           <details>
           Should correspond to the frame duration when only the raw stream is
           active.
@@ -4159,8 +4402,6 @@
           <description>The resolutions available for use with raw
           sensor output streams, listed as width,
           height</description>
-          <range>TODO: Remove property.
-          Must include: - sensor maximum resolution.</range>
         </entry>
       </static>
       <dynamic>
@@ -4170,7 +4411,8 @@
       <static>
         <entry name="availableInputOutputFormatsMap" type="int32"
         visibility="hidden"
-        container="array" typedef="imageFormat">
+        container="array" typedef="imageFormat"
+        hwlevel="full">
           <array>
             <size>n</size>
           </array>
@@ -4247,7 +4489,7 @@
         </entry>
         <entry name="availableStreamConfigurations" type="int32" visibility="hidden"
           enum="true" container="array"
-          typedef="streamConfiguration">
+          typedef="streamConfiguration" hwlevel="legacy">
           <array>
             <size>n</size>
             <size>4</size>
@@ -4349,7 +4591,7 @@
         </entry>
         <entry name="availableMinFrameDurations" type="int64" visibility="hidden"
                container="array"
-               typedef="streamConfigurationDuration" >
+               typedef="streamConfigurationDuration" hwlevel="legacy">
           <array>
             <size>4</size>
             <size>n</size>
@@ -4379,7 +4621,7 @@
           <tag id="V1" />
         </entry>
         <entry name="availableStallDurations" type="int64" visibility="hidden"
-               container="array" typedef="streamConfigurationDuration">
+               container="array" typedef="streamConfigurationDuration" hwlevel="legacy">
           <array>
             <size>4</size>
             <size>n</size>
@@ -4461,7 +4703,9 @@
           </hal_details>
           <tag id="V1" />
         </entry>
-        <entry name="streamConfigurationMap" type="int32" visibility="public" synthetic="true" typedef="streamConfigurationMap">
+        <entry name="streamConfigurationMap" type="int32" visibility="public"
+               synthetic="true" typedef="streamConfigurationMap"
+               hwlevel="legacy">
           <description>The available stream configurations that this
           camera device supports; also includes the minimum frame durations
           and the stall durations for each format/size combination.
@@ -4543,7 +4787,8 @@
           * available[Processed,Raw,Jpeg]Sizes
           </hal_details>
         </entry>
-        <entry name="croppingType" type="byte" visibility="public" enum="true">
+        <entry name="croppingType" type="byte" visibility="public" enum="true"
+               hwlevel="legacy">
           <enum>
             <value>CENTER_ONLY
               <notes>
@@ -4569,27 +4814,31 @@
           return the final used crop region in capture result metadata android.scaler.cropRegion.
 
           FULL capability devices (android.info.supportedHardwareLevel `==` FULL) will support
-          FREEFORM cropping.
+          FREEFORM cropping. LEGACY capability devices will only support CENTER_ONLY cropping.
           </details>
         </entry>
       </static>
     </section>
     <section name="sensor">
       <controls>
-        <entry name="exposureTime" type="int64" visibility="public">
+        <entry name="exposureTime" type="int64" visibility="public" hwlevel="full">
           <description>Duration each pixel is exposed to
           light.</description>
-          <units>nanoseconds</units>
+          <units>Nanoseconds</units>
           <range>android.sensor.info.exposureTimeRange</range>
-          <details>If the sensor can't expose this exact duration, it should shorten the
+          <details>If the sensor can't expose this exact duration, it will shorten the
           duration exposed to the nearest possible value (rather than expose longer).
+          The final exposure time used will be available in the output capture result.
+
+          This control is only effective if android.control.aeMode or android.control.mode is set to
+          OFF; otherwise the auto-exposure algorithm will override this value.
           </details>
           <tag id="V1" />
         </entry>
-        <entry name="frameDuration" type="int64" visibility="public">
+        <entry name="frameDuration" type="int64" visibility="public" hwlevel="full">
           <description>Duration from start of frame exposure to
           start of next frame exposure.</description>
-          <units>nanoseconds</units>
+          <units>Nanoseconds</units>
           <range>See android.sensor.info.maxFrameDuration,
           android.scaler.streamConfigurationMap. The duration
           is capped to `max(duration, exposureTime + overhead)`.</range>
@@ -4667,6 +4916,9 @@
 
           For more details about stalling, see
           StreamConfigurationMap#getOutputStallDuration(int,Size).
+
+          This control is only effective if android.control.aeMode or android.control.mode is set to
+          OFF; otherwise the auto-exposure algorithm will override this value.
           </details>
           <hal_details>
           For more details about stalling, see
@@ -4674,7 +4926,7 @@
           </hal_details>
           <tag id="V1" />
         </entry>
-        <entry name="sensitivity" type="int32" visibility="public">
+        <entry name="sensitivity" type="int32" visibility="public" hwlevel="full">
           <description>The amount of gain applied to sensor data
           before processing.</description>
           <units>ISO arithmetic units</units>
@@ -4701,32 +4953,49 @@
           <entry name="activeArraySize" type="int32" visibility="public"
           type_notes="Four ints defining the active pixel rectangle"
           container="array"
-          typedef="rectangle">
+          typedef="rectangle"
+          hwlevel="legacy">
             <array>
               <size>4</size>
             </array>
-            <description>Area of raw data which corresponds to only
+            <description>The area of the image sensor which corresponds to
             active pixels.</description>
-            <range>This array contains `(xmin, ymin, width, height)`. The `(xmin, ymin)` must be
-            &amp;gt;= `(0,0)`. The `(width, height)` must be &amp;lt;=
-            `android.sensor.info.pixelArraySize`.
+            <units>Pixel coordinates on the image sensor</units>
+            <range>
             </range>
-            <details>It is smaller or equal to
-            sensor full pixel array, which could include the black calibration pixels.</details>
+            <details>
+            This is the region of the sensor that actually receives light from the scene.
+            Therefore, the size of this region determines the maximum field of view and the maximum
+            number of pixels that an image from this sensor can contain.
+
+            The rectangle is defined in terms of the full pixel array; (0,0) is the top-left of the
+            full pixel array, and the size of the full pixel array is given by
+            android.sensor.info.pixelArraySize.
+
+            Most other keys listing pixel coordinates have their coordinate systems based on the
+            active array, with `(0, 0)` being the top-left of the active array rectangle.
+
+            The active array may be smaller than the full pixel array, since the full array may
+            include black calibration pixels or other inactive regions.
+            </details>
+            <hal_details>
+            This array contains `(xmin, ymin, width, height)`. The `(xmin, ymin)` must be
+            &amp;gt;= `(0,0)`.
+            The `(width, height)` must be &amp;lt;= `android.sensor.info.pixelArraySize`.
+            </hal_details>
             <tag id="RAW" />
           </entry>
           <entry name="sensitivityRange" type="int32" visibility="public"
           type_notes="Range of supported sensitivities"
-          container="array" typedef="rangeInt">
+          container="array" typedef="rangeInt"
+          hwlevel="full">
             <array>
               <size>2</size>
             </array>
-            <description>Range of valid sensitivities.</description>
+            <description>Range of sensitivities for android.sensor.sensitivity supported by this
+            camera device.</description>
             <range>Min &lt;= 100, Max &amp;gt;= 800</range>
             <details>
-              The minimum and maximum valid values for the
-              android.sensor.sensitivity control.
-
               The values are the standard ISO sensitivity values,
               as defined in ISO 12232:2006.
             </details>
@@ -4734,7 +5003,8 @@
             <tag id="BC" />
             <tag id="V1" />
           </entry>
-          <entry name="colorFilterArrangement" type="byte" visibility="public" enum="true">
+          <entry name="colorFilterArrangement" type="byte" visibility="public" enum="true"
+            hwlevel="full">
             <enum>
               <value>RGGB</value>
               <value>GRBG</value>
@@ -4751,43 +5021,38 @@
             <tag id="RAW" />
           </entry>
           <entry name="exposureTimeRange" type="int64" visibility="public"
-          type_notes="nanoseconds" container="array" typedef="rangeLong">
+                 type_notes="nanoseconds" container="array" typedef="rangeLong"
+                 hwlevel="full">
             <array>
               <size>2</size>
             </array>
-            <description>Range of valid exposure
-            times used by android.sensor.exposureTime.</description>
-            <range>Min &lt;= 100e3 (100 us). For FULL capability devices
-            (android.info.supportedHardwareLevel == FULL), Max SHOULD be
-            &amp;gt;= 1e9 (1sec), MUST be &amp;gt;= 100e6 (100ms)</range>
-            <details>The min value will be &lt;= 100e3 (100 us). For FULL
+            <description>The range of image exposure times for android.sensor.exposureTime supported
+            by this camera device.
+            </description>
+            <units>Nanoseconds</units>
+            <range>The minimum exposure time will be less than 100 us. For FULL
             capability devices (android.info.supportedHardwareLevel == FULL),
-            max will be &amp;gt;= 100e6 (100ms)</details>
+            the maximum exposure time will be greater than 100ms.</range>
             <hal_details>For FULL capability devices (android.info.supportedHardwareLevel == FULL),
-            The maximum of the range SHOULD be at least
-            1 second (1e9), MUST be at least 100ms.</hal_details>
+            The maximum of the range SHOULD be at least 1 second (1e9), MUST be at least
+            100ms.
+            </hal_details>
             <tag id="V1" />
           </entry>
-          <entry name="maxFrameDuration" type="int64" visibility="public">
-            <description>Maximum possible frame duration (minimum frame
-            rate).</description>
-            <units>nanoseconds</units>
+          <entry name="maxFrameDuration" type="int64" visibility="public"
+                 hwlevel="full">
+            <description>The maximum possible frame duration (minimum frame rate) for
+            android.sensor.frameDuration that is supported this camera device.</description>
+            <units>Nanoseconds</units>
             <range>For FULL capability devices
-            (android.info.supportedHardwareLevel == FULL), Max SHOULD be
-            &amp;gt;= 1e9 (1sec), MUST be &amp;gt;= 100e6 (100ms)
+            (android.info.supportedHardwareLevel == FULL), at least 100ms.
             </range>
-            <details>The largest possible android.sensor.frameDuration
-            that will be accepted by the camera device. Attempting to use
-            frame durations beyond the maximum will result in the frame duration
-            being clipped to the maximum. See that control
-            for a full definition of frame durations.
+            <details>Attempting to use frame durations beyond the maximum will result in the frame
+            duration being clipped to the maximum. See that control for a full definition of frame
+            durations.
 
-            Refer to
-            StreamConfigurationMap#getOutputMinFrameDuration(int,Size)
-            for the minimum frame duration values.
-
-            For FULL capability devices (android.info.supportedHardwareLevel == FULL),
-            max will be &amp;gt;= 100e6 (100ms).
+            Refer to StreamConfigurationMap#getOutputMinFrameDuration(int,Size) for the minimum
+            frame duration values.
             </details>
             <hal_details>
             For FULL capability devices (android.info.supportedHardwareLevel == FULL),
@@ -4810,13 +5075,14 @@
             <tag id="V1" />
           </entry>
           <entry name="physicalSize" type="float" visibility="public"
-          type_notes="width x height in millimeters"
-          container="array" typedef="sizeF">
+          type_notes="width x height"
+          container="array" typedef="sizeF" hwlevel="legacy">
             <array>
               <size>2</size>
             </array>
             <description>The physical dimensions of the full pixel
             array.</description>
+            <units>Millimeters</units>
             <details>This is the physical size of the sensor pixel
             array defined by android.sensor.info.pixelArraySize.
             </details>
@@ -4825,12 +5091,13 @@
             <tag id="BC" />
           </entry>
           <entry name="pixelArraySize" type="int32" visibility="public"
-          container="array" typedef="size">
+          container="array" typedef="size" hwlevel="legacy">
             <array>
               <size>2</size>
             </array>
-            <description>Dimensions of full pixel array, possibly
+            <description>Dimensions of the full pixel array, possibly
             including black calibration pixels.</description>
+            <units>Pixels</units>
             <details>The pixel count of the full pixel array,
             which covers android.sensor.info.physicalSize area.
 
@@ -4839,6 +5106,10 @@
             raw size listed in android.scaler.streamConfigurationMap.
             If a size corresponding to pixelArraySize is listed, the resulting
             raw sensor image will include black pixels.
+
+            Some parts of the full pixel array may not receive light from the scene,
+            or are otherwise inactive.  The android.sensor.info.activeArraySize key
+            defines the rectangle of active pixels that actually forms an image.
             </details>
             <tag id="RAW" />
             <tag id="BC" />
@@ -4853,7 +5124,7 @@
             sample values from the sensor.  This is typically caused by the
             sensor becoming highly non-linear or clipping. The minimum for
             each channel is specified by the offset in the
-            android.sensor.blackLevelPattern tag.
+            android.sensor.blackLevelPattern key.
 
             The white level is typically determined either by sensor bit depth
             (8-14 bits is expected), or by the point where the sensor response
@@ -4867,7 +5138,8 @@
             </hal_details>
             <tag id="RAW" />
           </entry>
-          <entry name="timestampSource" type="byte" visibility="public" enum="true">
+          <entry name="timestampSource" type="byte" visibility="public"
+                 enum="true" hwlevel="legacy">
             <enum>
               <value>UNKNOWN
                 <notes>
@@ -4898,7 +5170,8 @@
           <tag id="V1" />
         </entry>
         </namespace>
-        <entry name="referenceIlluminant1" type="byte" visibility="public" enum="true">
+        <entry name="referenceIlluminant1" type="byte" visibility="public"
+               enum="true">
           <enum>
             <value id="1">DAYLIGHT</value>
             <value id="2">FLUORESCENT</value>
@@ -4937,11 +5210,11 @@
           android.sensor.forwardMatrix1 matrices.
           </description>
           <details>
-          The values in this tag correspond to the values defined for the
+          The values in this key correspond to the values defined for the
           EXIF LightSource tag. These illuminants are standard light sources
           that are often used calibrating camera devices.
 
-          If this tag is present, then android.sensor.colorTransform1,
+          If this key is present, then android.sensor.colorTransform1,
           android.sensor.calibrationTransform1, and
           android.sensor.forwardMatrix1 will also be present.
 
@@ -4981,12 +5254,11 @@
           android.sensor.calibrationTransform2, and
           android.sensor.forwardMatrix2 matrices.
           </description>
+          <range>Any value listed in android.sensor.referenceIlluminant1</range>
           <details>
           See android.sensor.referenceIlluminant1 for more details.
-          Valid values for this are the same as those given for the first
-          reference illuminant.
 
-          If this tag is present, then android.sensor.colorTransform2,
+          If this key is present, then android.sensor.colorTransform2,
           android.sensor.calibrationTransform2, and
           android.sensor.forwardMatrix2 will also be present.
           </details>
@@ -4995,7 +5267,7 @@
         <entry name="calibrationTransform1" type="rational"
         visibility="public" optional="true"
         type_notes="3x3 matrix in row-major-order" container="array"
-        typedef="colorSpaceTransform" >
+        typedef="colorSpaceTransform">
           <array>
             <size>3</size>
             <size>3</size>
@@ -5049,7 +5321,7 @@
         <entry name="colorTransform1" type="rational"
         visibility="public" optional="true"
         type_notes="3x3 matrix in row-major-order" container="array"
-        typedef="colorSpaceTransform" >
+        typedef="colorSpaceTransform">
           <array>
             <size>3</size>
             <size>3</size>
@@ -5079,7 +5351,7 @@
         <entry name="colorTransform2" type="rational"
         visibility="public" optional="true"
         type_notes="3x3 matrix in row-major-order" container="array"
-        typedef="colorSpaceTransform" >
+        typedef="colorSpaceTransform">
           <array>
             <size>3</size>
             <size>3</size>
@@ -5112,7 +5384,7 @@
         <entry name="forwardMatrix1" type="rational"
         visibility="public" optional="true"
         type_notes="3x3 matrix in row-major-order" container="array"
-        typedef="colorSpaceTransform" >
+        typedef="colorSpaceTransform">
           <array>
             <size>3</size>
             <size>3</size>
@@ -5140,7 +5412,7 @@
         <entry name="forwardMatrix2" type="rational"
         visibility="public" optional="true"
         type_notes="3x3 matrix in row-major-order" container="array"
-        typedef="colorSpaceTransform" >
+        typedef="colorSpaceTransform">
           <array>
             <size>3</size>
             <size>3</size>
@@ -5186,12 +5458,12 @@
           </description>
           <range>&amp;gt;= 0 for each.</range>
           <details>
-          This tag specifies the zero light value for each of the CFA mosaic
+          This key specifies the zero light value for each of the CFA mosaic
           channels in the camera sensor.  The maximal value output by the
           sensor is represented by the value in android.sensor.info.whiteLevel.
 
           The values are given in the same order as channels listed for the CFA
-          layout tag (see android.sensor.info.colorFilterArrangement), i.e. the
+          layout key (see android.sensor.info.colorFilterArrangement), i.e. the
           nth value given corresponds to the black level offset for the nth
           color channel listed in the CFA.
           </details>
@@ -5202,7 +5474,7 @@
           <tag id="RAW" />
         </entry>
         <entry name="maxAnalogSensitivity" type="int32" visibility="public"
-        optional="true">
+               optional="true" hwlevel="full">
           <description>Maximum sensitivity that is implemented
           purely through analog gain.</description>
           <details>For android.sensor.sensitivity values less than or
@@ -5212,15 +5484,18 @@
           <tag id="V1" />
           <tag id="FULL" />
         </entry>
-        <entry name="orientation" type="int32" visibility="public">
-          <description>Clockwise angle through which the output
-          image needs to be rotated to be upright on the device
-          screen in its native orientation. Also defines the
-          direction of rolling shutter readout, which is from top
-          to bottom in the sensor's coordinate system</description>
-          <units>degrees clockwise rotation, only multiples of
+        <entry name="orientation" type="int32" visibility="public"
+               hwlevel="legacy">
+          <description>Clockwise angle through which the output image needs to be rotated to be
+          upright on the device screen in its native orientation.
+          </description>
+          <units>Degrees of clockwise rotation; always a multiple of
           90</units>
-          <range>0,90,180,270</range>
+          <range>0, 90, 180, 270</range>
+          <details>
+          Also defines the direction of rolling shutter readout, which is from top to bottom in
+          the sensor's coordinate system.
+          </details>
           <tag id="BC" />
         </entry>
         <entry name="profileHueSatMapDimensions" type="int32"
@@ -5255,10 +5530,11 @@
         kind="controls"></clone>
         <clone entry="android.sensor.sensitivity" kind="controls">
         </clone>
-        <entry name="timestamp" type="int64" visibility="public">
+        <entry name="timestamp" type="int64" visibility="public"
+               hwlevel="legacy">
           <description>Time at start of exposure of first
           row of the image sensor active array, in nanoseconds.</description>
-          <units>nanoseconds</units>
+          <units>Nanoseconds</units>
           <range>&amp;gt; 0</range>
           <details>The timestamps are also included in all image
           buffers produced for the same capture, and will be identical
@@ -5298,7 +5574,7 @@
           somewhere close to it.
           </description>
 
-          <units>celsius</units>
+          <units>Celsius</units>
           <range>Optional. This value is missing if no temperature is available.</range>
           <tag id="FUTURE" />
         </entry>
@@ -5333,10 +5609,10 @@
           Noise model coefficients for each CFA mosaic channel.
           </description>
           <details>
-          This tag contains two noise model coefficients for each CFA channel
+          This key contains two noise model coefficients for each CFA channel
           corresponding to the sensor amplification (S) and sensor readout
           noise (O).  These are given as pairs of coefficients for each channel
-          in the same order as channels listed for the CFA layout tag
+          in the same order as channels listed for the CFA layout key
           (see android.sensor.info.colorFilterArrangement).  This is
           represented as an array of Pair&amp;lt;Double, Double&amp;gt;, where
           the first member of the Pair at index n is the S coefficient and the
@@ -5378,8 +5654,8 @@
           for each pixel.
           </description>
           <units>
-          Hue shift is given in degrees; saturation and value scale factors are
-          unitless.
+          The hue shift is given in degrees; saturation and value scale factors are
+          unitless and are between 0 and 1 inclusive
           </units>
           <details>
           hue_samples, saturation_samples, and value_samples are given in
@@ -5387,7 +5663,7 @@
 
           Each entry of this map contains three floats corresponding to the
           hue shift, saturation scale, and value scale, respectively; where the
-          hue shift has the lowest index. The map entries are stored in the tag
+          hue shift has the lowest index. The map entries are stored in the key
           in nested loop order, with the value divisions in the outer loop, the
           hue divisions in the middle loop, and the saturation divisions in the
           inner loop. All zero input saturation entries are required to have a
@@ -5412,7 +5688,7 @@
           sample is required to be `(1, 1)`.
           </range>
           <details>
-          This tag contains a default tone curve that can be applied while
+          This key contains a default tone curve that can be applied while
           processing the image as a starting point for user adjustments.
           The curve is specified as a list of value pairs in linear gamma.
           The curve is interpolated using a cubic spline.
@@ -5478,9 +5754,6 @@
             A pixel `[R, G_even, G_odd, B]` that supplies the test pattern
             when android.sensor.testPatternMode is SOLID_COLOR.
           </description>
-          <range>Optional.
-          Must be supported if android.sensor.availableTestPatternModes contains
-          SOLID_COLOR.</range>
           <details>
           Each color channel is treated as an unsigned 32-bit integer.
           The camera device then uses the most significant X bits
@@ -5605,8 +5878,7 @@
           <description>When enabled, the sensor sends a test pattern instead of
           doing a real exposure from the camera.
           </description>
-          <range>Optional. Defaults to OFF. Value must be one of
-          android.sensor.availableTestPatternModes</range>
+          <range>android.sensor.availableTestPatternModes</range>
           <details>
           When a test pattern is enabled, all manual sensor controls specified
           by android.sensor.* will be ignored. All other controls should
@@ -5615,6 +5887,8 @@
           For example, if manual flash is enabled, flash firing should still
           occur (and that the test pattern remain unmodified, since the flash
           would not actually affect it).
+
+          Defaults to OFF.
           </details>
           <hal_details>
           All test patterns are specified in the Bayer domain.
@@ -5638,25 +5912,30 @@
           <array>
             <size>n</size>
           </array>
-          <description>Lists the supported sensor test pattern modes for android.sensor.testPatternMode.
+          <description>List of sensor test pattern modes for android.sensor.testPatternMode
+          supported by this camera device.
           </description>
-          <range>Always includes OFF if defined. All custom modes must be >= CUSTOM1</range>
+          <range>Any value listed in android.sensor.testPatternMode</range>
           <details>
-            Optional. Defaults to [OFF].
+            Defaults to OFF, and always includes OFF if defined.
           </details>
+          <hal_details>
+            All custom modes must be >= CUSTOM1.
+          </hal_details>
         </entry>
       </static>
       <dynamic>
-        <entry name="rollingShutterSkew" type="int64" visibility="public">
+        <entry name="rollingShutterSkew" type="int64" visibility="public" hwlevel="limited">
           <description>Duration between the start of first row exposure
           and the start of last row exposure.</description>
-          <units>nanoseconds</units>
+          <units>Nanoseconds</units>
           <range> &amp;gt;= 0 and &amp;lt;
           StreamConfigurationMap#getOutputMinFrameDuration(int, Size).</range>
           <details>
-          This is the exposure time skew (in the unit of nanosecond) between the first and
-          last row exposure start times. The first row and the last row are the first
-          and last rows inside of the android.sensor.info.activeArraySize.
+          This is the exposure time skew between the first and last
+          row exposure start times. The first row and the last row are
+          the first and last rows inside of the
+          android.sensor.info.activeArraySize.
 
           For typical camera sensors that use rolling shutters, this is also equivalent
           to the frame readout time.
@@ -5671,7 +5950,7 @@
     </section>
     <section name="shading">
       <controls>
-        <entry name="mode" type="byte" visibility="public" enum="true">
+        <entry name="mode" type="byte" visibility="public" enum="true" hwlevel="full">
           <enum>
             <value>OFF
             <notes>No lens shading correction is applied.</notes></value>
@@ -5688,29 +5967,28 @@
           When set to OFF mode, no lens shading correction will be applied by the
           camera device, and an identity lens shading map data will be provided
           if `android.statistics.lensShadingMapMode == ON`. For example, for lens
-          shading map with size specified as `android.lens.info.shadingMapSize = [ 4, 3 ]`,
-          the output android.statistics.lensShadingMap for this case will be an identity map
-          shown below:
+          shading map with size of `[ 4, 3 ]`,
+          the output android.statistics.lensShadingCorrectionMap for this case will be an identity
+          map shown below:
 
               [ 1.0, 1.0, 1.0, 1.0,  1.0, 1.0, 1.0, 1.0,
-                  1.0, 1.0, 1.0, 1.0,  1.0, 1.0, 1.0, 1.0,
-                1.0, 1.0, 1.0, 1.0,  1.0, 1.0, 1.0, 1.0,
-                  1.0, 1.0, 1.0, 1.0,  1.0, 1.0, 1.0, 1.0,
-                1.0, 1.0, 1.0, 1.0,   1.0, 1.0, 1.0, 1.0,
-                  1.0, 1.0, 1.0, 1.0,  1.0, 1.0, 1.0, 1.0 ]
+               1.0, 1.0, 1.0, 1.0,  1.0, 1.0, 1.0, 1.0,
+               1.0, 1.0, 1.0, 1.0,  1.0, 1.0, 1.0, 1.0,
+               1.0, 1.0, 1.0, 1.0,  1.0, 1.0, 1.0, 1.0,
+               1.0, 1.0, 1.0, 1.0,  1.0, 1.0, 1.0, 1.0,
+               1.0, 1.0, 1.0, 1.0,  1.0, 1.0, 1.0, 1.0 ]
 
-          When set to other modes, lens shading correction will be applied by the
-          camera device. Applications can request lens shading map data by setting
-          android.statistics.lensShadingMapMode to ON, and then the camera device will provide
-          lens shading map data in android.statistics.lensShadingMap, with size specified
-          by android.lens.info.shadingMapSize; the returned shading map data will be the one
-          applied by the camera device for this capture request.
+          When set to other modes, lens shading correction will be applied by the camera
+          device. Applications can request lens shading map data by setting
+          android.statistics.lensShadingMapMode to ON, and then the camera device will provide lens
+          shading map data in android.statistics.lensShadingCorrectionMap; the returned shading map
+          data will be the one applied by the camera device for this capture request.
 
-          The shading map data may depend on the auto-exposure (AE) and AWB statistics, therefore the reliability
-          of the map data may be affected by the AE and AWB algorithms. When AE and AWB are in
-          AUTO modes(android.control.aeMode `!=` OFF and android.control.awbMode `!=` OFF),
-          to get best results, it is recommended that the applications wait for the AE and AWB to
-          be converged before using the returned shading map data.
+          The shading map data may depend on the auto-exposure (AE) and AWB statistics, therefore
+          the reliability of the map data may be affected by the AE and AWB algorithms. When AE and
+          AWB are in AUTO modes(android.control.aeMode `!=` OFF and android.control.awbMode `!=`
+          OFF), to get best results, it is recommended that the applications wait for the AE and AWB
+          to be converged before using the returned shading map data.
           </details>
         </entry>
         <entry name="strength" type="byte">
@@ -5728,36 +6006,34 @@
     </section>
     <section name="statistics">
       <controls>
-        <entry name="faceDetectMode" type="byte" visibility="public" enum="true">
+        <entry name="faceDetectMode" type="byte" visibility="public" enum="true"
+               hwlevel="legacy">
           <enum>
             <value>OFF
             <notes>Do not include face detection statistics in capture
             results.</notes></value>
             <value optional="true">SIMPLE
             <notes>Return face rectangle and confidence values only.
-
-            In this mode, only android.statistics.faceRectangles and
-            android.statistics.faceScores outputs are valid.
             </notes></value>
             <value optional="true">FULL
             <notes>Return all face
             metadata.
 
-            In this mode,
-            android.statistics.faceRectangles,
-            android.statistics.faceScores,
-            android.statistics.faceIds, and
-            android.statistics.faceLandmarks outputs are valid.
+            In this mode, face rectangles, scores, landmarks, and face IDs are all valid.
             </notes></value>
           </enum>
-          <description>Control for the face detector
+          <description>Operating mode for the face detector
           unit.</description>
-          <range>
-          android.statistics.info.availableFaceDetectModes</range>
+          <range>android.statistics.info.availableFaceDetectModes</range>
           <details>Whether face detection is enabled, and whether it
           should output just the basic fields or the full set of
-          fields. Value must be one of the
-          android.statistics.info.availableFaceDetectModes.</details>
+          fields.</details>
+          <hal_details>
+            SIMPLE mode must fill in android.statistics.faceRectangles and
+            android.statistics.faceScores.
+            FULL mode must also fill in android.statistics.faceIds, and
+            android.statistics.faceLandmarks.
+          </hal_details>
           <tag id="BC" />
         </entry>
         <entry name="histogramMode" type="byte" enum="true" typedef="boolean">
@@ -5789,13 +6065,12 @@
             </notes></value>
           </enum>
           <description>
-          Operating mode for hotpixel map generation.
+          Operating mode for hot pixel map generation.
           </description>
+          <range>android.statistics.info.availableHotPixelMapModes</range>
           <details>
-          If set to ON, a hotpixel map is returned in android.statistics.hotPixelMap.
-          If set to OFF, no hotpixel map will be returned.
-
-          This must be set to a valid mode from android.statistics.info.availableHotPixelMapModes.
+          If set to `true`, a hot pixel map is returned in android.statistics.hotPixelMap.
+          If set to `false`, no hot pixel map will be returned.
           </details>
           <tag id="V1" />
           <tag id="RAW" />
@@ -5807,26 +6082,16 @@
                  visibility="public"
                  type_notes="List of enums from android.statistics.faceDetectMode"
                  container="array"
-                 typedef="enumList">
+                 typedef="enumList"
+                 hwlevel="legacy">
             <array>
               <size>n</size>
             </array>
-            <description>The face detection modes that are available
-            for this camera device.
+            <description>List of face detection modes for android.statistics.faceDetectMode that are
+            supported by this camera device.
             </description>
-            <units>List of enum:
-            OFF
-            SIMPLE
-            FULL</units>
+            <range>Any value listed in android.statistics.faceDetectMode</range>
             <details>OFF is always supported.
-
-            SIMPLE means the device supports the
-            android.statistics.faceRectangles and
-            android.statistics.faceScores outputs.
-
-            FULL means the device additionally supports the
-            android.statistics.faceIds and
-            android.statistics.faceLandmarks outputs.
             </details>
           </entry>
           <entry name="histogramBucketCount" type="int32">
@@ -5835,11 +6100,12 @@
             <range>&amp;gt;= 64</range>
             <tag id="FUTURE" />
           </entry>
-          <entry name="maxFaceCount" type="int32" visibility="public" >
+          <entry name="maxFaceCount" type="int32" visibility="public" hwlevel="legacy">
             <description>The maximum number of simultaneously detectable
             faces.</description>
-            <range>&amp;gt;= 4 if android.statistics.info.availableFaceDetectModes lists
-            modes besides OFF, otherwise 0</range>
+            <range>0 for cameras without available face detection; otherwise:
+            `&gt;=4` for LIMITED or FULL hwlevel devices or
+            `&gt;0` for LEGACY devices.</range>
             <tag id="BC" />
           </entry>
           <entry name="maxHistogramCount" type="int32">
@@ -5863,19 +6129,20 @@
             <tag id="FUTURE" />
           </entry>
           <entry name="availableHotPixelMapModes" type="byte" visibility="public"
-          type_notes="list of enums" container="array" typedef="boolean">
+                 type_notes="list of enums" container="array" typedef="boolean">
             <array>
               <size>n</size>
             </array>
             <description>
-            The set of hot pixel map output modes supported by this camera device.
+            List of hot pixel map output modes for android.statistics.hotPixelMapMode that are
+            supported by this camera device.
             </description>
+            <range>Any value listed in android.statistics.hotPixelMapMode</range>
             <details>
-            This tag lists valid output modes for android.statistics.hotPixelMapMode.
+            If no hotpixel map output is available for this camera device, this will contain only
+            `false`.
 
-            If no hotpixel map is available for this camera device, this will contain
-            only OFF.  If the hotpixel map is available, this will include both
-            the ON and OFF options.
+            ON is always supported on devices with the RAW capability.
             </details>
             <tag id="V1" />
             <tag id="RAW" />
@@ -5884,8 +6151,9 @@
       </static>
       <dynamic>
         <clone entry="android.statistics.faceDetectMode"
-        kind="controls"></clone>
-        <entry name="faceIds" type="int32" visibility="hidden" container="array">
+               kind="controls"></clone>
+        <entry name="faceIds" type="int32" visibility="hidden" container="array"
+               hwlevel="legacy">
           <array>
             <size>n</size>
           </array>
@@ -5900,7 +6168,7 @@
         </entry>
         <entry name="faceLandmarks" type="int32" visibility="hidden"
         type_notes="(leftEyeX, leftEyeY, rightEyeX, rightEyeY, mouthX, mouthY)"
-        container="array">
+        container="array" hwlevel="legacy">
           <array>
             <size>n</size>
             <size>6</size>
@@ -5916,7 +6184,7 @@
         </entry>
         <entry name="faceRectangles" type="int32" visibility="hidden"
         type_notes="(xmin, ymin, xmax, ymax). (0,0) is top-left of active pixel area"
-        container="array" typedef="rectangle">
+        container="array" typedef="rectangle" hwlevel="legacy">
           <array>
             <size>n</size>
             <size>4</size>
@@ -5930,7 +6198,8 @@
             Only available if android.statistics.faceDetectMode != OFF</details>
           <tag id="BC" />
         </entry>
-        <entry name="faceScores" type="byte" visibility="hidden" container="array">
+        <entry name="faceScores" type="byte" visibility="hidden" container="array"
+               hwlevel="legacy">
           <array>
             <size>n</size>
           </array>
@@ -5944,12 +6213,13 @@
           all times is illegal).</hal_details>
           <tag id="BC" />
         </entry>
-        <entry name="faces" type="int32" visibility="public" synthetic="true" container="array" typedef="face">
+        <entry name="faces" type="int32" visibility="public" synthetic="true"
+               container="array" typedef="face" hwlevel="legacy">
           <array>
             <size>n</size>
           </array>
           <description>List of the faces detected through camera face detection
-          in this result.</description>
+          in this capture.</description>
           <details>
           Only available if android.statistics.faceDetectMode `!=` OFF.
           </details>
@@ -5986,8 +6256,9 @@
           <tag id="FUTURE" />
         </entry>
         <clone entry="android.statistics.sharpnessMapMode"
-        kind="controls"></clone>
-        <entry name="lensShadingCorrectionMap" type="byte" visibility="public" typedef="lensShadingMap">
+               kind="controls"></clone>
+        <entry name="lensShadingCorrectionMap" type="byte" visibility="public"
+               typedef="lensShadingMap" hwlevel="full">
           <description>The shading map is a low-resolution floating-point map
           that lists the coefficients used to correct for vignetting, for each
           Bayer color channel.</description>
@@ -6041,7 +6312,7 @@
         </entry>
         <entry name="lensShadingMap" type="float" visibility="hidden"
                type_notes="2D array of float gain factors per channel to correct lens shading"
-               container="array">
+               container="array" hwlevel="full">
           <array>
             <size>4</size>
             <size>n</size>
@@ -6164,7 +6435,8 @@
           regardless of the android.control.* current values.
           </details>
         </entry>
-        <entry name="sceneFlicker" type="byte" visibility="public" enum="true">
+        <entry name="sceneFlicker" type="byte" visibility="public" enum="true"
+               hwlevel="full">
           <enum>
             <value>NONE
             <notes>The camera device does not detect any flickering illumination
@@ -6236,7 +6508,7 @@
         </entry>
       </dynamic>
       <controls>
-        <entry name="lensShadingMapMode" type="byte" visibility="public" enum="true">
+        <entry name="lensShadingMapMode" type="byte" visibility="public" enum="true" hwlevel="full">
           <enum>
             <value>OFF
             <notes>Do not include a lens shading map in the capture result.</notes></value>
@@ -6247,7 +6519,11 @@
           shading map in output result metadata.</description>
           <details>When set to ON,
           android.statistics.lensShadingMap will be provided in
-          the output result metadata.</details>
+          the output result metadata.
+
+          ON is always supported on devices with the RAW capability.
+          </details>
+          <tag id="RAW" />
         </entry>
       </controls>
       <dynamic>
@@ -6259,7 +6535,7 @@
       <controls>
         <entry name="curveBlue" type="float" visibility="hidden"
         type_notes="1D array of float pairs (P_IN, P_OUT). The maximum number of pairs is specified by android.tonemap.maxCurvePoints."
-        container="array">
+        container="array" hwlevel="full">
           <array>
             <size>n</size>
             <size>2</size>
@@ -6267,13 +6543,11 @@
           <description>Tonemapping / contrast / gamma curve for the blue
           channel, to use when android.tonemap.mode is
           CONTRAST_CURVE.</description>
-          <units>same as android.tonemap.curveRed</units>
-          <range>same as android.tonemap.curveRed</range>
           <details>See android.tonemap.curveRed for more details.</details>
         </entry>
         <entry name="curveGreen" type="float" visibility="hidden"
         type_notes="1D array of float pairs (P_IN, P_OUT). The maximum number of pairs is specified by android.tonemap.maxCurvePoints."
-        container="array">
+        container="array" hwlevel="full">
           <array>
             <size>n</size>
             <size>2</size>
@@ -6281,13 +6555,11 @@
           <description>Tonemapping / contrast / gamma curve for the green
           channel, to use when android.tonemap.mode is
           CONTRAST_CURVE.</description>
-          <units>same as android.tonemap.curveRed</units>
-          <range>same as android.tonemap.curveRed</range>
           <details>See android.tonemap.curveRed for more details.</details>
         </entry>
         <entry name="curveRed" type="float" visibility="hidden"
         type_notes="1D array of float pairs (P_IN, P_OUT). The maximum number of pairs is specified by android.tonemap.maxCurvePoints."
-        container="array">
+        container="array" hwlevel="full">
           <array>
             <size>n</size>
             <size>2</size>
@@ -6305,8 +6577,8 @@
                 [ P0in, P0out, P1in, P1out, P2in, P2out, P3in, P3out, ..., PNin, PNout ]
               2 &lt;= N &lt;= android.tonemap.maxCurvePoints
 
-          These are sorted in order of increasing `Pin`; it is always
-          guaranteed that input values 0.0 and 1.0 are included in the list to
+          These are sorted in order of increasing `Pin`; it is
+          required that input values 0.0 and 1.0 are included in the list to
           define a complete mapping. For input values between control points,
           the camera device must linearly interpolate between the control
           points.
@@ -6360,7 +6632,9 @@
           control points used as are available.
         </hal_details>
         </entry>
-        <entry name="curve" type="float" visibility="public" synthetic="true" typedef="tonemapCurve">
+        <entry name="curve" type="float" visibility="public" synthetic="true"
+               typedef="tonemapCurve"
+               hwlevel="full">
           <description>Tonemapping / contrast / gamma curve to use when android.tonemap.mode
           is CONTRAST_CURVE.</description>
           <details>
@@ -6425,7 +6699,8 @@
             curveBlue entries.
         </hal_details>
         </entry>
-        <entry name="mode" type="byte" visibility="public" enum="true">
+        <entry name="mode" type="byte" visibility="public" enum="true"
+               hwlevel="full">
           <enum>
             <value>CONTRAST_CURVE
               <notes>Use the tone mapping curve specified in
@@ -6454,6 +6729,7 @@
           </enum>
           <description>High-level global contrast/gamma/tonemapping control.
           </description>
+          <range>android.tonemap.availableToneMapModes</range>
           <details>
           When switching to an application-defined contrast curve by setting
           android.tonemap.mode to CONTRAST_CURVE, the curve is defined
@@ -6468,9 +6744,6 @@
           transforms will be disabled when android.tonemap.mode is
           CONTRAST_CURVE.
 
-          This must be set to a valid mode in
-          android.tonemap.availableToneMapModes.
-
           When using either FAST or HIGH_QUALITY, the camera device will
           emit its own tonemap curve in android.tonemap.curve.
           These values are always available, and as close as possible to the
@@ -6482,16 +6755,15 @@
         </entry>
       </controls>
       <static>
-        <entry name="maxCurvePoints" type="int32" visibility="public" >
+        <entry name="maxCurvePoints" type="int32" visibility="public"
+               hwlevel="full">
           <description>Maximum number of supported points in the
             tonemap curve that can be used for android.tonemap.curve.
           </description>
-          <range>&amp;gt;= 64</range>
           <details>
-          If the actual number of points provided by the application (in
-          android.tonemap.curve*)  is less than max, the camera device will
-          resample the curve to its internal representation, using linear
-          interpolation.
+          If the actual number of points provided by the application (in android.tonemap.curve*) is
+          less than this maximum, the camera device will resample the curve to its internal
+          representation, using linear interpolation.
 
           The output curves in the result metadata may have a different number
           of points than the input curves, and will represent the actual
@@ -6502,18 +6774,18 @@
           </hal_details>
         </entry>
         <entry name="availableToneMapModes" type="byte" visibility="public"
-        type_notes="list of enums" container="array" typedef="enumList">
+        type_notes="list of enums" container="array" typedef="enumList" hwlevel="full">
           <array>
             <size>n</size>
           </array>
           <description>
-          The set of tonemapping modes supported by this camera device.
+          List of tonemapping modes for android.tonemap.mode that are supported by this camera
+          device.
           </description>
+          <range>Any value listed in android.tonemap.mode</range>
           <details>
-          This tag lists the valid modes for android.tonemap.mode.
-
-          Full-capability camera devices must always support CONTRAST_CURVE and
-          FAST.
+          Camera devices that support the MANUAL_POST_PROCESSING capability will always list
+          CONTRAST_CURVE and FAST. This includes all FULL level devices.
           </details>
         </entry>
       </static>
@@ -6532,8 +6804,8 @@
     </section>
     <section name="led">
       <controls>
-        <entry name="transmit" type="byte" visibility="hidden" enum="true"
-               typedef="boolean">
+        <entry name="transmit" type="byte" visibility="hidden" optional="true"
+               enum="true" typedef="boolean">
           <enum>
             <value>OFF</value>
             <value>ON</value>
@@ -6557,8 +6829,9 @@
         <clone entry="android.led.transmit" kind="controls"></clone>
       </dynamic>
       <static>
-        <entry name="availableLeds" type="byte" visibility="hidden" enum="true"
-               container="array" >
+        <entry name="availableLeds" type="byte" visibility="hidden" optional="true"
+               enum="true"
+               container="array">
           <array>
             <size>n</size>
           </array>
@@ -6575,7 +6848,7 @@
     <section name="info">
       <static>
         <entry name="supportedHardwareLevel" type="byte" visibility="public"
-               enum="true" >
+               enum="true" hwlevel="legacy">
           <enum>
             <value>
               LIMITED
@@ -6599,11 +6872,10 @@
           <description>
           Generally classifies the overall set of the camera device functionality.
           </description>
-          <range>Default value is LIMITED.</range>
           <details>
-          Camera devices will come in two flavors: LIMITED and FULL.
+          Camera devices will come in three flavors: LEGACY, LIMITED and FULL.
 
-          A FULL device has the most support possible and will support below capabilities:
+          A FULL device will support below capabilities:
 
           * 30fps at maximum resolution (== sensor resolution) is preferred, more than 20fps is required.
           * Per frame control (android.sync.maxLatency `==` PER_FRAME_CONTROL)
@@ -6618,8 +6890,21 @@
           A LIMITED device may have some or none of the above characteristics.
           To find out more refer to android.request.availableCapabilities.
 
+          Some features are not part of any particular hardware level or capability and must be
+          queried separately. These include:
+
+          * Calibrated timestamps (android.sensor.info.timestampSource `==` REALTIME)
+          * Precision lens control (android.lens.info.focusDistanceCalibration `==` CALIBRATED)
+          * Face detection (android.statistics.info.availableFaceDetectModes)
+          * Optical or electrical image stabilization
+            (android.lens.info.availableOpticalStabilization,
+             android.control.availableVideoStabilizationModes)
+
           A LEGACY device does not support per-frame control, manual sensor control, manual
           post-processing, arbitrary cropping regions, and has relaxed performance constraints.
+
+          Each higher level supports everything the lower level supports
+          in this order: FULL `&gt;` LIMITED `&gt;` LEGACY.
           </details>
           <hal_details>
           The camera 3 HAL device can implement one of two possible
@@ -6631,6 +6916,10 @@
           limited, and they share the same essential operational flow.
 
           For full details refer to "S3. Operational Modes" in camera3.h
+
+          Camera HAL3+ must not implement LEGACY mode. It is there
+          for backwards compatibility in the `android.hardware.camera2`
+          user-facing API only.
           </hal_details>
         </entry>
       </static>
@@ -6638,16 +6927,16 @@
     <section name="blackLevel">
       <controls>
         <entry name="lock" type="byte" visibility="public" enum="true"
-               typedef="boolean">
+               typedef="boolean" hwlevel="full">
           <enum>
             <value>OFF</value>
             <value>ON</value>
           </enum>
           <description> Whether black-level compensation is locked
           to its current values, or is free to vary.</description>
-          <details>When set to ON, the values used for black-level
+          <details>When set to `true` (ON), the values used for black-level
           compensation will not change until the lock is set to
-          OFF.
+          `false` (OFF).
 
           Since changes to certain capture parameters (such as
           exposure time) may require resetting of black level
@@ -6708,7 +6997,8 @@
     </section>
     <section name="sync">
       <dynamic>
-        <entry name="frameNumber" type="int64" visibility="hidden" enum="true">
+        <entry name="frameNumber" type="int64" visibility="hidden" enum="true"
+               hwlevel="legacy">
           <enum>
             <value id="-1">CONVERGING
               <notes>
@@ -6818,7 +7108,8 @@
         </entry>
       </dynamic>
       <static>
-        <entry name="maxLatency" type="int32" visibility="public" enum="true">
+        <entry name="maxLatency" type="int32" visibility="public" enum="true"
+               hwlevel="legacy">
           <enum>
             <value id="0">PER_FRAME_CONTROL
               <notes>
@@ -6853,8 +7144,8 @@
           result's state becomes synchronized (by setting
           android.sync.frameNumber to a non-negative value).
           </description>
-          <units>number of processed requests</units>
-          <range>&amp;gt;= -1</range>
+          <units>Frame counts</units>
+          <range>A positive value, PER_FRAME_CONTROL, or UNKNOWN.</range>
           <details>
           This defines the maximum distance (in number of metadata results),
           between android.sync.frameNumber and the equivalent
diff --git a/camera/docs/metadata_properties.xsd b/camera/docs/metadata_properties.xsd
index 6d36c13..2bf2049 100644
--- a/camera/docs/metadata_properties.xsd
+++ b/camera/docs/metadata_properties.xsd
@@ -225,6 +225,15 @@
             </simpleType>
         </attribute>
         <attribute name="typedef" type="string" />
+        <attribute name="hwlevel" default="full">
+            <simpleType>
+                <restriction base="string">
+                    <enumeration value="full" />
+                    <enumeration value="limited" />
+                    <enumeration value="legacy" />
+                </restriction>
+            </simpleType>
+        </attribute>
     </complexType>
 
     <complexType name="EnumType">
diff --git a/camera/docs/metadata_template.mako b/camera/docs/metadata_template.mako
index d86c899..3dfa1bf 100644
--- a/camera/docs/metadata_template.mako
+++ b/camera/docs/metadata_template.mako
@@ -111,6 +111,10 @@
           % if prop.typedef is not None:
                 typedef="${prop.typedef.name}"
           % endif
+
+          % if prop.hwlevel:
+                hwlevel="${prop.hwlevel}"
+          % endif
             >
 
               % if prop.container == 'array':