aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDongwon Kang <dwkang@google.com>2014-07-25 11:41:02 +0900
committerDongwon Kang <dwkang@google.com>2014-07-31 16:16:00 +0900
commit512017945a2cd192797d7ca404cba08d792877dd (patch)
tree16d41fd7396dc424e5f984afb25c563063249a8b
parent3ee2db7cb32377781c8657907921540e1517aa8f (diff)
downloadTV-512017945a2cd192797d7ca404cba08d792877dd.tar.gz
Applying framework changes on TvTrackInfo in sample TV input.
This change addresses the following API council feedback: TvTrackInfo: -- Remove all KEY_/VALUE_ constants, and replace with explicit, strongly-typed accessor methods. -- Add additional Bundle getExtras() method (in addition to the explicit types); most of the time this Bundle will be null. Bug: 16542165 Change-Id: I2b6ada405731332dddde2283cc514e4e0817c4ca
-rw-r--r--sample/src/com/example/sampletvinput/BaseTvInputService.java87
-rw-r--r--src/com/android/tv/TvActivity.java5
-rw-r--r--src/com/android/tv/ui/TunableTvView.java25
3 files changed, 68 insertions, 49 deletions
diff --git a/sample/src/com/example/sampletvinput/BaseTvInputService.java b/sample/src/com/example/sampletvinput/BaseTvInputService.java
index 7e10757a..4309df4d 100644
--- a/sample/src/com/example/sampletvinput/BaseTvInputService.java
+++ b/sample/src/com/example/sampletvinput/BaseTvInputService.java
@@ -31,6 +31,7 @@ import android.media.tv.TvInputManager;
import android.media.tv.TvInputService;
import android.media.tv.TvTrackInfo;
import android.net.Uri;
+import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
@@ -47,8 +48,12 @@ import java.util.Map;
abstract public class BaseTvInputService extends TvInputService {
private static final String TAG = "BaseTvInputService";
private static final boolean DEBUG = true;
+ private static final String KEY_TRACK_ID = "track-id";
private final LongSparseArray<ChannelInfo> mChannelMap = new LongSparseArray<ChannelInfo>();
+ private int mSelectedAudioTrack = -1;
+ private int mSelectedVideoTrack = -1;
+ private int mSelectedSubtitleTrack = -1;
private final Handler mHandler = new Handler();
protected List<ChannelInfo> mChannels;
@@ -249,6 +254,7 @@ abstract public class BaseTvInputService extends TvInputService {
MediaPlayer.TrackInfo[] tracks = mPlayer.getTrackInfo();
setupTrackInfo(tracks, channel);
notifyTrackInfoChanged(new ArrayList<TvTrackInfo>(mTracks.values()));
+ notifySelectedTracks();
notifyVideoAvailable();
mPlayer.start();
}
@@ -310,28 +316,16 @@ abstract public class BaseTvInputService extends TvInputService {
@Override
public boolean onSelectTrack(TvTrackInfo track) {
- Log.d(TAG, "onSelectTrack(" + track.getString(TvTrackInfo.KEY_TAG) + ")");
+ Log.d(TAG, "onSelectTrack(" + track.getExtra().getInt(KEY_TRACK_ID) + ")");
if (mPlayer != null) {
- if (track.getInt(TvTrackInfo.KEY_TYPE) == TvTrackInfo.VALUE_TYPE_SUBTITLE) {
+ if (track.getType() == TvTrackInfo.TYPE_SUBTITLE) {
// SelectTrack only works on subtitle tracks.
- mPlayer.selectTrack(Integer.parseInt(track.getString(TvTrackInfo.KEY_TAG)));
-
- // Mark the previous subtitle track is unselected.
- for (TvTrackInfo info : mTracks.values()) {
- if (info.getInt(TvTrackInfo.KEY_TYPE) == TvTrackInfo.VALUE_TYPE_SUBTITLE
- && info.getBoolean(TvTrackInfo.KEY_IS_SELECTED)) {
- int tag = Integer.parseInt(info.getString(TvTrackInfo.KEY_TAG));
- mTracks.put(tag, new TvTrackInfo.Builder(info)
- .putBoolean(TvTrackInfo.KEY_IS_SELECTED, false)
- .build());
- }
- }
+ mPlayer.selectTrack(track.getExtra().getInt(KEY_TRACK_ID));
+
// Mark this track is selected.
- int tag = Integer.parseInt(track.getString(TvTrackInfo.KEY_TAG));
- mTracks.put(tag, new TvTrackInfo.Builder(track)
- .putBoolean(TvTrackInfo.KEY_IS_SELECTED, true)
- .build());
- notifyTrackInfoChanged(new ArrayList<TvTrackInfo>(mTracks.values()));
+ int id = track.getExtra().getInt(KEY_TRACK_ID);
+ mSelectedSubtitleTrack = id;
+ notifySelectedTracks();
return true;
}
}
@@ -341,21 +335,31 @@ abstract public class BaseTvInputService extends TvInputService {
@Override
public boolean onUnselectTrack(TvTrackInfo track) {
if (mPlayer != null) {
- if (track.getInt(TvTrackInfo.KEY_TYPE) == TvTrackInfo.VALUE_TYPE_SUBTITLE) {
+ if (track.getType() == TvTrackInfo.TYPE_SUBTITLE) {
// UnselectTrack only works on subtitle tracks.
- mPlayer.deselectTrack(Integer.parseInt(track.getString(TvTrackInfo.KEY_TAG)));
- // Mark the track is unselected.
- int tag = Integer.parseInt(track.getString(TvTrackInfo.KEY_TAG));
- mTracks.put(tag, new TvTrackInfo.Builder(track)
- .putBoolean(TvTrackInfo.KEY_IS_SELECTED, false)
- .build());
- notifyTrackInfoChanged(new ArrayList<TvTrackInfo>(mTracks.values()));
+ mPlayer.deselectTrack(track.getExtra().getInt(KEY_TRACK_ID));
+ mSelectedSubtitleTrack = -1;
+ notifySelectedTracks();
return true;
}
}
return false;
}
+ private void notifySelectedTracks() {
+ List<TvTrackInfo> list = new ArrayList<TvTrackInfo>();
+ if (mSelectedAudioTrack != -1) {
+ list.add(mTracks.get(mSelectedAudioTrack));
+ }
+ if (mSelectedVideoTrack != -1) {
+ list.add(mTracks.get(mSelectedVideoTrack));
+ }
+ if (mSelectedSubtitleTrack != -1) {
+ list.add(mTracks.get(mSelectedSubtitleTrack));
+ }
+ notifyTrackSelectionChanged(list);
+ }
+
private void setupTrackInfo(MediaPlayer.TrackInfo[] infos, ChannelInfo channel) {
Map<Integer, TvTrackInfo> tracks = new HashMap<Integer, TvTrackInfo>();
// Add subtitle tracks from the real media.
@@ -363,24 +367,33 @@ abstract public class BaseTvInputService extends TvInputService {
for (i = 0; i < infos.length; ++i) {
if (infos[i].getTrackType() == TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT
|| infos[i].getTrackType() == TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE) {
- tracks.put(i, new TvTrackInfo.Builder(TvTrackInfo.VALUE_TYPE_SUBTITLE,
- infos[i].getLanguage(), false)
- .putString(TvTrackInfo.KEY_TAG, Integer.toString(i))
+ Bundle extra = new Bundle();
+ extra.putInt(KEY_TRACK_ID, i);
+ tracks.put(i, new TvTrackInfo.Builder(TvTrackInfo.TYPE_SUBTITLE)
+ .setLanguage("und".equals(infos[i].getLanguage()) ? null
+ : infos[i].getLanguage())
+ .setExtra(extra)
.build());
}
Log.d(TAG, "tracks " + i + " " + infos[i].getTrackType() + " "
+ infos[i].getLanguage());
}
// Add predefine video and audio track.
- tracks.put(i, new TvTrackInfo.Builder(TvTrackInfo.VALUE_TYPE_VIDEO, "und", true)
- .putInt(TvTrackInfo.KEY_WIDTH, channel.mVideoWidth)
- .putInt(TvTrackInfo.KEY_HEIGHT, channel.mVideoHeight)
- .putString(TvTrackInfo.KEY_TAG, Integer.toString(i++))
+ Bundle extra = new Bundle();
+ extra.putInt(KEY_TRACK_ID, i++);
+ tracks.put(i, new TvTrackInfo.Builder(TvTrackInfo.TYPE_VIDEO)
+ .setVideoWidth(channel.mVideoWidth)
+ .setVideoHeight(channel.mVideoHeight)
+ .setExtra(extra)
.build());
- tracks.put(i, new TvTrackInfo.Builder(TvTrackInfo.VALUE_TYPE_AUDIO, "und", true)
- .putInt(TvTrackInfo.KEY_CHANNEL_COUNT, channel.mAudioChannel)
- .putString(TvTrackInfo.KEY_TAG, Integer.toString(i++))
+ mSelectedVideoTrack = i;
+ extra = new Bundle();
+ extra.putInt(KEY_TRACK_ID, i++);
+ tracks.put(i, new TvTrackInfo.Builder(TvTrackInfo.TYPE_AUDIO)
+ .setAudioChannelCount(channel.mAudioChannel)
+ .setExtra(extra)
.build());
+ mSelectedAudioTrack = i;
mTracks = tracks;
}
diff --git a/src/com/android/tv/TvActivity.java b/src/com/android/tv/TvActivity.java
index c4ee5333..0e0c6b28 100644
--- a/src/com/android/tv/TvActivity.java
+++ b/src/com/android/tv/TvActivity.java
@@ -1201,9 +1201,8 @@ public class TvActivity extends Activity implements AudioManager.OnAudioFocusCha
// selection.
List<TvTrackInfo> tracks = mTvView.getTracks();
for (TvTrackInfo track : tracks) {
- Log.d(TAG, "lang - " + track.getString(TvTrackInfo.KEY_LANGUAGE));
- if (track.getInt(TvTrackInfo.KEY_TYPE) == TvTrackInfo.VALUE_TYPE_SUBTITLE
- && !track.getBoolean(TvTrackInfo.KEY_IS_SELECTED)) {
+ Log.d(TAG, "lang - " + track.getLanguage());
+ if (track.getType() == TvTrackInfo.TYPE_SUBTITLE) {
Log.d(TAG, "selectTrack " + track);
mTvView.selectTrack(track);
break;
diff --git a/src/com/android/tv/ui/TunableTvView.java b/src/com/android/tv/ui/TunableTvView.java
index 008d1055..90e73122 100644
--- a/src/com/android/tv/ui/TunableTvView.java
+++ b/src/com/android/tv/ui/TunableTvView.java
@@ -115,17 +115,24 @@ public class TunableTvView extends FrameLayout implements StreamInfo {
@Override
public void onTrackInfoChanged(String inputId, List<TvTrackInfo> tracks) {
- for (TvTrackInfo track : tracks) {
- int type = track.getInt(TvTrackInfo.KEY_TYPE);
- boolean selected = track.getBoolean(TvTrackInfo.KEY_IS_SELECTED);
- if (type == TvTrackInfo.VALUE_TYPE_VIDEO && selected) {
- mVideoWidth = track.getInt(TvTrackInfo.KEY_WIDTH);
- mVideoHeight = track.getInt(TvTrackInfo.KEY_HEIGHT);
+ if (mOnTuneListener != null) {
+ mOnTuneListener.onStreamInfoChanged(TunableTvView.this);
+ }
+ }
+
+ @Override
+ public void onTrackSelectionChanged(String inputId,
+ List<TvTrackInfo> selectedTracks) {
+ for (TvTrackInfo track : selectedTracks) {
+ int type = track.getType();
+ if (type == TvTrackInfo.TYPE_VIDEO) {
+ mVideoWidth = track.getVideoWidth();
+ mVideoHeight = track.getVideoHeight();
mVideoFormat = Utils.getVideoDefinitionLevelFromSize(
mVideoWidth, mVideoHeight);
- } else if (type == TvTrackInfo.VALUE_TYPE_AUDIO && selected) {
- mAudioChannelCount = track.getInt(TvTrackInfo.KEY_CHANNEL_COUNT);
- } else if (type == TvTrackInfo.VALUE_TYPE_SUBTITLE) {
+ } else if (type == TvTrackInfo.TYPE_AUDIO) {
+ mAudioChannelCount = track.getAudioChannelCount();
+ } else if (type == TvTrackInfo.TYPE_SUBTITLE) {
mHasClosedCaption = true;
}
}