am 39b15017: am f98fe42f: Merge "TIF: Notify of size change of the video in TvView" into lmp-mr1-dev
* commit '39b150173ae3a2b6950553450648d5bb223542e3': TIF: Notify of size change of the video in TvView
This commit is contained in:
@@ -159,12 +159,12 @@ public final class TvInputManager {
|
|||||||
|
|
||||||
private final Object mLock = new Object();
|
private final Object mLock = new Object();
|
||||||
|
|
||||||
// @GuardedBy(mLock)
|
// @GuardedBy("mLock")
|
||||||
private final List<TvInputCallbackRecord> mCallbackRecords =
|
private final List<TvInputCallbackRecord> mCallbackRecords =
|
||||||
new LinkedList<TvInputCallbackRecord>();
|
new LinkedList<TvInputCallbackRecord>();
|
||||||
|
|
||||||
// A mapping from TV input ID to the state of corresponding input.
|
// A mapping from TV input ID to the state of corresponding input.
|
||||||
// @GuardedBy(mLock)
|
// @GuardedBy("mLock")
|
||||||
private final Map<String, Integer> mStateMap = new ArrayMap<String, Integer>();
|
private final Map<String, Integer> mStateMap = new ArrayMap<String, Integer>();
|
||||||
|
|
||||||
// A mapping from the sequence number of a session to its SessionCallbackRecord.
|
// A mapping from the sequence number of a session to its SessionCallbackRecord.
|
||||||
@@ -207,7 +207,7 @@ public final class TvInputManager {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* This is called when the channel of this session is changed by the underlying TV input
|
* This is called when the channel of this session is changed by the underlying TV input
|
||||||
* with out any {@link TvInputManager.Session#tune(Uri)} request.
|
* without any {@link TvInputManager.Session#tune(Uri)} request.
|
||||||
*
|
*
|
||||||
* @param session A {@link TvInputManager.Session} associated with this callback.
|
* @param session A {@link TvInputManager.Session} associated with this callback.
|
||||||
* @param channelUri The URI of a channel.
|
* @param channelUri The URI of a channel.
|
||||||
@@ -227,7 +227,7 @@ public final class TvInputManager {
|
|||||||
/**
|
/**
|
||||||
* This is called when a track for a given type is selected.
|
* This is called when a track for a given type is selected.
|
||||||
*
|
*
|
||||||
* @param session A {@link TvInputManager.Session} associated with this callback
|
* @param session A {@link TvInputManager.Session} associated with this callback.
|
||||||
* @param type The type of the selected track. The type can be
|
* @param type The type of the selected track. The type can be
|
||||||
* {@link TvTrackInfo#TYPE_AUDIO}, {@link TvTrackInfo#TYPE_VIDEO} or
|
* {@link TvTrackInfo#TYPE_AUDIO}, {@link TvTrackInfo#TYPE_VIDEO} or
|
||||||
* {@link TvTrackInfo#TYPE_SUBTITLE}.
|
* {@link TvTrackInfo#TYPE_SUBTITLE}.
|
||||||
@@ -237,6 +237,18 @@ public final class TvInputManager {
|
|||||||
public void onTrackSelected(Session session, int type, String trackId) {
|
public void onTrackSelected(Session session, int type, String trackId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is invoked when the video size has been changed. It is also called when the first
|
||||||
|
* time video size information becomes available after the session is tuned to a specific
|
||||||
|
* channel.
|
||||||
|
*
|
||||||
|
* @param session A {@link TvInputManager.Session} associated with this callback.
|
||||||
|
* @param width The width of the video.
|
||||||
|
* @param height The height of the video.
|
||||||
|
*/
|
||||||
|
public void onVideoSizeChanged(Session session, int width, int height) {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is called when the video is available, so the TV input starts the playback.
|
* This is called when the video is available, so the TV input starts the playback.
|
||||||
*
|
*
|
||||||
@@ -312,13 +324,13 @@ public final class TvInputManager {
|
|||||||
private final Handler mHandler;
|
private final Handler mHandler;
|
||||||
private Session mSession;
|
private Session mSession;
|
||||||
|
|
||||||
public SessionCallbackRecord(SessionCallback sessionCallback,
|
SessionCallbackRecord(SessionCallback sessionCallback,
|
||||||
Handler handler) {
|
Handler handler) {
|
||||||
mSessionCallback = sessionCallback;
|
mSessionCallback = sessionCallback;
|
||||||
mHandler = handler;
|
mHandler = handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void postSessionCreated(final Session session) {
|
void postSessionCreated(final Session session) {
|
||||||
mSession = session;
|
mSession = session;
|
||||||
mHandler.post(new Runnable() {
|
mHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
@@ -328,7 +340,7 @@ public final class TvInputManager {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void postSessionReleased() {
|
void postSessionReleased() {
|
||||||
mHandler.post(new Runnable() {
|
mHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@@ -337,7 +349,7 @@ public final class TvInputManager {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void postChannelRetuned(final Uri channelUri) {
|
void postChannelRetuned(final Uri channelUri) {
|
||||||
mHandler.post(new Runnable() {
|
mHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@@ -346,49 +358,34 @@ public final class TvInputManager {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void postTracksChanged(final List<TvTrackInfo> tracks) {
|
void postTracksChanged(final List<TvTrackInfo> tracks) {
|
||||||
mHandler.post(new Runnable() {
|
mHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
mSession.mAudioTracks.clear();
|
|
||||||
mSession.mVideoTracks.clear();
|
|
||||||
mSession.mSubtitleTracks.clear();
|
|
||||||
for (TvTrackInfo track : tracks) {
|
|
||||||
if (track.getType() == TvTrackInfo.TYPE_AUDIO) {
|
|
||||||
mSession.mAudioTracks.add(track);
|
|
||||||
} else if (track.getType() == TvTrackInfo.TYPE_VIDEO) {
|
|
||||||
mSession.mVideoTracks.add(track);
|
|
||||||
} else if (track.getType() == TvTrackInfo.TYPE_SUBTITLE) {
|
|
||||||
mSession.mSubtitleTracks.add(track);
|
|
||||||
} else {
|
|
||||||
// Silently ignore.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mSessionCallback.onTracksChanged(mSession, tracks);
|
mSessionCallback.onTracksChanged(mSession, tracks);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void postTrackSelected(final int type, final String trackId) {
|
void postTrackSelected(final int type, final String trackId) {
|
||||||
mHandler.post(new Runnable() {
|
mHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (type == TvTrackInfo.TYPE_AUDIO) {
|
|
||||||
mSession.mSelectedAudioTrackId = trackId;
|
|
||||||
} else if (type == TvTrackInfo.TYPE_VIDEO) {
|
|
||||||
mSession.mSelectedVideoTrackId = trackId;
|
|
||||||
} else if (type == TvTrackInfo.TYPE_SUBTITLE) {
|
|
||||||
mSession.mSelectedSubtitleTrackId = trackId;
|
|
||||||
} else {
|
|
||||||
// Silently ignore.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
mSessionCallback.onTrackSelected(mSession, type, trackId);
|
mSessionCallback.onTrackSelected(mSession, type, trackId);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void postVideoAvailable() {
|
void postVideoSizeChanged(final int width, final int height) {
|
||||||
|
mHandler.post(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
mSessionCallback.onVideoSizeChanged(mSession, width, height);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void postVideoAvailable() {
|
||||||
mHandler.post(new Runnable() {
|
mHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@@ -397,7 +394,7 @@ public final class TvInputManager {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void postVideoUnavailable(final int reason) {
|
void postVideoUnavailable(final int reason) {
|
||||||
mHandler.post(new Runnable() {
|
mHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@@ -406,7 +403,7 @@ public final class TvInputManager {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void postContentAllowed() {
|
void postContentAllowed() {
|
||||||
mHandler.post(new Runnable() {
|
mHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@@ -415,7 +412,7 @@ public final class TvInputManager {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void postContentBlocked(final TvContentRating rating) {
|
void postContentBlocked(final TvContentRating rating) {
|
||||||
mHandler.post(new Runnable() {
|
mHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@@ -424,7 +421,7 @@ public final class TvInputManager {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void postLayoutSurface(final int left, final int top, final int right,
|
void postLayoutSurface(final int left, final int top, final int right,
|
||||||
final int bottom) {
|
final int bottom) {
|
||||||
mHandler.post(new Runnable() {
|
mHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
@@ -434,7 +431,7 @@ public final class TvInputManager {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void postSessionEvent(final String eventType, final Bundle eventArgs) {
|
void postSessionEvent(final String eventType, final Bundle eventArgs) {
|
||||||
mHandler.post(new Runnable() {
|
mHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@@ -610,7 +607,10 @@ public final class TvInputManager {
|
|||||||
Log.e(TAG, "Callback not found for seq " + seq);
|
Log.e(TAG, "Callback not found for seq " + seq);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
record.postTracksChanged(tracks);
|
if (record.mSession.updateTracks(tracks)) {
|
||||||
|
record.postTracksChanged(tracks);
|
||||||
|
postVideoSizeChangedIfNeededLocked(record);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -622,7 +622,17 @@ public final class TvInputManager {
|
|||||||
Log.e(TAG, "Callback not found for seq " + seq);
|
Log.e(TAG, "Callback not found for seq " + seq);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
record.postTrackSelected(type, trackId);
|
if (record.mSession.updateTrackSelection(type, trackId)) {
|
||||||
|
record.postTrackSelected(type, trackId);
|
||||||
|
postVideoSizeChangedIfNeededLocked(record);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void postVideoSizeChangedIfNeededLocked(SessionCallbackRecord record) {
|
||||||
|
TvTrackInfo track = record.mSession.getVideoTrackToNotify();
|
||||||
|
if (track != null) {
|
||||||
|
record.postVideoSizeChanged(track.getVideoWidth(), track.getVideoHeight());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -778,7 +788,7 @@ public final class TvInputManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the state of a given TV input. It retuns one of the following:
|
* Returns the state of a given TV input. It returns one of the following:
|
||||||
* <ul>
|
* <ul>
|
||||||
* <li>{@link #INPUT_STATE_CONNECTED}
|
* <li>{@link #INPUT_STATE_CONNECTED}
|
||||||
* <li>{@link #INPUT_STATE_CONNECTED_STANDBY}
|
* <li>{@link #INPUT_STATE_CONNECTED_STANDBY}
|
||||||
@@ -1133,12 +1143,24 @@ public final class TvInputManager {
|
|||||||
private IBinder mToken;
|
private IBinder mToken;
|
||||||
private TvInputEventSender mSender;
|
private TvInputEventSender mSender;
|
||||||
private InputChannel mChannel;
|
private InputChannel mChannel;
|
||||||
|
|
||||||
|
private final Object mTrackLock = new Object();
|
||||||
|
// @GuardedBy("mTrackLock")
|
||||||
private final List<TvTrackInfo> mAudioTracks = new ArrayList<TvTrackInfo>();
|
private final List<TvTrackInfo> mAudioTracks = new ArrayList<TvTrackInfo>();
|
||||||
|
// @GuardedBy("mTrackLock")
|
||||||
private final List<TvTrackInfo> mVideoTracks = new ArrayList<TvTrackInfo>();
|
private final List<TvTrackInfo> mVideoTracks = new ArrayList<TvTrackInfo>();
|
||||||
|
// @GuardedBy("mTrackLock")
|
||||||
private final List<TvTrackInfo> mSubtitleTracks = new ArrayList<TvTrackInfo>();
|
private final List<TvTrackInfo> mSubtitleTracks = new ArrayList<TvTrackInfo>();
|
||||||
|
// @GuardedBy("mTrackLock")
|
||||||
private String mSelectedAudioTrackId;
|
private String mSelectedAudioTrackId;
|
||||||
|
// @GuardedBy("mTrackLock")
|
||||||
private String mSelectedVideoTrackId;
|
private String mSelectedVideoTrackId;
|
||||||
|
// @GuardedBy("mTrackLock")
|
||||||
private String mSelectedSubtitleTrackId;
|
private String mSelectedSubtitleTrackId;
|
||||||
|
// @GuardedBy("mTrackLock")
|
||||||
|
private int mVideoWidth;
|
||||||
|
// @GuardedBy("mTrackLock")
|
||||||
|
private int mVideoHeight;
|
||||||
|
|
||||||
private Session(IBinder token, InputChannel channel, ITvInputManager service, int userId,
|
private Session(IBinder token, InputChannel channel, ITvInputManager service, int userId,
|
||||||
int seq, SparseArray<SessionCallbackRecord> sessionCallbackRecordMap) {
|
int seq, SparseArray<SessionCallbackRecord> sessionCallbackRecordMap) {
|
||||||
@@ -1273,12 +1295,16 @@ public final class TvInputManager {
|
|||||||
Log.w(TAG, "The session has been already released");
|
Log.w(TAG, "The session has been already released");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mAudioTracks.clear();
|
synchronized (mTrackLock) {
|
||||||
mVideoTracks.clear();
|
mAudioTracks.clear();
|
||||||
mSubtitleTracks.clear();
|
mVideoTracks.clear();
|
||||||
mSelectedAudioTrackId = null;
|
mSubtitleTracks.clear();
|
||||||
mSelectedVideoTrackId = null;
|
mSelectedAudioTrackId = null;
|
||||||
mSelectedSubtitleTrackId = null;
|
mSelectedVideoTrackId = null;
|
||||||
|
mSelectedSubtitleTrackId = null;
|
||||||
|
mVideoWidth = 0;
|
||||||
|
mVideoHeight = 0;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
mService.tune(mToken, channelUri, params, mUserId);
|
mService.tune(mToken, channelUri, params, mUserId);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
@@ -1314,23 +1340,25 @@ public final class TvInputManager {
|
|||||||
* @see #getTracks
|
* @see #getTracks
|
||||||
*/
|
*/
|
||||||
public void selectTrack(int type, String trackId) {
|
public void selectTrack(int type, String trackId) {
|
||||||
if (type == TvTrackInfo.TYPE_AUDIO) {
|
synchronized (mTrackLock) {
|
||||||
if (trackId != null && !containsTrack(mAudioTracks, trackId)) {
|
if (type == TvTrackInfo.TYPE_AUDIO) {
|
||||||
Log.w(TAG, "Invalid audio trackId: " + trackId);
|
if (trackId != null && !containsTrack(mAudioTracks, trackId)) {
|
||||||
return;
|
Log.w(TAG, "Invalid audio trackId: " + trackId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (type == TvTrackInfo.TYPE_VIDEO) {
|
||||||
|
if (trackId != null && !containsTrack(mVideoTracks, trackId)) {
|
||||||
|
Log.w(TAG, "Invalid video trackId: " + trackId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (type == TvTrackInfo.TYPE_SUBTITLE) {
|
||||||
|
if (trackId != null && !containsTrack(mSubtitleTracks, trackId)) {
|
||||||
|
Log.w(TAG, "Invalid subtitle trackId: " + trackId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("invalid type: " + type);
|
||||||
}
|
}
|
||||||
} else if (type == TvTrackInfo.TYPE_VIDEO) {
|
|
||||||
if (trackId != null && !containsTrack(mVideoTracks, trackId)) {
|
|
||||||
Log.w(TAG, "Invalid video trackId: " + trackId);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else if (type == TvTrackInfo.TYPE_SUBTITLE) {
|
|
||||||
if (trackId != null && !containsTrack(mSubtitleTracks, trackId)) {
|
|
||||||
Log.w(TAG, "Invalid subtitle trackId: " + trackId);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new IllegalArgumentException("invalid type: " + type);
|
|
||||||
}
|
}
|
||||||
if (mToken == null) {
|
if (mToken == null) {
|
||||||
Log.w(TAG, "The session has been already released");
|
Log.w(TAG, "The session has been already released");
|
||||||
@@ -1361,21 +1389,23 @@ public final class TvInputManager {
|
|||||||
* @return the list of tracks for the given type.
|
* @return the list of tracks for the given type.
|
||||||
*/
|
*/
|
||||||
public List<TvTrackInfo> getTracks(int type) {
|
public List<TvTrackInfo> getTracks(int type) {
|
||||||
if (type == TvTrackInfo.TYPE_AUDIO) {
|
synchronized (mTrackLock) {
|
||||||
if (mAudioTracks == null) {
|
if (type == TvTrackInfo.TYPE_AUDIO) {
|
||||||
return null;
|
if (mAudioTracks == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new ArrayList<TvTrackInfo>(mAudioTracks);
|
||||||
|
} else if (type == TvTrackInfo.TYPE_VIDEO) {
|
||||||
|
if (mVideoTracks == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new ArrayList<TvTrackInfo>(mVideoTracks);
|
||||||
|
} else if (type == TvTrackInfo.TYPE_SUBTITLE) {
|
||||||
|
if (mSubtitleTracks == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new ArrayList<TvTrackInfo>(mSubtitleTracks);
|
||||||
}
|
}
|
||||||
return mAudioTracks;
|
|
||||||
} else if (type == TvTrackInfo.TYPE_VIDEO) {
|
|
||||||
if (mVideoTracks == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return mVideoTracks;
|
|
||||||
} else if (type == TvTrackInfo.TYPE_SUBTITLE) {
|
|
||||||
if (mSubtitleTracks == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return mSubtitleTracks;
|
|
||||||
}
|
}
|
||||||
throw new IllegalArgumentException("invalid type: " + type);
|
throw new IllegalArgumentException("invalid type: " + type);
|
||||||
}
|
}
|
||||||
@@ -1388,16 +1418,88 @@ public final class TvInputManager {
|
|||||||
* @see #selectTrack
|
* @see #selectTrack
|
||||||
*/
|
*/
|
||||||
public String getSelectedTrack(int type) {
|
public String getSelectedTrack(int type) {
|
||||||
if (type == TvTrackInfo.TYPE_AUDIO) {
|
synchronized (mTrackLock) {
|
||||||
return mSelectedAudioTrackId;
|
if (type == TvTrackInfo.TYPE_AUDIO) {
|
||||||
} else if (type == TvTrackInfo.TYPE_VIDEO) {
|
return mSelectedAudioTrackId;
|
||||||
return mSelectedVideoTrackId;
|
} else if (type == TvTrackInfo.TYPE_VIDEO) {
|
||||||
} else if (type == TvTrackInfo.TYPE_SUBTITLE) {
|
return mSelectedVideoTrackId;
|
||||||
return mSelectedSubtitleTrackId;
|
} else if (type == TvTrackInfo.TYPE_SUBTITLE) {
|
||||||
|
return mSelectedSubtitleTrackId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
throw new IllegalArgumentException("invalid type: " + type);
|
throw new IllegalArgumentException("invalid type: " + type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Responds to onTracksChanged() and updates the internal track information. Returns true if
|
||||||
|
* there is an update.
|
||||||
|
*/
|
||||||
|
boolean updateTracks(List<TvTrackInfo> tracks) {
|
||||||
|
synchronized (mTrackLock) {
|
||||||
|
mAudioTracks.clear();
|
||||||
|
mVideoTracks.clear();
|
||||||
|
mSubtitleTracks.clear();
|
||||||
|
for (TvTrackInfo track : tracks) {
|
||||||
|
if (track.getType() == TvTrackInfo.TYPE_AUDIO) {
|
||||||
|
mAudioTracks.add(track);
|
||||||
|
} else if (track.getType() == TvTrackInfo.TYPE_VIDEO) {
|
||||||
|
mVideoTracks.add(track);
|
||||||
|
} else if (track.getType() == TvTrackInfo.TYPE_SUBTITLE) {
|
||||||
|
mSubtitleTracks.add(track);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return !mAudioTracks.isEmpty() || !mVideoTracks.isEmpty()
|
||||||
|
|| !mSubtitleTracks.isEmpty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Responds to onTrackSelected() and updates the internal track selection information.
|
||||||
|
* Returns true if there is an update.
|
||||||
|
*/
|
||||||
|
boolean updateTrackSelection(int type, String trackId) {
|
||||||
|
synchronized (mTrackLock) {
|
||||||
|
if (type == TvTrackInfo.TYPE_AUDIO && trackId != mSelectedAudioTrackId) {
|
||||||
|
mSelectedAudioTrackId = trackId;
|
||||||
|
return true;
|
||||||
|
} else if (type == TvTrackInfo.TYPE_VIDEO && trackId != mSelectedVideoTrackId) {
|
||||||
|
mSelectedVideoTrackId = trackId;
|
||||||
|
return true;
|
||||||
|
} else if (type == TvTrackInfo.TYPE_SUBTITLE
|
||||||
|
&& trackId != mSelectedSubtitleTrackId) {
|
||||||
|
mSelectedSubtitleTrackId = trackId;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the new/updated video track that contains new video size information. Returns
|
||||||
|
* null if there is no video track to notify. Subsequent calls of this method results in a
|
||||||
|
* non-null video track returned only by the first call and null returned by following
|
||||||
|
* calls. The caller should immediately notify of the video size change upon receiving the
|
||||||
|
* track.
|
||||||
|
*/
|
||||||
|
TvTrackInfo getVideoTrackToNotify() {
|
||||||
|
synchronized (mTrackLock) {
|
||||||
|
if (!mVideoTracks.isEmpty() && mSelectedVideoTrackId != null) {
|
||||||
|
for (TvTrackInfo track : mVideoTracks) {
|
||||||
|
if (track.getId().equals(mSelectedVideoTrackId)) {
|
||||||
|
int videoWidth = track.getVideoWidth();
|
||||||
|
int videoHeight = track.getVideoHeight();
|
||||||
|
if (mVideoWidth != videoWidth || mVideoHeight != videoHeight) {
|
||||||
|
mVideoWidth = videoWidth;
|
||||||
|
mVideoHeight = videoHeight;
|
||||||
|
return track;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calls {@link TvInputService.Session#appPrivateCommand(String, Bundle)
|
* Calls {@link TvInputService.Session#appPrivateCommand(String, Bundle)
|
||||||
* TvInputService.Session.appPrivateCommand()} on the current TvView.
|
* TvInputService.Session.appPrivateCommand()} on the current TvView.
|
||||||
|
|||||||
@@ -59,8 +59,6 @@ public class TvView extends ViewGroup {
|
|||||||
private static final String TAG = "TvView";
|
private static final String TAG = "TvView";
|
||||||
private static final boolean DEBUG = false;
|
private static final boolean DEBUG = false;
|
||||||
|
|
||||||
private static final int VIDEO_SIZE_VALUE_UNKNOWN = 0;
|
|
||||||
|
|
||||||
private static final int ZORDER_MEDIA = 0;
|
private static final int ZORDER_MEDIA = 0;
|
||||||
private static final int ZORDER_MEDIA_OVERLAY = 1;
|
private static final int ZORDER_MEDIA_OVERLAY = 1;
|
||||||
private static final int ZORDER_ON_TOP = 2;
|
private static final int ZORDER_ON_TOP = 2;
|
||||||
@@ -69,7 +67,7 @@ public class TvView extends ViewGroup {
|
|||||||
private static final int CAPTION_ENABLED = 1;
|
private static final int CAPTION_ENABLED = 1;
|
||||||
private static final int CAPTION_DISABLED = 2;
|
private static final int CAPTION_DISABLED = 2;
|
||||||
|
|
||||||
private static final WeakReference<TvView> NULL_TV_VIEW = new WeakReference(null);
|
private static final WeakReference<TvView> NULL_TV_VIEW = new WeakReference<>(null);
|
||||||
|
|
||||||
private static final Object sMainTvViewLock = new Object();
|
private static final Object sMainTvViewLock = new Object();
|
||||||
private static WeakReference<TvView> sMainTvView = NULL_TV_VIEW;
|
private static WeakReference<TvView> sMainTvView = NULL_TV_VIEW;
|
||||||
@@ -86,8 +84,6 @@ public class TvView extends ViewGroup {
|
|||||||
private OnUnhandledInputEventListener mOnUnhandledInputEventListener;
|
private OnUnhandledInputEventListener mOnUnhandledInputEventListener;
|
||||||
private boolean mHasStreamVolume;
|
private boolean mHasStreamVolume;
|
||||||
private float mStreamVolume;
|
private float mStreamVolume;
|
||||||
private int mVideoWidth = VIDEO_SIZE_VALUE_UNKNOWN;
|
|
||||||
private int mVideoHeight = VIDEO_SIZE_VALUE_UNKNOWN;
|
|
||||||
private int mCaptionEnabled;
|
private int mCaptionEnabled;
|
||||||
private String mAppPrivateCommandAction;
|
private String mAppPrivateCommandAction;
|
||||||
private Bundle mAppPrivateCommandData;
|
private Bundle mAppPrivateCommandData;
|
||||||
@@ -200,7 +196,7 @@ public class TvView extends ViewGroup {
|
|||||||
@SystemApi
|
@SystemApi
|
||||||
public void setMain() {
|
public void setMain() {
|
||||||
synchronized (sMainTvViewLock) {
|
synchronized (sMainTvViewLock) {
|
||||||
sMainTvView = new WeakReference(this);
|
sMainTvView = new WeakReference<>(this);
|
||||||
if (hasWindowFocus() && mSession != null) {
|
if (hasWindowFocus() && mSession != null) {
|
||||||
mSession.setMain();
|
mSession.setMain();
|
||||||
}
|
}
|
||||||
@@ -294,7 +290,7 @@ public class TvView extends ViewGroup {
|
|||||||
}
|
}
|
||||||
synchronized (sMainTvViewLock) {
|
synchronized (sMainTvViewLock) {
|
||||||
if (sMainTvView.get() == null) {
|
if (sMainTvView.get() == null) {
|
||||||
sMainTvView = new WeakReference(this);
|
sMainTvView = new WeakReference<>(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mSessionCallback != null && mSessionCallback.mInputId.equals(inputId)) {
|
if (mSessionCallback != null && mSessionCallback.mInputId.equals(inputId)) {
|
||||||
@@ -715,20 +711,9 @@ public class TvView extends ViewGroup {
|
|||||||
public void onDisconnected(String inputId) {
|
public void onDisconnected(String inputId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* This is invoked when the view is tuned to a specific channel and starts decoding video
|
|
||||||
* stream from there. It is also called later when the video size is changed.
|
|
||||||
*
|
|
||||||
* @param inputId The ID of the TV input bound to this view.
|
|
||||||
* @param width The width of the video.
|
|
||||||
* @param height The height of the video.
|
|
||||||
*/
|
|
||||||
public void onVideoSizeChanged(String inputId, int width, int height) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is invoked when the channel of this TvView is changed by the underlying TV input
|
* This is invoked when the channel of this TvView is changed by the underlying TV input
|
||||||
* with out any {@link TvView#tune(String, Uri)} request.
|
* without any {@link TvView#tune(String, Uri)} request.
|
||||||
*
|
*
|
||||||
* @param inputId The ID of the TV input bound to this view.
|
* @param inputId The ID of the TV input bound to this view.
|
||||||
* @param channelUri The URI of a channel.
|
* @param channelUri The URI of a channel.
|
||||||
@@ -757,6 +742,18 @@ public class TvView extends ViewGroup {
|
|||||||
public void onTrackSelected(String inputId, int type, String trackId) {
|
public void onTrackSelected(String inputId, int type, String trackId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is invoked when the video size has been changed. It is also called when the first
|
||||||
|
* time video size information becomes available after this view is tuned to a specific
|
||||||
|
* channel.
|
||||||
|
*
|
||||||
|
* @param inputId The ID of the TV input bound to this view.
|
||||||
|
* @param width The width of the video.
|
||||||
|
* @param height The height of the video.
|
||||||
|
*/
|
||||||
|
public void onVideoSizeChanged(String inputId, int width, int height) {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is called when the video is available, so the TV input starts the playback.
|
* This is called when the video is available, so the TV input starts the playback.
|
||||||
*
|
*
|
||||||
@@ -841,16 +838,17 @@ public class TvView extends ViewGroup {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSessionCreated(Session session) {
|
public void onSessionCreated(Session session) {
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.d(TAG, "onSessionCreated()");
|
||||||
|
}
|
||||||
if (this != mSessionCallback) {
|
if (this != mSessionCallback) {
|
||||||
|
Log.w(TAG, "onSessionCreated - session already created");
|
||||||
// This callback is obsolete.
|
// This callback is obsolete.
|
||||||
if (session != null) {
|
if (session != null) {
|
||||||
session.release();
|
session.release();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (DEBUG) {
|
|
||||||
Log.d(TAG, "onSessionCreated()");
|
|
||||||
}
|
|
||||||
mSession = session;
|
mSession = session;
|
||||||
if (session != null) {
|
if (session != null) {
|
||||||
synchronized (sMainTvViewLock) {
|
synchronized (sMainTvViewLock) {
|
||||||
@@ -891,7 +889,11 @@ public class TvView extends ViewGroup {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSessionReleased(Session session) {
|
public void onSessionReleased(Session session) {
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.d(TAG, "onSessionReleased()");
|
||||||
|
}
|
||||||
if (this != mSessionCallback) {
|
if (this != mSessionCallback) {
|
||||||
|
Log.w(TAG, "onSessionReleased - session not created");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mOverlayViewCreated = false;
|
mOverlayViewCreated = false;
|
||||||
@@ -905,12 +907,13 @@ public class TvView extends ViewGroup {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onChannelRetuned(Session session, Uri channelUri) {
|
public void onChannelRetuned(Session session, Uri channelUri) {
|
||||||
if (this != mSessionCallback) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "onChannelChangedByTvInput(" + channelUri + ")");
|
Log.d(TAG, "onChannelChangedByTvInput(" + channelUri + ")");
|
||||||
}
|
}
|
||||||
|
if (this != mSessionCallback) {
|
||||||
|
Log.w(TAG, "onChannelRetuned - session not created");
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (mCallback != null) {
|
if (mCallback != null) {
|
||||||
mCallback.onChannelRetuned(mInputId, channelUri);
|
mCallback.onChannelRetuned(mInputId, channelUri);
|
||||||
}
|
}
|
||||||
@@ -918,11 +921,12 @@ public class TvView extends ViewGroup {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTracksChanged(Session session, List<TvTrackInfo> tracks) {
|
public void onTracksChanged(Session session, List<TvTrackInfo> tracks) {
|
||||||
if (this != mSessionCallback) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "onTracksChanged()");
|
Log.d(TAG, "onTracksChanged(" + tracks + ")");
|
||||||
|
}
|
||||||
|
if (this != mSessionCallback) {
|
||||||
|
Log.w(TAG, "onTracksChanged - session not created");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if (mCallback != null) {
|
if (mCallback != null) {
|
||||||
mCallback.onTracksChanged(mInputId, tracks);
|
mCallback.onTracksChanged(mInputId, tracks);
|
||||||
@@ -931,26 +935,41 @@ public class TvView extends ViewGroup {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTrackSelected(Session session, int type, String trackId) {
|
public void onTrackSelected(Session session, int type, String trackId) {
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.d(TAG, "onTrackSelected(type=" + type + ", trackId=" + trackId + ")");
|
||||||
|
}
|
||||||
if (this != mSessionCallback) {
|
if (this != mSessionCallback) {
|
||||||
|
Log.w(TAG, "onTrackSelected - session not created");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (DEBUG) {
|
|
||||||
Log.d(TAG, "onTrackSelected()");
|
|
||||||
}
|
|
||||||
// TODO: Update the video size when the type is TYPE_VIDEO.
|
|
||||||
if (mCallback != null) {
|
if (mCallback != null) {
|
||||||
mCallback.onTrackSelected(mInputId, type, trackId);
|
mCallback.onTrackSelected(mInputId, type, trackId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onVideoAvailable(Session session) {
|
public void onVideoSizeChanged(Session session, int width, int height) {
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.d(TAG, "onVideoSizeChanged()");
|
||||||
|
}
|
||||||
if (this != mSessionCallback) {
|
if (this != mSessionCallback) {
|
||||||
|
Log.w(TAG, "onVideoSizeChanged - session not created");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (mCallback != null) {
|
||||||
|
mCallback.onVideoSizeChanged(mInputId, width, height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onVideoAvailable(Session session) {
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "onVideoAvailable()");
|
Log.d(TAG, "onVideoAvailable()");
|
||||||
}
|
}
|
||||||
|
if (this != mSessionCallback) {
|
||||||
|
Log.w(TAG, "onVideoAvailable - session not created");
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (mCallback != null) {
|
if (mCallback != null) {
|
||||||
mCallback.onVideoAvailable(mInputId);
|
mCallback.onVideoAvailable(mInputId);
|
||||||
}
|
}
|
||||||
@@ -958,11 +977,12 @@ public class TvView extends ViewGroup {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onVideoUnavailable(Session session, int reason) {
|
public void onVideoUnavailable(Session session, int reason) {
|
||||||
if (this != mSessionCallback) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "onVideoUnavailable(" + reason + ")");
|
Log.d(TAG, "onVideoUnavailable(reason=" + reason + ")");
|
||||||
|
}
|
||||||
|
if (this != mSessionCallback) {
|
||||||
|
Log.w(TAG, "onVideoUnavailable - session not created");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if (mCallback != null) {
|
if (mCallback != null) {
|
||||||
mCallback.onVideoUnavailable(mInputId, reason);
|
mCallback.onVideoUnavailable(mInputId, reason);
|
||||||
@@ -971,12 +991,13 @@ public class TvView extends ViewGroup {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onContentAllowed(Session session) {
|
public void onContentAllowed(Session session) {
|
||||||
if (this != mSessionCallback) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "onContentAllowed()");
|
Log.d(TAG, "onContentAllowed()");
|
||||||
}
|
}
|
||||||
|
if (this != mSessionCallback) {
|
||||||
|
Log.w(TAG, "onContentAllowed - session not created");
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (mCallback != null) {
|
if (mCallback != null) {
|
||||||
mCallback.onContentAllowed(mInputId);
|
mCallback.onContentAllowed(mInputId);
|
||||||
}
|
}
|
||||||
@@ -984,11 +1005,12 @@ public class TvView extends ViewGroup {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onContentBlocked(Session session, TvContentRating rating) {
|
public void onContentBlocked(Session session, TvContentRating rating) {
|
||||||
if (this != mSessionCallback) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "onContentBlocked()");
|
Log.d(TAG, "onContentBlocked(rating=" + rating + ")");
|
||||||
|
}
|
||||||
|
if (this != mSessionCallback) {
|
||||||
|
Log.w(TAG, "onContentBlocked - session not created");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if (mCallback != null) {
|
if (mCallback != null) {
|
||||||
mCallback.onContentBlocked(mInputId, rating);
|
mCallback.onContentBlocked(mInputId, rating);
|
||||||
@@ -997,13 +1019,14 @@ public class TvView extends ViewGroup {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onLayoutSurface(Session session, int left, int top, int right, int bottom) {
|
public void onLayoutSurface(Session session, int left, int top, int right, int bottom) {
|
||||||
if (this != mSessionCallback) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "onLayoutSurface (left=" + left + ", top=" + top + ", right="
|
Log.d(TAG, "onLayoutSurface (left=" + left + ", top=" + top + ", right="
|
||||||
+ right + ", bottom=" + bottom + ",)");
|
+ right + ", bottom=" + bottom + ",)");
|
||||||
}
|
}
|
||||||
|
if (this != mSessionCallback) {
|
||||||
|
Log.w(TAG, "onLayoutSurface - session not created");
|
||||||
|
return;
|
||||||
|
}
|
||||||
mSurfaceViewLeft = left;
|
mSurfaceViewLeft = left;
|
||||||
mSurfaceViewTop = top;
|
mSurfaceViewTop = top;
|
||||||
mSurfaceViewRight = right;
|
mSurfaceViewRight = right;
|
||||||
@@ -1014,12 +1037,13 @@ public class TvView extends ViewGroup {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSessionEvent(Session session, String eventType, Bundle eventArgs) {
|
public void onSessionEvent(Session session, String eventType, Bundle eventArgs) {
|
||||||
if (this != mSessionCallback) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "onSessionEvent(" + eventType + ")");
|
Log.d(TAG, "onSessionEvent(" + eventType + ")");
|
||||||
}
|
}
|
||||||
|
if (this != mSessionCallback) {
|
||||||
|
Log.w(TAG, "onSessionEvent - session not created");
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (mCallback != null) {
|
if (mCallback != null) {
|
||||||
mCallback.onEvent(mInputId, eventType, eventArgs);
|
mCallback.onEvent(mInputId, eventType, eventArgs);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user