Add a cpp DVR wrapper

So we can store the FMQ, states, etc. for each Dvr instance.

Test: make; acloud create;
Change-Id: Ia51bbfea017c1eb3831016545b75eeb06a1dc169
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index 5fa6a1f..9304450 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -97,6 +97,14 @@
     mDvr = env->NewWeakGlobalRef(dvr);
 }
 
+/////////////// Dvr ///////////////////////
+
+Dvr::Dvr(sp<IDvr> sp, jweak obj) : mDvrSp(sp), mDvrObj(obj) {}
+
+sp<IDvr> Dvr::getIDvr() {
+    return mDvrSp;
+}
+
 /////////////// FilterCallback ///////////////////////
 //TODO: implement filter callback
 Return<void> FilterCallback::onFilterEvent(const DemuxFilterEvent& /*filterEvent*/) {
@@ -395,14 +403,14 @@
             return NULL;
         }
     }
-    sp<IDvr> dvrSp;
+    sp<IDvr> iDvrSp;
     sp<DvrCallback> callback = new DvrCallback();
     mDemux->openDvr(type, bufferSize, callback,
             [&](Result, const sp<IDvr>& dvr) {
-                dvrSp = dvr;
+                iDvrSp = dvr;
             });
 
-    if (dvrSp == NULL) {
+    if (iDvrSp == NULL) {
         return NULL;
     }
 
@@ -412,7 +420,7 @@
                     env->FindClass("android/media/tv/tuner/Tuner$Dvr"),
                     gFields.dvrInitID,
                     mObject);
-
+    sp<Dvr> dvrSp = new Dvr(iDvrSp, dvrObj);
     dvrSp->incStrong(dvrObj);
     env->SetLongField(dvrObj, gFields.dvrContext, (jlong)dvrSp.get());
 
@@ -532,8 +540,8 @@
     return dvrSettings;
 }
 
-static sp<IDvr> getDvr(JNIEnv *env, jobject dvr) {
-    return (IDvr *)env->GetLongField(dvr, gFields.dvrContext);
+static sp<Dvr> getDvr(JNIEnv *env, jobject dvr) {
+    return (Dvr *)env->GetLongField(dvr, gFields.dvrContext);
 }
 
 static void android_media_tv_Tuner_native_init(JNIEnv *env) {
@@ -777,7 +785,7 @@
 }
 
 static bool android_media_tv_Tuner_attach_filter(JNIEnv *env, jobject dvr, jobject filter) {
-    sp<IDvr> dvrSp = getDvr(env, dvr);
+    sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr();
     sp<IFilter> filterSp = getFilter(env, filter)->getIFilter();
     if (dvrSp == NULL || filterSp == NULL) {
         return false;
@@ -787,7 +795,7 @@
 }
 
 static bool android_media_tv_Tuner_detach_filter(JNIEnv *env, jobject dvr, jobject filter) {
-    sp<IDvr> dvrSp = getDvr(env, dvr);
+    sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr();
     sp<IFilter> filterSp = getFilter(env, filter)->getIFilter();
     if (dvrSp == NULL || filterSp == NULL) {
         return false;
@@ -797,7 +805,7 @@
 }
 
 static int android_media_tv_Tuner_configure_dvr(JNIEnv *env, jobject dvr, jobject settings) {
-    sp<IDvr> dvrSp = getDvr(env, dvr);
+    sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr();
     if (dvrSp == NULL) {
         ALOGD("Failed to configure dvr: dvr not found");
         return (int)Result::INVALID_STATE;
@@ -807,7 +815,7 @@
 }
 
 static bool android_media_tv_Tuner_start_dvr(JNIEnv *env, jobject dvr) {
-    sp<IDvr> dvrSp = getDvr(env, dvr);
+    sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr();
     if (dvrSp == NULL) {
         ALOGD("Failed to start dvr: dvr not found");
         return false;
@@ -816,7 +824,7 @@
 }
 
 static bool android_media_tv_Tuner_stop_dvr(JNIEnv *env, jobject dvr) {
-    sp<IDvr> dvrSp = getDvr(env, dvr);
+    sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr();
     if (dvrSp == NULL) {
         ALOGD("Failed to stop dvr: dvr not found");
         return false;
@@ -825,7 +833,7 @@
 }
 
 static bool android_media_tv_Tuner_flush_dvr(JNIEnv *env, jobject dvr) {
-    sp<IDvr> dvrSp = getDvr(env, dvr);
+    sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr();
     if (dvrSp == NULL) {
         ALOGD("Failed to flush dvr: dvr not found");
         return false;
diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h
index 467acb8..9f9fb27 100644
--- a/media/jni/android_media_tv_Tuner.h
+++ b/media/jni/android_media_tv_Tuner.h
@@ -77,6 +77,13 @@
     jweak mDvr;
 };
 
+struct Dvr : public RefBase {
+    Dvr(sp<IDvr> sp, jweak obj);
+    sp<IDvr> getIDvr();
+    sp<IDvr> mDvrSp;
+    jweak mDvrObj;
+};
+
 struct FilterCallback : public IFilterCallback {
     virtual Return<void> onFilterEvent(const DemuxFilterEvent& filterEvent);
     virtual Return<void> onFilterStatus(const DemuxFilterStatus status);