diff options
7 files changed, 76 insertions, 138 deletions
diff --git a/services/core/java/com/android/server/hdmi/DevicePowerStatusAction.java b/services/core/java/com/android/server/hdmi/DevicePowerStatusAction.java index 7b646b36124b..e01c37901563 100644 --- a/services/core/java/com/android/server/hdmi/DevicePowerStatusAction.java +++ b/services/core/java/com/android/server/hdmi/DevicePowerStatusAction.java @@ -22,11 +22,8 @@ import android.hardware.hdmi.HdmiPlaybackClient; import android.hardware.hdmi.HdmiPlaybackClient.DisplayStatusCallback; import android.hardware.hdmi.IHdmiControlCallback; import android.hardware.tv.cec.V1_0.SendMessageResult; -import android.os.RemoteException; import android.util.Slog; -import java.util.ArrayList; -import java.util.List; /** * Feature action that queries the power status of other device. This action is initiated via @@ -42,7 +39,6 @@ final class DevicePowerStatusAction extends HdmiCecFeatureAction { private static final int STATE_WAITING_FOR_REPORT_POWER_STATUS = 1; private final int mTargetAddress; - private final List<IHdmiControlCallback> mCallbacks = new ArrayList<>(); // Retry the power status query as it might happen when the target device is waking up. In // that case a device may be quite busy and can fail to respond within the 2s timeout. @@ -59,9 +55,8 @@ final class DevicePowerStatusAction extends HdmiCecFeatureAction { private DevicePowerStatusAction(HdmiCecLocalDevice localDevice, int targetAddress, IHdmiControlCallback callback) { - super(localDevice); + super(localDevice, callback); mTargetAddress = targetAddress; - addCallback(callback); } @Override @@ -74,8 +69,7 @@ final class DevicePowerStatusAction extends HdmiCecFeatureAction { && deviceInfo.getCecVersion() >= HdmiControlManager.HDMI_CEC_VERSION_2_0) { int powerStatus = deviceInfo.getDevicePowerStatus(); if (powerStatus != HdmiControlManager.POWER_STATUS_UNKNOWN) { - invokeCallback(powerStatus); - finish(); + finishWithCallback(powerStatus); return true; } } @@ -93,8 +87,7 @@ final class DevicePowerStatusAction extends HdmiCecFeatureAction { // the device is not present or not capable of CEC. if (error == SendMessageResult.NACK) { // Got no response from TV. Report status 'unknown'. - invokeCallback(HdmiControlManager.POWER_STATUS_UNKNOWN); - finish(); + finishWithCallback(HdmiControlManager.POWER_STATUS_UNKNOWN); } }); } @@ -107,8 +100,7 @@ final class DevicePowerStatusAction extends HdmiCecFeatureAction { } if (cmd.getOpcode() == Constants.MESSAGE_REPORT_POWER_STATUS) { int status = cmd.getParams()[0]; - invokeCallback(status); - finish(); + finishWithCallback(status); return true; } return false; @@ -127,22 +119,7 @@ final class DevicePowerStatusAction extends HdmiCecFeatureAction { } // Got no response from TV. Report status 'unknown'. - invokeCallback(HdmiControlManager.POWER_STATUS_UNKNOWN); - finish(); - } - } - - public void addCallback(IHdmiControlCallback callback) { - mCallbacks.add(callback); - } - - private void invokeCallback(int result) { - try { - for (IHdmiControlCallback callback : mCallbacks) { - callback.onComplete(result); - } - } catch (RemoteException e) { - Slog.e(TAG, "Callback failed:" + e); + finishWithCallback(HdmiControlManager.POWER_STATUS_UNKNOWN); } } } diff --git a/services/core/java/com/android/server/hdmi/DeviceSelectAction.java b/services/core/java/com/android/server/hdmi/DeviceSelectAction.java index 983b6b5bceb4..c23e2e691b55 100644 --- a/services/core/java/com/android/server/hdmi/DeviceSelectAction.java +++ b/services/core/java/com/android/server/hdmi/DeviceSelectAction.java @@ -21,7 +21,6 @@ import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.HdmiTvClient; import android.hardware.hdmi.IHdmiControlCallback; import android.hardware.tv.cec.V1_0.SendMessageResult; -import android.os.RemoteException; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; @@ -63,7 +62,6 @@ final class DeviceSelectAction extends HdmiCecFeatureAction { static final int STATE_WAIT_FOR_DEVICE_POWER_ON = 3; private final HdmiDeviceInfo mTarget; - private final IHdmiControlCallback mCallback; private final HdmiCecMessage mGivePowerStatus; private final boolean mIsCec20; @@ -86,8 +84,7 @@ final class DeviceSelectAction extends HdmiCecFeatureAction { @VisibleForTesting DeviceSelectAction(HdmiCecLocalDeviceTv source, HdmiDeviceInfo target, IHdmiControlCallback callback, boolean isCec20) { - super(source); - mCallback = callback; + super(source, callback); mTarget = target; mGivePowerStatus = HdmiCecMessageBuilder.buildGiveDevicePowerStatus( getSourceAddress(), getTargetAddress()); @@ -108,7 +105,7 @@ final class DeviceSelectAction extends HdmiCecFeatureAction { if (!mIsCec20 || targetPowerStatus == HdmiControlManager.POWER_STATUS_UNKNOWN) { queryDevicePowerStatus(); } else if (targetPowerStatus == HdmiControlManager.POWER_STATUS_ON) { - invokeCallbackAndFinish(HdmiControlManager.RESULT_SUCCESS); + finishWithCallback(HdmiControlManager.RESULT_SUCCESS); return true; } mState = STATE_WAIT_FOR_REPORT_POWER_STATUS; @@ -117,14 +114,17 @@ final class DeviceSelectAction extends HdmiCecFeatureAction { } private void queryDevicePowerStatus() { - sendCommand(mGivePowerStatus, new SendMessageCallback() { - @Override - public void onSendCompleted(int error) { - if (error != SendMessageResult.SUCCESS) { - invokeCallbackAndFinish(HdmiControlManager.RESULT_COMMUNICATION_FAILED); - } - } - }); + sendCommand( + mGivePowerStatus, + new SendMessageCallback() { + @Override + public void onSendCompleted(int error) { + if (error != SendMessageResult.SUCCESS) { + finishWithCallback(HdmiControlManager.RESULT_COMMUNICATION_FAILED); + return; + } + } + }); } @Override @@ -189,7 +189,7 @@ final class DeviceSelectAction extends HdmiCecFeatureAction { switch (mState) { case STATE_WAIT_FOR_REPORT_POWER_STATUS: if (tv().isPowerStandbyOrTransient()) { - invokeCallbackAndFinish(HdmiControlManager.RESULT_INCORRECT_MODE); + finishWithCallback(HdmiControlManager.RESULT_INCORRECT_MODE); return; } selectDevice(); @@ -217,7 +217,7 @@ final class DeviceSelectAction extends HdmiCecFeatureAction { if (!mIsCec20) { sendSetStreamPath(); } - invokeCallbackAndFinish(HdmiControlManager.RESULT_SUCCESS); + finishWithCallback(HdmiControlManager.RESULT_SUCCESS); } private void sendSetStreamPath() { @@ -228,15 +228,4 @@ final class DeviceSelectAction extends HdmiCecFeatureAction { sendCommand(HdmiCecMessageBuilder.buildSetStreamPath( getSourceAddress(), mTarget.getPhysicalAddress())); } - - private void invokeCallbackAndFinish(int result) { - if (mCallback != null) { - try { - mCallback.onComplete(result); - } catch (RemoteException e) { - Slog.e(TAG, "Callback failed:" + e); - } - } - finish(); - } } diff --git a/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java b/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java index 2da698be56be..2e1ff038931d 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java @@ -15,9 +15,11 @@ */ package com.android.server.hdmi; +import android.hardware.hdmi.IHdmiControlCallback; import android.os.Handler; import android.os.Looper; import android.os.Message; +import android.os.RemoteException; import android.util.Pair; import android.util.Slog; @@ -25,6 +27,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.server.hdmi.HdmiControlService.DevicePollingCallback; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; /** @@ -61,7 +64,20 @@ abstract class HdmiCecFeatureAction { private ArrayList<Pair<HdmiCecFeatureAction, Runnable>> mOnFinishedCallbacks; + final List<IHdmiControlCallback> mCallbacks = new ArrayList<>(); + HdmiCecFeatureAction(HdmiCecLocalDevice source) { + this(source, new ArrayList<>()); + } + + HdmiCecFeatureAction(HdmiCecLocalDevice source, IHdmiControlCallback callback) { + this(source, Arrays.asList(callback)); + } + + HdmiCecFeatureAction(HdmiCecLocalDevice source, List<IHdmiControlCallback> callbacks) { + for (IHdmiControlCallback callback : callbacks) { + addCallback(callback); + } mSource = source; mService = mSource.getService(); mActionTimer = createActionTimer(mService.getServiceLooper()); @@ -282,4 +298,26 @@ abstract class HdmiCecFeatureAction { } mOnFinishedCallbacks.add(Pair.create(action, runnable)); } + + protected void finishWithCallback(int returnCode) { + invokeCallback(returnCode); + finish(); + } + + public void addCallback(IHdmiControlCallback callback) { + mCallbacks.add(callback); + } + + private void invokeCallback(int result) { + try { + for (IHdmiControlCallback callback : mCallbacks) { + if (callback == null) { + continue; + } + callback.onComplete(result); + } + } catch (RemoteException e) { + Slog.e(TAG, "Callback failed:" + e); + } + } } diff --git a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java index ea6e61582ea0..02b09b15b464 100644 --- a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java +++ b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java @@ -18,11 +18,8 @@ package com.android.server.hdmi; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiPlaybackClient.OneTouchPlayCallback; import android.hardware.hdmi.IHdmiControlCallback; -import android.os.RemoteException; import android.util.Slog; -import java.util.ArrayList; -import java.util.List; /** * Feature action that performs one touch play against TV/Display device. This action is initiated @@ -50,7 +47,6 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction { private static final int LOOP_COUNTER_MAX = 10; private final int mTargetAddress; - private final List<IHdmiControlCallback> mCallbacks = new ArrayList<>(); private int mPowerStatusCounter = 0; @@ -69,9 +65,8 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction { private OneTouchPlayAction(HdmiCecLocalDevice localDevice, int targetAddress, IHdmiControlCallback callback) { - super(localDevice); + super(localDevice, callback); mTargetAddress = targetAddress; - addCallback(callback); } @Override @@ -121,8 +116,7 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction { int status = cmd.getParams()[0]; if (status == HdmiControlManager.POWER_STATUS_ON) { broadcastActiveSource(); - invokeCallback(HdmiControlManager.RESULT_SUCCESS); - finish(); + finishWithCallback(HdmiControlManager.RESULT_SUCCESS); } return true; } @@ -140,26 +134,11 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction { addTimer(mState, HdmiConfig.TIMEOUT_MS); } else { // Couldn't wake up the TV for whatever reason. Report failure. - invokeCallback(HdmiControlManager.RESULT_TIMEOUT); - finish(); + finishWithCallback(HdmiControlManager.RESULT_TIMEOUT); } } } - public void addCallback(IHdmiControlCallback callback) { - mCallbacks.add(callback); - } - - private void invokeCallback(int result) { - try { - for (IHdmiControlCallback callback : mCallbacks) { - callback.onComplete(result); - } - } catch (RemoteException e) { - Slog.e(TAG, "Callback failed:" + e); - } - } - private boolean shouldTurnOnConnectedAudioSystem() { HdmiControlService service = mSource.mService; if (service.isAudioSystemDevice()) { @@ -170,4 +149,5 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction { HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE); return sendStandbyOnSleep.equals(HdmiControlManager.POWER_CONTROL_MODE_BROADCAST); } + } diff --git a/services/core/java/com/android/server/hdmi/RoutingControlAction.java b/services/core/java/com/android/server/hdmi/RoutingControlAction.java index 6c147ed5e6d6..b9404e407b88 100644 --- a/services/core/java/com/android/server/hdmi/RoutingControlAction.java +++ b/services/core/java/com/android/server/hdmi/RoutingControlAction.java @@ -16,11 +16,9 @@ package com.android.server.hdmi; -import android.annotation.Nullable; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.IHdmiControlCallback; -import android.os.RemoteException; import android.util.Slog; import com.android.server.hdmi.HdmiControlService.SendMessageCallback; @@ -66,15 +64,12 @@ final class RoutingControlAction extends HdmiCecFeatureAction { // <Inactive Source> command. private final boolean mNotifyInputChange; - @Nullable private final IHdmiControlCallback mCallback; - // The latest routing path. Updated by each <Routing Information> from CEC switches. private int mCurrentRoutingPath; RoutingControlAction(HdmiCecLocalDevice localDevice, int path, boolean queryDevicePowerStatus, IHdmiControlCallback callback) { - super(localDevice); - mCallback = callback; + super(localDevice, callback); mCurrentRoutingPath = path; mQueryDevicePowerStatus = queryDevicePowerStatus; // Callback is non-null when routing control action is brought up by binder API. Use @@ -147,11 +142,6 @@ final class RoutingControlAction extends HdmiCecFeatureAction { mCurrentRoutingPath)); } - private void finishWithCallback(int result) { - invokeCallback(result); - finish(); - } - @Override public void handleTimerEvent(int timeoutState) { if (mState != timeoutState || mState == STATE_NONE) { @@ -202,15 +192,4 @@ final class RoutingControlAction extends HdmiCecFeatureAction { finishWithCallback(HdmiControlManager.RESULT_SUCCESS); } } - - private void invokeCallback(int result) { - if (mCallback == null) { - return; - } - try { - mCallback.onComplete(result); - } catch (RemoteException e) { - // Do nothing. - } - } } diff --git a/services/core/java/com/android/server/hdmi/SystemAudioAction.java b/services/core/java/com/android/server/hdmi/SystemAudioAction.java index a5477e865c40..978c25d0a8c6 100644 --- a/services/core/java/com/android/server/hdmi/SystemAudioAction.java +++ b/services/core/java/com/android/server/hdmi/SystemAudioAction.java @@ -16,13 +16,11 @@ package com.android.server.hdmi; -import android.annotation.Nullable; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.IHdmiControlCallback; import android.hardware.tv.cec.V1_0.SendMessageResult; -import android.os.RemoteException; -import android.util.Slog; + import java.util.List; /** @@ -49,8 +47,6 @@ abstract class SystemAudioAction extends HdmiCecFeatureAction { // The target audio status of the action, whether to enable the system audio mode or not. protected boolean mTargetAudioStatus; - @Nullable private final IHdmiControlCallback mCallback; - private int mSendRetryCount = 0; /** @@ -64,11 +60,10 @@ abstract class SystemAudioAction extends HdmiCecFeatureAction { */ SystemAudioAction(HdmiCecLocalDevice source, int avrAddress, boolean targetStatus, IHdmiControlCallback callback) { - super(source); + super(source, callback); HdmiUtils.verifyAddressType(avrAddress, HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM); mAvrLogicalAddress = avrAddress; mTargetAudioStatus = targetStatus; - mCallback = callback; } // Seq #27 @@ -174,7 +169,7 @@ abstract class SystemAudioAction extends HdmiCecFeatureAction { } protected void startAudioStatusAction() { - addAndStartAction(new SystemAudioStatusAction(tv(), mAvrLogicalAddress, mCallback)); + addAndStartAction(new SystemAudioStatusAction(tv(), mAvrLogicalAddress, mCallbacks)); finish(); } @@ -194,17 +189,4 @@ abstract class SystemAudioAction extends HdmiCecFeatureAction { return; } } - - // TODO: if IHdmiControlCallback is general to other FeatureAction, - // move it into FeatureAction. - protected void finishWithCallback(int returnCode) { - if (mCallback != null) { - try { - mCallback.onComplete(returnCode); - } catch (RemoteException e) { - Slog.e(TAG, "Failed to invoke callback.", e); - } - } - finish(); - } } diff --git a/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java b/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java index 5d913d12b79f..b4af540b96f5 100644 --- a/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java +++ b/services/core/java/com/android/server/hdmi/SystemAudioStatusAction.java @@ -16,14 +16,14 @@ package com.android.server.hdmi; -import android.annotation.Nullable; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.IHdmiControlCallback; import android.hardware.tv.cec.V1_0.SendMessageResult; -import android.os.RemoteException; -import android.util.Slog; + import com.android.server.hdmi.HdmiControlService.SendMessageCallback; +import java.util.List; + /** * Action to update audio status (volume or mute) of audio amplifier */ @@ -34,13 +34,17 @@ final class SystemAudioStatusAction extends HdmiCecFeatureAction { private static final int STATE_WAIT_FOR_REPORT_AUDIO_STATUS = 1; private final int mAvrAddress; - @Nullable private final IHdmiControlCallback mCallback; + + SystemAudioStatusAction( + HdmiCecLocalDevice source, int avrAddress, List<IHdmiControlCallback> callbacks) { + super(source, callbacks); + mAvrAddress = avrAddress; + } SystemAudioStatusAction(HdmiCecLocalDevice source, int avrAddress, IHdmiControlCallback callback) { - super(source); + super(source, callback); mAvrAddress = avrAddress; - mCallback = callback; } @Override @@ -97,17 +101,6 @@ final class SystemAudioStatusAction extends HdmiCecFeatureAction { finishWithCallback(HdmiControlManager.RESULT_SUCCESS); } - private void finishWithCallback(int returnCode) { - if (mCallback != null) { - try { - mCallback.onComplete(returnCode); - } catch (RemoteException e) { - Slog.e(TAG, "Failed to invoke callback.", e); - } - } - finish(); - } - @Override void handleTimerEvent(int state) { if (mState != state) { |