diff options
author | Dongwon Kang <dwkang@google.com> | 2014-07-25 11:41:02 +0900 |
---|---|---|
committer | Dongwon Kang <dwkang@google.com> | 2014-07-31 16:16:00 +0900 |
commit | 512017945a2cd192797d7ca404cba08d792877dd (patch) | |
tree | 16d41fd7396dc424e5f984afb25c563063249a8b | |
parent | 3ee2db7cb32377781c8657907921540e1517aa8f (diff) | |
download | TV-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.java | 87 | ||||
-rw-r--r-- | src/com/android/tv/TvActivity.java | 5 | ||||
-rw-r--r-- | src/com/android/tv/ui/TunableTvView.java | 25 |
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; } } |