Loading services/core/java/com/android/server/hdmi/ActiveSourceHandler.java +4 −1 Original line number Diff line number Diff line Loading @@ -67,7 +67,10 @@ final class ActiveSourceHandler { } HdmiCecDeviceInfo device = mService.getDeviceInfo(deviceLogicalAddress); if (device == null) { // TODO: Start new device action (Device Discovery) sequence 5. // "New device action" initiated by <Active Source> does not require // "Routing change action". mService.addAndStartAction(new NewDeviceAction(mService, mSourceAddress, deviceLogicalAddress, routingPath, false)); } if (!mService.isInPresetInstallationMode()) { Loading services/core/java/com/android/server/hdmi/DeviceDiscoveryAction.java +1 −4 Original line number Diff line number Diff line Loading @@ -55,9 +55,6 @@ final class DeviceDiscoveryAction extends FeatureAction { private static final int DEVICE_POLLING_RETRY = 1; // TODO: Move this to common place private static final int INVALID_PHYSICAL_ADDRESS = 0xFFFF; /** * Interface used to report result of device discovery. */ Loading @@ -75,7 +72,7 @@ final class DeviceDiscoveryAction extends FeatureAction { private static final class DeviceInfo { private final int mLogicalAddress; private int mPhysicalAddress = INVALID_PHYSICAL_ADDRESS; private int mPhysicalAddress = HdmiConstants.INVALID_PHYSICAL_ADDRESS; private int mVendorId = HdmiCec.UNKNOWN_VENDOR_ID; private String mDisplayName = ""; private int mDeviceType = HdmiCec.DEVICE_INACTIVE; Loading services/core/java/com/android/server/hdmi/DeviceSelectAction.java +4 −0 Original line number Diff line number Diff line Loading @@ -220,4 +220,8 @@ final class DeviceSelectAction extends FeatureAction { Slog.e(TAG, "Callback failed:" + e); } } int getTargetAddress() { return mTarget.getLogicalAddress(); } } services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +7 −1 Original line number Diff line number Diff line Loading @@ -76,7 +76,7 @@ abstract class HdmiCecLocalDevice { return onMessage(message); } protected boolean onMessage(HdmiCecMessage message) { protected final boolean onMessage(HdmiCecMessage message) { switch (message.getOpcode()) { case HdmiCec.MESSAGE_GET_MENU_LANGUAGE: return handleGetMenuLanguage(message); Loading @@ -88,6 +88,8 @@ abstract class HdmiCecLocalDevice { return handleGiveDeviceVendorId(); case HdmiCec.MESSAGE_GET_CEC_VERSION: return handleGetCecVersion(message); case HdmiCec.MESSAGE_REPORT_PHYSICAL_ADDRESS: return handleReportPhysicalAddress(message); default: return false; } Loading Loading @@ -143,6 +145,10 @@ abstract class HdmiCecLocalDevice { return false; } protected boolean handleReportPhysicalAddress(HdmiCecMessage message) { return false; } final void handleAddressAllocated(int logicalAddress) { mAddress = mPreferredAddress = logicalAddress; onAddressAllocated(logicalAddress); Loading services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +39 −15 Original line number Diff line number Diff line Loading @@ -16,13 +16,15 @@ package com.android.server.hdmi; import android.hardware.hdmi.IHdmiControlCallback; import android.hardware.hdmi.HdmiCec; import android.hardware.hdmi.HdmiCecDeviceInfo; import android.hardware.hdmi.HdmiCecMessage; import android.hardware.hdmi.IHdmiControlCallback; import android.os.RemoteException; import android.util.Slog; import com.android.server.hdmi.DeviceDiscoveryAction.DeviceDiscoveryCallback; import java.util.Collections; import java.util.List; import java.util.Locale; Loading @@ -46,20 +48,10 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { mService.sendCecCommand(HdmiCecMessageBuilder.buildDeviceVendorIdCommand( mAddress, mService.getVendorId())); mService.launchDeviceDiscovery(mAddress); launchDeviceDiscovery(); // TODO: Start routing control action, device discovery action. } @Override protected boolean onMessage(HdmiCecMessage message) { switch (message.getOpcode()) { case HdmiCec.MESSAGE_REPORT_PHYSICAL_ADDRESS: return handleReportPhysicalAddress(message); default: return super.onMessage(message); } } /** * Performs the action 'device select', or 'one touch play' initiated by TV. * Loading Loading @@ -98,7 +90,8 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { return true; } private boolean handleReportPhysicalAddress(HdmiCecMessage message) { @Override protected boolean handleReportPhysicalAddress(HdmiCecMessage message) { // Ignore if [Device Discovery Action] is going on. if (mService.hasAction(DeviceDiscoveryAction.class)) { Slog.i(TAG, "Ignore unrecognizable <Report Physical Address> " Loading @@ -107,9 +100,15 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { } int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams()); mService.addAndStartAction(new NewDeviceAction(mService, mAddress, message.getSource(), physicalAddress)); int logicalAddress = message.getSource(); // If it is a new device and connected to the tail of active path, // it's required to change routing path. boolean requireRoutingChange = !mService.isInDeviceList(physicalAddress, logicalAddress) && mService.isTailOfActivePath(physicalAddress); mService.addAndStartAction(new NewDeviceAction(mService, mAddress, message.getSource(), physicalAddress, requireRoutingChange)); return true; } Loading Loading @@ -137,4 +136,29 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { HdmiConstants.ABORT_REFUSED)); return true; } private void launchDeviceDiscovery() { mService.clearAllDeviceInfo(); // TODO: Move the following callback to HdmiLocalDeviceTv. DeviceDiscoveryAction action = new DeviceDiscoveryAction(mService, mAddress, new DeviceDiscoveryCallback() { @Override public void onDeviceDiscoveryDone(List<HdmiCecDeviceInfo> deviceInfos) { for (HdmiCecDeviceInfo info : deviceInfos) { mService.addCecDevice(info); } // Since we removed all devices when it's start and // device discovery action does not poll local devices, // we should put device info of local device manually here for (HdmiCecLocalDevice device : mService.getAllLocalDevices()) { mService.addCecDevice(device.getDeviceInfo()); } mService.addAndStartAction(new HotplugDetectionAction(mService, mAddress)); } }); mService.addAndStartAction(action); } } Loading
services/core/java/com/android/server/hdmi/ActiveSourceHandler.java +4 −1 Original line number Diff line number Diff line Loading @@ -67,7 +67,10 @@ final class ActiveSourceHandler { } HdmiCecDeviceInfo device = mService.getDeviceInfo(deviceLogicalAddress); if (device == null) { // TODO: Start new device action (Device Discovery) sequence 5. // "New device action" initiated by <Active Source> does not require // "Routing change action". mService.addAndStartAction(new NewDeviceAction(mService, mSourceAddress, deviceLogicalAddress, routingPath, false)); } if (!mService.isInPresetInstallationMode()) { Loading
services/core/java/com/android/server/hdmi/DeviceDiscoveryAction.java +1 −4 Original line number Diff line number Diff line Loading @@ -55,9 +55,6 @@ final class DeviceDiscoveryAction extends FeatureAction { private static final int DEVICE_POLLING_RETRY = 1; // TODO: Move this to common place private static final int INVALID_PHYSICAL_ADDRESS = 0xFFFF; /** * Interface used to report result of device discovery. */ Loading @@ -75,7 +72,7 @@ final class DeviceDiscoveryAction extends FeatureAction { private static final class DeviceInfo { private final int mLogicalAddress; private int mPhysicalAddress = INVALID_PHYSICAL_ADDRESS; private int mPhysicalAddress = HdmiConstants.INVALID_PHYSICAL_ADDRESS; private int mVendorId = HdmiCec.UNKNOWN_VENDOR_ID; private String mDisplayName = ""; private int mDeviceType = HdmiCec.DEVICE_INACTIVE; Loading
services/core/java/com/android/server/hdmi/DeviceSelectAction.java +4 −0 Original line number Diff line number Diff line Loading @@ -220,4 +220,8 @@ final class DeviceSelectAction extends FeatureAction { Slog.e(TAG, "Callback failed:" + e); } } int getTargetAddress() { return mTarget.getLogicalAddress(); } }
services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +7 −1 Original line number Diff line number Diff line Loading @@ -76,7 +76,7 @@ abstract class HdmiCecLocalDevice { return onMessage(message); } protected boolean onMessage(HdmiCecMessage message) { protected final boolean onMessage(HdmiCecMessage message) { switch (message.getOpcode()) { case HdmiCec.MESSAGE_GET_MENU_LANGUAGE: return handleGetMenuLanguage(message); Loading @@ -88,6 +88,8 @@ abstract class HdmiCecLocalDevice { return handleGiveDeviceVendorId(); case HdmiCec.MESSAGE_GET_CEC_VERSION: return handleGetCecVersion(message); case HdmiCec.MESSAGE_REPORT_PHYSICAL_ADDRESS: return handleReportPhysicalAddress(message); default: return false; } Loading Loading @@ -143,6 +145,10 @@ abstract class HdmiCecLocalDevice { return false; } protected boolean handleReportPhysicalAddress(HdmiCecMessage message) { return false; } final void handleAddressAllocated(int logicalAddress) { mAddress = mPreferredAddress = logicalAddress; onAddressAllocated(logicalAddress); Loading
services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +39 −15 Original line number Diff line number Diff line Loading @@ -16,13 +16,15 @@ package com.android.server.hdmi; import android.hardware.hdmi.IHdmiControlCallback; import android.hardware.hdmi.HdmiCec; import android.hardware.hdmi.HdmiCecDeviceInfo; import android.hardware.hdmi.HdmiCecMessage; import android.hardware.hdmi.IHdmiControlCallback; import android.os.RemoteException; import android.util.Slog; import com.android.server.hdmi.DeviceDiscoveryAction.DeviceDiscoveryCallback; import java.util.Collections; import java.util.List; import java.util.Locale; Loading @@ -46,20 +48,10 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { mService.sendCecCommand(HdmiCecMessageBuilder.buildDeviceVendorIdCommand( mAddress, mService.getVendorId())); mService.launchDeviceDiscovery(mAddress); launchDeviceDiscovery(); // TODO: Start routing control action, device discovery action. } @Override protected boolean onMessage(HdmiCecMessage message) { switch (message.getOpcode()) { case HdmiCec.MESSAGE_REPORT_PHYSICAL_ADDRESS: return handleReportPhysicalAddress(message); default: return super.onMessage(message); } } /** * Performs the action 'device select', or 'one touch play' initiated by TV. * Loading Loading @@ -98,7 +90,8 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { return true; } private boolean handleReportPhysicalAddress(HdmiCecMessage message) { @Override protected boolean handleReportPhysicalAddress(HdmiCecMessage message) { // Ignore if [Device Discovery Action] is going on. if (mService.hasAction(DeviceDiscoveryAction.class)) { Slog.i(TAG, "Ignore unrecognizable <Report Physical Address> " Loading @@ -107,9 +100,15 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { } int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams()); mService.addAndStartAction(new NewDeviceAction(mService, mAddress, message.getSource(), physicalAddress)); int logicalAddress = message.getSource(); // If it is a new device and connected to the tail of active path, // it's required to change routing path. boolean requireRoutingChange = !mService.isInDeviceList(physicalAddress, logicalAddress) && mService.isTailOfActivePath(physicalAddress); mService.addAndStartAction(new NewDeviceAction(mService, mAddress, message.getSource(), physicalAddress, requireRoutingChange)); return true; } Loading Loading @@ -137,4 +136,29 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { HdmiConstants.ABORT_REFUSED)); return true; } private void launchDeviceDiscovery() { mService.clearAllDeviceInfo(); // TODO: Move the following callback to HdmiLocalDeviceTv. DeviceDiscoveryAction action = new DeviceDiscoveryAction(mService, mAddress, new DeviceDiscoveryCallback() { @Override public void onDeviceDiscoveryDone(List<HdmiCecDeviceInfo> deviceInfos) { for (HdmiCecDeviceInfo info : deviceInfos) { mService.addCecDevice(info); } // Since we removed all devices when it's start and // device discovery action does not poll local devices, // we should put device info of local device manually here for (HdmiCecLocalDevice device : mService.getAllLocalDevices()) { mService.addCecDevice(device.getDeviceInfo()); } mService.addAndStartAction(new HotplugDetectionAction(mService, mAddress)); } }); mService.addAndStartAction(action); } }