From 7da63b82d67c2e5fc3d823dbd734ab671746d5c3 Mon Sep 17 00:00:00 2001 From: Amy Date: Tue, 3 Mar 2020 16:32:40 -0800 Subject: Add an Executor to the new acquireTvInputHardware API Test: manual Bug: 149237987 Change-Id: I9fa83a1f829aaf18ccd08c97142df58d47776d9a --- api/system-current.txt | 2 +- media/java/android/media/tv/TvInputManager.java | 42 ++++++++++++++++++------- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/api/system-current.txt b/api/system-current.txt index 37376e59b207..b16f09511277 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4749,7 +4749,7 @@ package android.media.tv { public final class TvInputManager { method @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public android.media.tv.TvInputManager.Hardware acquireTvInputHardware(int, @NonNull android.media.tv.TvInputInfo, @NonNull android.media.tv.TvInputManager.HardwareCallback); - method @Nullable @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public android.media.tv.TvInputManager.Hardware acquireTvInputHardware(int, @NonNull android.media.tv.TvInputInfo, @NonNull android.media.tv.TvInputManager.HardwareCallback, @Nullable String, int); + method @Nullable @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public android.media.tv.TvInputManager.Hardware acquireTvInputHardware(int, @NonNull android.media.tv.TvInputInfo, @Nullable String, int, @NonNull java.util.concurrent.Executor, @NonNull android.media.tv.TvInputManager.HardwareCallback); method @RequiresPermission(android.Manifest.permission.MODIFY_PARENTAL_CONTROLS) public void addBlockedRating(@NonNull android.media.tv.TvContentRating); method @RequiresPermission(android.Manifest.permission.CAPTURE_TV_INPUT) public boolean captureFrame(String, android.view.Surface, android.media.tv.TvStreamConfig); method @RequiresPermission(android.Manifest.permission.CAPTURE_TV_INPUT) public java.util.List getAvailableTvStreamConfigList(String); diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java index 6bf9e19ae079..f058a02ceb1e 100644 --- a/media/java/android/media/tv/TvInputManager.java +++ b/media/java/android/media/tv/TvInputManager.java @@ -16,6 +16,7 @@ package android.media.tv; +import android.annotation.CallbackExecutor; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -27,6 +28,7 @@ import android.content.Intent; import android.graphics.Rect; import android.media.PlaybackParams; import android.net.Uri; +import android.os.Binder; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -56,6 +58,7 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.concurrent.Executor; /** * Central system API to the overall TV input framework (TIF) architecture, which arbitrates @@ -1743,8 +1746,8 @@ public final class TvInputManager { *

Otherwise default priority will be applied. * * @param deviceId The device ID to acquire Hardware for. - * @param callback A callback to receive updates on Hardware. * @param info The TV input which will use the acquired Hardware. + * @param callback A callback to receive updates on Hardware. * @return Hardware on success, {@code null} otherwise. * * @hide @@ -1755,8 +1758,12 @@ public final class TvInputManager { @NonNull final HardwareCallback callback) { Preconditions.checkNotNull(info); Preconditions.checkNotNull(callback); - return acquireTvInputHardwareInternal(deviceId, info, callback, null, - TvInputService.PRIORITY_HINT_USE_CASE_TYPE_LIVE); + return acquireTvInputHardwareInternal(deviceId, info, null, + TvInputService.PRIORITY_HINT_USE_CASE_TYPE_LIVE, new Executor() { + public void execute(Runnable r) { + r.run(); + } + }, callback); } /** @@ -1767,12 +1774,13 @@ public final class TvInputManager { * request. * * @param deviceId The device ID to acquire Hardware for. - * @param callback A callback to receive updates on Hardware. * @param info The TV input which will use the acquired Hardware. * @param tvInputSessionId a String returned to TIS when the session was created. * {@see TvInputService#onCreateSession(String, String)}. If null, the client will be * treated as a background app. * @param priorityHint The use case of the client. {@see TvInputService#PriorityHintUseCaseType} + * @param executor the executor on which the listener would be invoked. + * @param callback A callback to receive updates on Hardware. * @return Hardware on success, {@code null} otherwise. When the TRM decides to not grant * resource, null is returned and the {@link IllegalStateException} is thrown with * "No enough resources". @@ -1783,28 +1791,40 @@ public final class TvInputManager { @Nullable @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public Hardware acquireTvInputHardware(int deviceId, @NonNull TvInputInfo info, - @NonNull final HardwareCallback callback, @Nullable String tvInputSessionId, - @TvInputService.PriorityHintUseCaseType int priorityHint) { + @TvInputService.PriorityHintUseCaseType int priorityHint, + @NonNull @CallbackExecutor Executor executor, + @NonNull final HardwareCallback callback) { Preconditions.checkNotNull(info); Preconditions.checkNotNull(callback); - return acquireTvInputHardwareInternal(deviceId, info, callback, - tvInputSessionId, priorityHint); + return acquireTvInputHardwareInternal(deviceId, info, tvInputSessionId, priorityHint, + executor, callback); } private Hardware acquireTvInputHardwareInternal(int deviceId, TvInputInfo info, - final HardwareCallback callback, String tvInputSessionId, int priorityHint) { + String tvInputSessionId, int priorityHint, + Executor executor, final HardwareCallback callback) { try { return new Hardware( mService.acquireTvInputHardware(deviceId, new ITvInputHardwareCallback.Stub() { @Override public void onReleased() { - callback.onReleased(); + final long identity = Binder.clearCallingIdentity(); + try { + executor.execute(() -> callback.onReleased()); + } finally { + Binder.restoreCallingIdentity(identity); + } } @Override public void onStreamConfigChanged(TvStreamConfig[] configs) { - callback.onStreamConfigChanged(configs); + final long identity = Binder.clearCallingIdentity(); + try { + executor.execute(() -> callback.onStreamConfigChanged(configs)); + } finally { + Binder.restoreCallingIdentity(identity); + } } }, info, mUserId, tvInputSessionId, priorityHint)); } catch (RemoteException e) { -- cgit v1.2.3-59-g8ed1b