From e151e6084343f771cdb992f92698ef2acd23d2f9 Mon Sep 17 00:00:00 2001 From: Amy Zhang Date: Wed, 27 May 2020 16:14:50 -0700 Subject: [PATCH] Expose necessary SystemApi as test API for CEC CTS This CL annotates multiple APIs in the HdmiControlManager as Test APIs. Also creates a Test api wrapper for aidl interface IHdmiControlService. HdmiPortInfo is the param under test that is also annotated as Test API. Test: atest android.hardware.hdmi.cts Bug: 155113872 Change-Id: I58b483eaaa5fe08f90415a7e044c30a28dc7d7c2 --- api/test-current.txt | 124 +++++ .../android/hardware/hdmi/HdmiClient.java | 4 +- .../hardware/hdmi/HdmiControlManager.java | 27 +- .../hdmi/HdmiControlServiceWrapper.java | 469 ++++++++++++++++++ .../android/hardware/hdmi/HdmiPortInfo.java | 9 + .../hardware/hdmi/HdmiSwitchClient.java | 5 +- 6 files changed, 632 insertions(+), 6 deletions(-) create mode 100644 core/java/android/hardware/hdmi/HdmiControlServiceWrapper.java diff --git a/api/test-current.txt b/api/test-current.txt index ed4c9b13dacd5..66b5015902f0b 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -1298,6 +1298,130 @@ package android.hardware.display { } +package android.hardware.hdmi { + + public final class HdmiControlManager { + method @Nullable public android.hardware.hdmi.HdmiSwitchClient getSwitchClient(); + method @RequiresPermission("android.permission.HDMI_CEC") public void setStandbyMode(boolean); + field public static final String ACTION_OSD_MESSAGE = "android.hardware.hdmi.action.OSD_MESSAGE"; + field public static final int AVR_VOLUME_MUTED = 101; // 0x65 + field public static final int CLEAR_TIMER_STATUS_CEC_DISABLE = 162; // 0xa2 + field public static final int CLEAR_TIMER_STATUS_CHECK_RECORDER_CONNECTION = 160; // 0xa0 + field public static final int CLEAR_TIMER_STATUS_FAIL_TO_CLEAR_SELECTED_SOURCE = 161; // 0xa1 + field public static final int CLEAR_TIMER_STATUS_TIMER_CLEARED = 128; // 0x80 + field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_NO_INFO_AVAILABLE = 2; // 0x2 + field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_NO_MATCHING = 1; // 0x1 + field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_RECORDING = 0; // 0x0 + field public static final int CONTROL_STATE_CHANGED_REASON_SETTING = 1; // 0x1 + field public static final int CONTROL_STATE_CHANGED_REASON_STANDBY = 3; // 0x3 + field public static final int CONTROL_STATE_CHANGED_REASON_START = 0; // 0x0 + field public static final int CONTROL_STATE_CHANGED_REASON_WAKEUP = 2; // 0x2 + field public static final int DEVICE_EVENT_ADD_DEVICE = 1; // 0x1 + field public static final int DEVICE_EVENT_REMOVE_DEVICE = 2; // 0x2 + field public static final int DEVICE_EVENT_UPDATE_DEVICE = 3; // 0x3 + field public static final String EXTRA_MESSAGE_EXTRA_PARAM1 = "android.hardware.hdmi.extra.MESSAGE_EXTRA_PARAM1"; + field public static final String EXTRA_MESSAGE_ID = "android.hardware.hdmi.extra.MESSAGE_ID"; + field public static final int ONE_TOUCH_RECORD_ALREADY_RECORDING = 18; // 0x12 + field public static final int ONE_TOUCH_RECORD_CEC_DISABLED = 51; // 0x33 + field public static final int ONE_TOUCH_RECORD_CHECK_RECORDER_CONNECTION = 49; // 0x31 + field public static final int ONE_TOUCH_RECORD_DISALLOW_TO_COPY = 13; // 0xd + field public static final int ONE_TOUCH_RECORD_DISALLOW_TO_FUTHER_COPIES = 14; // 0xe + field public static final int ONE_TOUCH_RECORD_FAIL_TO_RECORD_DISPLAYED_SCREEN = 50; // 0x32 + field public static final int ONE_TOUCH_RECORD_INVALID_EXTERNAL_PHYSICAL_ADDRESS = 10; // 0xa + field public static final int ONE_TOUCH_RECORD_INVALID_EXTERNAL_PLUG_NUMBER = 9; // 0x9 + field public static final int ONE_TOUCH_RECORD_MEDIA_PROBLEM = 21; // 0x15 + field public static final int ONE_TOUCH_RECORD_MEDIA_PROTECTED = 19; // 0x13 + field public static final int ONE_TOUCH_RECORD_NOT_ENOUGH_SPACE = 22; // 0x16 + field public static final int ONE_TOUCH_RECORD_NO_MEDIA = 16; // 0x10 + field public static final int ONE_TOUCH_RECORD_NO_OR_INSUFFICIENT_CA_ENTITLEMENTS = 12; // 0xc + field public static final int ONE_TOUCH_RECORD_NO_SOURCE_SIGNAL = 20; // 0x14 + field public static final int ONE_TOUCH_RECORD_OTHER_REASON = 31; // 0x1f + field public static final int ONE_TOUCH_RECORD_PARENT_LOCK_ON = 23; // 0x17 + field public static final int ONE_TOUCH_RECORD_PLAYING = 17; // 0x11 + field public static final int ONE_TOUCH_RECORD_PREVIOUS_RECORDING_IN_PROGRESS = 48; // 0x30 + field public static final int ONE_TOUCH_RECORD_RECORDING_ALREADY_TERMINATED = 27; // 0x1b + field public static final int ONE_TOUCH_RECORD_RECORDING_ANALOGUE_SERVICE = 3; // 0x3 + field public static final int ONE_TOUCH_RECORD_RECORDING_CURRENTLY_SELECTED_SOURCE = 1; // 0x1 + field public static final int ONE_TOUCH_RECORD_RECORDING_DIGITAL_SERVICE = 2; // 0x2 + field public static final int ONE_TOUCH_RECORD_RECORDING_EXTERNAL_INPUT = 4; // 0x4 + field public static final int ONE_TOUCH_RECORD_RECORDING_TERMINATED_NORMALLY = 26; // 0x1a + field public static final int ONE_TOUCH_RECORD_UNABLE_ANALOGUE_SERVICE = 6; // 0x6 + field public static final int ONE_TOUCH_RECORD_UNABLE_DIGITAL_SERVICE = 5; // 0x5 + field public static final int ONE_TOUCH_RECORD_UNABLE_SELECTED_SERVICE = 7; // 0x7 + field public static final int ONE_TOUCH_RECORD_UNSUPPORTED_CA = 11; // 0xb + field public static final int OSD_MESSAGE_ARC_CONNECTED_INVALID_PORT = 1; // 0x1 + field public static final int OSD_MESSAGE_AVR_VOLUME_CHANGED = 2; // 0x2 + field public static final int POWER_STATUS_ON = 0; // 0x0 + field public static final int POWER_STATUS_STANDBY = 1; // 0x1 + field public static final int POWER_STATUS_TRANSIENT_TO_ON = 2; // 0x2 + field public static final int POWER_STATUS_TRANSIENT_TO_STANDBY = 3; // 0x3 + field public static final int POWER_STATUS_UNKNOWN = -1; // 0xffffffff + field @Deprecated public static final int RESULT_ALREADY_IN_PROGRESS = 4; // 0x4 + field public static final int RESULT_COMMUNICATION_FAILED = 7; // 0x7 + field public static final int RESULT_EXCEPTION = 5; // 0x5 + field public static final int RESULT_INCORRECT_MODE = 6; // 0x6 + field public static final int RESULT_SOURCE_NOT_AVAILABLE = 2; // 0x2 + field public static final int RESULT_SUCCESS = 0; // 0x0 + field public static final int RESULT_TARGET_NOT_AVAILABLE = 3; // 0x3 + field public static final int RESULT_TIMEOUT = 1; // 0x1 + field public static final int TIMER_RECORDING_RESULT_EXTRA_CEC_DISABLED = 3; // 0x3 + field public static final int TIMER_RECORDING_RESULT_EXTRA_CHECK_RECORDER_CONNECTION = 1; // 0x1 + field public static final int TIMER_RECORDING_RESULT_EXTRA_FAIL_TO_RECORD_SELECTED_SOURCE = 2; // 0x2 + field public static final int TIMER_RECORDING_RESULT_EXTRA_NO_ERROR = 0; // 0x0 + field public static final int TIMER_RECORDING_TYPE_ANALOGUE = 2; // 0x2 + field public static final int TIMER_RECORDING_TYPE_DIGITAL = 1; // 0x1 + field public static final int TIMER_RECORDING_TYPE_EXTERNAL = 3; // 0x3 + field public static final int TIMER_STATUS_MEDIA_INFO_NOT_PRESENT = 2; // 0x2 + field public static final int TIMER_STATUS_MEDIA_INFO_PRESENT_NOT_PROTECTED = 0; // 0x0 + field public static final int TIMER_STATUS_MEDIA_INFO_PRESENT_PROTECTED = 1; // 0x1 + field public static final int TIMER_STATUS_NOT_PROGRAMMED_CA_NOT_SUPPORTED = 6; // 0x6 + field public static final int TIMER_STATUS_NOT_PROGRAMMED_CLOCK_FAILURE = 10; // 0xa + field public static final int TIMER_STATUS_NOT_PROGRAMMED_DATE_OUT_OF_RANGE = 2; // 0x2 + field public static final int TIMER_STATUS_NOT_PROGRAMMED_DUPLICATED = 14; // 0xe + field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_EXTERNAL_PHYSICAL_NUMBER = 5; // 0x5 + field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_EXTERNAL_PLUG_NUMBER = 4; // 0x4 + field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_SEQUENCE = 3; // 0x3 + field public static final int TIMER_STATUS_NOT_PROGRAMMED_NO_CA_ENTITLEMENTS = 7; // 0x7 + field public static final int TIMER_STATUS_NOT_PROGRAMMED_NO_FREE_TIME = 1; // 0x1 + field public static final int TIMER_STATUS_NOT_PROGRAMMED_PARENTAL_LOCK_ON = 9; // 0x9 + field public static final int TIMER_STATUS_NOT_PROGRAMMED_UNSUPPORTED_RESOLUTION = 8; // 0x8 + field public static final int TIMER_STATUS_PROGRAMMED_INFO_ENOUGH_SPACE = 8; // 0x8 + field public static final int TIMER_STATUS_PROGRAMMED_INFO_MIGHT_NOT_ENOUGH_SPACE = 11; // 0xb + field public static final int TIMER_STATUS_PROGRAMMED_INFO_NOT_ENOUGH_SPACE = 9; // 0x9 + field public static final int TIMER_STATUS_PROGRAMMED_INFO_NO_MEDIA_INFO = 10; // 0xa + } + + public final class HdmiControlServiceWrapper { + ctor public HdmiControlServiceWrapper(); + method @NonNull public android.hardware.hdmi.HdmiControlManager createHdmiControlManager(); + method @BinderThread public void setDeviceTypes(@NonNull int[]); + method @BinderThread public void setPortInfo(@NonNull java.util.List); + field public static final int DEVICE_PURE_CEC_SWITCH = 6; // 0x6 + } + + public final class HdmiPortInfo implements android.os.Parcelable { + ctor public HdmiPortInfo(int, int, int, boolean, boolean, boolean); + method public int describeContents(); + method public int getAddress(); + method public int getId(); + method public int getType(); + method public boolean isArcSupported(); + method public boolean isCecSupported(); + method public boolean isMhlSupported(); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + field public static final int PORT_INPUT = 0; // 0x0 + field public static final int PORT_OUTPUT = 1; // 0x1 + } + + public class HdmiSwitchClient { + method public int getDeviceType(); + method @NonNull public java.util.List getPortInfo(); + method public void sendKeyEvent(int, boolean); + method public void sendVendorCommand(int, byte[], boolean); + } + +} + package android.hardware.lights { public final class Light implements android.os.Parcelable { diff --git a/core/java/android/hardware/hdmi/HdmiClient.java b/core/java/android/hardware/hdmi/HdmiClient.java index bff8c39e8c563..a921215c6133e 100644 --- a/core/java/android/hardware/hdmi/HdmiClient.java +++ b/core/java/android/hardware/hdmi/HdmiClient.java @@ -1,6 +1,7 @@ package android.hardware.hdmi; import android.annotation.NonNull; +import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.hardware.hdmi.HdmiControlManager.VendorCommandListener; import android.os.RemoteException; @@ -84,7 +85,8 @@ public abstract class HdmiClient { * @param hasVendorId {@code true} if the command type will be <Vendor Command With ID>. * {@code false} if the command will be <Vendor Command> */ - public void sendVendorCommand(int targetAddress, byte[] params, boolean hasVendorId) { + public void sendVendorCommand(int targetAddress, + @SuppressLint("MissingNullability") byte[] params, boolean hasVendorId) { try { mService.sendVendorCommand(getDeviceType(), targetAddress, params, hasVendorId); } catch (RemoteException e) { diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java index 208406566e52b..1ce9b9c71c0e6 100644 --- a/core/java/android/hardware/hdmi/HdmiControlManager.java +++ b/core/java/android/hardware/hdmi/HdmiControlManager.java @@ -29,6 +29,7 @@ import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemService; +import android.annotation.TestApi; import android.content.Context; import android.content.pm.PackageManager; import android.os.Binder; @@ -57,6 +58,7 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi +@TestApi @SystemService(Context.HDMI_CONTROL_SERVICE) @RequiresFeature(PackageManager.FEATURE_HDMI_CEC) public final class HdmiControlManager { @@ -139,6 +141,8 @@ public final class HdmiControlManager { public static final int POWER_STATUS_TRANSIENT_TO_ON = 2; public static final int POWER_STATUS_TRANSIENT_TO_STANDBY = 3; + /** @hide */ + @SystemApi @IntDef ({ RESULT_SUCCESS, RESULT_TIMEOUT, @@ -400,8 +404,11 @@ public final class HdmiControlManager { * See {@link HdmiDeviceInfo#DEVICE_PLAYBACK} * See {@link HdmiDeviceInfo#DEVICE_TV} * See {@link HdmiDeviceInfo#DEVICE_AUDIO_SYSTEM} + * + * @hide */ @Nullable + @SystemApi @SuppressLint("Doclava125") public HdmiClient getClient(int type) { if (mService == null) { @@ -430,8 +437,11 @@ public final class HdmiControlManager { * system if the system is configured to host more than one type of HDMI-CEC logical devices. * * @return {@link HdmiPlaybackClient} instance. {@code null} on failure. + * + * @hide */ @Nullable + @SystemApi @SuppressLint("Doclava125") public HdmiPlaybackClient getPlaybackClient() { return (HdmiPlaybackClient) getClient(HdmiDeviceInfo.DEVICE_PLAYBACK); @@ -445,8 +455,11 @@ public final class HdmiControlManager { * system if the system is configured to host more than one type of HDMI-CEC logical devices. * * @return {@link HdmiTvClient} instance. {@code null} on failure. + * + * @hide */ @Nullable + @SystemApi @SuppressLint("Doclava125") public HdmiTvClient getTvClient() { return (HdmiTvClient) getClient(HdmiDeviceInfo.DEVICE_TV); @@ -478,10 +491,8 @@ public final class HdmiControlManager { * system if the system is configured to host more than one type of HDMI-CEC logical device. * * @return {@link HdmiSwitchClient} instance. {@code null} on failure. - * @hide */ @Nullable - @SystemApi @SuppressLint("Doclava125") public HdmiSwitchClient getSwitchClient() { return (HdmiSwitchClient) getClient(HdmiDeviceInfo.DEVICE_PURE_CEC_SWITCH); @@ -790,7 +801,10 @@ public final class HdmiControlManager { /** * Listener used to get hotplug event from HDMI port. + * + * @hide */ + @SystemApi public interface HotplugEventListener { void onReceived(HdmiHotplugEvent event); } @@ -840,7 +854,10 @@ public final class HdmiControlManager { /** * Listener used to get vendor-specific commands. + * + * @hide */ + @SystemApi public interface VendorCommandListener { /** * Called when a vendor command is received. @@ -879,7 +896,10 @@ public final class HdmiControlManager { * * @param listener {@link HotplugEventListener} instance * @see HdmiControlManager#removeHotplugEventListener(HotplugEventListener) + * + * @hide */ + @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void addHotplugEventListener(HotplugEventListener listener) { if (mService == null) { @@ -903,7 +923,10 @@ public final class HdmiControlManager { * Removes a listener to stop getting informed of {@link HdmiHotplugEvent}. * * @param listener {@link HotplugEventListener} instance to be removed + * + * @hide */ + @SystemApi @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void removeHotplugEventListener(HotplugEventListener listener) { if (mService == null) { diff --git a/core/java/android/hardware/hdmi/HdmiControlServiceWrapper.java b/core/java/android/hardware/hdmi/HdmiControlServiceWrapper.java new file mode 100644 index 0000000000000..02896351ea3a0 --- /dev/null +++ b/core/java/android/hardware/hdmi/HdmiControlServiceWrapper.java @@ -0,0 +1,469 @@ +/* + * Copyright 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.hdmi; + +import android.annotation.BinderThread; +import android.annotation.NonNull; +import android.annotation.TestApi; + +import java.util.List; + +/** + * A wrapper of the Binder interface that clients running in the application process + * will use to perform HDMI-CEC features by communicating with other devices + * on the bus. + * + * @hide + */ +@TestApi +public final class HdmiControlServiceWrapper { + + /** Pure CEC switch device type. */ + public static final int DEVICE_PURE_CEC_SWITCH = HdmiDeviceInfo.DEVICE_PURE_CEC_SWITCH; + + private List mInfoList = null; + private int[] mTypes = null; + + /** + * Create a new HdmiControlManager with the current HdmiControlService wrapper + * + * @return the created HdmiControlManager + */ + @NonNull + public HdmiControlManager createHdmiControlManager() { + return new HdmiControlManager(mInterface); + } + + private final IHdmiControlService mInterface = new IHdmiControlService.Stub() { + + @Override + public int[] getSupportedTypes() { + return HdmiControlServiceWrapper.this.getSupportedTypes(); + } + + @Override + public HdmiDeviceInfo getActiveSource() { + return HdmiControlServiceWrapper.this.getActiveSource(); + } + + @Override + public void oneTouchPlay(IHdmiControlCallback callback) { + HdmiControlServiceWrapper.this.oneTouchPlay(callback); + } + + @Override + public void queryDisplayStatus(IHdmiControlCallback callback) { + HdmiControlServiceWrapper.this.queryDisplayStatus(callback); + } + + @Override + public void addHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener) { + HdmiControlServiceWrapper.this.addHdmiControlStatusChangeListener(listener); + } + + @Override + public void removeHdmiControlStatusChangeListener( + IHdmiControlStatusChangeListener listener) { + HdmiControlServiceWrapper.this.removeHdmiControlStatusChangeListener(listener); + } + + @Override + public void addHotplugEventListener(IHdmiHotplugEventListener listener) { + HdmiControlServiceWrapper.this.addHotplugEventListener(listener); + } + + @Override + public void removeHotplugEventListener(IHdmiHotplugEventListener listener) { + HdmiControlServiceWrapper.this.removeHotplugEventListener(listener); + } + + @Override + public void addDeviceEventListener(IHdmiDeviceEventListener listener) { + HdmiControlServiceWrapper.this.addDeviceEventListener(listener); + } + + @Override + public void deviceSelect(int deviceId, IHdmiControlCallback callback) { + HdmiControlServiceWrapper.this.deviceSelect(deviceId, callback); + } + + @Override + public void portSelect(int portId, IHdmiControlCallback callback) { + HdmiControlServiceWrapper.this.portSelect(portId, callback); + } + + @Override + public void sendKeyEvent(int deviceType, int keyCode, boolean isPressed) { + HdmiControlServiceWrapper.this.sendKeyEvent(deviceType, keyCode, isPressed); + } + + @Override + public void sendVolumeKeyEvent(int deviceType, int keyCode, boolean isPressed) { + HdmiControlServiceWrapper.this.sendVolumeKeyEvent(deviceType, keyCode, isPressed); + } + + @Override + public List getPortInfo() { + return HdmiControlServiceWrapper.this.getPortInfo(); + } + + @Override + public boolean canChangeSystemAudioMode() { + return HdmiControlServiceWrapper.this.canChangeSystemAudioMode(); + } + + @Override + public boolean getSystemAudioMode() { + return HdmiControlServiceWrapper.this.getSystemAudioMode(); + } + + @Override + public int getPhysicalAddress() { + return HdmiControlServiceWrapper.this.getPhysicalAddress(); + } + + @Override + public void setSystemAudioMode(boolean enabled, IHdmiControlCallback callback) { + HdmiControlServiceWrapper.this.setSystemAudioMode(enabled, callback); + } + + @Override + public void addSystemAudioModeChangeListener(IHdmiSystemAudioModeChangeListener listener) { + HdmiControlServiceWrapper.this.addSystemAudioModeChangeListener(listener); + } + + @Override + public void removeSystemAudioModeChangeListener( + IHdmiSystemAudioModeChangeListener listener) { + HdmiControlServiceWrapper.this.removeSystemAudioModeChangeListener(listener); + } + + @Override + public void setArcMode(boolean enabled) { + HdmiControlServiceWrapper.this.setArcMode(enabled); + } + + @Override + public void setProhibitMode(boolean enabled) { + HdmiControlServiceWrapper.this.setProhibitMode(enabled); + } + + @Override + public void setSystemAudioVolume(int oldIndex, int newIndex, int maxIndex) { + HdmiControlServiceWrapper.this.setSystemAudioVolume(oldIndex, newIndex, maxIndex); + } + + @Override + public void setSystemAudioMute(boolean mute) { + HdmiControlServiceWrapper.this.setSystemAudioMute(mute); + } + + @Override + public void setInputChangeListener(IHdmiInputChangeListener listener) { + HdmiControlServiceWrapper.this.setInputChangeListener(listener); + } + + @Override + public List getInputDevices() { + return HdmiControlServiceWrapper.this.getInputDevices(); + } + + @Override + public List getDeviceList() { + return HdmiControlServiceWrapper.this.getDeviceList(); + } + + @Override + public void powerOffRemoteDevice(int logicalAddress, int powerStatus) { + HdmiControlServiceWrapper.this.powerOffRemoteDevice(logicalAddress, powerStatus); + } + + @Override + public void powerOnRemoteDevice(int logicalAddress, int powerStatus) { + HdmiControlServiceWrapper.this.powerOnRemoteDevice(logicalAddress, powerStatus); + } + + @Override + public void askRemoteDeviceToBecomeActiveSource(int physicalAddress) { + HdmiControlServiceWrapper.this.askRemoteDeviceToBecomeActiveSource(physicalAddress); + } + + @Override + public void sendVendorCommand(int deviceType, int targetAddress, byte[] params, + boolean hasVendorId) { + HdmiControlServiceWrapper.this.sendVendorCommand( + deviceType, targetAddress, params, hasVendorId); + } + + @Override + public void addVendorCommandListener(IHdmiVendorCommandListener listener, int deviceType) { + HdmiControlServiceWrapper.this.addVendorCommandListener(listener, deviceType); + } + + @Override + public void sendStandby(int deviceType, int deviceId) { + HdmiControlServiceWrapper.this.sendStandby(deviceType, deviceId); + } + + @Override + public void setHdmiRecordListener(IHdmiRecordListener callback) { + HdmiControlServiceWrapper.this.setHdmiRecordListener(callback); + } + + @Override + public void startOneTouchRecord(int recorderAddress, byte[] recordSource) { + HdmiControlServiceWrapper.this.startOneTouchRecord(recorderAddress, recordSource); + } + + @Override + public void stopOneTouchRecord(int recorderAddress) { + HdmiControlServiceWrapper.this.stopOneTouchRecord(recorderAddress); + } + + @Override + public void startTimerRecording(int recorderAddress, int sourceType, byte[] recordSource) { + HdmiControlServiceWrapper.this.startTimerRecording( + recorderAddress, sourceType, recordSource); + } + + @Override + public void clearTimerRecording(int recorderAddress, int sourceType, byte[] recordSource) { + HdmiControlServiceWrapper.this.clearTimerRecording( + recorderAddress, sourceType, recordSource); + } + + @Override + public void sendMhlVendorCommand(int portId, int offset, int length, byte[] data) { + HdmiControlServiceWrapper.this.sendMhlVendorCommand(portId, offset, length, data); + } + + @Override + public void addHdmiMhlVendorCommandListener(IHdmiMhlVendorCommandListener listener) { + HdmiControlServiceWrapper.this.addHdmiMhlVendorCommandListener(listener); + } + + @Override + public void setStandbyMode(boolean isStandbyModeOn) { + HdmiControlServiceWrapper.this.setStandbyMode(isStandbyModeOn); + } + + @Override + public void setHdmiCecVolumeControlEnabled(boolean isHdmiCecVolumeControlEnabled) { + HdmiControlServiceWrapper.this.setHdmiCecVolumeControlEnabled( + isHdmiCecVolumeControlEnabled); + } + + @Override + public boolean isHdmiCecVolumeControlEnabled() { + return HdmiControlServiceWrapper.this.isHdmiCecVolumeControlEnabled(); + } + + @Override + public void reportAudioStatus(int deviceType, int volume, int maxVolume, boolean isMute) { + HdmiControlServiceWrapper.this.reportAudioStatus(deviceType, volume, maxVolume, isMute); + } + + @Override + public void setSystemAudioModeOnForAudioOnlySource() { + HdmiControlServiceWrapper.this.setSystemAudioModeOnForAudioOnlySource(); + } + + @Override + public void addHdmiCecVolumeControlFeatureListener( + IHdmiCecVolumeControlFeatureListener listener) { + HdmiControlServiceWrapper.this.addHdmiCecVolumeControlFeatureListener(listener); + } + + @Override + public void removeHdmiCecVolumeControlFeatureListener( + IHdmiCecVolumeControlFeatureListener listener) { + HdmiControlServiceWrapper.this.removeHdmiCecVolumeControlFeatureListener(listener); + } + }; + + @BinderThread + public void setPortInfo(@NonNull List infoList) { + mInfoList = infoList; + } + + @BinderThread + public void setDeviceTypes(@NonNull int[] types) { + mTypes = types; + } + + /** @hide */ + public List getPortInfo() { + return mInfoList; + } + + /** @hide */ + public int[] getSupportedTypes() { + return mTypes; + } + + /** @hide */ + public HdmiDeviceInfo getActiveSource() { + return null; + } + + /** @hide */ + public void oneTouchPlay(IHdmiControlCallback callback) {} + + /** @hide */ + public void queryDisplayStatus(IHdmiControlCallback callback) {} + + /** @hide */ + public void addHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener) {} + + /** @hide */ + public void removeHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener) {} + + /** @hide */ + public void addHotplugEventListener(IHdmiHotplugEventListener listener) {} + + /** @hide */ + public void removeHotplugEventListener(IHdmiHotplugEventListener listener) {} + + /** @hide */ + public void addDeviceEventListener(IHdmiDeviceEventListener listener) {} + + /** @hide */ + public void deviceSelect(int deviceId, IHdmiControlCallback callback) {} + + /** @hide */ + public void portSelect(int portId, IHdmiControlCallback callback) {} + + /** @hide */ + public void sendKeyEvent(int deviceType, int keyCode, boolean isPressed) {} + + /** @hide */ + public void sendVolumeKeyEvent(int deviceType, int keyCode, boolean isPressed) {} + + /** @hide */ + public boolean canChangeSystemAudioMode() { + return true; + } + + /** @hide */ + public boolean getSystemAudioMode() { + return true; + } + + /** @hide */ + public int getPhysicalAddress() { + return 0xffff; + } + + /** @hide */ + public void setSystemAudioMode(boolean enabled, IHdmiControlCallback callback) {} + + /** @hide */ + public void addSystemAudioModeChangeListener(IHdmiSystemAudioModeChangeListener listener) {} + + /** @hide */ + public void removeSystemAudioModeChangeListener(IHdmiSystemAudioModeChangeListener listener) {} + + /** @hide */ + public void setArcMode(boolean enabled) {} + + /** @hide */ + public void setProhibitMode(boolean enabled) {} + + /** @hide */ + public void setSystemAudioVolume(int oldIndex, int newIndex, int maxIndex) {} + + /** @hide */ + public void setSystemAudioMute(boolean mute) {} + + /** @hide */ + public void setInputChangeListener(IHdmiInputChangeListener listener) {} + + /** @hide */ + public List getInputDevices() { + return null; + } + + /** @hide */ + public List getDeviceList() { + return null; + } + + /** @hide */ + public void powerOffRemoteDevice(int logicalAddress, int powerStatus) {} + + /** @hide */ + public void powerOnRemoteDevice(int logicalAddress, int powerStatus) {} + + /** @hide */ + public void askRemoteDeviceToBecomeActiveSource(int physicalAddress) {} + + /** @hide */ + public void sendVendorCommand(int deviceType, int targetAddress, byte[] params, + boolean hasVendorId) {} + + /** @hide */ + public void addVendorCommandListener(IHdmiVendorCommandListener listener, int deviceType) {} + + /** @hide */ + public void sendStandby(int deviceType, int deviceId) {} + + /** @hide */ + public void setHdmiRecordListener(IHdmiRecordListener callback) {} + + /** @hide */ + public void startOneTouchRecord(int recorderAddress, byte[] recordSource) {} + + /** @hide */ + public void stopOneTouchRecord(int recorderAddress) {} + + /** @hide */ + public void startTimerRecording(int recorderAddress, int sourceType, byte[] recordSource) {} + + /** @hide */ + public void clearTimerRecording(int recorderAddress, int sourceType, byte[] recordSource) {} + + /** @hide */ + public void sendMhlVendorCommand(int portId, int offset, int length, byte[] data) {} + + /** @hide */ + public void addHdmiMhlVendorCommandListener(IHdmiMhlVendorCommandListener listener) {} + + /** @hide */ + public void setStandbyMode(boolean isStandbyModeOn) {} + + /** @hide */ + public void setHdmiCecVolumeControlEnabled(boolean isHdmiCecVolumeControlEnabled) {} + + /** @hide */ + public boolean isHdmiCecVolumeControlEnabled() { + return true; + } + + /** @hide */ + public void reportAudioStatus(int deviceType, int volume, int maxVolume, boolean isMute) {} + + /** @hide */ + public void setSystemAudioModeOnForAudioOnlySource() {} + + /** @hide */ + public void addHdmiCecVolumeControlFeatureListener( + IHdmiCecVolumeControlFeatureListener listener) {} + + /** @hide */ + public void removeHdmiCecVolumeControlFeatureListener( + IHdmiCecVolumeControlFeatureListener listener) {} +} diff --git a/core/java/android/hardware/hdmi/HdmiPortInfo.java b/core/java/android/hardware/hdmi/HdmiPortInfo.java index 2623458aff5b7..52c3628f358b0 100644 --- a/core/java/android/hardware/hdmi/HdmiPortInfo.java +++ b/core/java/android/hardware/hdmi/HdmiPortInfo.java @@ -18,6 +18,7 @@ package android.hardware.hdmi; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -28,6 +29,7 @@ import android.os.Parcelable; * @hide */ @SystemApi +@TestApi public final class HdmiPortInfo implements Parcelable { /** HDMI port type: Input */ public static final int PORT_INPUT = 0; @@ -153,7 +155,9 @@ public final class HdmiPortInfo implements Parcelable { * @param dest The Parcel in which the object should be written. * @param flags Additional flags about how the object should be written. * May be 0 or {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE}. + * @hide */ + @SystemApi @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mId); @@ -187,4 +191,9 @@ public final class HdmiPortInfo implements Parcelable { && mCecSupported == other.mCecSupported && mArcSupported == other.mArcSupported && mMhlSupported == other.mMhlSupported; } + + @Override + public int hashCode() { + return mId; + } } diff --git a/core/java/android/hardware/hdmi/HdmiSwitchClient.java b/core/java/android/hardware/hdmi/HdmiSwitchClient.java index 7833653e41b02..913edfd0ebf4a 100644 --- a/core/java/android/hardware/hdmi/HdmiSwitchClient.java +++ b/core/java/android/hardware/hdmi/HdmiSwitchClient.java @@ -18,6 +18,7 @@ package android.hardware.hdmi; import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.hardware.hdmi.HdmiControlManager.ControlCallbackResult; import android.os.Binder; import android.os.RemoteException; @@ -38,6 +39,7 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi +@TestApi public class HdmiSwitchClient extends HdmiClient { private static final String TAG = "HdmiSwitchClient"; @@ -187,11 +189,8 @@ public class HdmiSwitchClient extends HdmiClient { *

This returns an empty list when the current device does not have HDMI input. * * @return a list of {@link HdmiPortInfo} - * - * @hide */ @NonNull - @SystemApi public List getPortInfo() { try { return mService.getPortInfo();