summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java14
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java28
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java38
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java28
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiControlService.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java15
6 files changed, 66 insertions, 64 deletions
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
index c384b5434bce..9349ea54e4ee 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
@@ -1030,10 +1030,20 @@ abstract class HdmiCecLocalDevice extends HdmiLocalDevice {
}
@ServiceThreadOnly
+ void addAndStartAction(final HdmiCecFeatureAction action, final boolean remove) {
+ assertRunOnServiceThread();
+ if (hasAction(action.getClass()) && remove) {
+ // If the action is currently running, remove it and restart it.
+ Slog.i(TAG, action.getClass().getName() + " is in progress. Restarting.");
+ removeAction(action.getClass());
+ }
+ addAndStartAction(action);
+ }
+
+ @ServiceThreadOnly
void startNewAvbAudioStatusAction(int targetAddress) {
assertRunOnServiceThread();
- removeAction(AbsoluteVolumeAudioStatusAction.class);
- addAndStartAction(new AbsoluteVolumeAudioStatusAction(this, targetAddress));
+ addAndStartAction(new AbsoluteVolumeAudioStatusAction(this, targetAddress), true);
}
@ServiceThreadOnly
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
index 1e90ab279d32..510e4f5e1868 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java
@@ -317,11 +317,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
if ((systemAudioOnPowerOnProp == ALWAYS_SYSTEM_AUDIO_CONTROL_ON_POWER_ON)
|| ((systemAudioOnPowerOnProp == USE_LAST_STATE_SYSTEM_AUDIO_CONTROL_ON_POWER_ON)
&& lastSystemAudioControlStatus && isSystemAudioControlFeatureEnabled())) {
- if (hasAction(SystemAudioInitiationActionFromAvr.class)) {
- Slog.i(TAG, "SystemAudioInitiationActionFromAvr is in progress. Restarting.");
- removeAction(SystemAudioInitiationActionFromAvr.class);
- }
- addAndStartAction(new SystemAudioInitiationActionFromAvr(this));
+ addAndStartAction(new SystemAudioInitiationActionFromAvr(this), true);
}
}
@@ -457,6 +453,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
HdmiLogger.debug("AVR device is not directly connected with TV");
return Constants.ABORT_NOT_IN_CORRECT_MODE;
} else {
+ // Action has been removed if it existed, do not attempt to remove again before start.
addAndStartAction(new ArcInitiationActionFromAvr(this));
return Constants.HANDLED;
}
@@ -477,11 +474,9 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
&& !getActions(ArcTerminationActionFromAvr.class).get(0).mCallbacks.isEmpty()) {
IHdmiControlCallback callback =
getActions(ArcTerminationActionFromAvr.class).get(0).mCallbacks.get(0);
- removeAction(ArcTerminationActionFromAvr.class);
- addAndStartAction(new ArcTerminationActionFromAvr(this, callback));
+ addAndStartAction(new ArcTerminationActionFromAvr(this, callback), true);
} else {
- removeAction(ArcTerminationActionFromAvr.class);
- addAndStartAction(new ArcTerminationActionFromAvr(this));
+ addAndStartAction(new ArcTerminationActionFromAvr(this), true);
}
return Constants.HANDLED;
}
@@ -1036,11 +1031,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
void onSystemAudioControlFeatureSupportChanged(boolean enabled) {
setSystemAudioControlFeatureEnabled(enabled);
if (enabled) {
- if (hasAction(SystemAudioInitiationActionFromAvr.class)) {
- Slog.i(TAG, "SystemAudioInitiationActionFromAvr is in progress. Restarting.");
- removeAction(SystemAudioInitiationActionFromAvr.class);
- }
- addAndStartAction(new SystemAudioInitiationActionFromAvr(this));
+ addAndStartAction(new SystemAudioInitiationActionFromAvr(this), true);
}
}
@@ -1221,8 +1212,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
removeAction(ArcTerminationActionFromAvr.class);
if (SystemProperties.getBoolean(Constants.PROPERTY_ARC_SUPPORT, true)
&& isDirectConnectToTv() && !isArcEnabled()) {
- removeAction(ArcInitiationActionFromAvr.class);
- addAndStartAction(new ArcInitiationActionFromAvr(this));
+ addAndStartAction(new ArcInitiationActionFromAvr(this), true);
}
}
@@ -1367,10 +1357,6 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
if (mService.isDeviceDiscoveryHandledByPlayback()) {
return;
}
- if (hasAction(DeviceDiscoveryAction.class)) {
- Slog.i(TAG, "Device Discovery Action is in progress. Restarting.");
- removeAction(DeviceDiscoveryAction.class);
- }
DeviceDiscoveryAction action = new DeviceDiscoveryAction(this,
new DeviceDiscoveryCallback() {
@Override
@@ -1380,7 +1366,7 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource {
}
}
});
- addAndStartAction(action);
+ addAndStartAction(action, true);
}
@Override
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
index 0b667fc10880..86abbc403e50 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java
@@ -21,7 +21,6 @@ import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
-import android.hardware.display.DeviceProductInfo;
import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiDeviceInfo;
import android.hardware.hdmi.IHdmiControlCallback;
@@ -32,7 +31,6 @@ import android.os.PowerManager;
import android.os.SystemProperties;
import android.sysprop.HdmiProperties;
import android.util.Slog;
-import android.view.Display;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.LocalePicker;
@@ -151,10 +149,6 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
private void launchDeviceDiscovery() {
assertRunOnServiceThread();
clearDeviceInfoList();
- if (hasAction(DeviceDiscoveryAction.class)) {
- Slog.i(TAG, "Device Discovery Action is in progress. Restarting.");
- removeAction(DeviceDiscoveryAction.class);
- }
DeviceDiscoveryAction action = new DeviceDiscoveryAction(this,
new DeviceDiscoveryAction.DeviceDiscoveryCallback() {
@Override
@@ -163,25 +157,21 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
mService.getHdmiCecNetwork().addCecDevice(info);
}
- // Since we removed all devices when it starts and device discovery action
- // does not poll local devices, we should put device info of local device
- // manually here.
+ // Since we removed all devices when it starts and device discovery
+ // action does not poll local devices, we should put device info of
+ // local device manually here.
for (HdmiCecLocalDevice device : mService.getAllCecLocalDevices()) {
mService.getHdmiCecNetwork().addCecDevice(device.getDeviceInfo());
}
- List<HotplugDetectionAction> hotplugActions =
- getActions(HotplugDetectionAction.class);
- if (hotplugActions.isEmpty()) {
+ if (!hasAction(HotplugDetectionAction.class)) {
addAndStartAction(
- new HotplugDetectionAction(HdmiCecLocalDevicePlayback.this));
+ new HotplugDetectionAction(
+ HdmiCecLocalDevicePlayback.this));
}
if (mService.isHdmiControlEnhancedBehaviorFlagEnabled()) {
- List<PowerStatusMonitorActionFromPlayback>
- powerStatusMonitorActionsFromPlayback =
- getActions(PowerStatusMonitorActionFromPlayback.class);
- if (powerStatusMonitorActionsFromPlayback.isEmpty()) {
+ if (!hasAction(PowerStatusMonitorActionFromPlayback.class)) {
addAndStartAction(
new PowerStatusMonitorActionFromPlayback(
HdmiCecLocalDevicePlayback.this));
@@ -189,7 +179,7 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
}
}
});
- addAndStartAction(action);
+ addAndStartAction(action, true);
}
@Override
@@ -235,8 +225,16 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource {
invokeCallback(callback, HdmiControlManager.RESULT_INCORRECT_MODE);
return;
}
- removeAction(DeviceSelectActionFromPlayback.class);
- addAndStartAction(new DeviceSelectActionFromPlayback(this, targetDevice, callback));
+ List<DeviceSelectActionFromPlayback> actions = getActions(
+ DeviceSelectActionFromPlayback.class);
+ if (!actions.isEmpty()) {
+ DeviceSelectActionFromPlayback action = actions.get(0);
+ if (action.getTargetAddress() == targetDevice.getLogicalAddress()) {
+ return;
+ }
+ }
+ addAndStartAction(new DeviceSelectActionFromPlayback(this, targetDevice, callback),
+ true);
}
@Override
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index 424102cbdd89..3d6d34bf9911 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -220,10 +220,6 @@ public class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
List<HdmiCecMessage> bufferedActiveSource = mDelayedMessageBuffer
.getBufferedMessagesWithOpcode(Constants.MESSAGE_ACTIVE_SOURCE);
if (bufferedActiveSource.isEmpty()) {
- if (hasAction(RequestActiveSourceAction.class)) {
- Slog.i(TAG, "RequestActiveSourceAction is in progress. Restarting.");
- removeAction(RequestActiveSourceAction.class);
- }
addAndStartAction(new RequestActiveSourceAction(this, new IHdmiControlCallback.Stub() {
@Override
public void onComplete(int result) {
@@ -231,7 +227,7 @@ public class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
launchRoutingControl(routingForBootup);
}
}
- }));
+ }), true);
} else {
addCecDeviceForBufferedActiveSource(bufferedActiveSource.get(0));
}
@@ -328,8 +324,15 @@ public class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
invokeCallback(callback, HdmiControlManager.RESULT_INCORRECT_MODE);
return;
}
- removeAction(DeviceSelectActionFromTv.class);
- addAndStartAction(new DeviceSelectActionFromTv(this, targetDevice, callback));
+ List<DeviceSelectActionFromTv> actions = getActions(DeviceSelectActionFromTv.class);
+ if (!actions.isEmpty()) {
+ DeviceSelectActionFromTv action = actions.get(0);
+ if (action.getTargetAddress() == targetDevice.getLogicalAddress()) {
+ return;
+ }
+ }
+ addAndStartAction(new DeviceSelectActionFromTv(this, targetDevice, callback),
+ true);
}
@ServiceThreadOnly
@@ -475,9 +478,8 @@ public class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
HdmiCecMessageBuilder.buildRoutingChange(
getDeviceInfo().getLogicalAddress(), oldPath, newPath);
mService.sendCecCommand(routingChange);
- removeAction(RoutingControlAction.class);
addAndStartAction(
- new RoutingControlAction(this, newPath, callback));
+ new RoutingControlAction(this, newPath, callback), true);
}
@ServiceThreadOnly
@@ -801,16 +803,12 @@ public class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
mSelectRequestBuffer.process();
resetSelectRequestBuffer();
- List<HotplugDetectionAction> hotplugActions
- = getActions(HotplugDetectionAction.class);
- if (hotplugActions.isEmpty()) {
+ if (!hasAction(HotplugDetectionAction.class)) {
addAndStartAction(
new HotplugDetectionAction(HdmiCecLocalDeviceTv.this));
}
- List<PowerStatusMonitorAction> powerStatusActions
- = getActions(PowerStatusMonitorAction.class);
- if (powerStatusActions.isEmpty()) {
+ if (!hasAction(PowerStatusMonitorAction.class)) {
addAndStartAction(
new PowerStatusMonitorAction(HdmiCecLocalDeviceTv.this));
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index 35ef18b144e7..bd8b67b9d626 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -17,7 +17,6 @@
package com.android.server.hdmi;
import static android.media.tv.flags.Flags.hdmiControlEnhancedBehavior;
-
import static android.hardware.hdmi.HdmiControlManager.DEVICE_EVENT_ADD_DEVICE;
import static android.hardware.hdmi.HdmiControlManager.DEVICE_EVENT_REMOVE_DEVICE;
import static android.hardware.hdmi.HdmiControlManager.EARC_FEATURE_DISABLED;
@@ -107,7 +106,6 @@ import android.util.Slog;
import android.util.SparseArray;
import android.view.Display;
import android.view.KeyEvent;
-import android.view.WindowManager;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
@@ -1218,9 +1216,6 @@ public class HdmiControlService extends SystemService {
audioSystem.terminateSystemAudioMode();
}
if (isArcEnabled) {
- if (audioSystem.hasAction(ArcTerminationActionFromAvr.class)) {
- audioSystem.removeAction(ArcTerminationActionFromAvr.class);
- }
audioSystem.addAndStartAction(new ArcTerminationActionFromAvr(audioSystem,
new IHdmiControlCallback.Stub() {
@Override
@@ -1228,7 +1223,7 @@ public class HdmiControlService extends SystemService {
mAddressAllocated = false;
initializeCecLocalDevices(INITIATED_BY_SOUNDBAR_MODE);
}
- }));
+ }), true);
}
}
if (!isArcEnabled) {
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
index 02441648a589..4f551119b42e 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java
@@ -887,6 +887,21 @@ public class HdmiCecLocalDeviceAudioSystemTest {
systemAudioModeRequest_fromAudioSystem);
}
+ @Test
+ public void addAndStartAction_remove() throws Exception {
+ // utilize callback test to test if addAndStartAction(action, remove)
+ TestCallback callback = new TestCallback();
+
+ mHdmiCecLocalDeviceAudioSystem.setArcStatus(true);
+ mHdmiCecLocalDeviceAudioSystem.addAndStartAction(
+ new ArcTerminationActionFromAvr(mHdmiCecLocalDeviceAudioSystem, callback),
+ true);
+
+ mTestLooper.dispatchAll();
+ assertThat(mHdmiCecLocalDeviceAudioSystem.getActions(
+ ArcTerminationActionFromAvr.class).size()).isEqualTo(1);
+ }
+
private static class TestCallback extends IHdmiControlCallback.Stub {
private final ArrayList<Integer> mCallbackResult = new ArrayList<Integer>();