summaryrefslogtreecommitdiffstats
path: root/media/java/android
diff options
context:
space:
mode:
authorYoungsang Cho <youngsang@google.com>2014-07-18 03:28:15 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-07-17 21:58:28 +0000
commitc66ca1267cfa4aca70d3dceaf5962ff77ee030b3 (patch)
treefe26b28a03fc114caa7e36a58795d4613e9fe917 /media/java/android
parentb375805f3b1672e68d1511565af4700e5fa8491d (diff)
parente821d711db1799dc51661a3ed6188f3cd942bae7 (diff)
downloadframeworks_base-c66ca1267cfa4aca70d3dceaf5962ff77ee030b3.zip
frameworks_base-c66ca1267cfa4aca70d3dceaf5962ff77ee030b3.tar.gz
frameworks_base-c66ca1267cfa4aca70d3dceaf5962ff77ee030b3.tar.bz2
Merge "TIF: Add a notification for surface change from TvView to TvInputService" into lmp-dev
Diffstat (limited to 'media/java/android')
-rw-r--r--media/java/android/media/tv/ITvInputManager.aidl2
-rw-r--r--media/java/android/media/tv/ITvInputSession.aidl1
-rw-r--r--media/java/android/media/tv/ITvInputSessionWrapper.java29
-rw-r--r--media/java/android/media/tv/TvInputManager.java21
-rw-r--r--media/java/android/media/tv/TvInputService.java23
-rw-r--r--media/java/android/media/tv/TvView.java39
6 files changed, 100 insertions, 15 deletions
diff --git a/media/java/android/media/tv/ITvInputManager.aidl b/media/java/android/media/tv/ITvInputManager.aidl
index d4b3359..6147f40 100644
--- a/media/java/android/media/tv/ITvInputManager.aidl
+++ b/media/java/android/media/tv/ITvInputManager.aidl
@@ -43,6 +43,8 @@ interface ITvInputManager {
void releaseSession(in IBinder sessionToken, int userId);
void setSurface(in IBinder sessionToken, in Surface surface, int userId);
+ void dispatchSurfaceChanged(in IBinder sessionToken, int format, int width, int height,
+ int userId);
void setVolume(in IBinder sessionToken, float volume, int userId);
void tune(in IBinder sessionToken, in Uri channelUri, int userId);
void setCaptionEnabled(in IBinder sessionToken, boolean enabled, int userId);
diff --git a/media/java/android/media/tv/ITvInputSession.aidl b/media/java/android/media/tv/ITvInputSession.aidl
index 875fa34..9211dfc 100644
--- a/media/java/android/media/tv/ITvInputSession.aidl
+++ b/media/java/android/media/tv/ITvInputSession.aidl
@@ -29,6 +29,7 @@ oneway interface ITvInputSession {
void release();
void setSurface(in Surface surface);
+ void dispatchSurfaceChanged(int format, int width, int height);
// TODO: Remove this once it becomes irrelevant for applications to handle audio focus. The plan
// is to introduce some new concepts that will solve a number of problems in audio policy today.
void setVolume(float volume);
diff --git a/media/java/android/media/tv/ITvInputSessionWrapper.java b/media/java/android/media/tv/ITvInputSessionWrapper.java
index 0c08590..c9c0768 100644
--- a/media/java/android/media/tv/ITvInputSessionWrapper.java
+++ b/media/java/android/media/tv/ITvInputSessionWrapper.java
@@ -42,14 +42,15 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand
private static final int DO_RELEASE = 1;
private static final int DO_SET_SURFACE = 2;
- private static final int DO_SET_VOLUME = 3;
- private static final int DO_TUNE = 4;
- private static final int DO_SET_CAPTION_ENABLED = 5;
- private static final int DO_SELECT_TRACK = 6;
- private static final int DO_UNSELECT_TRACK = 7;
- private static final int DO_CREATE_OVERLAY_VIEW = 8;
- private static final int DO_RELAYOUT_OVERLAY_VIEW = 9;
- private static final int DO_REMOVE_OVERLAY_VIEW = 10;
+ private static final int DO_DISPATCH_SURFACE_CHANGED = 3;
+ private static final int DO_SET_VOLUME = 4;
+ private static final int DO_TUNE = 5;
+ private static final int DO_SET_CAPTION_ENABLED = 6;
+ private static final int DO_SELECT_TRACK = 7;
+ private static final int DO_UNSELECT_TRACK = 8;
+ private static final int DO_CREATE_OVERLAY_VIEW = 9;
+ private static final int DO_RELAYOUT_OVERLAY_VIEW = 10;
+ private static final int DO_REMOVE_OVERLAY_VIEW = 11;
private final HandlerCaller mCaller;
@@ -91,6 +92,12 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand
mTvInputSessionImpl.setSurface((Surface) msg.obj);
return;
}
+ case DO_DISPATCH_SURFACE_CHANGED: {
+ SomeArgs args = (SomeArgs) msg.obj;
+ mTvInputSessionImpl.dispatchSurfaceChanged(args.argi1, args.argi2, args.argi3);
+ args.recycle();
+ return;
+ }
case DO_SET_VOLUME: {
mTvInputSessionImpl.setVolume((Float) msg.obj);
return;
@@ -143,6 +150,12 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand
}
@Override
+ public void dispatchSurfaceChanged(int format, int width, int height) {
+ mCaller.executeOrSendMessage(mCaller.obtainMessageIIII(DO_DISPATCH_SURFACE_CHANGED,
+ format, width, height, 0));
+ }
+
+ @Override
public final void setVolume(float volume) {
mCaller.executeOrSendMessage(mCaller.obtainMessageO(DO_SET_VOLUME, volume));
}
diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java
index a163150..57a8eb8 100644
--- a/media/java/android/media/tv/TvInputManager.java
+++ b/media/java/android/media/tv/TvInputManager.java
@@ -669,6 +669,27 @@ public final class TvInputManager {
}
/**
+ * Notifies of any structural changes (format or size) of the {@link Surface}
+ * passed by {@link #setSurface}.
+ *
+ * @param format The new PixelFormat of the {@link Surface}.
+ * @param width The new width of the {@link Surface}.
+ * @param height The new height of the {@link Surface}.
+ * @hide
+ */
+ public void dispatchSurfaceChanged(int format, int width, int height) {
+ if (mToken == null) {
+ Log.w(TAG, "The session has been already released");
+ return;
+ }
+ try {
+ mService.dispatchSurfaceChanged(mToken, format, width, height, mUserId);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
* Sets the relative stream volume of this session to handle a change of audio focus.
*
* @param volume A volume value between 0.0f to 1.0f.
diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java
index ecffb7b..fccc3ce 100644
--- a/media/java/android/media/tv/TvInputService.java
+++ b/media/java/android/media/tv/TvInputService.java
@@ -399,6 +399,18 @@ public abstract class TvInputService extends Service {
public abstract boolean onSetSurface(Surface surface);
/**
+ * Called after any structural changes (format or size) have been made to the
+ * {@link Surface} passed by {@link #onSetSurface}. This method is always called
+ * at least once, after {@link #onSetSurface} with non-null {@link Surface} is called.
+ *
+ * @param format The new PixelFormat of the {@link Surface}.
+ * @param width The new width of the {@link Surface}.
+ * @param height The new height of the {@link Surface}.
+ */
+ public void onSurfaceChanged(int format, int width, int height) {
+ }
+
+ /**
* Sets the relative stream volume of the current TV input session to handle the change of
* audio focus by setting.
*
@@ -612,6 +624,17 @@ public abstract class TvInputService extends Service {
}
/**
+ * Calls {@link #onSurfaceChanged}.
+ */
+ void dispatchSurfaceChanged(int format, int width, int height) {
+ if (DEBUG) {
+ Log.d(TAG, "dispatchSurfaceChanged(format=" + format + ", width=" + width
+ + ", height=" + height + ")");
+ }
+ onSurfaceChanged(format, width, height);
+ }
+
+ /**
* Calls {@link #onSetStreamVolume}.
*/
void setVolume(float volume) {
diff --git a/media/java/android/media/tv/TvView.java b/media/java/android/media/tv/TvView.java
index 12a6961..afdd971 100644
--- a/media/java/android/media/tv/TvView.java
+++ b/media/java/android/media/tv/TvView.java
@@ -75,17 +75,21 @@ public class TvView extends ViewGroup {
private float mStreamVolume;
private int mVideoWidth = VIDEO_SIZE_VALUE_UNKNOWN;
private int mVideoHeight = VIDEO_SIZE_VALUE_UNKNOWN;
+ private boolean mSurfaceChanged;
+ private int mSurfaceFormat;
+ private int mSurfaceWidth;
+ private int mSurfaceHeight;
private final SurfaceHolder.Callback mSurfaceHolderCallback = new SurfaceHolder.Callback() {
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Log.d(TAG, "surfaceChanged(holder=" + holder + ", format=" + format + ", width=" + width
+ ", height=" + height + ")");
- if (holder.getSurface() == mSurface) {
- return;
- }
- mSurface = holder.getSurface();
- setSessionSurface(mSurface);
+ mSurfaceFormat = format;
+ mSurfaceWidth = width;
+ mSurfaceHeight = height;
+ mSurfaceChanged = true;
+ dispatchSurfaceChanged(mSurfaceFormat, mSurfaceWidth, mSurfaceHeight);
}
@Override
@@ -97,6 +101,7 @@ public class TvView extends ViewGroup {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mSurface = null;
+ mSurfaceChanged = false;
setSessionSurface(null);
}
};
@@ -423,6 +428,13 @@ public class TvView extends ViewGroup {
mSession.setSurface(surface);
}
+ private void dispatchSurfaceChanged(int format, int width, int height) {
+ if (mSession == null) {
+ return;
+ }
+ mSession.dispatchSurfaceChanged(format, width, height);
+ }
+
private void createSessionOverlayView() {
if (mSession == null || !isAttachedToWindow()
|| mOverlayViewCreated) {
@@ -609,6 +621,9 @@ public class TvView extends ViewGroup {
// setSessionSurface will be called in surfaceCreated.
if (mSurface != null) {
setSessionSurface(mSurface);
+ if (mSurfaceChanged) {
+ dispatchSurfaceChanged(mSurfaceFormat, mSurfaceWidth, mSurfaceHeight);
+ }
}
createSessionOverlayView();
mSession.tune(mChannelUri);
@@ -624,9 +639,10 @@ public class TvView extends ViewGroup {
@Override
public void onSessionReleased(Session session) {
- if (this == mSessionCallback) {
- mSessionCallback = null;
+ if (this != mSessionCallback) {
+ return;
}
+ mSessionCallback = null;
mSession = null;
if (mListener != null) {
mListener.onError(mInputId, ERROR_TV_INPUT_DISCONNECTED);
@@ -635,6 +651,9 @@ public class TvView extends ViewGroup {
@Override
public void onChannelRetuned(Session session, Uri channelUri) {
+ if (this != mSessionCallback) {
+ return;
+ }
if (DEBUG) {
Log.d(TAG, "onChannelChangedByTvInput(" + channelUri + ")");
}
@@ -659,6 +678,9 @@ public class TvView extends ViewGroup {
@Override
public void onVideoAvailable(Session session) {
+ if (this != mSessionCallback) {
+ return;
+ }
if (DEBUG) {
Log.d(TAG, "onVideoAvailable()");
}
@@ -669,6 +691,9 @@ public class TvView extends ViewGroup {
@Override
public void onVideoUnavailable(Session session, int reason) {
+ if (this != mSessionCallback) {
+ return;
+ }
if (DEBUG) {
Log.d(TAG, "onVideoUnavailable(" + reason + ")");
}