aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDongwon Kang <dwkang@google.com>2014-08-06 17:34:06 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-08-06 17:34:06 +0000
commit24cd5649bf368678db9a64dab8adbf75f7f5e37e (patch)
tree0ef7a9f9e81cbe7d9fce582a7a996c47bd06f5ea
parentcc990ea15943b9f448c863c185b811f43850dbea (diff)
parentec9bd88036279df7421321b2e9945adf8f89db4b (diff)
downloadTV-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.java93
-rw-r--r--src/com/android/tv/TvActivity.java13
-rw-r--r--src/com/android/tv/ui/TunableTvView.java57
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) {