summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/hdmi/ActiveSourceHandler.java2
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java20
-rw-r--r--services/core/java/com/android/server/hdmi/NewDeviceAction.java38
3 files changed, 41 insertions, 19 deletions
diff --git a/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java b/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java
index 2c8c1c1..432424b 100644
--- a/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java
+++ b/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java
@@ -66,7 +66,7 @@ final class ActiveSourceHandler {
}
HdmiCecDeviceInfo device = mService.getDeviceInfo(activeAddress);
if (device == null) {
- tv.addAndStartAction(new NewDeviceAction(tv, activeAddress, activePath));
+ tv.startNewDeviceAction(activeAddress, activePath);
}
int currentActive = tv.getActiveSource();
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index bc68882..44b0f28 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -399,10 +399,28 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
if (!isInDeviceList(path, address)) {
handleNewDeviceAtTheTailOfActivePath(path);
}
- addAndStartAction(new NewDeviceAction(this, address, path));
+ startNewDeviceAction(address, path);
return true;
}
+ void startNewDeviceAction(int address, int path) {
+ for (NewDeviceAction action : getActions(NewDeviceAction.class)) {
+ // If there is new device action which has the same logical address and path
+ // ignore new request.
+ // NewDeviceAction is created whenever it receives <Report Physical Address>.
+ // And there is a chance starting NewDeviceAction for the same source.
+ // Usually, new device sends <Report Physical Address> when it's plugged
+ // in. However, TV can detect a new device from HotPlugDetectionAction,
+ // which sends <Give Physical Address> to the source for newly detected
+ // device.
+ if (action.isActionOf(address, path)) {
+ return;
+ }
+ }
+
+ addAndStartAction(new NewDeviceAction(this, address, path));
+ }
+
private void handleNewDeviceAtTheTailOfActivePath(int path) {
// Seq #22
if (isTailOfActivePath(path, getActivePath())) {
diff --git a/services/core/java/com/android/server/hdmi/NewDeviceAction.java b/services/core/java/com/android/server/hdmi/NewDeviceAction.java
index 80deaab..f89e299 100644
--- a/services/core/java/com/android/server/hdmi/NewDeviceAction.java
+++ b/services/core/java/com/android/server/hdmi/NewDeviceAction.java
@@ -56,7 +56,6 @@ final class NewDeviceAction extends FeatureAction {
* @param source {@link HdmiCecLocalDevice} instance
* @param deviceLogicalAddress logical address of the device in interest
* @param devicePhysicalAddress physical address of the device in interest
- * @param requireRoutingChange whether to initiate routing change or not
*/
NewDeviceAction(HdmiCecLocalDevice source, int deviceLogicalAddress,
int devicePhysicalAddress) {
@@ -68,18 +67,6 @@ final class NewDeviceAction extends FeatureAction {
@Override
public boolean start() {
- if (HdmiUtils.getTypeFromAddress(getSourceAddress())
- == HdmiCecDeviceInfo.DEVICE_AUDIO_SYSTEM) {
- if (tv().getAvrDeviceInfo() == null) {
- // TODO: Start system audio initiation action
- }
-
- if (shouldTryArcInitiation()) {
- addAndStartAction(new RequestArcInitiationAction(localDevice(),
- mDeviceLogicalAddress));
- }
- }
-
mState = STATE_WAITING_FOR_SET_OSD_NAME;
if (mayProcessCommandIfCached(mDeviceLogicalAddress, Constants.MESSAGE_SET_OSD_NAME)) {
return true;
@@ -91,10 +78,6 @@ final class NewDeviceAction extends FeatureAction {
return true;
}
- private boolean shouldTryArcInitiation() {
- return tv().isConnectedToArcPort(mDevicePhysicalAddress) && tv().isArcFeatureEnabled();
- }
-
@Override
public boolean processCommand(HdmiCecMessage cmd) {
// For the logical device in interest, we want two more pieces of information -
@@ -172,6 +155,23 @@ final class NewDeviceAction extends FeatureAction {
mDeviceLogicalAddress, mDevicePhysicalAddress,
HdmiUtils.getTypeFromAddress(mDeviceLogicalAddress),
mVendorId, mDisplayName));
+
+ if (HdmiUtils.getTypeFromAddress(mDeviceLogicalAddress)
+ == HdmiCecDeviceInfo.DEVICE_AUDIO_SYSTEM) {
+ if (tv().getSystemAudioMode()) {
+ addAndStartAction(new SystemAudioAutoInitiationAction(localDevice(),
+ mDeviceLogicalAddress));
+ }
+
+ if (shouldTryArcInitiation()) {
+ addAndStartAction(new RequestArcInitiationAction(localDevice(),
+ mDeviceLogicalAddress));
+ }
+ }
+ }
+
+ private boolean shouldTryArcInitiation() {
+ return tv().isConnectedToArcPort(mDevicePhysicalAddress) && tv().isArcFeatureEnabled();
}
@Override
@@ -188,4 +188,8 @@ final class NewDeviceAction extends FeatureAction {
finish();
}
}
+
+ boolean isActionOf(int address, int path) {
+ return (mDeviceLogicalAddress == address) && (mDevicePhysicalAddress == path);
+ }
}