diff options
4 files changed, 74 insertions, 5 deletions
diff --git a/media/java/android/media/tv/ITvInputServiceCallback.aidl b/media/java/android/media/tv/ITvInputServiceCallback.aidl index df648e737d31..26a0d2051fc5 100644 --- a/media/java/android/media/tv/ITvInputServiceCallback.aidl +++ b/media/java/android/media/tv/ITvInputServiceCallback.aidl @@ -27,4 +27,5 @@ oneway interface ITvInputServiceCallback { void addHardwareTvInput(in int deviceID, in TvInputInfo inputInfo); void addHdmiCecTvInput(in int logicalAddress, in TvInputInfo inputInfo); void removeTvInput(in String inputId); + void setWrappedInputId(in String inputId, in String wrappedInputId); } diff --git a/media/java/android/media/tv/TvInputPassthroughWrapperService.java b/media/java/android/media/tv/TvInputPassthroughWrapperService.java index 562dc2fbcee3..e99044d3abae 100644 --- a/media/java/android/media/tv/TvInputPassthroughWrapperService.java +++ b/media/java/android/media/tv/TvInputPassthroughWrapperService.java @@ -75,6 +75,7 @@ public abstract class TvInputPassthroughWrapperService extends TvInputService { if (!session.connect(passthroughInputId)) { throw new IllegalStateException("WrapperSession cannot be reused."); } + notifyWrappedInputId(inputId, passthroughInputId); return session; } diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java index db07b6531d4b..e80c71f4c172 100644 --- a/media/java/android/media/tv/TvInputService.java +++ b/media/java/android/media/tv/TvInputService.java @@ -217,6 +217,21 @@ public abstract class TvInputService extends Service { } /** + * Notify wrapped TV input ID of current input to TV input framework manager + * + * @param inputId The TV input ID of {@link TvInputPassthroughWrapperService} + * @param wrappedInputId The ID of the wrapped TV input such as external pass-though TV input + * @hide + */ + public final void notifyWrappedInputId(String inputId, String wrappedInputId) { + SomeArgs args = SomeArgs.obtain(); + args.arg1 = inputId; + args.arg2 = wrappedInputId; + mHandler.obtainMessage(TvInputService.ServiceHandler.DO_SET_WRAPPED_TV_INPUT_ID, + args).sendToTarget(); + } + + /** * Base class for derived classes to implement to provide a TV input session. */ public abstract class Session implements KeyEvent.Callback { @@ -943,6 +958,7 @@ public abstract class TvInputService extends Service { private static final int DO_REMOVE_HARDWARE_TV_INPUT = 3; private static final int DO_ADD_HDMI_CEC_TV_INPUT = 4; private static final int DO_REMOVE_HDMI_CEC_TV_INPUT = 5; + private static final int DO_SET_WRAPPED_TV_INPUT_ID = 6; private void broadcastAddHardwareTvInput(int deviceId, TvInputInfo inputInfo) { int n = mCallbacks.beginBroadcast(); @@ -950,7 +966,7 @@ public abstract class TvInputService extends Service { try { mCallbacks.getBroadcastItem(i).addHardwareTvInput(deviceId, inputInfo); } catch (RemoteException e) { - Log.e(TAG, "Error while broadcasting: " + e); + Log.e(TAG, "Error while broadcasting.", e); } } mCallbacks.finishBroadcast(); @@ -963,7 +979,7 @@ public abstract class TvInputService extends Service { try { mCallbacks.getBroadcastItem(i).addHdmiCecTvInput(logicalAddress, inputInfo); } catch (RemoteException e) { - Log.e(TAG, "Error while broadcasting: " + e); + Log.e(TAG, "Error while broadcasting.", e); } } mCallbacks.finishBroadcast(); @@ -975,7 +991,19 @@ public abstract class TvInputService extends Service { try { mCallbacks.getBroadcastItem(i).removeTvInput(inputId); } catch (RemoteException e) { - Log.e(TAG, "Error while broadcasting: " + e); + Log.e(TAG, "Error while broadcasting.", e); + } + } + mCallbacks.finishBroadcast(); + } + + private void broadcastSetWrappedTvInputId(String inputId, String wrappedInputId) { + int n = mCallbacks.beginBroadcast(); + for (int i = 0; i < n; ++i) { + try { + mCallbacks.getBroadcastItem(i).setWrappedInputId(inputId, wrappedInputId); + } catch (RemoteException e) { + Log.e(TAG, "Error while broadcasting.", e); } } mCallbacks.finishBroadcast(); @@ -1038,6 +1066,13 @@ public abstract class TvInputService extends Service { } return; } + case DO_SET_WRAPPED_TV_INPUT_ID: { + SomeArgs args = (SomeArgs) msg.obj; + String inputId = (String) args.arg1; + String wrappedInputId = (String) args.arg2; + broadcastSetWrappedTvInputId(inputId, wrappedInputId); + return; + } default: { Log.w(TAG, "Unhandled message code: " + msg.what); return; diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index b7314bba415b..340af41ccff1 100644 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -1293,8 +1293,14 @@ public final class TvInputManagerService extends SystemService { final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid, userId, "captureFrame"); try { + final String wrappedInputId; + synchronized (mLock) { + UserState userState = getUserStateLocked(resolvedUserId); + wrappedInputId = userState.wrappedInputMap.get(inputId); + } return mTvInputHardwareManager.captureFrame( - inputId, surface, config, callingUid, resolvedUserId); + (wrappedInputId != null) ? wrappedInputId : inputId, + surface, config, callingUid, resolvedUserId); } finally { Binder.restoreCallingIdentity(identity); } @@ -1470,6 +1476,9 @@ public final class TvInputManagerService extends SystemService { // A set of callbacks. private final Set<ITvInputManagerCallback> callbackSet = new HashSet<ITvInputManagerCallback>(); + + // A mapping from the TV input id to wrapped input id. + private final Map<String, String> wrappedInputMap = new HashMap<String, String>(); } private final class ClientState implements IBinder.DeathRecipient { @@ -1662,8 +1671,10 @@ public final class TvInputManagerService extends SystemService { for (TvInputState inputState : userState.inputMap.values()) { if (inputState.mInfo.getComponent().equals(name)) { - notifyInputStateChangedLocked(userState, inputState.mInfo.getId(), + String inputId = inputState.mInfo.getId(); + notifyInputStateChangedLocked(userState, inputId, INPUT_STATE_DISCONNECTED, null); + userState.wrappedInputMap.remove(inputId); } } updateServiceConnectionLocked(mName, mUserId); @@ -1742,6 +1753,27 @@ public final class TvInputManagerService extends SystemService { } } } + + @Override + public void setWrappedInputId(String inputId, String wrappedInputId) { + synchronized (mLock) { + if (!hasInputIdLocked(inputId)) { + return; + } + UserState userState = getUserStateLocked(mUserId); + userState.wrappedInputMap.put(inputId, wrappedInputId); + } + } + + private boolean hasInputIdLocked(String inputId) { + ServiceState serviceState = getServiceStateLocked(mName, mUserId); + for (TvInputInfo inputInfo : serviceState.mInputList) { + if (inputInfo.getId().equals(inputId)) { + return true; + } + } + return false; + } } private final class LogHandler extends Handler { |