[API review] Duration limiter

  Add unit type to the method name by renaming OutputOptions
  get/setDurationLimit to get/setDurationLimitMillis.

  Also fix some documentation.

Relnote: "Renamed OutputOptions.getDurationLimit to OutputOptions.getDurationLimitMillis and OutputOptions.setDurationLimit to OutputOptions.setDurationLimitMillis."

Bug: b/254279631
Test: ./gradlew camera:camera-video:updateApi, ./gradlew
camera: camera-video:build
Change-Id: I91f0c94066e5605cd031718f9cd547c1b427d775
diff --git a/camera/camera-video/api/current.txt b/camera/camera-video/api/current.txt
index 1661eea..729cb0a 100644
--- a/camera/camera-video/api/current.txt
+++ b/camera/camera-video/api/current.txt
@@ -27,7 +27,7 @@
   @RequiresApi(21) public static final class FileDescriptorOutputOptions.Builder {
     ctor public FileDescriptorOutputOptions.Builder(android.os.ParcelFileDescriptor);
     method public androidx.camera.video.FileDescriptorOutputOptions build();
-    method public androidx.camera.video.FileDescriptorOutputOptions.Builder setDurationLimit(@IntRange(from=0) long);
+    method public androidx.camera.video.FileDescriptorOutputOptions.Builder setDurationLimitMillis(@IntRange(from=0) long);
     method public androidx.camera.video.FileDescriptorOutputOptions.Builder setFileSizeLimit(@IntRange(from=0) long);
     method public androidx.camera.video.FileDescriptorOutputOptions.Builder setLocation(android.location.Location?);
   }
@@ -39,7 +39,7 @@
   @RequiresApi(21) public static final class FileOutputOptions.Builder {
     ctor public FileOutputOptions.Builder(java.io.File);
     method public androidx.camera.video.FileOutputOptions build();
-    method public androidx.camera.video.FileOutputOptions.Builder setDurationLimit(@IntRange(from=0) long);
+    method public androidx.camera.video.FileOutputOptions.Builder setDurationLimitMillis(@IntRange(from=0) long);
     method public androidx.camera.video.FileOutputOptions.Builder setFileSizeLimit(@IntRange(from=0) long);
     method public androidx.camera.video.FileOutputOptions.Builder setLocation(android.location.Location?);
   }
@@ -55,13 +55,13 @@
     ctor public MediaStoreOutputOptions.Builder(android.content.ContentResolver, android.net.Uri);
     method public androidx.camera.video.MediaStoreOutputOptions build();
     method public androidx.camera.video.MediaStoreOutputOptions.Builder setContentValues(android.content.ContentValues);
-    method public androidx.camera.video.MediaStoreOutputOptions.Builder setDurationLimit(@IntRange(from=0) long);
+    method public androidx.camera.video.MediaStoreOutputOptions.Builder setDurationLimitMillis(@IntRange(from=0) long);
     method public androidx.camera.video.MediaStoreOutputOptions.Builder setFileSizeLimit(@IntRange(from=0) long);
     method public androidx.camera.video.MediaStoreOutputOptions.Builder setLocation(android.location.Location?);
   }
 
   @RequiresApi(21) public abstract class OutputOptions {
-    method @IntRange(from=0) public long getDurationLimit();
+    method @IntRange(from=0) public long getDurationLimitMillis();
     method @IntRange(from=0) public long getFileSizeLimit();
     method public android.location.Location? getLocation();
     field public static final int DURATION_UNLIMITED = 0; // 0x0
diff --git a/camera/camera-video/api/public_plus_experimental_current.txt b/camera/camera-video/api/public_plus_experimental_current.txt
index 1661eea..729cb0a 100644
--- a/camera/camera-video/api/public_plus_experimental_current.txt
+++ b/camera/camera-video/api/public_plus_experimental_current.txt
@@ -27,7 +27,7 @@
   @RequiresApi(21) public static final class FileDescriptorOutputOptions.Builder {
     ctor public FileDescriptorOutputOptions.Builder(android.os.ParcelFileDescriptor);
     method public androidx.camera.video.FileDescriptorOutputOptions build();
-    method public androidx.camera.video.FileDescriptorOutputOptions.Builder setDurationLimit(@IntRange(from=0) long);
+    method public androidx.camera.video.FileDescriptorOutputOptions.Builder setDurationLimitMillis(@IntRange(from=0) long);
     method public androidx.camera.video.FileDescriptorOutputOptions.Builder setFileSizeLimit(@IntRange(from=0) long);
     method public androidx.camera.video.FileDescriptorOutputOptions.Builder setLocation(android.location.Location?);
   }
@@ -39,7 +39,7 @@
   @RequiresApi(21) public static final class FileOutputOptions.Builder {
     ctor public FileOutputOptions.Builder(java.io.File);
     method public androidx.camera.video.FileOutputOptions build();
-    method public androidx.camera.video.FileOutputOptions.Builder setDurationLimit(@IntRange(from=0) long);
+    method public androidx.camera.video.FileOutputOptions.Builder setDurationLimitMillis(@IntRange(from=0) long);
     method public androidx.camera.video.FileOutputOptions.Builder setFileSizeLimit(@IntRange(from=0) long);
     method public androidx.camera.video.FileOutputOptions.Builder setLocation(android.location.Location?);
   }
@@ -55,13 +55,13 @@
     ctor public MediaStoreOutputOptions.Builder(android.content.ContentResolver, android.net.Uri);
     method public androidx.camera.video.MediaStoreOutputOptions build();
     method public androidx.camera.video.MediaStoreOutputOptions.Builder setContentValues(android.content.ContentValues);
-    method public androidx.camera.video.MediaStoreOutputOptions.Builder setDurationLimit(@IntRange(from=0) long);
+    method public androidx.camera.video.MediaStoreOutputOptions.Builder setDurationLimitMillis(@IntRange(from=0) long);
     method public androidx.camera.video.MediaStoreOutputOptions.Builder setFileSizeLimit(@IntRange(from=0) long);
     method public androidx.camera.video.MediaStoreOutputOptions.Builder setLocation(android.location.Location?);
   }
 
   @RequiresApi(21) public abstract class OutputOptions {
-    method @IntRange(from=0) public long getDurationLimit();
+    method @IntRange(from=0) public long getDurationLimitMillis();
     method @IntRange(from=0) public long getFileSizeLimit();
     method public android.location.Location? getLocation();
     field public static final int DURATION_UNLIMITED = 0; // 0x0
diff --git a/camera/camera-video/api/restricted_current.txt b/camera/camera-video/api/restricted_current.txt
index 1661eea..729cb0a 100644
--- a/camera/camera-video/api/restricted_current.txt
+++ b/camera/camera-video/api/restricted_current.txt
@@ -27,7 +27,7 @@
   @RequiresApi(21) public static final class FileDescriptorOutputOptions.Builder {
     ctor public FileDescriptorOutputOptions.Builder(android.os.ParcelFileDescriptor);
     method public androidx.camera.video.FileDescriptorOutputOptions build();
-    method public androidx.camera.video.FileDescriptorOutputOptions.Builder setDurationLimit(@IntRange(from=0) long);
+    method public androidx.camera.video.FileDescriptorOutputOptions.Builder setDurationLimitMillis(@IntRange(from=0) long);
     method public androidx.camera.video.FileDescriptorOutputOptions.Builder setFileSizeLimit(@IntRange(from=0) long);
     method public androidx.camera.video.FileDescriptorOutputOptions.Builder setLocation(android.location.Location?);
   }
@@ -39,7 +39,7 @@
   @RequiresApi(21) public static final class FileOutputOptions.Builder {
     ctor public FileOutputOptions.Builder(java.io.File);
     method public androidx.camera.video.FileOutputOptions build();
-    method public androidx.camera.video.FileOutputOptions.Builder setDurationLimit(@IntRange(from=0) long);
+    method public androidx.camera.video.FileOutputOptions.Builder setDurationLimitMillis(@IntRange(from=0) long);
     method public androidx.camera.video.FileOutputOptions.Builder setFileSizeLimit(@IntRange(from=0) long);
     method public androidx.camera.video.FileOutputOptions.Builder setLocation(android.location.Location?);
   }
@@ -55,13 +55,13 @@
     ctor public MediaStoreOutputOptions.Builder(android.content.ContentResolver, android.net.Uri);
     method public androidx.camera.video.MediaStoreOutputOptions build();
     method public androidx.camera.video.MediaStoreOutputOptions.Builder setContentValues(android.content.ContentValues);
-    method public androidx.camera.video.MediaStoreOutputOptions.Builder setDurationLimit(@IntRange(from=0) long);
+    method public androidx.camera.video.MediaStoreOutputOptions.Builder setDurationLimitMillis(@IntRange(from=0) long);
     method public androidx.camera.video.MediaStoreOutputOptions.Builder setFileSizeLimit(@IntRange(from=0) long);
     method public androidx.camera.video.MediaStoreOutputOptions.Builder setLocation(android.location.Location?);
   }
 
   @RequiresApi(21) public abstract class OutputOptions {
-    method @IntRange(from=0) public long getDurationLimit();
+    method @IntRange(from=0) public long getDurationLimitMillis();
     method @IntRange(from=0) public long getFileSizeLimit();
     method public android.location.Location? getLocation();
     field public static final int DURATION_UNLIMITED = 0; // 0x0
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt
index dce6a36..12ef8da 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt
@@ -118,12 +118,12 @@
     fun canBuildOutputOptions() {
         val outputOptions = FakeOutputOptions.Builder()
             .setFileSizeLimit(FILE_SIZE_LIMIT)
-            .setDurationLimit(DURATION_LIMIT)
+            .setDurationLimitMillis(DURATION_LIMIT)
             .build()
 
         assertThat(outputOptions).isNotNull()
         assertThat(outputOptions.fileSizeLimit).isEqualTo(FILE_SIZE_LIMIT)
-        assertThat(outputOptions.durationLimit).isEqualTo(DURATION_LIMIT)
+        assertThat(outputOptions.durationLimitMillis).isEqualTo(DURATION_LIMIT)
     }
 
     @Test
@@ -132,7 +132,7 @@
 
         assertThat(outputOptions.location).isNull()
         assertThat(outputOptions.fileSizeLimit).isEqualTo(OutputOptions.FILE_SIZE_UNLIMITED)
-        assertThat(outputOptions.durationLimit).isEqualTo(OutputOptions.DURATION_UNLIMITED)
+        assertThat(outputOptions.durationLimitMillis).isEqualTo(OutputOptions.DURATION_UNLIMITED)
     }
 
     @Test
@@ -145,7 +145,7 @@
     @Test
     fun invalidDurationLimit_throwsException() {
         assertThrows(IllegalArgumentException::class.java) {
-            FakeOutputOptions.Builder().setDurationLimit(INVALID_DURATION_LIMIT)
+            FakeOutputOptions.Builder().setDurationLimitMillis(INVALID_DURATION_LIMIT)
         }
     }
 
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/RecorderTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/RecorderTest.kt
index 2f648b8..b7568be 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/RecorderTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/RecorderTest.kt
@@ -597,7 +597,7 @@
         val durationTolerance = 50L
         val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
         val outputOptions = FileOutputOptions.Builder(file)
-            .setDurationLimit(durationLimitMs)
+            .setDurationLimitMillis(durationLimitMs)
             .build()
 
         val recording = recorder
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/OutputOptions.java b/camera/camera-video/src/main/java/androidx/camera/video/OutputOptions.java
index 127b5a0..c7015d9 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/OutputOptions.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/OutputOptions.java
@@ -53,7 +53,7 @@
     /**
      * Gets the limit for the file size in bytes.
      *
-     * @return the file size limit in bytes or zero if it's unlimited.
+     * @return the file size limit in bytes or {@link #FILE_SIZE_UNLIMITED} if it's unlimited.
      */
     @IntRange(from = 0)
     public long getFileSizeLimit() {
@@ -64,7 +64,7 @@
      * Returns a {@link Location} object representing the geographic location where the video was
      * recorded.
      *
-     * @return The location object or {@code null} if no location was set.
+     * @return the location object or {@code null} if no location was set.
      */
     @Nullable
     public Location getLocation() {
@@ -74,11 +74,12 @@
     /**
      * Gets the limit for the video duration in milliseconds.
      *
-     * @return the video duration limit in milliseconds or zero if it's unlimited.
+     * @return the video duration limit in milliseconds or {@link #DURATION_UNLIMITED} if it's
+     * unlimited.
      */
     @IntRange(from = 0)
-    public long getDurationLimit() {
-        return mOutputOptionsInternal.getDurationLimit();
+    public long getDurationLimitMillis() {
+        return mOutputOptionsInternal.getDurationLimitMillis();
     }
 
     /**
@@ -93,7 +94,7 @@
             mRootInternalBuilder = builder;
             // Apply default value
             mRootInternalBuilder.setFileSizeLimit(FILE_SIZE_UNLIMITED);
-            mRootInternalBuilder.setDurationLimit(DURATION_UNLIMITED);
+            mRootInternalBuilder.setDurationLimitMillis(DURATION_UNLIMITED);
         }
 
         /**
@@ -109,12 +110,12 @@
          *
          * @param fileSizeLimitBytes the file size limit in bytes.
          * @return this Builder.
-         * @throws IllegalArgumentException if the specified file size limit is less than zero.
+         * @throws IllegalArgumentException if the specified file size limit is negative.
          */
         @NonNull
         public B setFileSizeLimit(@IntRange(from = 0) long fileSizeLimitBytes) {
             Preconditions.checkArgument(fileSizeLimitBytes >= 0, "The specified file size limit "
-                    + "should be greater than zero.");
+                    + "can't be negative.");
             mRootInternalBuilder.setFileSizeLimit(fileSizeLimitBytes);
             return (B) this;
         }
@@ -130,15 +131,15 @@
          * unlimited}. If set with a negative value, an {@link IllegalArgumentException} will be
          * thrown.
          *
-         * @param durationLimitMs the video duration limit in milliseconds.
+         * @param durationLimitMillis the video duration limit in milliseconds.
          * @return this Builder.
-         * @throws IllegalArgumentException if the specified duration limit is less than zero.
+         * @throws IllegalArgumentException if the specified duration limit is negative.
          */
         @NonNull
-        public B setDurationLimit(@IntRange(from = 0) long durationLimitMs) {
-            Preconditions.checkArgument(durationLimitMs >= 0, "The specified duration limit "
-                    + "should be greater than zero.");
-            mRootInternalBuilder.setDurationLimit(durationLimitMs);
+        public B setDurationLimitMillis(@IntRange(from = 0) long durationLimitMillis) {
+            Preconditions.checkArgument(durationLimitMillis >= 0, "The specified duration limit "
+                    + "can't be negative.");
+            mRootInternalBuilder.setDurationLimitMillis(durationLimitMillis);
             return (B) this;
         }
 
@@ -154,7 +155,8 @@
          * value is {@code null}.
          *
          * @throws IllegalArgumentException if the latitude of the location is not in the range
-         * [-90, 90] or the longitude of the location is not in the range [-180, 180].
+         * {@code [-90, 90]} or the longitude of the location is not in the range {@code [-180,
+         * 180]}.
          */
         @NonNull
         public B setLocation(@Nullable Location location) {
@@ -184,7 +186,7 @@
         abstract long getFileSizeLimit();
 
         @IntRange(from = 0)
-        abstract long getDurationLimit();
+        abstract long getDurationLimitMillis();
 
         @Nullable
         abstract Location getLocation();
@@ -197,7 +199,7 @@
             abstract B setFileSizeLimit(@IntRange(from = 0) long fileSizeLimitBytes);
 
             @NonNull
-            abstract B setDurationLimit(@IntRange(from = 0) long durationLimitMs);
+            abstract B setDurationLimitMillis(@IntRange(from = 0) long durationLimitMillis);
 
             @NonNull
             abstract B setLocation(@Nullable Location location);
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/Recorder.java b/camera/camera-video/src/main/java/androidx/camera/video/Recorder.java
index ad44acd..d36a8bb 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/Recorder.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/Recorder.java
@@ -1472,9 +1472,9 @@
             mFileSizeLimitInBytes = OutputOptions.FILE_SIZE_UNLIMITED;
         }
 
-        if (recordingToStart.getOutputOptions().getDurationLimit() > 0) {
+        if (recordingToStart.getOutputOptions().getDurationLimitMillis() > 0) {
             mDurationLimitNs = TimeUnit.MILLISECONDS.toNanos(
-                    recordingToStart.getOutputOptions().getDurationLimit());
+                    recordingToStart.getOutputOptions().getDurationLimitMillis());
             Logger.d(TAG, "Duration limit in nanoseconds: " + mDurationLimitNs);
         } else {
             mDurationLimitNs = OutputOptions.DURATION_UNLIMITED;