From 0e9610ad3c8ca5d8b9481a49dd3bfee0d320ea0e Mon Sep 17 00:00:00 2001 From: Aravind Angadi Date: Mon, 25 Jan 2021 14:42:43 +0530 Subject: [PATCH] CEC: Move finishWithCallback method to FeatureAction Bug: 159901363 Test: None Change-Id: Idd30ec162136c8b32e8cee1181c6e3e733aa9966 Merged-In: Idd30ec162136c8b32e8cee1181c6e3e733aa9966 --- .../server/hdmi/DevicePowerStatusAction.java | 27 ++---------- .../server/hdmi/DeviceSelectAction.java | 44 +++++++------------ .../server/hdmi/HdmiCecFeatureAction.java | 38 ++++++++++++++++ .../server/hdmi/OneTouchPlayAction.java | 27 ++---------- .../server/hdmi/RoutingControlAction.java | 23 +--------- .../server/hdmi/SystemAudioAction.java | 24 ++-------- .../server/hdmi/SystemAudioStatusAction.java | 27 +++++------- 7 files changed, 73 insertions(+), 137 deletions(-) diff --git a/services/core/java/com/android/server/hdmi/DevicePowerStatusAction.java b/services/core/java/com/android/server/hdmi/DevicePowerStatusAction.java index b52ab76660d7d..313e9dfee218d 100644 --- a/services/core/java/com/android/server/hdmi/DevicePowerStatusAction.java +++ b/services/core/java/com/android/server/hdmi/DevicePowerStatusAction.java @@ -20,11 +20,8 @@ import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiPlaybackClient; import android.hardware.hdmi.HdmiPlaybackClient.DisplayStatusCallback; import android.hardware.hdmi.IHdmiControlCallback; -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 @@ -40,7 +37,6 @@ final class DevicePowerStatusAction extends HdmiCecFeatureAction { private static final int STATE_WAITING_FOR_REPORT_POWER_STATUS = 1; private final int mTargetAddress; - private final List mCallbacks = new ArrayList<>(); static DevicePowerStatusAction create(HdmiCecLocalDevice source, int targetAddress, IHdmiControlCallback callback) { @@ -53,9 +49,8 @@ final class DevicePowerStatusAction extends HdmiCecFeatureAction { private DevicePowerStatusAction(HdmiCecLocalDevice localDevice, int targetAddress, IHdmiControlCallback callback) { - super(localDevice); + super(localDevice, callback); mTargetAddress = targetAddress; - addCallback(callback); } @Override @@ -79,8 +74,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; @@ -93,22 +87,7 @@ final class DevicePowerStatusAction extends HdmiCecFeatureAction { } if (state == STATE_WAITING_FOR_REPORT_POWER_STATUS) { // 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 c684a56ec5d48..24b99cdcaaa51 100644 --- a/services/core/java/com/android/server/hdmi/DeviceSelectAction.java +++ b/services/core/java/com/android/server/hdmi/DeviceSelectAction.java @@ -21,8 +21,8 @@ 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.server.hdmi.HdmiControlService.SendMessageCallback; /** @@ -59,7 +59,6 @@ final class DeviceSelectAction extends HdmiCecFeatureAction { private static final int STATE_WAIT_FOR_DEVICE_POWER_ON = 3; private final HdmiDeviceInfo mTarget; - private final IHdmiControlCallback mCallback; private final HdmiCecMessage mGivePowerStatus; private int mPowerStatusCounter = 0; @@ -73,8 +72,7 @@ final class DeviceSelectAction extends HdmiCecFeatureAction { */ public DeviceSelectAction(HdmiCecLocalDeviceTv source, HdmiDeviceInfo target, IHdmiControlCallback callback) { - super(source); - mCallback = callback; + super(source, callback); mTarget = target; mGivePowerStatus = HdmiCecMessageBuilder.buildGiveDevicePowerStatus( getSourceAddress(), getTargetAddress()); @@ -92,16 +90,17 @@ final class DeviceSelectAction extends HdmiCecFeatureAction { } private void queryDevicePowerStatus() { - sendCommand(mGivePowerStatus, new SendMessageCallback() { - @Override - public void onSendCompleted(int error) { - if (error != SendMessageResult.SUCCESS) { - invokeCallback(HdmiControlManager.RESULT_COMMUNICATION_FAILED); - finish(); - return; - } - } - }); + sendCommand( + mGivePowerStatus, + new SendMessageCallback() { + @Override + public void onSendCompleted(int error) { + if (error != SendMessageResult.SUCCESS) { + finishWithCallback(HdmiControlManager.RESULT_COMMUNICATION_FAILED); + return; + } + } + }); mState = STATE_WAIT_FOR_REPORT_POWER_STATUS; addTimer(mState, HdmiConfig.TIMEOUT_MS); } @@ -174,8 +173,7 @@ final class DeviceSelectAction extends HdmiCecFeatureAction { tv().setActivePath(mTarget.getPhysicalAddress()); sendCommand(HdmiCecMessageBuilder.buildSetStreamPath( getSourceAddress(), mTarget.getPhysicalAddress())); - invokeCallback(HdmiControlManager.RESULT_SUCCESS); - finish(); + finishWithCallback(HdmiControlManager.RESULT_SUCCESS); } @Override @@ -187,8 +185,7 @@ final class DeviceSelectAction extends HdmiCecFeatureAction { switch (mState) { case STATE_WAIT_FOR_REPORT_POWER_STATUS: if (tv().isPowerStandbyOrTransient()) { - invokeCallback(HdmiControlManager.RESULT_INCORRECT_MODE); - finish(); + finishWithCallback(HdmiControlManager.RESULT_INCORRECT_MODE); return; } sendSetStreamPath(); @@ -200,15 +197,4 @@ final class DeviceSelectAction extends HdmiCecFeatureAction { break; } } - - private void invokeCallback(int result) { - if (mCallback == null) { - return; - } - try { - mCallback.onComplete(result); - } catch (RemoteException e) { - Slog.e(TAG, "Callback failed:" + e); - } - } } diff --git a/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java b/services/core/java/com/android/server/hdmi/HdmiCecFeatureAction.java index 2da698be56be4..2e1ff038931d2 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> mOnFinishedCallbacks; + final List mCallbacks = new ArrayList<>(); + HdmiCecFeatureAction(HdmiCecLocalDevice source) { + this(source, new ArrayList<>()); + } + + HdmiCecFeatureAction(HdmiCecLocalDevice source, IHdmiControlCallback callback) { + this(source, Arrays.asList(callback)); + } + + HdmiCecFeatureAction(HdmiCecLocalDevice source, List 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 4962af176f18a..083aecd5a7469 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 mCallbacks = new ArrayList<>(); private int mPowerStatusCounter = 0; @@ -67,9 +63,8 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction { private OneTouchPlayAction(HdmiCecLocalDevice localDevice, int targetAddress, IHdmiControlCallback callback) { - super(localDevice); + super(localDevice, callback); mTargetAddress = targetAddress; - addCallback(callback); } @Override @@ -113,8 +108,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; } @@ -132,23 +126,8 @@ 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); - } - } } diff --git a/services/core/java/com/android/server/hdmi/RoutingControlAction.java b/services/core/java/com/android/server/hdmi/RoutingControlAction.java index 9a52c19c27713..aff9630a19042 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 { // command. private final boolean mNotifyInputChange; - @Nullable private final IHdmiControlCallback mCallback; - // The latest routing path. Updated by each 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) { @@ -200,15 +190,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 a5477e865c402..978c25d0a8c60 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 5d913d12b79ff..b4af540b96f5a 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 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) {