[go: nahoru, domu]

Change MeteringPoint from enum to IntDef.

Bug: 144053857
Test: manual test and ./gradlew bOS
Change-Id: I9dee4a428bfe8944889b89b33c850d5623745d81
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2CameraControlTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2CameraControlTest.java
index ee964c8..396bedc 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2CameraControlTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2CameraControlTest.java
@@ -439,7 +439,7 @@
         SurfaceOrientedMeteringPointFactory factory = new SurfaceOrientedMeteringPointFactory(1.0f,
                 1.0f);
         FocusMeteringAction action = FocusMeteringAction.Builder.from(factory.createPoint(0, 0),
-                MeteringMode.AE_AWB)
+                MeteringMode.AE | MeteringMode.AWB)
                 .build();
         mCamera2CameraControl.startFocusAndMetering(action);
         HandlerUtil.waitForLooperToIdle(mHandler);
@@ -530,7 +530,7 @@
         SurfaceOrientedMeteringPointFactory factory = new SurfaceOrientedMeteringPointFactory(1.0f,
                 1.0f);
         FocusMeteringAction action = FocusMeteringAction.Builder.from(factory.createPoint(0, 0),
-                MeteringMode.AE_ONLY)
+                MeteringMode.AE)
                 .build();
         mCamera2CameraControl.startFocusAndMetering(action);
         HandlerUtil.waitForLooperToIdle(mHandler);
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/FocusMeteringControlTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/FocusMeteringControlTest.java
index dd25292..e60ba92 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/FocusMeteringControlTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/FocusMeteringControlTest.java
@@ -47,6 +47,7 @@
 import androidx.camera.camera2.impl.annotation.CameraExecutor;
 import androidx.camera.core.CameraControlInternal;
 import androidx.camera.core.FocusMeteringAction;
+import androidx.camera.core.FocusMeteringAction.MeteringMode;
 import androidx.camera.core.ImageAnalysis;
 import androidx.camera.core.MeteringPoint;
 import androidx.camera.core.MeteringPointFactory;
@@ -285,9 +286,9 @@
     @Test
     public void startFocusAndMetering_multiplePointVariousModes() {
         mFocusMeteringControl.startFocusAndMetering(
-                FocusMeteringAction.Builder.from(mPoint1, FocusMeteringAction.MeteringMode.AWB_ONLY)
-                        .addPoint(mPoint2, FocusMeteringAction.MeteringMode.AF_AE)
-                        .addPoint(mPoint3, FocusMeteringAction.MeteringMode.AF_AE_AWB)
+                FocusMeteringAction.Builder.from(mPoint1, MeteringMode.AWB)
+                        .addPoint(mPoint2, MeteringMode.AF | MeteringMode.AE)
+                        .addPoint(mPoint3, MeteringMode.AF | MeteringMode.AE | MeteringMode.AWB)
                         .build(), PREVIEW_ASPECT_RATIO_4_X_3);
 
         MeteringRectangle[] afRects = getAfRects(mFocusMeteringControl);
@@ -310,9 +311,9 @@
     @Test
     public void startFocusAndMetering_multiplePointVariousModes2() {
         mFocusMeteringControl.startFocusAndMetering(
-                FocusMeteringAction.Builder.from(mPoint1, FocusMeteringAction.MeteringMode.AF_ONLY)
-                        .addPoint(mPoint2, FocusMeteringAction.MeteringMode.AWB_ONLY)
-                        .addPoint(mPoint3, FocusMeteringAction.MeteringMode.AE_ONLY)
+                FocusMeteringAction.Builder.from(mPoint1, MeteringMode.AF)
+                        .addPoint(mPoint2, MeteringMode.AWB)
+                        .addPoint(mPoint3, MeteringMode.AE)
                         .build(), PREVIEW_ASPECT_RATIO_4_X_3);
         MeteringRectangle[] afRects = getAfRects(mFocusMeteringControl);
         MeteringRectangle[] aeRects = getAeRects(mFocusMeteringControl);
@@ -436,28 +437,29 @@
     @Test
     public void withAFPoints_AFIsTriggered() {
         mFocusMeteringControl.startFocusAndMetering(FocusMeteringAction.Builder.from(mPoint1,
-                FocusMeteringAction.MeteringMode.AF_AE_AWB).build(), PREVIEW_ASPECT_RATIO_4_X_3);
+                MeteringMode.AF | MeteringMode.AE | MeteringMode.AWB).build(),
+                PREVIEW_ASPECT_RATIO_4_X_3);
 
         verify(mFocusMeteringControl).triggerAf();
         Mockito.reset(mFocusMeteringControl);
 
         mFocusMeteringControl.startFocusAndMetering(
                 FocusMeteringAction.Builder.from(mPoint1,
-                        FocusMeteringAction.MeteringMode.AF_ONLY).build(),
+                        MeteringMode.AF).build(),
                 PREVIEW_ASPECT_RATIO_4_X_3);
         verify(mFocusMeteringControl).triggerAf();
         Mockito.reset(mFocusMeteringControl);
 
         mFocusMeteringControl.startFocusAndMetering(
                 FocusMeteringAction.Builder.from(mPoint1,
-                        FocusMeteringAction.MeteringMode.AF_AE).build(),
+                        MeteringMode.AF | MeteringMode.AE).build(),
                 PREVIEW_ASPECT_RATIO_4_X_3);
         verify(mFocusMeteringControl).triggerAf();
         Mockito.reset(mFocusMeteringControl);
 
         mFocusMeteringControl.startFocusAndMetering(
                 FocusMeteringAction.Builder.from(mPoint1,
-                        FocusMeteringAction.MeteringMode.AF_AWB).build(),
+                        MeteringMode.AF | MeteringMode.AWB).build(),
                 PREVIEW_ASPECT_RATIO_4_X_3);
         verify(mFocusMeteringControl).triggerAf();
         Mockito.reset(mFocusMeteringControl);
@@ -465,28 +467,27 @@
 
     @Test
     public void withoutAFPoints_AFIsNotTriggered() {
-        mFocusMeteringControl.startFocusAndMetering(FocusMeteringAction.Builder.from(mPoint1,
-                FocusMeteringAction.MeteringMode.AE_ONLY).build(), PREVIEW_ASPECT_RATIO_4_X_3);
+        mFocusMeteringControl.startFocusAndMetering(
+                FocusMeteringAction.Builder.from(mPoint1, MeteringMode.AE).build(),
+                PREVIEW_ASPECT_RATIO_4_X_3);
         verify(mFocusMeteringControl, never()).triggerAf();
         Mockito.reset(mFocusMeteringControl);
 
         mFocusMeteringControl.startFocusAndMetering(
-                FocusMeteringAction.Builder.from(mPoint1,
-                        FocusMeteringAction.MeteringMode.AWB_ONLY).build(),
+                FocusMeteringAction.Builder.from(mPoint1, MeteringMode.AWB).build(),
+                PREVIEW_ASPECT_RATIO_4_X_3);
+        verify(mFocusMeteringControl, never()).triggerAf();
+        Mockito.reset(mFocusMeteringControl);
+
+        mFocusMeteringControl.startFocusAndMetering(
+                FocusMeteringAction.Builder.from(mPoint1, MeteringMode.AE).build(),
                 PREVIEW_ASPECT_RATIO_4_X_3);
         verify(mFocusMeteringControl, never()).triggerAf();
         Mockito.reset(mFocusMeteringControl);
 
         mFocusMeteringControl.startFocusAndMetering(
                 FocusMeteringAction.Builder.from(mPoint1,
-                        FocusMeteringAction.MeteringMode.AE_ONLY).build(),
-                PREVIEW_ASPECT_RATIO_4_X_3);
-        verify(mFocusMeteringControl, never()).triggerAf();
-        Mockito.reset(mFocusMeteringControl);
-
-        mFocusMeteringControl.startFocusAndMetering(
-                FocusMeteringAction.Builder.from(mPoint1,
-                        FocusMeteringAction.MeteringMode.AE_AWB).build(),
+                        MeteringMode.AE | MeteringMode.AWB).build(),
                 PREVIEW_ASPECT_RATIO_4_X_3);
         verify(mFocusMeteringControl, never()).triggerAf();
         Mockito.reset(mFocusMeteringControl);
@@ -555,7 +556,7 @@
                 FocusMeteringAction.OnAutoFocusListener.class);
 
         FocusMeteringAction action = FocusMeteringAction.Builder.from(mPoint1,
-                FocusMeteringAction.MeteringMode.AE_AWB)
+                MeteringMode.AE | MeteringMode.AWB)
                 .setAutoFocusCallback(onAutoFocusListener)
                 .build();
         mFocusMeteringControl.startFocusAndMetering(action, PREVIEW_ASPECT_RATIO_4_X_3);
@@ -563,16 +564,14 @@
         verify(onAutoFocusListener).onFocusCompleted(false);
         Mockito.reset(onAutoFocusListener);
 
-        action = FocusMeteringAction.Builder.from(mPoint1,
-                FocusMeteringAction.MeteringMode.AE_ONLY)
+        action = FocusMeteringAction.Builder.from(mPoint1, MeteringMode.AE)
                 .setAutoFocusCallback(onAutoFocusListener)
                 .build();
         mFocusMeteringControl.startFocusAndMetering(action, PREVIEW_ASPECT_RATIO_4_X_3);
         verify(onAutoFocusListener).onFocusCompleted(false);
         Mockito.reset(onAutoFocusListener);
 
-        action = FocusMeteringAction.Builder.from(mPoint1,
-                FocusMeteringAction.MeteringMode.AWB_ONLY)
+        action = FocusMeteringAction.Builder.from(mPoint1, FocusMeteringAction.MeteringMode.AWB)
                 .setAutoFocusCallback(onAutoFocusListener)
                 .build();
         mFocusMeteringControl.startFocusAndMetering(action, PREVIEW_ASPECT_RATIO_4_X_3);
@@ -704,8 +703,8 @@
     @Test
     public void cancelFocusAndMetering_regionIsReset() {
         FocusMeteringAction action = FocusMeteringAction.Builder.from(mPoint1,
-                FocusMeteringAction.MeteringMode.AF_AE_AWB)
-                .addPoint(mPoint2, FocusMeteringAction.MeteringMode.AF_AE_AWB)
+                MeteringMode.AF | MeteringMode.AE | MeteringMode.AWB)
+                .addPoint(mPoint2, MeteringMode.AF | MeteringMode.AE | MeteringMode.AWB)
                 .build();
 
         mFocusMeteringControl.startFocusAndMetering(action, PREVIEW_ASPECT_RATIO_4_X_3);
@@ -731,8 +730,8 @@
     @Test
     public void cancelFocusAndMetering_updateSessionIsCalled() {
         FocusMeteringAction action = FocusMeteringAction.Builder.from(mPoint1,
-                FocusMeteringAction.MeteringMode.AF_AE_AWB)
-                .addPoint(mPoint2, FocusMeteringAction.MeteringMode.AF_AE_AWB)
+                MeteringMode.AF | MeteringMode.AE | MeteringMode.AWB)
+                .addPoint(mPoint2, MeteringMode.AF | MeteringMode.AE | MeteringMode.AWB)
                 .build();
 
         mFocusMeteringControl.startFocusAndMetering(action, PREVIEW_ASPECT_RATIO_4_X_3);
@@ -747,7 +746,7 @@
     public void cancelFocusAndMetering_triggerCancelAfProperly() {
         // If AF is enabled, cancel operation needs to call cancelAfAeTriggerInternal(true, false)
         FocusMeteringAction action = FocusMeteringAction.Builder.from(mPoint1,
-                FocusMeteringAction.MeteringMode.AF_AE_AWB)
+                MeteringMode.AF | MeteringMode.AE | MeteringMode.AWB)
                 .build();
 
         mFocusMeteringControl.startFocusAndMetering(action, PREVIEW_ASPECT_RATIO_4_X_3);
@@ -755,21 +754,21 @@
         mFocusMeteringControl.cancelFocusAndMetering();
         verify(mFocusMeteringControl, times(1)).cancelAfAeTrigger(true, false);
 
-        action = FocusMeteringAction.Builder.from(mPoint1, FocusMeteringAction.MeteringMode.AF_AE)
+        action = FocusMeteringAction.Builder.from(mPoint1, MeteringMode.AF | MeteringMode.AE)
                 .build();
         mFocusMeteringControl.startFocusAndMetering(action, PREVIEW_ASPECT_RATIO_4_X_3);
         Mockito.reset(mFocusMeteringControl);
         mFocusMeteringControl.cancelFocusAndMetering();
         verify(mFocusMeteringControl, times(1)).cancelAfAeTrigger(true, false);
 
-        action = FocusMeteringAction.Builder.from(mPoint1, FocusMeteringAction.MeteringMode.AF_AWB)
+        action = FocusMeteringAction.Builder.from(mPoint1, MeteringMode.AF | MeteringMode.AWB)
                 .build();
         mFocusMeteringControl.startFocusAndMetering(action, PREVIEW_ASPECT_RATIO_4_X_3);
         Mockito.reset(mFocusMeteringControl);
         mFocusMeteringControl.cancelFocusAndMetering();
         verify(mFocusMeteringControl, times(1)).cancelAfAeTrigger(true, false);
 
-        action = FocusMeteringAction.Builder.from(mPoint1, FocusMeteringAction.MeteringMode.AF_ONLY)
+        action = FocusMeteringAction.Builder.from(mPoint1, MeteringMode.AF)
                 .build();
         mFocusMeteringControl.startFocusAndMetering(action, PREVIEW_ASPECT_RATIO_4_X_3);
         Mockito.reset(mFocusMeteringControl);
@@ -779,8 +778,7 @@
 
     @Test
     public void cancelFocusAndMetering_AFNotInvolved_cancelAfNotTriggered() {
-        FocusMeteringAction action = FocusMeteringAction.Builder.from(mPoint1,
-                FocusMeteringAction.MeteringMode.AE_ONLY)
+        FocusMeteringAction action = FocusMeteringAction.Builder.from(mPoint1, MeteringMode.AE)
                 .build();
 
         mFocusMeteringControl.startFocusAndMetering(action, PREVIEW_ASPECT_RATIO_4_X_3);
@@ -788,15 +786,14 @@
         mFocusMeteringControl.cancelFocusAndMetering();
         verify(mFocusMeteringControl, never()).cancelAfAeTrigger(true, false);
 
-        action = FocusMeteringAction.Builder.from(mPoint1,
-                FocusMeteringAction.MeteringMode.AWB_ONLY)
+        action = FocusMeteringAction.Builder.from(mPoint1, MeteringMode.AWB)
                 .build();
         mFocusMeteringControl.startFocusAndMetering(action, PREVIEW_ASPECT_RATIO_4_X_3);
         Mockito.reset(mFocusMeteringControl);
         mFocusMeteringControl.cancelFocusAndMetering();
         verify(mFocusMeteringControl, never()).cancelAfAeTrigger(true, false);
 
-        action = FocusMeteringAction.Builder.from(mPoint1, FocusMeteringAction.MeteringMode.AE_AWB)
+        action = FocusMeteringAction.Builder.from(mPoint1, MeteringMode.AE | MeteringMode.AWB)
                 .build();
         mFocusMeteringControl.startFocusAndMetering(action, PREVIEW_ASPECT_RATIO_4_X_3);
         Mockito.reset(mFocusMeteringControl);
@@ -846,7 +843,7 @@
     @Test
     public void startFocusMetering_AfNotInvolved_isAfAutoModeIsSet() {
         FocusMeteringAction action = FocusMeteringAction.Builder.from(mPoint1,
-                FocusMeteringAction.MeteringMode.AE_AWB).build();
+                MeteringMode.AE | MeteringMode.AWB).build();
 
         verifyAfMode(CaptureResult.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
         mFocusMeteringControl.startFocusAndMetering(action, PREVIEW_ASPECT_RATIO_4_X_3);
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringAction.java b/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringAction.java
index 93b32e6..8997ea6 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringAction.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringAction.java
@@ -16,6 +16,7 @@
 
 package androidx.camera.core;
 
+import androidx.annotation.IntDef;
 import androidx.annotation.IntRange;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -26,6 +27,8 @@
 
 import com.google.common.util.concurrent.ListenableFuture;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -37,17 +40,17 @@
  * A configuration used to trigger a focus and/or metering action.
  *
  * <p>To construct a {@link FocusMeteringAction}, apps have to create a {@link Builder} by
- * {@link Builder#from(MeteringPoint)} or {@link Builder#from(MeteringPoint, MeteringMode)}.
+ * {@link Builder#from(MeteringPoint)} or {@link Builder#from(MeteringPoint, int)}.
  * {@link MeteringPoint} is a point used to specify the focus/metering areas. Apps can use various
  * {@link MeteringPointFactory} to create the points. When the {@link FocusMeteringAction} is built,
  * pass it to {@link CameraControl#startFocusAndMetering(FocusMeteringAction)} to initiate the focus
  * and metering action.
  *
- * <p>The default {@link MeteringMode} is {@link MeteringMode#AF_AE_AWB} which means the point is
- * used for all AF/AE/AWB regions. Apps can set the proper {@link MeteringMode} to optionally
- * exclude some 3A regions. Multiple regions for specific 3A type are also supported via
- * {@link Builder#addPoint(MeteringPoint)} or
- * {@link Builder#addPoint(MeteringPoint, MeteringMode)}. App can also this API to enable
+ * <p>The default {@link MeteringMode} is {@link MeteringMode#AF} | {@link MeteringMode#AE} |
+ * {@link MeteringMode#AWB} which means the point is used for all AF/AE/AWB regions. Apps can set
+ * the proper {@link MeteringMode} to optionally exclude some 3A regions. Multiple regions for
+ * specific 3A type are also supported via {@link Builder#addPoint(MeteringPoint)} or
+ * {@link Builder#addPoint(MeteringPoint, int)}. App can also this API to enable
  * different region for AF and AE respectively.
  *
  * <p>If any AF points are specified, it will trigger AF to start a manual AF scan and cancel AF
@@ -63,7 +66,8 @@
  * to disable auto-cancel.
  */
 public final class FocusMeteringAction {
-    static final MeteringMode DEFAULT_METERINGMODE = MeteringMode.AF_AE_AWB;
+    @MeteringMode
+    static final int DEFAULT_METERINGMODE = MeteringMode.AF | MeteringMode.AE | MeteringMode.AWB;
     static final long DEFAULT_AUTOCANCEL_DURATION = 5000;
     private final List<MeteringPoint> mMeteringPointsAf;
     private final List<MeteringPoint> mMeteringPointsAe;
@@ -171,20 +175,18 @@
      * Focus/Metering mode used to specify which 3A regions is activated for corresponding
      * {@link MeteringPoint}.
      */
-    public enum MeteringMode {
-        AF_AE_AWB,
-        AF_AE,
-        AE_AWB,
-        AF_AWB,
-        AF_ONLY,
-        AE_ONLY,
-        AWB_ONLY
+    @IntDef(flag = true, value = {MeteringMode.AF, MeteringMode.AE, MeteringMode.AWB})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface MeteringMode {
+        int AF = 1;
+        int AE = 1 << 1;
+        int AWB = 1 << 2;
     }
 
     /**
      * The builder used to create the {@link FocusMeteringAction}. App must use
      * {@link Builder#from(MeteringPoint)}
-     * or {@link Builder#from(MeteringPoint, MeteringMode)} to create the {@link Builder}.
+     * or {@link Builder#from(MeteringPoint, int)} to create the {@link Builder}.
      */
     public static class Builder {
         @SuppressWarnings("WeakerAccess") /* synthetic accessor */
@@ -204,13 +206,13 @@
             this(point, DEFAULT_METERINGMODE);
         }
 
-        private Builder(@NonNull MeteringPoint point, @NonNull MeteringMode mode) {
+        private Builder(@NonNull MeteringPoint point, @MeteringMode int mode) {
             addPoint(point, mode);
         }
 
         /**
          * Creates the Builder from a {@link MeteringPoint} with default
-         * mode {@link MeteringMode#AF_AE_AWB}.
+         * mode {@link MeteringMode#AF} | {@link MeteringMode#AE} | {@link MeteringMode#AWB}.
          */
         @NonNull
         public static Builder from(@NonNull MeteringPoint meteringPoint) {
@@ -222,12 +224,13 @@
          */
         @NonNull
         public static Builder from(@NonNull MeteringPoint meteringPoint,
-                @NonNull MeteringMode mode) {
+                @MeteringMode int mode) {
             return new Builder(meteringPoint, mode);
         }
 
         /**
-         * Adds another {@link MeteringPoint} with default mode {@link MeteringMode#AF_AE_AWB}.
+         * Adds another {@link MeteringPoint} with default mode {@link MeteringMode#AF} |
+         * {@link MeteringMode#AE} | {@link MeteringMode#AWB}.
          *
          * <p>If more points are added than what current device supports for AF/AE/AWB, only the
          * first region and then in order up to the number of regions supported by the device
@@ -248,27 +251,23 @@
          * will be enabled. If it turns out no added points can be supported on the device, the
          * returned {@link ListenableFuture} in
          * {@link CameraControl#startFocusAndMetering(FocusMeteringAction)} will fail immediately.
+         *
+         * @param mode Must be a valid {@link MeteringMode}, otherwise an
+         *             {@link IllegalArgumentException} is thrown.
          */
         @NonNull
-        public Builder addPoint(@NonNull MeteringPoint point, @NonNull MeteringMode mode) {
-            if (mode == MeteringMode.AF_AE_AWB
-                    || mode == MeteringMode.AF_AE
-                    || mode == MeteringMode.AF_AWB
-                    || mode == MeteringMode.AF_ONLY) {
+        public Builder addPoint(@NonNull MeteringPoint point, @MeteringMode int mode) {
+            Preconditions.checkArgument(
+                    (mode >= MeteringMode.AF) && (mode <= (MeteringMode.AF | MeteringMode.AE
+                            | MeteringMode.AWB)), "Invalid metering mode " + mode);
+
+            if ((mode & MeteringMode.AF) != 0) {
                 mMeteringPointsAf.add(point);
             }
-
-            if (mode == MeteringMode.AF_AE_AWB
-                    || mode == MeteringMode.AF_AE
-                    || mode == MeteringMode.AE_AWB
-                    || mode == MeteringMode.AE_ONLY) {
+            if ((mode & MeteringMode.AE) != 0) {
                 mMeteringPointsAe.add(point);
             }
-
-            if (mode == MeteringMode.AF_AE_AWB
-                    || mode == MeteringMode.AE_AWB
-                    || mode == MeteringMode.AF_AWB
-                    || mode == MeteringMode.AWB_ONLY) {
+            if ((mode & MeteringMode.AWB) != 0) {
                 mMeteringPointsAwb.add(point);
             }
             return this;
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/FocusMeteringActionTest.java b/camera/camera-core/src/test/java/androidx/camera/core/FocusMeteringActionTest.java
index ee12576..3be8cca 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/FocusMeteringActionTest.java
+++ b/camera/camera-core/src/test/java/androidx/camera/core/FocusMeteringActionTest.java
@@ -57,7 +57,7 @@
     @Test
     public void fromPointWithAFAEAWB() {
         FocusMeteringAction action = FocusMeteringAction.Builder
-                .from(mPoint1, MeteringMode.AF_AE_AWB).build();
+                .from(mPoint1, MeteringMode.AF | MeteringMode.AE | MeteringMode.AWB).build();
         assertThat(action.getMeteringPointsAf()).containsExactly(mPoint1);
         assertThat(action.getMeteringPointsAe()).containsExactly(mPoint1);
         assertThat(action.getMeteringPointsAwb()).containsExactly(mPoint1);
@@ -66,7 +66,7 @@
     @Test
     public void fromPointWithAFAE() {
         FocusMeteringAction action = FocusMeteringAction.Builder
-                .from(mPoint1, MeteringMode.AF_AE).build();
+                .from(mPoint1, MeteringMode.AF | MeteringMode.AE).build();
         assertThat(action.getMeteringPointsAf()).containsExactly(mPoint1);
         assertThat(action.getMeteringPointsAe()).containsExactly(mPoint1);
         assertThat(action.getMeteringPointsAwb()).isEmpty();
@@ -75,7 +75,7 @@
     @Test
     public void fromPointWithAFAWB() {
         FocusMeteringAction action = FocusMeteringAction.Builder
-                .from(mPoint1, MeteringMode.AF_AWB).build();
+                .from(mPoint1, MeteringMode.AF | MeteringMode.AWB).build();
         assertThat(action.getMeteringPointsAf()).containsExactly(mPoint1);
         assertThat(action.getMeteringPointsAe()).isEmpty();
         assertThat(action.getMeteringPointsAwb()).containsExactly(mPoint1);
@@ -84,7 +84,7 @@
     @Test
     public void fromPointWithAEAWB() {
         FocusMeteringAction action = FocusMeteringAction.Builder
-                .from(mPoint1, MeteringMode.AE_AWB).build();
+                .from(mPoint1, MeteringMode.AE | MeteringMode.AWB).build();
         assertThat(action.getMeteringPointsAf()).isEmpty();
         assertThat(action.getMeteringPointsAe()).containsExactly(mPoint1);
         assertThat(action.getMeteringPointsAwb()).containsExactly(mPoint1);
@@ -93,7 +93,7 @@
     @Test
     public void fromPointWithAF() {
         FocusMeteringAction action = FocusMeteringAction.Builder
-                .from(mPoint1, MeteringMode.AF_ONLY).build();
+                .from(mPoint1, MeteringMode.AF).build();
         assertThat(action.getMeteringPointsAf()).containsExactly(mPoint1);
         assertThat(action.getMeteringPointsAe()).isEmpty();
         assertThat(action.getMeteringPointsAwb()).isEmpty();
@@ -102,7 +102,7 @@
     @Test
     public void fromPointWithAE() {
         FocusMeteringAction action = FocusMeteringAction.Builder
-                .from(mPoint1, MeteringMode.AE_ONLY).build();
+                .from(mPoint1, MeteringMode.AE).build();
         assertThat(action.getMeteringPointsAf()).isEmpty();
         assertThat(action.getMeteringPointsAe()).containsExactly(mPoint1);
         assertThat(action.getMeteringPointsAwb()).isEmpty();
@@ -111,7 +111,7 @@
     @Test
     public void fromPointWithAWB() {
         FocusMeteringAction action = FocusMeteringAction.Builder
-                .from(mPoint1, MeteringMode.AWB_ONLY).build();
+                .from(mPoint1, MeteringMode.AWB).build();
         assertThat(action.getMeteringPointsAf()).isEmpty();
         assertThat(action.getMeteringPointsAe()).isEmpty();
         assertThat(action.getMeteringPointsAwb()).containsExactly(mPoint1);
@@ -131,9 +131,9 @@
     @Test
     public void multiplePointsWithSameAF_AE_AWB() {
         FocusMeteringAction action = FocusMeteringAction.Builder
-                .from(mPoint1, MeteringMode.AF_AE_AWB)
-                .addPoint(mPoint2, MeteringMode.AF_AE_AWB)
-                .addPoint(mPoint3, MeteringMode.AF_AE_AWB)
+                .from(mPoint1, MeteringMode.AF | MeteringMode.AE | MeteringMode.AWB)
+                .addPoint(mPoint2, MeteringMode.AF | MeteringMode.AE | MeteringMode.AWB)
+                .addPoint(mPoint3, MeteringMode.AF | MeteringMode.AE | MeteringMode.AWB)
                 .build();
         assertThat(action.getMeteringPointsAf()).containsExactly(mPoint1, mPoint2, mPoint3);
         assertThat(action.getMeteringPointsAe()).containsExactly(mPoint1, mPoint2, mPoint3);
@@ -143,9 +143,9 @@
     @Test
     public void multiplePointsWithSameAF_AE() {
         FocusMeteringAction action = FocusMeteringAction.Builder
-                .from(mPoint1, MeteringMode.AF_AE)
-                .addPoint(mPoint2, MeteringMode.AF_AE)
-                .addPoint(mPoint3, MeteringMode.AF_AE)
+                .from(mPoint1, MeteringMode.AF | MeteringMode.AE)
+                .addPoint(mPoint2, MeteringMode.AF | MeteringMode.AE)
+                .addPoint(mPoint3, MeteringMode.AF | MeteringMode.AE)
                 .build();
         assertThat(action.getMeteringPointsAf()).containsExactly(mPoint1, mPoint2, mPoint3);
         assertThat(action.getMeteringPointsAe()).containsExactly(mPoint1, mPoint2, mPoint3);
@@ -155,9 +155,9 @@
     @Test
     public void multiplePointsWithSameAE_AWB() {
         FocusMeteringAction action = FocusMeteringAction.Builder
-                .from(mPoint1, MeteringMode.AE_AWB)
-                .addPoint(mPoint2, MeteringMode.AE_AWB)
-                .addPoint(mPoint3, MeteringMode.AE_AWB)
+                .from(mPoint1, MeteringMode.AE | MeteringMode.AWB)
+                .addPoint(mPoint2, MeteringMode.AE | MeteringMode.AWB)
+                .addPoint(mPoint3, MeteringMode.AE | MeteringMode.AWB)
                 .build();
         assertThat(action.getMeteringPointsAf()).isEmpty();
         assertThat(action.getMeteringPointsAe()).containsExactly(mPoint1, mPoint2, mPoint3);
@@ -167,9 +167,9 @@
     @Test
     public void multiplePointsWithSameAF_AWB() {
         FocusMeteringAction action = FocusMeteringAction.Builder
-                .from(mPoint1, MeteringMode.AF_AWB)
-                .addPoint(mPoint2, MeteringMode.AF_AWB)
-                .addPoint(mPoint3, MeteringMode.AF_AWB)
+                .from(mPoint1, MeteringMode.AF | MeteringMode.AWB)
+                .addPoint(mPoint2, MeteringMode.AF | MeteringMode.AWB)
+                .addPoint(mPoint3, MeteringMode.AF | MeteringMode.AWB)
                 .build();
         assertThat(action.getMeteringPointsAf()).containsExactly(mPoint1, mPoint2, mPoint3);
         assertThat(action.getMeteringPointsAe()).isEmpty();
@@ -178,10 +178,9 @@
 
     @Test
     public void multiplePointsWithSameAWBOnly() {
-        FocusMeteringAction action = FocusMeteringAction.Builder.from(mPoint1,
-                MeteringMode.AWB_ONLY)
-                .addPoint(mPoint2, MeteringMode.AWB_ONLY)
-                .addPoint(mPoint3, MeteringMode.AWB_ONLY)
+        FocusMeteringAction action = FocusMeteringAction.Builder.from(mPoint1, MeteringMode.AWB)
+                .addPoint(mPoint2, MeteringMode.AWB)
+                .addPoint(mPoint3, MeteringMode.AWB)
                 .build();
         assertThat(action.getMeteringPointsAf()).isEmpty();
         assertThat(action.getMeteringPointsAe()).isEmpty();
@@ -191,9 +190,9 @@
     @Test
     public void multiplePointsWithSameAEOnly() {
         FocusMeteringAction action = FocusMeteringAction.Builder.from(mPoint1,
-                MeteringMode.AE_ONLY)
-                .addPoint(mPoint2, MeteringMode.AE_ONLY)
-                .addPoint(mPoint3, MeteringMode.AE_ONLY)
+                MeteringMode.AE)
+                .addPoint(mPoint2, MeteringMode.AE)
+                .addPoint(mPoint3, MeteringMode.AE)
                 .build();
         assertThat(action.getMeteringPointsAf()).isEmpty();
         assertThat(action.getMeteringPointsAe()).containsExactly(mPoint1, mPoint2, mPoint3);
@@ -203,9 +202,9 @@
     @Test
     public void multiplePointsWithSameAFOnly() {
         FocusMeteringAction action = FocusMeteringAction.Builder.from(mPoint1,
-                MeteringMode.AF_ONLY)
-                .addPoint(mPoint2, MeteringMode.AF_ONLY)
-                .addPoint(mPoint3, MeteringMode.AF_ONLY)
+                MeteringMode.AF)
+                .addPoint(mPoint2, MeteringMode.AF)
+                .addPoint(mPoint3, MeteringMode.AF)
                 .build();
         assertThat(action.getMeteringPointsAf()).containsExactly(mPoint1, mPoint2, mPoint3);
         assertThat(action.getMeteringPointsAe()).isEmpty();
@@ -215,9 +214,9 @@
     @Test
     public void multiplePointsWithAFOnly_AEOnly_AWBOnly() {
         FocusMeteringAction action = FocusMeteringAction.Builder.from(mPoint1,
-                MeteringMode.AF_ONLY)
-                .addPoint(mPoint2, MeteringMode.AE_ONLY)
-                .addPoint(mPoint3, MeteringMode.AWB_ONLY)
+                MeteringMode.AF)
+                .addPoint(mPoint2, MeteringMode.AE)
+                .addPoint(mPoint3, MeteringMode.AWB)
                 .build();
         assertThat(action.getMeteringPointsAf()).containsExactly(mPoint1);
         assertThat(action.getMeteringPointsAe()).containsExactly(mPoint2);
@@ -227,9 +226,9 @@
     @Test
     public void multiplePointsWithAFAE_AEAWB_AFAWB() {
         FocusMeteringAction action = FocusMeteringAction.Builder.from(mPoint1,
-                MeteringMode.AF_AE)
-                .addPoint(mPoint2, MeteringMode.AE_AWB)
-                .addPoint(mPoint3, MeteringMode.AF_AWB)
+                MeteringMode.AF | MeteringMode.AE)
+                .addPoint(mPoint2, MeteringMode.AE | MeteringMode.AWB)
+                .addPoint(mPoint3, MeteringMode.AF | MeteringMode.AWB)
                 .build();
         assertThat(action.getMeteringPointsAf()).containsExactly(mPoint1, mPoint3);
         assertThat(action.getMeteringPointsAe()).containsExactly(mPoint2, mPoint1);
@@ -239,9 +238,9 @@
     @Test
     public void multiplePointsWithAFAEAWB_AEAWB_AFOnly() {
         FocusMeteringAction action = FocusMeteringAction.Builder.from(mPoint1,
-                MeteringMode.AF_AE_AWB)
-                .addPoint(mPoint2, MeteringMode.AE_AWB)
-                .addPoint(mPoint3, MeteringMode.AF_ONLY)
+                MeteringMode.AF | MeteringMode.AE | MeteringMode.AWB)
+                .addPoint(mPoint2, MeteringMode.AE | MeteringMode.AWB)
+                .addPoint(mPoint3, MeteringMode.AF)
                 .build();
         assertThat(action.getMeteringPointsAf()).containsExactly(mPoint1, mPoint3);
         assertThat(action.getMeteringPointsAe()).containsExactly(mPoint1, mPoint2);
@@ -251,9 +250,9 @@
     @Test
     public void multiplePointsWithAEOnly_AFAWAEB_AEOnly() {
         FocusMeteringAction action = FocusMeteringAction.Builder.from(mPoint1,
-                MeteringMode.AE_ONLY)
-                .addPoint(mPoint2, MeteringMode.AF_AE_AWB)
-                .addPoint(mPoint3, MeteringMode.AE_ONLY)
+                MeteringMode.AE)
+                .addPoint(mPoint2, MeteringMode.AF | MeteringMode.AE | MeteringMode.AWB)
+                .addPoint(mPoint3, MeteringMode.AE)
                 .build();
         assertThat(action.getMeteringPointsAf()).containsExactly(mPoint2);
         assertThat(action.getMeteringPointsAe()).containsExactly(mPoint1, mPoint2, mPoint3);
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/CameraView.java b/camera/camera-view/src/main/java/androidx/camera/view/CameraView.java
index 8a9671d..e116f88 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/CameraView.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/CameraView.java
@@ -795,8 +795,8 @@
         Camera camera = mCameraModule.getCamera();
         if (camera != null) {
             camera.getCameraControl().startFocusAndMetering(
-                    FocusMeteringAction.Builder.from(afPoint, MeteringMode.AF_ONLY)
-                            .addPoint(aePoint, MeteringMode.AE_ONLY)
+                    FocusMeteringAction.Builder.from(afPoint, MeteringMode.AF)
+                            .addPoint(aePoint, MeteringMode.AE)
                             .build());
         } else {
             Log.d(TAG, "cannot access camera");