Add setStatusCheckIntervalHint method

Bug: 232426514
Test: atest android.media.tv.tuner.cts with cf_x86_tv-userdebug AVD
Change-Id: I15bdaf51e5a5a7189ae01ea1546cbcf16c6c4994
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 7dcfab4..beac112 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -7136,6 +7136,7 @@
     field public static final int TUNER_VERSION_1_0 = 65536; // 0x10000
     field public static final int TUNER_VERSION_1_1 = 65537; // 0x10001
     field public static final int TUNER_VERSION_2_0 = 131072; // 0x20000
+    field public static final int TUNER_VERSION_3_0 = 196608; // 0x30000
     field public static final int TUNER_VERSION_UNKNOWN = 0; // 0x0
   }
 
@@ -7153,6 +7154,7 @@
     method public long read(@NonNull byte[], long, long);
     method public long seek(long);
     method public void setFileDescriptor(@NonNull android.os.ParcelFileDescriptor);
+    method public int setPlaybackBufferStatusCheckIntervalHint(long);
     method public int start();
     method public int stop();
     field public static final int PLAYBACK_STATUS_ALMOST_EMPTY = 2; // 0x2
@@ -7168,6 +7170,7 @@
     method public int detachFilter(@NonNull android.media.tv.tuner.filter.Filter);
     method public int flush();
     method public void setFileDescriptor(@NonNull android.os.ParcelFileDescriptor);
+    method public int setRecordBufferStatusCheckIntervalHint(long);
     method public int start();
     method public int stop();
     method public long write(long);
diff --git a/media/java/android/media/tv/tuner/TunerVersionChecker.java b/media/java/android/media/tv/tuner/TunerVersionChecker.java
index 3e13bed..f29a93c 100644
--- a/media/java/android/media/tv/tuner/TunerVersionChecker.java
+++ b/media/java/android/media/tv/tuner/TunerVersionChecker.java
@@ -59,6 +59,10 @@
      * Tuner version 2.0.
      */
     public static final int TUNER_VERSION_2_0 = (2 << 16);
+    /**
+     * Tuner version 3.0.
+     */
+    public static final int TUNER_VERSION_3_0 = (3 << 16);
 
     /**
      * Get the current running Tuner version.
diff --git a/media/java/android/media/tv/tuner/dvr/DvrPlayback.java b/media/java/android/media/tv/tuner/dvr/DvrPlayback.java
index 11e6999..0680240 100644
--- a/media/java/android/media/tv/tuner/dvr/DvrPlayback.java
+++ b/media/java/android/media/tv/tuner/dvr/DvrPlayback.java
@@ -23,6 +23,7 @@
 import android.media.tv.tuner.Tuner;
 import android.media.tv.tuner.Tuner.Result;
 import android.media.tv.tuner.TunerUtils;
+import android.media.tv.tuner.TunerVersionChecker;
 import android.media.tv.tuner.filter.Filter;
 import android.os.ParcelFileDescriptor;
 import android.os.Process;
@@ -91,6 +92,7 @@
     private native int nativeAttachFilter(Filter filter);
     private native int nativeDetachFilter(Filter filter);
     private native int nativeConfigureDvr(DvrSettings settings);
+    private native int nativeSetStatusCheckIntervalHint(long durationInMs);
     private native int nativeStartDvr();
     private native int nativeStopDvr();
     private native int nativeFlushDvr();
@@ -177,6 +179,35 @@
     }
 
     /**
+     * Set playback buffer status check time interval.
+     *
+     * This status check time interval will be used by the Dvr to decide how often to evaluate
+     * data. The default value will be decided by HAL if it’s not set.
+     *
+     * <p>This functionality is only available in Tuner version 3.0 and higher and will otherwise
+     * return a {@link Tuner#RESULT_UNAVAILABLE}. Use {@link TunerVersionChecker#getTunerVersion()}
+     * to get the version information.
+     *
+     * @param durationInMs specifies the duration of the delay in milliseconds.
+     *
+     * @return one of the following results:
+     * {@link Tuner#RESULT_SUCCESS} if succeed,
+     * {@link Tuner#RESULT_UNAVAILABLE} if Dvr is unavailable or unsupported HAL versions,
+     * {@link Tuner#RESULT_NOT_INITIALIZED} if Dvr is not initialized,
+     * {@link Tuner#RESULT_INVALID_STATE} if Dvr is in a wrong state,
+     * {@link Tuner#RESULT_INVALID_ARGUMENT}  if the input parameter is invalid.
+     */
+    @Result
+    public int setPlaybackBufferStatusCheckIntervalHint(long durationInMs) {
+        if (!TunerVersionChecker.checkHigherOrEqualVersionTo(
+                TunerVersionChecker.TUNER_VERSION_3_0, "Set status check interval hint")) {
+            // no-op
+            return Tuner.RESULT_UNAVAILABLE;
+        }
+        return nativeSetStatusCheckIntervalHint(durationInMs);
+    }
+
+    /**
      * Starts DVR.
      *
      * <p>Starts consuming playback data or producing data for recording.
diff --git a/media/java/android/media/tv/tuner/dvr/DvrRecorder.java b/media/java/android/media/tv/tuner/dvr/DvrRecorder.java
index e72026a..1a65832 100644
--- a/media/java/android/media/tv/tuner/dvr/DvrRecorder.java
+++ b/media/java/android/media/tv/tuner/dvr/DvrRecorder.java
@@ -22,6 +22,7 @@
 import android.media.tv.tuner.Tuner;
 import android.media.tv.tuner.Tuner.Result;
 import android.media.tv.tuner.TunerUtils;
+import android.media.tv.tuner.TunerVersionChecker;
 import android.media.tv.tuner.filter.Filter;
 import android.os.ParcelFileDescriptor;
 import android.os.Process;
@@ -53,6 +54,7 @@
     private native int nativeAttachFilter(Filter filter);
     private native int nativeDetachFilter(Filter filter);
     private native int nativeConfigureDvr(DvrSettings settings);
+    private native int nativeSetStatusCheckIntervalHint(long durationInMs);
     private native int nativeStartDvr();
     private native int nativeStopDvr();
     private native int nativeFlushDvr();
@@ -131,6 +133,35 @@
     }
 
     /**
+     * Set record buffer status check time interval.
+     *
+     * This status check time interval will be used by the Dvr to decide how often to evaluate
+     * data. The default value will be decided by HAL if it’s not set.
+     *
+     * <p>This functionality is only available in Tuner version 3.0 and higher and will otherwise
+     * return a {@link Tuner#RESULT_UNAVAILABLE}. Use {@link TunerVersionChecker#getTunerVersion()}
+     * to get the version information.
+     *
+     * @param durationInMs specifies the duration of the delay in milliseconds.
+     *
+     * @return one of the following results:
+     * {@link Tuner#RESULT_SUCCESS} if succeed,
+     * {@link Tuner#RESULT_UNAVAILABLE} if Dvr is unavailable or unsupported HAL versions,
+     * {@link Tuner#RESULT_NOT_INITIALIZED} if Dvr is not initialized,
+     * {@link Tuner#RESULT_INVALID_STATE} if Dvr is in a wrong state,
+     * {@link Tuner#RESULT_INVALID_ARGUMENT}  if the input parameter is invalid.
+     */
+    @Result
+    public int setRecordBufferStatusCheckIntervalHint(long durationInMs) {
+        if (!TunerVersionChecker.checkHigherOrEqualVersionTo(
+                TunerVersionChecker.TUNER_VERSION_3_0, "Set status check interval hint")) {
+            // no-op
+            return Tuner.RESULT_UNAVAILABLE;
+        }
+        return nativeSetStatusCheckIntervalHint(durationInMs);
+    }
+
+    /**
      * Starts DVR.
      *
      * <p>Starts consuming playback data or producing data for recording.
diff --git a/media/jni/Android.bp b/media/jni/Android.bp
index 96a3781..a0304bb 100644
--- a/media/jni/Android.bp
+++ b/media/jni/Android.bp
@@ -175,7 +175,7 @@
 
     shared_libs: [
         "android.hardware.graphics.bufferqueue@2.0",
-        "android.hardware.tv.tuner-V1-ndk",
+        "android.hardware.tv.tuner-V2-ndk",
         "libbinder_ndk",
         "libandroid_runtime",
         "libcutils",
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index 244730b..c18edcd 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -4485,6 +4485,17 @@
     return (jint)result;
 }
 
+static jint android_media_tv_Tuner_set_status_check_interval_hint(JNIEnv *env, jobject dvr,
+                                                                  jlong durationInMs) {
+    sp<DvrClient> dvrClient = getDvrClient(env, dvr);
+    if (dvrClient == nullptr) {
+        ALOGD("Failed to set status check interval hint: dvr client not found");
+        return (int)Result::NOT_INITIALIZED;
+    }
+    Result result = dvrClient->setStatusCheckIntervalHint(durationInMs);
+    return (jint)result;
+}
+
 static jint android_media_tv_Tuner_start_dvr(JNIEnv *env, jobject dvr) {
     sp<DvrClient> dvrClient = getDvrClient(env, dvr);
     if (dvrClient == nullptr) {
@@ -4828,6 +4839,8 @@
             (void *)android_media_tv_Tuner_detach_filter },
     { "nativeConfigureDvr", "(Landroid/media/tv/tuner/dvr/DvrSettings;)I",
             (void *)android_media_tv_Tuner_configure_dvr },
+    { "nativeSetStatusCheckIntervalHint", "(J)I",
+            (void *)android_media_tv_Tuner_set_status_check_interval_hint},
     { "nativeStartDvr", "()I", (void *)android_media_tv_Tuner_start_dvr },
     { "nativeStopDvr", "()I", (void *)android_media_tv_Tuner_stop_dvr },
     { "nativeFlushDvr", "()I", (void *)android_media_tv_Tuner_flush_dvr },
@@ -4844,6 +4857,8 @@
             (void *)android_media_tv_Tuner_detach_filter},
     { "nativeConfigureDvr", "(Landroid/media/tv/tuner/dvr/DvrSettings;)I",
             (void *)android_media_tv_Tuner_configure_dvr},
+    { "nativeSetStatusCheckIntervalHint", "(J)I",
+            (void *)android_media_tv_Tuner_set_status_check_interval_hint},
     { "nativeStartDvr", "()I", (void *)android_media_tv_Tuner_start_dvr},
     { "nativeStopDvr", "()I", (void *)android_media_tv_Tuner_stop_dvr},
     { "nativeFlushDvr", "()I", (void *)android_media_tv_Tuner_flush_dvr},
diff --git a/media/jni/tuner/DvrClient.cpp b/media/jni/tuner/DvrClient.cpp
index 05683b6..6e47052 100644
--- a/media/jni/tuner/DvrClient.cpp
+++ b/media/jni/tuner/DvrClient.cpp
@@ -303,7 +303,17 @@
 
     return Result::INVALID_STATE;
 }
+Result DvrClient::setStatusCheckIntervalHint(int64_t durationInMs) {
+    if (mTunerDvr == nullptr) {
+      return Result::INVALID_STATE;
+    }
+    if (durationInMs < 0) {
+      return Result::INVALID_ARGUMENT;
+    }
 
+    Status s = mTunerDvr->setStatusCheckIntervalHint(durationInMs);
+    return ClientHelper::getServiceSpecificErrorCode(s);
+}
 /////////////// TunerDvrCallback ///////////////////////
 TunerDvrCallback::TunerDvrCallback(sp<DvrClientCallback> dvrClientCallback)
         : mDvrClientCallback(dvrClientCallback) {}
diff --git a/media/jni/tuner/DvrClient.h b/media/jni/tuner/DvrClient.h
index 61c0325..40ed75b 100644
--- a/media/jni/tuner/DvrClient.h
+++ b/media/jni/tuner/DvrClient.h
@@ -126,6 +126,11 @@
      */
     Result close();
 
+    /**
+     * Set status check time interval.
+     */
+    Result setStatusCheckIntervalHint(int64_t durationInMs);
+
 private:
     /**
      * An AIDL Tuner Dvr Singleton assigned at the first time the Tuner Client