Loading Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -177,8 +177,10 @@ java_defaults { "core/java/android/hardware/face/IFaceServiceReceiver.aidl", "core/java/android/hardware/fingerprint/IFingerprintService.aidl", "core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl", "core/java/android/hardware/hdmi/IHdmiCecVolumeControlFeatureListener.aidl", "core/java/android/hardware/hdmi/IHdmiControlCallback.aidl", "core/java/android/hardware/hdmi/IHdmiControlService.aidl", "core/java/android/hardware/hdmi/IHdmiControlStatusChangeListener.aidl", "core/java/android/hardware/hdmi/IHdmiDeviceEventListener.aidl", "core/java/android/hardware/hdmi/IHdmiHotplugEventListener.aidl", "core/java/android/hardware/hdmi/IHdmiInputChangeListener.aidl", Loading core/java/android/hardware/hdmi/HdmiControlManager.java +246 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.hardware.hdmi; import static com.android.internal.os.RoSystemProperties.PROPERTY_HDMI_IS_DEVICE_HDMI_CEC_SWITCH; import android.annotation.CallbackExecutor; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; Loading @@ -30,6 +31,7 @@ import android.annotation.SystemApi; import android.annotation.SystemService; import android.content.Context; import android.content.pm.PackageManager; import android.os.Binder; import android.os.RemoteException; import android.os.SystemProperties; import android.util.ArrayMap; Loading @@ -38,6 +40,7 @@ import android.util.Log; import com.android.internal.util.Preconditions; import java.util.List; import java.util.concurrent.Executor; /** * The {@link HdmiControlManager} class is used to send HDMI control messages Loading Loading @@ -592,6 +595,68 @@ public final class HdmiControlManager { } } /** * Controls whether volume control commands via HDMI CEC are enabled. * * <p>When disabled: * <ul> * <li>the device will not send any HDMI CEC audio messages * <li>received HDMI CEC audio messages are responded to with {@code <Feature Abort>} * </ul> * * <p>Effects on different device types: * <table> * <tr><th>HDMI CEC device type</th><th>enabled</th><th>disabled</th></tr> * <tr> * <td>TV (type: 0)</td> * <td>Per CEC specification.</td> * <td>TV changes system volume. TV no longer reacts to incoming volume changes via * {@code <User Control Pressed>}. TV no longer handles {@code <Report Audio Status>} * .</td> * </tr> * <tr> * <td>Playback device (type: 4)</td> * <td>Device sends volume commands to TV/Audio system via {@code <User Control * Pressed>}</td><td>Device does not send volume commands via {@code <User Control * Pressed>}.</td> * </tr> * <tr> * <td>Audio device (type: 5)</td> * <td>Full "System Audio Control" capabilities.</td> * <td>Audio device no longer reacts to incoming {@code <User Control Pressed>} * volume commands. Audio device no longer reports volume changes via {@code <Report * Audio Status>}.</td> * </tr> * </table> * * <p> Due to the resulting behavior, usage on TV and Audio devices is discouraged. * * @param isHdmiCecVolumeControlEnabled target state of HDMI CEC volume control. * @see Settings.Global.HDMI_CONTROL_VOLUME_CONTROL_ENABLED * @hide */ @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setHdmiCecVolumeControlEnabled(boolean isHdmiCecVolumeControlEnabled) { try { mService.setHdmiCecVolumeControlEnabled(isHdmiCecVolumeControlEnabled); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Returns whether volume changes via HDMI CEC are enabled. * @hide */ @RequiresPermission(android.Manifest.permission.HDMI_CEC) public boolean isHdmiCecVolumeControlEnabled() { try { return mService.isHdmiCecVolumeControlEnabled(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Gets whether the system is in system audio mode. * Loading Loading @@ -684,6 +749,46 @@ public final class HdmiControlManager { private final ArrayMap<HotplugEventListener, IHdmiHotplugEventListener> mHotplugEventListeners = new ArrayMap<>(); /** * Listener used to get HDMI Control (CEC) status (enabled/disabled) and the connected display * status. * @hide */ public interface HdmiControlStatusChangeListener { /** * Called when HDMI Control (CEC) is enabled/disabled. * * @param isCecEnabled status of HDMI Control * {@link android.provider.Settings.Global#HDMI_CONTROL_ENABLED}: {@code true} if enabled. * @param isCecAvailable status of CEC support of the connected display (the TV). * {@code true} if supported. * * Note: Value of isCecAvailable is only valid when isCecEnabled is true. **/ void onStatusChange(boolean isCecEnabled, boolean isCecAvailable); } private final ArrayMap<HdmiControlStatusChangeListener, IHdmiControlStatusChangeListener> mHdmiControlStatusChangeListeners = new ArrayMap<>(); /** * Listener used to get the status of the HDMI CEC volume control feature (enabled/disabled). * @hide */ public interface HdmiCecVolumeControlFeatureListener { /** * Called when the HDMI Control (CEC) volume control feature is enabled/disabled. * * @param enabled status of HDMI CEC volume control feature * @see {@link HdmiControlManager#setHdmiCecVolumeControlEnabled(boolean)} ()} **/ void onHdmiCecVolumeControlFeature(boolean enabled); } private final ArrayMap<HdmiCecVolumeControlFeatureListener, IHdmiCecVolumeControlFeatureListener> mHdmiCecVolumeControlFeatureListeners = new ArrayMap<>(); /** * Listener used to get vendor-specific commands. */ Loading Loading @@ -777,4 +882,145 @@ public final class HdmiControlManager { } }; } /** * Adds a listener to get informed of {@link HdmiControlStatusChange}. * * <p>To stop getting the notification, * use {@link #removeHdmiControlStatusChangeListener(HdmiControlStatusChangeListener)}. * * @param listener {@link HdmiControlStatusChangeListener} instance * @see HdmiControlManager#removeHdmiControlStatusChangeListener( * HdmiControlStatusChangeListener) * * @hide */ @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void addHdmiControlStatusChangeListener(HdmiControlStatusChangeListener listener) { if (mService == null) { Log.e(TAG, "HdmiControlService is not available"); return; } if (mHdmiControlStatusChangeListeners.containsKey(listener)) { Log.e(TAG, "listener is already registered"); return; } IHdmiControlStatusChangeListener wrappedListener = getHdmiControlStatusChangeListenerWrapper(listener); mHdmiControlStatusChangeListeners.put(listener, wrappedListener); try { mService.addHdmiControlStatusChangeListener(wrappedListener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Removes a listener to stop getting informed of {@link HdmiControlStatusChange}. * * @param listener {@link HdmiControlStatusChangeListener} instance to be removed * * @hide */ @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void removeHdmiControlStatusChangeListener(HdmiControlStatusChangeListener listener) { if (mService == null) { Log.e(TAG, "HdmiControlService is not available"); return; } IHdmiControlStatusChangeListener wrappedListener = mHdmiControlStatusChangeListeners.remove(listener); if (wrappedListener == null) { Log.e(TAG, "tried to remove not-registered listener"); return; } try { mService.removeHdmiControlStatusChangeListener(wrappedListener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } private IHdmiControlStatusChangeListener getHdmiControlStatusChangeListenerWrapper( final HdmiControlStatusChangeListener listener) { return new IHdmiControlStatusChangeListener.Stub() { @Override public void onStatusChange(boolean isCecEnabled, boolean isCecAvailable) { listener.onStatusChange(isCecEnabled, isCecAvailable); } }; } /** * Adds a listener to get informed of changes to the state of the HDMI CEC volume control * feature. * * Upon adding a listener, the current state of the HDMI CEC volume control feature will be * sent immediately. * * <p>To stop getting the notification, * use {@link #removeHdmiCecVolumeControlFeatureListener(HdmiCecVolumeControlFeatureListener)}. * * @param listener {@link HdmiCecVolumeControlFeatureListener} instance * @hide * @see #removeHdmiCecVolumeControlFeatureListener(HdmiCecVolumeControlFeatureListener) */ @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void addHdmiCecVolumeControlFeatureListener(@NonNull @CallbackExecutor Executor executor, @NonNull HdmiCecVolumeControlFeatureListener listener) { if (mService == null) { Log.e(TAG, "HdmiControlService is not available"); return; } if (mHdmiCecVolumeControlFeatureListeners.containsKey(listener)) { Log.e(TAG, "listener is already registered"); return; } IHdmiCecVolumeControlFeatureListener wrappedListener = createHdmiCecVolumeControlFeatureListenerWrapper(executor, listener); mHdmiCecVolumeControlFeatureListeners.put(listener, wrappedListener); try { mService.addHdmiCecVolumeControlFeatureListener(wrappedListener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Removes a listener to stop getting informed of changes to the state of the HDMI CEC volume * control feature. * * @param listener {@link HdmiCecVolumeControlFeatureListener} instance to be removed * @hide */ @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void removeHdmiCecVolumeControlFeatureListener( HdmiCecVolumeControlFeatureListener listener) { if (mService == null) { Log.e(TAG, "HdmiControlService is not available"); return; } IHdmiCecVolumeControlFeatureListener wrappedListener = mHdmiCecVolumeControlFeatureListeners.remove(listener); if (wrappedListener == null) { Log.e(TAG, "tried to remove not-registered listener"); return; } try { mService.removeHdmiCecVolumeControlFeatureListener(wrappedListener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } private IHdmiCecVolumeControlFeatureListener createHdmiCecVolumeControlFeatureListenerWrapper( Executor executor, final HdmiCecVolumeControlFeatureListener listener) { return new android.hardware.hdmi.IHdmiCecVolumeControlFeatureListener.Stub() { @Override public void onHdmiCecVolumeControlFeature(boolean enabled) { Binder.clearCallingIdentity(); executor.execute(() -> listener.onHdmiCecVolumeControlFeature(enabled)); } }; } } core/java/android/hardware/hdmi/IHdmiCecVolumeControlFeatureListener.aidl 0 → 100644 +32 −0 Original line number Diff line number Diff line /* * Copyright (C) 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; /** * Listener used to get the status of the HDMI CEC volume control feature (enabled/disabled). * @hide */ oneway interface IHdmiCecVolumeControlFeatureListener { /** * Called when the HDMI Control (CEC) volume control feature is enabled/disabled. * * @param enabled status of HDMI CEC volume control feature * @see {@link HdmiControlManager#setHdmiCecVolumeControlEnabled(boolean)} ()} **/ void onHdmiCecVolumeControlFeature(boolean enabled); } core/java/android/hardware/hdmi/IHdmiControlService.aidl +8 −0 Original line number Diff line number Diff line Loading @@ -18,7 +18,9 @@ package android.hardware.hdmi; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.HdmiPortInfo; import android.hardware.hdmi.IHdmiCecVolumeControlFeatureListener; import android.hardware.hdmi.IHdmiControlCallback; import android.hardware.hdmi.IHdmiControlStatusChangeListener; import android.hardware.hdmi.IHdmiDeviceEventListener; import android.hardware.hdmi.IHdmiHotplugEventListener; import android.hardware.hdmi.IHdmiInputChangeListener; Loading @@ -41,6 +43,10 @@ interface IHdmiControlService { HdmiDeviceInfo getActiveSource(); void oneTouchPlay(IHdmiControlCallback callback); void queryDisplayStatus(IHdmiControlCallback callback); void addHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener); void removeHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener); void addHdmiCecVolumeControlFeatureListener(IHdmiCecVolumeControlFeatureListener listener); void removeHdmiCecVolumeControlFeatureListener(IHdmiCecVolumeControlFeatureListener listener); void addHotplugEventListener(IHdmiHotplugEventListener listener); void removeHotplugEventListener(IHdmiHotplugEventListener listener); void addDeviceEventListener(IHdmiDeviceEventListener listener); Loading Loading @@ -77,6 +83,8 @@ interface IHdmiControlService { void sendMhlVendorCommand(int portId, int offset, int length, in byte[] data); void addHdmiMhlVendorCommandListener(IHdmiMhlVendorCommandListener listener); void setStandbyMode(boolean isStandbyModeOn); void setHdmiCecVolumeControlEnabled(boolean isHdmiCecVolumeControlEnabled); boolean isHdmiCecVolumeControlEnabled(); void reportAudioStatus(int deviceType, int volume, int maxVolume, boolean isMute); void setSystemAudioModeOnForAudioOnlySource(); } core/java/android/hardware/hdmi/IHdmiControlStatusChangeListener.aidl 0 → 100644 +40 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 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.hardware.hdmi.HdmiDeviceInfo; /** * Callback interface definition for HDMI client to get informed of * the CEC availability change event. * * @hide */ oneway interface IHdmiControlStatusChangeListener { /** * Called when HDMI Control (CEC) is enabled/disabled. * * @param isCecEnabled status of HDMI Control * {@link android.provider.Settings.Global#HDMI_CONTROL_ENABLED}: {@code true} if enabled. * @param isCecAvailable status of CEC support of the connected display (the TV). * {@code true} if supported. * * Note: Value of isCecAvailable is only valid when isCecEnabled is true. **/ void onStatusChange(boolean isCecEnabled, boolean isCecAvailable); } Loading
Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -177,8 +177,10 @@ java_defaults { "core/java/android/hardware/face/IFaceServiceReceiver.aidl", "core/java/android/hardware/fingerprint/IFingerprintService.aidl", "core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl", "core/java/android/hardware/hdmi/IHdmiCecVolumeControlFeatureListener.aidl", "core/java/android/hardware/hdmi/IHdmiControlCallback.aidl", "core/java/android/hardware/hdmi/IHdmiControlService.aidl", "core/java/android/hardware/hdmi/IHdmiControlStatusChangeListener.aidl", "core/java/android/hardware/hdmi/IHdmiDeviceEventListener.aidl", "core/java/android/hardware/hdmi/IHdmiHotplugEventListener.aidl", "core/java/android/hardware/hdmi/IHdmiInputChangeListener.aidl", Loading
core/java/android/hardware/hdmi/HdmiControlManager.java +246 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.hardware.hdmi; import static com.android.internal.os.RoSystemProperties.PROPERTY_HDMI_IS_DEVICE_HDMI_CEC_SWITCH; import android.annotation.CallbackExecutor; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; Loading @@ -30,6 +31,7 @@ import android.annotation.SystemApi; import android.annotation.SystemService; import android.content.Context; import android.content.pm.PackageManager; import android.os.Binder; import android.os.RemoteException; import android.os.SystemProperties; import android.util.ArrayMap; Loading @@ -38,6 +40,7 @@ import android.util.Log; import com.android.internal.util.Preconditions; import java.util.List; import java.util.concurrent.Executor; /** * The {@link HdmiControlManager} class is used to send HDMI control messages Loading Loading @@ -592,6 +595,68 @@ public final class HdmiControlManager { } } /** * Controls whether volume control commands via HDMI CEC are enabled. * * <p>When disabled: * <ul> * <li>the device will not send any HDMI CEC audio messages * <li>received HDMI CEC audio messages are responded to with {@code <Feature Abort>} * </ul> * * <p>Effects on different device types: * <table> * <tr><th>HDMI CEC device type</th><th>enabled</th><th>disabled</th></tr> * <tr> * <td>TV (type: 0)</td> * <td>Per CEC specification.</td> * <td>TV changes system volume. TV no longer reacts to incoming volume changes via * {@code <User Control Pressed>}. TV no longer handles {@code <Report Audio Status>} * .</td> * </tr> * <tr> * <td>Playback device (type: 4)</td> * <td>Device sends volume commands to TV/Audio system via {@code <User Control * Pressed>}</td><td>Device does not send volume commands via {@code <User Control * Pressed>}.</td> * </tr> * <tr> * <td>Audio device (type: 5)</td> * <td>Full "System Audio Control" capabilities.</td> * <td>Audio device no longer reacts to incoming {@code <User Control Pressed>} * volume commands. Audio device no longer reports volume changes via {@code <Report * Audio Status>}.</td> * </tr> * </table> * * <p> Due to the resulting behavior, usage on TV and Audio devices is discouraged. * * @param isHdmiCecVolumeControlEnabled target state of HDMI CEC volume control. * @see Settings.Global.HDMI_CONTROL_VOLUME_CONTROL_ENABLED * @hide */ @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void setHdmiCecVolumeControlEnabled(boolean isHdmiCecVolumeControlEnabled) { try { mService.setHdmiCecVolumeControlEnabled(isHdmiCecVolumeControlEnabled); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Returns whether volume changes via HDMI CEC are enabled. * @hide */ @RequiresPermission(android.Manifest.permission.HDMI_CEC) public boolean isHdmiCecVolumeControlEnabled() { try { return mService.isHdmiCecVolumeControlEnabled(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Gets whether the system is in system audio mode. * Loading Loading @@ -684,6 +749,46 @@ public final class HdmiControlManager { private final ArrayMap<HotplugEventListener, IHdmiHotplugEventListener> mHotplugEventListeners = new ArrayMap<>(); /** * Listener used to get HDMI Control (CEC) status (enabled/disabled) and the connected display * status. * @hide */ public interface HdmiControlStatusChangeListener { /** * Called when HDMI Control (CEC) is enabled/disabled. * * @param isCecEnabled status of HDMI Control * {@link android.provider.Settings.Global#HDMI_CONTROL_ENABLED}: {@code true} if enabled. * @param isCecAvailable status of CEC support of the connected display (the TV). * {@code true} if supported. * * Note: Value of isCecAvailable is only valid when isCecEnabled is true. **/ void onStatusChange(boolean isCecEnabled, boolean isCecAvailable); } private final ArrayMap<HdmiControlStatusChangeListener, IHdmiControlStatusChangeListener> mHdmiControlStatusChangeListeners = new ArrayMap<>(); /** * Listener used to get the status of the HDMI CEC volume control feature (enabled/disabled). * @hide */ public interface HdmiCecVolumeControlFeatureListener { /** * Called when the HDMI Control (CEC) volume control feature is enabled/disabled. * * @param enabled status of HDMI CEC volume control feature * @see {@link HdmiControlManager#setHdmiCecVolumeControlEnabled(boolean)} ()} **/ void onHdmiCecVolumeControlFeature(boolean enabled); } private final ArrayMap<HdmiCecVolumeControlFeatureListener, IHdmiCecVolumeControlFeatureListener> mHdmiCecVolumeControlFeatureListeners = new ArrayMap<>(); /** * Listener used to get vendor-specific commands. */ Loading Loading @@ -777,4 +882,145 @@ public final class HdmiControlManager { } }; } /** * Adds a listener to get informed of {@link HdmiControlStatusChange}. * * <p>To stop getting the notification, * use {@link #removeHdmiControlStatusChangeListener(HdmiControlStatusChangeListener)}. * * @param listener {@link HdmiControlStatusChangeListener} instance * @see HdmiControlManager#removeHdmiControlStatusChangeListener( * HdmiControlStatusChangeListener) * * @hide */ @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void addHdmiControlStatusChangeListener(HdmiControlStatusChangeListener listener) { if (mService == null) { Log.e(TAG, "HdmiControlService is not available"); return; } if (mHdmiControlStatusChangeListeners.containsKey(listener)) { Log.e(TAG, "listener is already registered"); return; } IHdmiControlStatusChangeListener wrappedListener = getHdmiControlStatusChangeListenerWrapper(listener); mHdmiControlStatusChangeListeners.put(listener, wrappedListener); try { mService.addHdmiControlStatusChangeListener(wrappedListener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Removes a listener to stop getting informed of {@link HdmiControlStatusChange}. * * @param listener {@link HdmiControlStatusChangeListener} instance to be removed * * @hide */ @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void removeHdmiControlStatusChangeListener(HdmiControlStatusChangeListener listener) { if (mService == null) { Log.e(TAG, "HdmiControlService is not available"); return; } IHdmiControlStatusChangeListener wrappedListener = mHdmiControlStatusChangeListeners.remove(listener); if (wrappedListener == null) { Log.e(TAG, "tried to remove not-registered listener"); return; } try { mService.removeHdmiControlStatusChangeListener(wrappedListener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } private IHdmiControlStatusChangeListener getHdmiControlStatusChangeListenerWrapper( final HdmiControlStatusChangeListener listener) { return new IHdmiControlStatusChangeListener.Stub() { @Override public void onStatusChange(boolean isCecEnabled, boolean isCecAvailable) { listener.onStatusChange(isCecEnabled, isCecAvailable); } }; } /** * Adds a listener to get informed of changes to the state of the HDMI CEC volume control * feature. * * Upon adding a listener, the current state of the HDMI CEC volume control feature will be * sent immediately. * * <p>To stop getting the notification, * use {@link #removeHdmiCecVolumeControlFeatureListener(HdmiCecVolumeControlFeatureListener)}. * * @param listener {@link HdmiCecVolumeControlFeatureListener} instance * @hide * @see #removeHdmiCecVolumeControlFeatureListener(HdmiCecVolumeControlFeatureListener) */ @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void addHdmiCecVolumeControlFeatureListener(@NonNull @CallbackExecutor Executor executor, @NonNull HdmiCecVolumeControlFeatureListener listener) { if (mService == null) { Log.e(TAG, "HdmiControlService is not available"); return; } if (mHdmiCecVolumeControlFeatureListeners.containsKey(listener)) { Log.e(TAG, "listener is already registered"); return; } IHdmiCecVolumeControlFeatureListener wrappedListener = createHdmiCecVolumeControlFeatureListenerWrapper(executor, listener); mHdmiCecVolumeControlFeatureListeners.put(listener, wrappedListener); try { mService.addHdmiCecVolumeControlFeatureListener(wrappedListener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** * Removes a listener to stop getting informed of changes to the state of the HDMI CEC volume * control feature. * * @param listener {@link HdmiCecVolumeControlFeatureListener} instance to be removed * @hide */ @RequiresPermission(android.Manifest.permission.HDMI_CEC) public void removeHdmiCecVolumeControlFeatureListener( HdmiCecVolumeControlFeatureListener listener) { if (mService == null) { Log.e(TAG, "HdmiControlService is not available"); return; } IHdmiCecVolumeControlFeatureListener wrappedListener = mHdmiCecVolumeControlFeatureListeners.remove(listener); if (wrappedListener == null) { Log.e(TAG, "tried to remove not-registered listener"); return; } try { mService.removeHdmiCecVolumeControlFeatureListener(wrappedListener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } private IHdmiCecVolumeControlFeatureListener createHdmiCecVolumeControlFeatureListenerWrapper( Executor executor, final HdmiCecVolumeControlFeatureListener listener) { return new android.hardware.hdmi.IHdmiCecVolumeControlFeatureListener.Stub() { @Override public void onHdmiCecVolumeControlFeature(boolean enabled) { Binder.clearCallingIdentity(); executor.execute(() -> listener.onHdmiCecVolumeControlFeature(enabled)); } }; } }
core/java/android/hardware/hdmi/IHdmiCecVolumeControlFeatureListener.aidl 0 → 100644 +32 −0 Original line number Diff line number Diff line /* * Copyright (C) 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; /** * Listener used to get the status of the HDMI CEC volume control feature (enabled/disabled). * @hide */ oneway interface IHdmiCecVolumeControlFeatureListener { /** * Called when the HDMI Control (CEC) volume control feature is enabled/disabled. * * @param enabled status of HDMI CEC volume control feature * @see {@link HdmiControlManager#setHdmiCecVolumeControlEnabled(boolean)} ()} **/ void onHdmiCecVolumeControlFeature(boolean enabled); }
core/java/android/hardware/hdmi/IHdmiControlService.aidl +8 −0 Original line number Diff line number Diff line Loading @@ -18,7 +18,9 @@ package android.hardware.hdmi; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.HdmiPortInfo; import android.hardware.hdmi.IHdmiCecVolumeControlFeatureListener; import android.hardware.hdmi.IHdmiControlCallback; import android.hardware.hdmi.IHdmiControlStatusChangeListener; import android.hardware.hdmi.IHdmiDeviceEventListener; import android.hardware.hdmi.IHdmiHotplugEventListener; import android.hardware.hdmi.IHdmiInputChangeListener; Loading @@ -41,6 +43,10 @@ interface IHdmiControlService { HdmiDeviceInfo getActiveSource(); void oneTouchPlay(IHdmiControlCallback callback); void queryDisplayStatus(IHdmiControlCallback callback); void addHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener); void removeHdmiControlStatusChangeListener(IHdmiControlStatusChangeListener listener); void addHdmiCecVolumeControlFeatureListener(IHdmiCecVolumeControlFeatureListener listener); void removeHdmiCecVolumeControlFeatureListener(IHdmiCecVolumeControlFeatureListener listener); void addHotplugEventListener(IHdmiHotplugEventListener listener); void removeHotplugEventListener(IHdmiHotplugEventListener listener); void addDeviceEventListener(IHdmiDeviceEventListener listener); Loading Loading @@ -77,6 +83,8 @@ interface IHdmiControlService { void sendMhlVendorCommand(int portId, int offset, int length, in byte[] data); void addHdmiMhlVendorCommandListener(IHdmiMhlVendorCommandListener listener); void setStandbyMode(boolean isStandbyModeOn); void setHdmiCecVolumeControlEnabled(boolean isHdmiCecVolumeControlEnabled); boolean isHdmiCecVolumeControlEnabled(); void reportAudioStatus(int deviceType, int volume, int maxVolume, boolean isMute); void setSystemAudioModeOnForAudioOnlySource(); }
core/java/android/hardware/hdmi/IHdmiControlStatusChangeListener.aidl 0 → 100644 +40 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 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.hardware.hdmi.HdmiDeviceInfo; /** * Callback interface definition for HDMI client to get informed of * the CEC availability change event. * * @hide */ oneway interface IHdmiControlStatusChangeListener { /** * Called when HDMI Control (CEC) is enabled/disabled. * * @param isCecEnabled status of HDMI Control * {@link android.provider.Settings.Global#HDMI_CONTROL_ENABLED}: {@code true} if enabled. * @param isCecAvailable status of CEC support of the connected display (the TV). * {@code true} if supported. * * Note: Value of isCecAvailable is only valid when isCecEnabled is true. **/ void onStatusChange(boolean isCecEnabled, boolean isCecAvailable); }