diff --git a/media/java/android/media/tv/ITvInputManager.aidl b/media/java/android/media/tv/ITvInputManager.aidl index 14c020e94c150..901ea46ba38bb 100644 --- a/media/java/android/media/tv/ITvInputManager.aidl +++ b/media/java/android/media/tv/ITvInputManager.aidl @@ -120,6 +120,7 @@ interface ITvInputManager { // For TV Message void notifyTvMessage(in IBinder sessionToken, int type, in Bundle data, int userId); + void setTvMessageEnabled(in IBinder sessionToken, int type, boolean enabled, int userId); // For TV input hardware binding List getHardwareList(); diff --git a/media/java/android/media/tv/ITvInputSession.aidl b/media/java/android/media/tv/ITvInputSession.aidl index a7bd8d313ac35..5246f5c4dc1ef 100644 --- a/media/java/android/media/tv/ITvInputSession.aidl +++ b/media/java/android/media/tv/ITvInputSession.aidl @@ -79,4 +79,5 @@ oneway interface ITvInputSession { // For TV messages void notifyTvMessage(int type, in Bundle data); + void setTvMessageEnabled(int type, boolean enabled); } diff --git a/media/java/android/media/tv/ITvInputSessionWrapper.java b/media/java/android/media/tv/ITvInputSessionWrapper.java index f939f523d3fa2..3a990b3dd6a91 100644 --- a/media/java/android/media/tv/ITvInputSessionWrapper.java +++ b/media/java/android/media/tv/ITvInputSessionWrapper.java @@ -268,6 +268,7 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand case DO_SET_TV_MESSAGE_ENABLED: { SomeArgs args = (SomeArgs) msg.obj; mTvInputSessionImpl.setTvMessageEnabled((Integer) args.arg1, (Boolean) args.arg2); + args.recycle(); break; } case DO_REQUEST_AD: { @@ -474,6 +475,12 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand mCaller.executeOrSendMessage(mCaller.obtainMessageOO(DO_NOTIFY_TV_MESSAGE, type, data)); } + @Override + public void setTvMessageEnabled(int type, boolean enabled) { + mCaller.executeOrSendMessage(mCaller.obtainMessageOO(DO_SET_TV_MESSAGE_ENABLED, type, + enabled)); + } + private final class TvInputEventReceiver extends InputEventReceiver { TvInputEventReceiver(InputChannel inputChannel, Looper looper) { super(inputChannel, looper); diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java index ef2b5a5b6e503..fc51689a777d4 100644 --- a/media/java/android/media/tv/TvInputManager.java +++ b/media/java/android/media/tv/TvInputManager.java @@ -3273,7 +3273,7 @@ public final class TvInputManager { /** * Sends TV messages to the service for testing purposes */ - public void notifyTvMessage(@NonNull @TvMessageType int type, @NonNull Bundle data) { + public void notifyTvMessage(int type, Bundle data) { try { mService.notifyTvMessage(mToken, type, data, mUserId); } catch (RemoteException e) { @@ -3281,6 +3281,17 @@ public final class TvInputManager { } } + /** + * Sets whether the TV message of the specific type should be enabled. + */ + public void setTvMessageEnabled(int type, boolean enabled) { + try { + mService.setTvMessageEnabled(mToken, type, enabled, mUserId); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** * Starts TV program recording in the current recording session. * diff --git a/media/java/android/media/tv/TvView.java b/media/java/android/media/tv/TvView.java index 8a886832e88e2..8c2411c913ea5 100644 --- a/media/java/android/media/tv/TvView.java +++ b/media/java/android/media/tv/TvView.java @@ -745,6 +745,9 @@ public class TvView extends ViewGroup { */ public void setTvMessageEnabled(@TvInputManager.TvMessageType int type, boolean enabled) { + if (mSession != null) { + mSession.setTvMessageEnabled(type, enabled); + } } @Override diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index 5442b6dc4b095..ad789d830c397 100644 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -2128,7 +2128,7 @@ public final class TvInputManagerService extends SystemService { public void notifyTvMessage(IBinder sessionToken, int type, Bundle data, int userId) { final int callingUid = Binder.getCallingUid(); final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid, - userId, "timeShiftEnablePositionTracking"); + userId, "notifyTvmessage"); final long identity = Binder.clearCallingIdentity(); try { synchronized (mLock) { @@ -2136,7 +2136,28 @@ public final class TvInputManagerService extends SystemService { getSessionLocked(sessionToken, callingUid, resolvedUserId) .notifyTvMessage(type, data); } catch (RemoteException | SessionNotFoundException e) { - Slog.e(TAG, "error in timeShiftEnablePositionTracking", e); + Slog.e(TAG, "error in notifyTvMessage", e); + } + } + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + @Override + public void setTvMessageEnabled(IBinder sessionToken, int type, boolean enabled, + int userId) { + final int callingUid = Binder.getCallingUid(); + final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid, + userId, "setTvMessageEnabled"); + final long identity = Binder.clearCallingIdentity(); + try { + synchronized (mLock) { + try { + getSessionLocked(sessionToken, callingUid, resolvedUserId) + .setTvMessageEnabled(type, enabled); + } catch (RemoteException | SessionNotFoundException e) { + Slog.e(TAG, "error in setTvMessageEnabled", e); } } } finally {