Merge "TIAF: Change on API Review: First round API council questions" into tm-dev
diff --git a/core/api/current.txt b/core/api/current.txt
index 24d48ab..ef87fcd 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -25191,17 +25191,23 @@
   }
 
   public final class CommandRequest extends android.media.tv.BroadcastInfoRequest implements android.os.Parcelable {
-    ctor public CommandRequest(int, int, @NonNull String, @NonNull String, @NonNull String);
+    ctor public CommandRequest(int, int, @NonNull String, @NonNull String, @NonNull String, @NonNull String);
+    method @NonNull public String getArgumentType();
     method @NonNull public String getArguments();
     method @NonNull public String getName();
-    method @NonNull public String getNameSpace();
+    method @NonNull public String getNamespace();
+    field public static final String ARGUMENT_TYPE_JSON = "json";
+    field public static final String ARGUMENT_TYPE_XML = "xml";
     field @NonNull public static final android.os.Parcelable.Creator<android.media.tv.CommandRequest> CREATOR;
   }
 
   public final class CommandResponse extends android.media.tv.BroadcastInfoResponse implements android.os.Parcelable {
-    ctor public CommandResponse(int, int, int, @Nullable String);
+    ctor public CommandResponse(int, int, int, @Nullable String, @NonNull String);
     method @Nullable public String getResponse();
+    method @NonNull public String getResponseType();
     field @NonNull public static final android.os.Parcelable.Creator<android.media.tv.CommandResponse> CREATOR;
+    field public static final String RESPONSE_TYPE_JSON = "json";
+    field public static final String RESPONSE_TYPE_XML = "xml";
   }
 
   public final class DsmccRequest extends android.media.tv.BroadcastInfoRequest implements android.os.Parcelable {
@@ -25266,7 +25272,7 @@
     ctor public StreamEventResponse(int, int, int, int, long, @Nullable byte[]);
     method @Nullable public byte[] getData();
     method public int getEventId();
-    method public long getNpt();
+    method public long getNptMillis();
     field @NonNull public static final android.os.Parcelable.Creator<android.media.tv.StreamEventResponse> CREATOR;
   }
 
@@ -25296,7 +25302,7 @@
 
   public final class TimelineResponse extends android.media.tv.BroadcastInfoResponse implements android.os.Parcelable {
     ctor public TimelineResponse(int, int, int, @Nullable String, int, int, long, long);
-    method @Nullable public String getSelector();
+    method @Nullable public android.net.Uri getSelector();
     method public long getTicks();
     method public int getUnitsPerSecond();
     method public int getUnitsPerTick();
diff --git a/media/java/android/media/tv/CommandRequest.java b/media/java/android/media/tv/CommandRequest.java
index ffb6e07..3245fb5 100644
--- a/media/java/android/media/tv/CommandRequest.java
+++ b/media/java/android/media/tv/CommandRequest.java
@@ -24,6 +24,8 @@
  * A request for command from broadcast signal.
  */
 public final class CommandRequest extends BroadcastInfoRequest implements Parcelable {
+    public static final String ARGUMENT_TYPE_XML = "xml";
+    public static final String ARGUMENT_TYPE_JSON = "json";
     private static final @TvInputManager.BroadcastInfoType int REQUEST_TYPE =
             TvInputManager.BROADCAST_INFO_TYPE_COMMAND;
 
@@ -41,35 +43,38 @@
                 }
             };
 
-    private final String mNameSpace;
+    private final String mNamespace;
     private final String mName;
     private final String mArguments;
+    private final String mArgumentType;
 
     static CommandRequest createFromParcelBody(Parcel in) {
         return new CommandRequest(in);
     }
 
-    public CommandRequest(int requestId, @RequestOption int option, @NonNull String nameSpace,
-            @NonNull String name, @NonNull String arguments) {
+    public CommandRequest(int requestId, @RequestOption int option, @NonNull String namespace,
+            @NonNull String name, @NonNull String arguments, @NonNull String argumentType) {
         super(REQUEST_TYPE, requestId, option);
-        mNameSpace = nameSpace;
+        mNamespace = namespace;
         mName = name;
         mArguments = arguments;
+        mArgumentType = argumentType;
     }
 
     CommandRequest(Parcel source) {
         super(REQUEST_TYPE, source);
-        mNameSpace = source.readString();
+        mNamespace = source.readString();
         mName = source.readString();
         mArguments = source.readString();
+        mArgumentType = source.readString();
     }
 
     /**
      * Gets the namespace of the command.
      */
     @NonNull
-    public String getNameSpace() {
-        return mNameSpace;
+    public String getNamespace() {
+        return mNamespace;
     }
 
     /**
@@ -89,6 +94,15 @@
         return mArguments;
     }
 
+    /**
+     * Gets the argument type of the command.
+     * It could be either JSON or XML.
+     */
+    @NonNull
+    public String getArgumentType() {
+        return mArgumentType;
+    }
+
     @Override
     public int describeContents() {
         return 0;
@@ -97,8 +111,9 @@
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         super.writeToParcel(dest, flags);
-        dest.writeString(mNameSpace);
+        dest.writeString(mNamespace);
         dest.writeString(mName);
         dest.writeString(mArguments);
+        dest.writeString(mArgumentType);
     }
 }
diff --git a/media/java/android/media/tv/CommandResponse.java b/media/java/android/media/tv/CommandResponse.java
index c8853f1..8e448cd 100644
--- a/media/java/android/media/tv/CommandResponse.java
+++ b/media/java/android/media/tv/CommandResponse.java
@@ -25,6 +25,8 @@
  * A response for command from broadcast signal.
  */
 public final class CommandResponse extends BroadcastInfoResponse implements Parcelable {
+    public static final String RESPONSE_TYPE_XML = "xml";
+    public static final String RESPONSE_TYPE_JSON = "json";
     private static final @TvInputManager.BroadcastInfoType int RESPONSE_TYPE =
             TvInputManager.BROADCAST_INFO_TYPE_COMMAND;
 
@@ -43,20 +45,23 @@
             };
 
     private final String mResponse;
+    private final String mResponseType;
 
     static CommandResponse createFromParcelBody(Parcel in) {
         return new CommandResponse(in);
     }
 
-    public CommandResponse(int requestId, int sequence,
-            @ResponseResult int responseResult, @Nullable String response) {
+    public CommandResponse(int requestId, int sequence, @ResponseResult int responseResult,
+            @Nullable String response, @NonNull String responseType) {
         super(RESPONSE_TYPE, requestId, sequence, responseResult);
         mResponse = response;
+        mResponseType = responseType;
     }
 
     CommandResponse(Parcel source) {
         super(RESPONSE_TYPE, source);
         mResponse = source.readString();
+        mResponseType = source.readString();
     }
 
     /**
@@ -68,6 +73,15 @@
         return mResponse;
     }
 
+    /**
+     * Gets the type of the command response.
+     * It could be either JSON or XML.
+     */
+    @NonNull
+    public String getResponseType() {
+        return mResponseType;
+    }
+
     @Override
     public int describeContents() {
         return 0;
@@ -77,5 +91,6 @@
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         super.writeToParcel(dest, flags);
         dest.writeString(mResponse);
+        dest.writeString(mResponseType);
     }
 }
diff --git a/media/java/android/media/tv/SectionRequest.java b/media/java/android/media/tv/SectionRequest.java
index 5957528..078e832 100644
--- a/media/java/android/media/tv/SectionRequest.java
+++ b/media/java/android/media/tv/SectionRequest.java
@@ -80,6 +80,11 @@
 
     /**
      * Gets the version number of requested session. If it is null, value will be -1.
+     * <p>The consistency of version numbers between request and response depends on
+     * {@link BroadcastInfoRequest.RequestOption}. If the request has RequestOption value
+     * REQUEST_OPTION_AUTO_UPDATE, then the response may be set to the latest version which may be
+     * different from the version of the request. Otherwise, response with a different version from
+     * its request will be considered invalid.
      */
     public int getVersion() {
         return mVersion;
diff --git a/media/java/android/media/tv/SectionResponse.java b/media/java/android/media/tv/SectionResponse.java
index 35836be..f38ea9d 100644
--- a/media/java/android/media/tv/SectionResponse.java
+++ b/media/java/android/media/tv/SectionResponse.java
@@ -74,14 +74,20 @@
     }
 
     /**
-     * Gets the Version number of requested session.
+     * Gets the Version number of requested session. If it is null, value will be -1.
+     * <p>The consistency of version numbers between request and response depends on
+     * {@link BroadcastInfoRequest.RequestOption}. If the request has RequestOption value
+     * REQUEST_OPTION_AUTO_UPDATE, then the response may be set to the latest version which may be
+     * different from the version of the request. Otherwise, response with a different version from
+     * its request will be considered invalid.
      */
     public int getVersion() {
         return mVersion;
     }
 
     /**
-     * Gets the raw data of session.
+     * Gets the raw data of session. The sessionData field represents payload data of the session
+     * after session header, which includes version and sessionId.
      */
     @NonNull
     public Bundle getSessionData() {
diff --git a/media/java/android/media/tv/StreamEventResponse.java b/media/java/android/media/tv/StreamEventResponse.java
index f952ce9..28dff37 100644
--- a/media/java/android/media/tv/StreamEventResponse.java
+++ b/media/java/android/media/tv/StreamEventResponse.java
@@ -43,7 +43,7 @@
             };
 
     private final int mEventId;
-    private final long mNpt;
+    private final long mNptMillis;
     private final byte[] mData;
 
     static StreamEventResponse createFromParcelBody(Parcel in) {
@@ -51,17 +51,17 @@
     }
 
     public StreamEventResponse(int requestId, int sequence, @ResponseResult int responseResult,
-            int eventId, long npt, @Nullable byte[] data) {
+            int eventId, long nptMillis, @Nullable byte[] data) {
         super(RESPONSE_TYPE, requestId, sequence, responseResult);
         mEventId = eventId;
-        mNpt = npt;
+        mNptMillis = nptMillis;
         mData = data;
     }
 
     private StreamEventResponse(@NonNull Parcel source) {
         super(RESPONSE_TYPE, source);
         mEventId = source.readInt();
-        mNpt = source.readLong();
+        mNptMillis = source.readLong();
         int dataLength = source.readInt();
         mData = new byte[dataLength];
         source.readByteArray(mData);
@@ -76,9 +76,10 @@
 
     /**
      * Returns the NPT(Normal Play Time) value when the event occurred or will occur.
+     * <p>The time unit of NPT is millisecond.
      */
-    public long getNpt() {
-        return mNpt;
+    public long getNptMillis() {
+        return mNptMillis;
     }
 
     /**
@@ -98,7 +99,7 @@
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         super.writeToParcel(dest, flags);
         dest.writeInt(mEventId);
-        dest.writeLong(mNpt);
+        dest.writeLong(mNptMillis);
         dest.writeInt(mData.length);
         dest.writeByteArray(mData);
     }
diff --git a/media/java/android/media/tv/TableRequest.java b/media/java/android/media/tv/TableRequest.java
index 37df4ea..a1a6b51 100644
--- a/media/java/android/media/tv/TableRequest.java
+++ b/media/java/android/media/tv/TableRequest.java
@@ -91,7 +91,12 @@
     }
 
     /**
-     * Gets the version number of requested table.
+     * Gets the version number of requested table. If it is null, value will be -1.
+     * <p>The consistency of version numbers between request and response depends on
+     * {@link BroadcastInfoRequest.RequestOption}. If the request has RequestOption value
+     * REQUEST_OPTION_AUTO_UPDATE, then the response may be set to the latest version which may be
+     * different from the version of the request. Otherwise, response with a different version from
+     * its request will be considered invalid.
      */
     public int getVersion() {
         return mVersion;
diff --git a/media/java/android/media/tv/TableResponse.java b/media/java/android/media/tv/TableResponse.java
index e9f1136..afc9bee 100644
--- a/media/java/android/media/tv/TableResponse.java
+++ b/media/java/android/media/tv/TableResponse.java
@@ -76,7 +76,12 @@
     }
 
     /**
-     * Gets the Version number of table.
+     * Gets the version number of requested table. If it is null, value will be -1.
+     * <p>The consistency of version numbers between request and response depends on
+     * {@link BroadcastInfoRequest.RequestOption}. If the request has RequestOption value
+     * REQUEST_OPTION_AUTO_UPDATE, then the response may be set to the latest version which may be
+     * different from the version of the request. Otherwise, response with a different version from
+     * its request will be considered invalid.
      */
     public int getVersion() {
         return mVersion;
diff --git a/media/java/android/media/tv/TimelineResponse.java b/media/java/android/media/tv/TimelineResponse.java
index fbeb0c4..7de30f5 100644
--- a/media/java/android/media/tv/TimelineResponse.java
+++ b/media/java/android/media/tv/TimelineResponse.java
@@ -18,6 +18,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.net.Uri;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -79,8 +80,8 @@
      * that conveys Time Values on it.
      */
     @Nullable
-    public String getSelector() {
-        return mSelector;
+    public Uri getSelector() {
+        return Uri.parse(mSelector);
     }
 
     /**