Loading core/java/android/hardware/hdmi/HdmiTvClient.java +18 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ import android.hardware.hdmi.HdmiTimerRecordSources.TimerRecordSource; import android.os.RemoteException; import android.util.Log; import java.util.Collections; import java.util.List; import libcore.util.EmptyArray; /** Loading Loading @@ -149,6 +152,21 @@ public final class HdmiTvClient extends HdmiClient { }; } /** * Returns all the CEC devices connected to TV. * * @return list of {@link HdmiDeviceInfo} for connected CEC devices. * Empty list is returned if there is none. */ public List<HdmiDeviceInfo> getDeviceList() { try { return mService.getDeviceList(); } catch (RemoteException e) { Log.e("TAG", "Failed to call getDeviceList():", e); return Collections.<HdmiDeviceInfo>emptyList(); } } /** * Set system audio volume * Loading core/java/android/hardware/hdmi/IHdmiControlService.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ interface IHdmiControlService { void setSystemAudioMute(boolean mute); void setInputChangeListener(IHdmiInputChangeListener listener); List<HdmiDeviceInfo> getInputDevices(); List<HdmiDeviceInfo> getDeviceList(); void sendVendorCommand(int deviceType, int targetAddress, in byte[] params, boolean hasVendorId); void addVendorCommandListener(IHdmiVendorCommandListener listener, int deviceType); Loading services/core/java/com/android/server/hdmi/ActiveSourceHandler.java +3 −2 Original line number Diff line number Diff line Loading @@ -57,8 +57,9 @@ final class ActiveSourceHandler { * Handles the incoming active source command. * * @param newActive new active source information * @param deviceType device type of the new active source */ void process(ActiveSource newActive) { void process(ActiveSource newActive, int deviceType) { // Seq #17 HdmiCecLocalDeviceTv tv = mSource; ActiveSource activeSource = tv.getActiveSource(); Loading @@ -68,7 +69,7 @@ final class ActiveSourceHandler { } HdmiDeviceInfo device = mService.getDeviceInfo(newActive.logicalAddress); if (device == null) { tv.startNewDeviceAction(newActive); tv.startNewDeviceAction(newActive, deviceType); } if (!tv.isProhibitMode()) { Loading services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +33 −13 Original line number Diff line number Diff line Loading @@ -110,6 +110,9 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { // If true, TV wakes itself up when receiving <Text/Image View On>. private boolean mAutoWakeup; // List of the logical address of local CEC devices. Unmodifiable, thread-safe. private List<Integer> mLocalDeviceAddresses; private final HdmiCecStandbyModeHandler mStandbyHandler; // If true, do not do routing control/send active source for internal source. Loading Loading @@ -141,10 +144,22 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { mSkipRoutingControl = (reason == HdmiControlService.INITIATED_BY_WAKE_UP_MESSAGE); launchRoutingControl(reason != HdmiControlService.INITIATED_BY_ENABLE_CEC && reason != HdmiControlService.INITIATED_BY_BOOT_UP); mLocalDeviceAddresses = initLocalDeviceAddresses(); launchDeviceDiscovery(); startQueuedActions(); } @ServiceThreadOnly private List<Integer> initLocalDeviceAddresses() { assertRunOnServiceThread(); List<Integer> addresses = new ArrayList<>(); for (HdmiCecLocalDevice device : mService.getAllLocalDevices()) { addresses.add(device.getDeviceInfo().getLogicalAddress()); } return Collections.unmodifiableList(addresses); } @Override @ServiceThreadOnly protected int getPreferredAddress() { Loading Loading @@ -390,11 +405,12 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { assertRunOnServiceThread(); int logicalAddress = message.getSource(); int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams()); if (getCecDeviceInfo(logicalAddress) == null) { HdmiDeviceInfo info = getCecDeviceInfo(logicalAddress); if (info == null) { handleNewDeviceAtTheTailOfActivePath(physicalAddress); } else { ActiveSource activeSource = ActiveSource.of(logicalAddress, physicalAddress); ActiveSourceHandler.create(this, null).process(activeSource); ActiveSourceHandler.create(this, null).process(activeSource, info.getDeviceType()); } return true; } Loading Loading @@ -484,7 +500,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { if (!isInDeviceList(address, path)) { handleNewDeviceAtTheTailOfActivePath(path); } startNewDeviceAction(ActiveSource.of(address, path)); startNewDeviceAction(ActiveSource.of(address, path), type); return true; } Loading Loading @@ -520,7 +536,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { return false; } void startNewDeviceAction(ActiveSource activeSource) { void startNewDeviceAction(ActiveSource activeSource, int deviceType) { for (NewDeviceAction action : getActions(NewDeviceAction.class)) { // If there is new device action which has the same logical address and path // ignore new request. Loading @@ -536,7 +552,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { } addAndStartAction(new NewDeviceAction(this, activeSource.logicalAddress, activeSource.physicalAddress)); activeSource.physicalAddress, deviceType)); } private void handleNewDeviceAtTheTailOfActivePath(int path) { Loading Loading @@ -1195,15 +1211,8 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { } } @ServiceThreadOnly private boolean isLocalDeviceAddress(int address) { assertRunOnServiceThread(); for (HdmiCecLocalDevice device : mService.getAllLocalDevices()) { if (device.isAddressOf(address)) { return true; } } return false; return mLocalDeviceAddresses.contains(address); } @ServiceThreadOnly Loading Loading @@ -1253,6 +1262,17 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { } } List<HdmiDeviceInfo> getSafeCecDevicesLocked() { ArrayList<HdmiDeviceInfo> infoList = new ArrayList<>(); for (HdmiDeviceInfo info : mSafeAllDeviceInfos) { if (isLocalDeviceAddress(info.getLogicalAddress())) { continue; } infoList.add(info); } return infoList; } /** * Called when a device is newly added or a new device is detected or * existing device is updated. Loading services/core/java/com/android/server/hdmi/HdmiControlService.java +13 −0 Original line number Diff line number Diff line Loading @@ -1232,6 +1232,19 @@ public final class HdmiControlService extends SystemService { } } // Returns all the CEC devices on the bus including system audio, switch, // even those of reserved type. @Override public List<HdmiDeviceInfo> getDeviceList() { enforceAccessPermission(); HdmiCecLocalDeviceTv tv = tv(); synchronized (mLock) { return (tv == null) ? Collections.<HdmiDeviceInfo>emptyList() : tv.getSafeCecDevicesLocked(); } } @Override public void setSystemAudioVolume(final int oldIndex, final int newIndex, final int maxIndex) { Loading Loading
core/java/android/hardware/hdmi/HdmiTvClient.java +18 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ import android.hardware.hdmi.HdmiTimerRecordSources.TimerRecordSource; import android.os.RemoteException; import android.util.Log; import java.util.Collections; import java.util.List; import libcore.util.EmptyArray; /** Loading Loading @@ -149,6 +152,21 @@ public final class HdmiTvClient extends HdmiClient { }; } /** * Returns all the CEC devices connected to TV. * * @return list of {@link HdmiDeviceInfo} for connected CEC devices. * Empty list is returned if there is none. */ public List<HdmiDeviceInfo> getDeviceList() { try { return mService.getDeviceList(); } catch (RemoteException e) { Log.e("TAG", "Failed to call getDeviceList():", e); return Collections.<HdmiDeviceInfo>emptyList(); } } /** * Set system audio volume * Loading
core/java/android/hardware/hdmi/IHdmiControlService.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ interface IHdmiControlService { void setSystemAudioMute(boolean mute); void setInputChangeListener(IHdmiInputChangeListener listener); List<HdmiDeviceInfo> getInputDevices(); List<HdmiDeviceInfo> getDeviceList(); void sendVendorCommand(int deviceType, int targetAddress, in byte[] params, boolean hasVendorId); void addVendorCommandListener(IHdmiVendorCommandListener listener, int deviceType); Loading
services/core/java/com/android/server/hdmi/ActiveSourceHandler.java +3 −2 Original line number Diff line number Diff line Loading @@ -57,8 +57,9 @@ final class ActiveSourceHandler { * Handles the incoming active source command. * * @param newActive new active source information * @param deviceType device type of the new active source */ void process(ActiveSource newActive) { void process(ActiveSource newActive, int deviceType) { // Seq #17 HdmiCecLocalDeviceTv tv = mSource; ActiveSource activeSource = tv.getActiveSource(); Loading @@ -68,7 +69,7 @@ final class ActiveSourceHandler { } HdmiDeviceInfo device = mService.getDeviceInfo(newActive.logicalAddress); if (device == null) { tv.startNewDeviceAction(newActive); tv.startNewDeviceAction(newActive, deviceType); } if (!tv.isProhibitMode()) { Loading
services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +33 −13 Original line number Diff line number Diff line Loading @@ -110,6 +110,9 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { // If true, TV wakes itself up when receiving <Text/Image View On>. private boolean mAutoWakeup; // List of the logical address of local CEC devices. Unmodifiable, thread-safe. private List<Integer> mLocalDeviceAddresses; private final HdmiCecStandbyModeHandler mStandbyHandler; // If true, do not do routing control/send active source for internal source. Loading Loading @@ -141,10 +144,22 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { mSkipRoutingControl = (reason == HdmiControlService.INITIATED_BY_WAKE_UP_MESSAGE); launchRoutingControl(reason != HdmiControlService.INITIATED_BY_ENABLE_CEC && reason != HdmiControlService.INITIATED_BY_BOOT_UP); mLocalDeviceAddresses = initLocalDeviceAddresses(); launchDeviceDiscovery(); startQueuedActions(); } @ServiceThreadOnly private List<Integer> initLocalDeviceAddresses() { assertRunOnServiceThread(); List<Integer> addresses = new ArrayList<>(); for (HdmiCecLocalDevice device : mService.getAllLocalDevices()) { addresses.add(device.getDeviceInfo().getLogicalAddress()); } return Collections.unmodifiableList(addresses); } @Override @ServiceThreadOnly protected int getPreferredAddress() { Loading Loading @@ -390,11 +405,12 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { assertRunOnServiceThread(); int logicalAddress = message.getSource(); int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams()); if (getCecDeviceInfo(logicalAddress) == null) { HdmiDeviceInfo info = getCecDeviceInfo(logicalAddress); if (info == null) { handleNewDeviceAtTheTailOfActivePath(physicalAddress); } else { ActiveSource activeSource = ActiveSource.of(logicalAddress, physicalAddress); ActiveSourceHandler.create(this, null).process(activeSource); ActiveSourceHandler.create(this, null).process(activeSource, info.getDeviceType()); } return true; } Loading Loading @@ -484,7 +500,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { if (!isInDeviceList(address, path)) { handleNewDeviceAtTheTailOfActivePath(path); } startNewDeviceAction(ActiveSource.of(address, path)); startNewDeviceAction(ActiveSource.of(address, path), type); return true; } Loading Loading @@ -520,7 +536,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { return false; } void startNewDeviceAction(ActiveSource activeSource) { void startNewDeviceAction(ActiveSource activeSource, int deviceType) { for (NewDeviceAction action : getActions(NewDeviceAction.class)) { // If there is new device action which has the same logical address and path // ignore new request. Loading @@ -536,7 +552,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { } addAndStartAction(new NewDeviceAction(this, activeSource.logicalAddress, activeSource.physicalAddress)); activeSource.physicalAddress, deviceType)); } private void handleNewDeviceAtTheTailOfActivePath(int path) { Loading Loading @@ -1195,15 +1211,8 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { } } @ServiceThreadOnly private boolean isLocalDeviceAddress(int address) { assertRunOnServiceThread(); for (HdmiCecLocalDevice device : mService.getAllLocalDevices()) { if (device.isAddressOf(address)) { return true; } } return false; return mLocalDeviceAddresses.contains(address); } @ServiceThreadOnly Loading Loading @@ -1253,6 +1262,17 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { } } List<HdmiDeviceInfo> getSafeCecDevicesLocked() { ArrayList<HdmiDeviceInfo> infoList = new ArrayList<>(); for (HdmiDeviceInfo info : mSafeAllDeviceInfos) { if (isLocalDeviceAddress(info.getLogicalAddress())) { continue; } infoList.add(info); } return infoList; } /** * Called when a device is newly added or a new device is detected or * existing device is updated. Loading
services/core/java/com/android/server/hdmi/HdmiControlService.java +13 −0 Original line number Diff line number Diff line Loading @@ -1232,6 +1232,19 @@ public final class HdmiControlService extends SystemService { } } // Returns all the CEC devices on the bus including system audio, switch, // even those of reserved type. @Override public List<HdmiDeviceInfo> getDeviceList() { enforceAccessPermission(); HdmiCecLocalDeviceTv tv = tv(); synchronized (mLock) { return (tv == null) ? Collections.<HdmiDeviceInfo>emptyList() : tv.getSafeCecDevicesLocked(); } } @Override public void setSystemAudioVolume(final int oldIndex, final int newIndex, final int maxIndex) { Loading