diff options
author | Dongwon Kang <dwkang@google.com> | 2014-08-06 17:34:06 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-08-06 17:34:06 +0000 |
commit | 24cd5649bf368678db9a64dab8adbf75f7f5e37e (patch) | |
tree | 0ef7a9f9e81cbe7d9fce582a7a996c47bd06f5ea | |
parent | cc990ea15943b9f448c863c185b811f43850dbea (diff) | |
parent | ec9bd88036279df7421321b2e9945adf8f89db4b (diff) | |
download | TV-24cd5649bf368678db9a64dab8adbf75f7f5e37e.tar.gz |
am ec9bd880: Applying framework change for making selected tracks identifiable in TV and sample app.
* commit 'ec9bd88036279df7421321b2e9945adf8f89db4b':
Applying framework change for making selected tracks identifiable in TV and sample app.
-rw-r--r-- | sample/src/com/example/sampletvinput/BaseTvInputService.java | 93 | ||||
-rw-r--r-- | src/com/android/tv/TvActivity.java | 13 | ||||
-rw-r--r-- | src/com/android/tv/ui/TunableTvView.java | 57 |
3 files changed, 78 insertions, 85 deletions
diff --git a/sample/src/com/example/sampletvinput/BaseTvInputService.java b/sample/src/com/example/sampletvinput/BaseTvInputService.java index 5453bd43..14711749 100644 --- a/sample/src/com/example/sampletvinput/BaseTvInputService.java +++ b/sample/src/com/example/sampletvinput/BaseTvInputService.java @@ -26,12 +26,10 @@ import android.media.MediaPlayer.TrackInfo; import android.media.tv.TvContentRating; import android.media.tv.TvContract; import android.media.tv.TvContract.Programs; -import android.media.tv.TvInputInfo; 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; @@ -48,12 +46,11 @@ 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 String mSelectedAudioTrack; + private String mSelectedVideoTrack; + private String mSelectedSubtitleTrack; private final Handler mHandler = new Handler(); protected List<ChannelInfo> mChannels; @@ -151,7 +148,7 @@ abstract public class BaseTvInputService extends TvInputService { private MediaPlayer mPlayer; private float mVolume; private boolean mMute; - private Map<Integer, TvTrackInfo> mTracks; + private Map<String, TvTrackInfo> mTracks; protected BaseTvInputSessionImpl() { @@ -257,8 +254,6 @@ abstract public class BaseTvInputService extends TvInputService { } MediaPlayer.TrackInfo[] tracks = mPlayer.getTrackInfo(); setupTrackInfo(tracks, channel); - notifyTrackInfoChanged(new ArrayList<TvTrackInfo>(mTracks.values())); - notifySelectedTracks(); notifyVideoAvailable(); try { mPlayer.start(); @@ -327,87 +322,63 @@ abstract public class BaseTvInputService extends TvInputService { } @Override - public boolean onSelectTrack(TvTrackInfo track) { - Log.d(TAG, "onSelectTrack(" + track.getExtra().getInt(KEY_TRACK_ID) + ")"); + public boolean onSelectTrack(int type, String trackId) { + Log.d(TAG, "onSelectTrack(" + type + " ," + trackId + ")"); if (mPlayer != null) { - if (track.getType() == TvTrackInfo.TYPE_SUBTITLE) { + if (type == TvTrackInfo.TYPE_SUBTITLE) { // SelectTrack only works on subtitle tracks. - mPlayer.selectTrack(track.getExtra().getInt(KEY_TRACK_ID)); - - // Mark this track is selected. - int id = track.getExtra().getInt(KEY_TRACK_ID); - mSelectedSubtitleTrack = id; - notifySelectedTracks(); - return true; - } - } - return false; - } - - @Override - public boolean onUnselectTrack(TvTrackInfo track) { - if (mPlayer != null) { - if (track.getType() == TvTrackInfo.TYPE_SUBTITLE) { - // UnselectTrack only works on subtitle tracks. - mPlayer.deselectTrack(track.getExtra().getInt(KEY_TRACK_ID)); - mSelectedSubtitleTrack = -1; - notifySelectedTracks(); + if (trackId == null) { + if (mSelectedSubtitleTrack != null) { + mPlayer.deselectTrack(Integer.parseInt(mSelectedSubtitleTrack)); + } + } else { + TvTrackInfo track = mTracks.get(trackId); + if (track == null) { + return false; + } + mPlayer.selectTrack(Integer.parseInt(trackId)); + mSelectedSubtitleTrack = trackId; + } + notifyTrackSelected(TvTrackInfo.TYPE_SUBTITLE, trackId); 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>(); + Map<String, TvTrackInfo> tracks = new HashMap<String, TvTrackInfo>(); // Add subtitle tracks from the real media. int i; for (i = 0; i < infos.length; ++i) { if (infos[i].getTrackType() == TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT || infos[i].getTrackType() == TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE) { - Bundle extra = new Bundle(); - extra.putInt(KEY_TRACK_ID, i); - tracks.put(i, new TvTrackInfo.Builder(TvTrackInfo.TYPE_SUBTITLE) + tracks.put(Integer.toString(i), new TvTrackInfo.Builder( + TvTrackInfo.TYPE_SUBTITLE, Integer.toString(i)) .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. - Bundle extra = new Bundle(); - extra.putInt(KEY_TRACK_ID, i++); - tracks.put(i, new TvTrackInfo.Builder(TvTrackInfo.TYPE_VIDEO) + mSelectedVideoTrack = Integer.toString(i++); + tracks.put(mSelectedVideoTrack, new TvTrackInfo.Builder( + TvTrackInfo.TYPE_VIDEO, mSelectedVideoTrack) .setVideoWidth(channel.mVideoWidth) .setVideoHeight(channel.mVideoHeight) - .setExtra(extra) .build()); - mSelectedVideoTrack = i; - extra = new Bundle(); - extra.putInt(KEY_TRACK_ID, i++); - tracks.put(i, new TvTrackInfo.Builder(TvTrackInfo.TYPE_AUDIO) + mSelectedAudioTrack = Integer.toString(i++); + tracks.put(mSelectedAudioTrack, new TvTrackInfo.Builder(TvTrackInfo.TYPE_AUDIO, + mSelectedAudioTrack) .setAudioChannelCount(channel.mAudioChannel) - .setExtra(extra) .build()); - mSelectedAudioTrack = i; mTracks = tracks; + notifyTracksChanged(new ArrayList<TvTrackInfo>(mTracks.values())); + notifyTrackSelected(TvTrackInfo.TYPE_VIDEO, mSelectedVideoTrack); + notifyTrackSelected(TvTrackInfo.TYPE_AUDIO, mSelectedAudioTrack); } private class AddProgramRunnable implements Runnable { diff --git a/src/com/android/tv/TvActivity.java b/src/com/android/tv/TvActivity.java index 770ad0b8..e5127afc 100644 --- a/src/com/android/tv/TvActivity.java +++ b/src/com/android/tv/TvActivity.java @@ -1228,14 +1228,11 @@ public class TvActivity extends Activity implements AudioManager.OnAudioFocusCha // For now, we just select the first subtitle track. // TODO: show audio/subtitle language options to user and handle the user's // selection. - List<TvTrackInfo> tracks = mTvView.getTracks(); - for (TvTrackInfo track : tracks) { - Log.d(TAG, "lang - " + track.getLanguage()); - if (track.getType() == TvTrackInfo.TYPE_SUBTITLE) { - Log.d(TAG, "selectTrack " + track); - mTvView.selectTrack(track); - break; - } + List<TvTrackInfo> tracks = mTvView.getTracks(TvTrackInfo.TYPE_SUBTITLE); + if (!tracks.isEmpty()) { + Log.d(TAG, "lang - " + tracks.get(0).getLanguage()); + Log.d(TAG, "selectTrack " + tracks.get(0)); + mTvView.selectTrack(TvTrackInfo.TYPE_SUBTITLE, tracks.get(0).getId()); } return true; } diff --git a/src/com/android/tv/ui/TunableTvView.java b/src/com/android/tv/ui/TunableTvView.java index b0db3a1d..141a340c 100644 --- a/src/com/android/tv/ui/TunableTvView.java +++ b/src/com/android/tv/ui/TunableTvView.java @@ -95,26 +95,51 @@ public class TunableTvView extends FrameLayout implements StreamInfo { } @Override - public void onTrackInfoChanged(String inputId, List<TvTrackInfo> tracks) { + public void onTracksChanged(String inputId, List<TvTrackInfo> tracks) { + mHasClosedCaption = false; + for (TvTrackInfo track : tracks) { + if (track.getType() == TvTrackInfo.TYPE_SUBTITLE) { + mHasClosedCaption = true; + break; + } + } if (mOnTuneListener != null) { mOnTuneListener.onStreamInfoChanged(TunableTvView.this); } } @Override - public void onTrackSelectionChanged(String inputId, - List<TvTrackInfo> selectedTracks) { - for (TvTrackInfo track : selectedTracks) { - int type = track.getType(); + public void onTrackSelected(String inputId, int type, String trackId) { + if (trackId == null) { + // A track is unselected. if (type == TvTrackInfo.TYPE_VIDEO) { - mVideoWidth = track.getVideoWidth(); - mVideoHeight = track.getVideoHeight(); - mVideoFormat = Utils.getVideoDefinitionLevelFromSize( - mVideoWidth, mVideoHeight); + mVideoWidth = 0; + mVideoHeight = 0; + mVideoFormat = StreamInfo.VIDEO_DEFINITION_LEVEL_UNKNOWN; } else if (type == TvTrackInfo.TYPE_AUDIO) { - mAudioChannelCount = track.getAudioChannelCount(); - } else if (type == TvTrackInfo.TYPE_SUBTITLE) { - mHasClosedCaption = true; + mAudioChannelCount = StreamInfo.AUDIO_CHANNEL_COUNT_UNKNOWN; + } + } else { + List<TvTrackInfo> tracks = getTracks(type); + boolean trackFound = false; + if (tracks != null) { + for (TvTrackInfo track : getTracks(type)) { + if (track.getId().equals(trackId)) { + if (type == TvTrackInfo.TYPE_VIDEO) { + mVideoWidth = track.getVideoWidth(); + mVideoHeight = track.getVideoHeight(); + mVideoFormat = Utils.getVideoDefinitionLevelFromSize( + mVideoWidth, mVideoHeight); + } else if (type == TvTrackInfo.TYPE_AUDIO) { + mAudioChannelCount = track.getAudioChannelCount(); + } + trackFound = true; + break; + } + } + } + if (!trackFound) { + Log.w(TAG, "Invalid track ID: " + trackId); } } if (mOnTuneListener != null) { @@ -316,12 +341,12 @@ public class TunableTvView extends FrameLayout implements StreamInfo { mTvView.setOnUnhandledInputEventListener(listener); } - public List<TvTrackInfo> getTracks() { - return mTvView.getTracks(); + public List<TvTrackInfo> getTracks(int type) { + return mTvView.getTracks(type); } - public void selectTrack(TvTrackInfo track) { - mTvView.selectTrack(track); + public void selectTrack(int type, String trackId) { + mTvView.selectTrack(type, trackId); } private void block(int reason) { |