Merge "add function setTvView to link the input Session and IApp Session"
diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java
index f22b7dc..0461f0a 100644
--- a/media/java/android/media/tv/TvInputManager.java
+++ b/media/java/android/media/tv/TvInputManager.java
@@ -28,6 +28,7 @@
 import android.content.Intent;
 import android.graphics.Rect;
 import android.media.PlaybackParams;
+import android.media.tv.interactive.TvIAppManager;
 import android.net.Uri;
 import android.os.Binder;
 import android.os.Bundle;
@@ -2073,6 +2074,8 @@
         // @GuardedBy("mMetadataLock")
         private int mVideoHeight;
 
+        private TvIAppManager.Session mIAppSession;
+
         private Session(IBinder token, InputChannel channel, ITvInputManager service, int userId,
                 int seq, SparseArray<SessionCallbackRecord> sessionCallbackRecordMap) {
             mToken = token;
@@ -2083,6 +2086,14 @@
             mSessionCallbackRecordMap = sessionCallbackRecordMap;
         }
 
+        public TvIAppManager.Session getIAppSession() {
+            return mIAppSession;
+        }
+
+        public void setIAppSession(TvIAppManager.Session IAppSession) {
+            this.mIAppSession = IAppSession;
+        }
+
         /**
          * Releases this session.
          */
diff --git a/media/java/android/media/tv/TvView.java b/media/java/android/media/tv/TvView.java
index b1baf94..6994d28 100644
--- a/media/java/android/media/tv/TvView.java
+++ b/media/java/android/media/tv/TvView.java
@@ -34,6 +34,8 @@
 import android.media.tv.TvInputManager.Session;
 import android.media.tv.TvInputManager.Session.FinishedInputEventCallback;
 import android.media.tv.TvInputManager.SessionCallback;
+import android.media.tv.interactive.TvIAppManager;
+import android.media.tv.interactive.TvIAppView;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
@@ -197,6 +199,11 @@
         mCallback = callback;
     }
 
+    /** @hide */
+    public Session getInputSession() {
+        return mSession;
+    }
+
     /**
      * Sets this as the main {@link TvView}.
      *
diff --git a/media/java/android/media/tv/interactive/TvIAppManager.java b/media/java/android/media/tv/interactive/TvIAppManager.java
index 16e19e7..94534cd 100644
--- a/media/java/android/media/tv/interactive/TvIAppManager.java
+++ b/media/java/android/media/tv/interactive/TvIAppManager.java
@@ -20,6 +20,7 @@
 import android.annotation.Nullable;
 import android.annotation.SystemService;
 import android.content.Context;
+import android.media.tv.TvInputManager;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.RemoteException;
@@ -150,6 +151,8 @@
 
         private IBinder mToken;
 
+        private TvInputManager.Session mInputSession;
+
         private Session(IBinder token, ITvIAppManager service, int userId, int seq,
                 SparseArray<SessionCallbackRecord> sessionCallbackRecordMap) {
             mToken = token;
@@ -159,6 +162,14 @@
             mSessionCallbackRecordMap = sessionCallbackRecordMap;
         }
 
+        public TvInputManager.Session getInputSession() {
+            return mInputSession;
+        }
+
+        public void setInputSession(TvInputManager.Session inputSession) {
+            mInputSession = inputSession;
+        }
+
         void startIApp() {
             if (mToken == null) {
                 Log.w(TAG, "The session has been already released");
diff --git a/media/java/android/media/tv/interactive/TvIAppView.java b/media/java/android/media/tv/interactive/TvIAppView.java
index adaaab0..1b25c23 100644
--- a/media/java/android/media/tv/interactive/TvIAppView.java
+++ b/media/java/android/media/tv/interactive/TvIAppView.java
@@ -16,9 +16,12 @@
 
 package android.media.tv.interactive;
 
+import android.annotation.Nullable;
 import android.content.Context;
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
+import android.media.tv.TvInputManager;
+import android.media.tv.TvView;
 import android.media.tv.interactive.TvIAppManager.Session;
 import android.media.tv.interactive.TvIAppManager.SessionCallback;
 import android.os.Handler;
@@ -39,6 +42,11 @@
     private static final String TAG = "TvIAppView";
     private static final boolean DEBUG = false;
 
+    private static final int SET_TVVIEW_SUCCESS = 1;
+    private static final int SET_TVVIEW_FAIL = 2;
+    private static final int UNSET_TVVIEW_SUCCESS = 3;
+    private static final int UNSET_TVVIEW_FAIL = 4;
+
     private final TvIAppManager mTvIAppManager;
     private final Handler mHandler = new Handler();
     private Session mSession;
@@ -213,6 +221,39 @@
         }
     }
 
+    public Session getIAppSession() {
+        return mSession;
+    }
+
+    /**
+     * Sets the TvIAppView to receive events from TIS. This method links the session of
+     * TvIAppManager to TvInputManager session, so the TIAS can get the TIS events.
+     *
+     * @param tvView the TvView to be linked to this TvIAppView via linking of Sessions.
+     * @return to be added
+     */
+    public int setTvView(@Nullable TvView tvView) {
+        if (tvView == null) {
+            return unsetTvView();
+        }
+        TvInputManager.Session inputSession = tvView.getInputSession();
+        if (inputSession == null || mSession == null) {
+            return SET_TVVIEW_FAIL;
+        }
+        mSession.setInputSession(inputSession);
+        inputSession.setIAppSession(mSession);
+        return SET_TVVIEW_SUCCESS;
+    }
+
+    private int unsetTvView() {
+        if (mSession == null || mSession.getInputSession() == null) {
+            return UNSET_TVVIEW_FAIL;
+        }
+        mSession.getInputSession().setIAppSession(null);
+        mSession.setInputSession(null);
+        return UNSET_TVVIEW_SUCCESS;
+    }
+
     private class MySessionCallback extends SessionCallback {
         final String mIAppServiceId;
         int mType;