Merge "CEC: AIDL Native Wrapper" am: d3ebddf5f3 am: c80d885785
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2176463 Change-Id: I833ee37a7601fa7be0b1841e07864aa379cc9e80 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -153,6 +153,8 @@ java_library_static {
|
|||||||
"android.hardware.health-translate-java",
|
"android.hardware.health-translate-java",
|
||||||
"android.hardware.light-V1-java",
|
"android.hardware.light-V1-java",
|
||||||
"android.hardware.tv.cec-V1.1-java",
|
"android.hardware.tv.cec-V1.1-java",
|
||||||
|
"android.hardware.tv.cec-V1-java",
|
||||||
|
"android.hardware.tv.hdmi-V1-java",
|
||||||
"android.hardware.weaver-V1.0-java",
|
"android.hardware.weaver-V1.0-java",
|
||||||
"android.hardware.biometrics.face-V1.0-java",
|
"android.hardware.biometrics.face-V1.0-java",
|
||||||
"android.hardware.biometrics.fingerprint-V2.3-java",
|
"android.hardware.biometrics.fingerprint-V2.3-java",
|
||||||
|
|||||||
@@ -19,20 +19,25 @@ package com.android.server.hdmi;
|
|||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.hardware.hdmi.HdmiPortInfo;
|
import android.hardware.hdmi.HdmiPortInfo;
|
||||||
import android.hardware.tv.cec.V1_0.CecMessage;
|
import android.hardware.tv.cec.CecMessage;
|
||||||
|
import android.hardware.tv.cec.IHdmiCec;
|
||||||
|
import android.hardware.tv.cec.IHdmiCecCallback;
|
||||||
import android.hardware.tv.cec.V1_0.HotplugEvent;
|
import android.hardware.tv.cec.V1_0.HotplugEvent;
|
||||||
import android.hardware.tv.cec.V1_0.IHdmiCec;
|
|
||||||
import android.hardware.tv.cec.V1_0.IHdmiCec.getPhysicalAddressCallback;
|
import android.hardware.tv.cec.V1_0.IHdmiCec.getPhysicalAddressCallback;
|
||||||
import android.hardware.tv.cec.V1_0.IHdmiCecCallback;
|
import android.hardware.tv.cec.V1_0.OptionKey;
|
||||||
import android.hardware.tv.cec.V1_0.Result;
|
import android.hardware.tv.cec.V1_0.Result;
|
||||||
import android.hardware.tv.cec.V1_0.SendMessageResult;
|
import android.hardware.tv.cec.V1_0.SendMessageResult;
|
||||||
|
import android.hardware.tv.hdmi.IHdmi;
|
||||||
|
import android.hardware.tv.hdmi.IHdmiCallback;
|
||||||
import android.icu.util.IllformedLocaleException;
|
import android.icu.util.IllformedLocaleException;
|
||||||
import android.icu.util.ULocale;
|
import android.icu.util.ULocale;
|
||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.os.IBinder;
|
||||||
import android.os.IHwBinder;
|
import android.os.IHwBinder;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
|
import android.os.ServiceManager;
|
||||||
import android.stats.hdmi.HdmiStatsEnums;
|
import android.stats.hdmi.HdmiStatsEnums;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
|
|
||||||
@@ -168,8 +173,14 @@ final class HdmiCecController {
|
|||||||
* returns {@code null}.
|
* returns {@code null}.
|
||||||
*/
|
*/
|
||||||
static HdmiCecController create(HdmiControlService service, HdmiCecAtomWriter atomWriter) {
|
static HdmiCecController create(HdmiControlService service, HdmiCecAtomWriter atomWriter) {
|
||||||
HdmiCecController controller = createWithNativeWrapper(service, new NativeWrapperImpl11(),
|
HdmiCecController controller =
|
||||||
atomWriter);
|
createWithNativeWrapper(service, new NativeWrapperImplAidl(), atomWriter);
|
||||||
|
if (controller != null) {
|
||||||
|
return controller;
|
||||||
|
}
|
||||||
|
HdmiLogger.warning("Unable to use CEC and HDMI AIDL HALs");
|
||||||
|
|
||||||
|
controller = createWithNativeWrapper(service, new NativeWrapperImpl11(), atomWriter);
|
||||||
if (controller != null) {
|
if (controller != null) {
|
||||||
return controller;
|
return controller;
|
||||||
}
|
}
|
||||||
@@ -360,16 +371,43 @@ final class HdmiCecController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set an option to CEC HAL.
|
* Configures the TV panel device wakeup behaviour in standby mode when it receives an OTP
|
||||||
|
* (One Touch Play) from a source device.
|
||||||
*
|
*
|
||||||
* @param flag key of option
|
* @param value If true, the TV device will wake up when OTP is received and if false, the TV
|
||||||
* @param enabled whether to enable/disable the given option.
|
* device will not wake up for an OTP.
|
||||||
*/
|
*/
|
||||||
@ServiceThreadOnly
|
@ServiceThreadOnly
|
||||||
void setOption(int flag, boolean enabled) {
|
void enableWakeupByOtp(boolean enabled) {
|
||||||
assertRunOnServiceThread();
|
assertRunOnServiceThread();
|
||||||
HdmiLogger.debug("setOption: [flag:%d, enabled:%b]", flag, enabled);
|
HdmiLogger.debug("enableWakeupByOtp: %b", enabled);
|
||||||
mNativeWrapperImpl.nativeSetOption(flag, enabled);
|
mNativeWrapperImpl.enableWakeupByOtp(enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Switch to enable or disable CEC on the device.
|
||||||
|
*
|
||||||
|
* @param value If true, the device will have all CEC functionalities and if false, the device
|
||||||
|
* will not perform any CEC functions.
|
||||||
|
*/
|
||||||
|
@ServiceThreadOnly
|
||||||
|
void enableCec(boolean enabled) {
|
||||||
|
assertRunOnServiceThread();
|
||||||
|
HdmiLogger.debug("enableCec: %b", enabled);
|
||||||
|
mNativeWrapperImpl.enableCec(enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the module that processes CEC messages - the Android framework or the HAL.
|
||||||
|
*
|
||||||
|
* @param value If true, the Android framework will actively process CEC messages and if false,
|
||||||
|
* only the HAL will process the CEC messages.
|
||||||
|
*/
|
||||||
|
@ServiceThreadOnly
|
||||||
|
void enableSystemCecControl(boolean enabled) {
|
||||||
|
assertRunOnServiceThread();
|
||||||
|
HdmiLogger.debug("enableSystemCecControl: %b", enabled);
|
||||||
|
mNativeWrapperImpl.enableSystemCecControl(enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -819,12 +857,233 @@ final class HdmiCecController {
|
|||||||
int nativeGetVersion();
|
int nativeGetVersion();
|
||||||
int nativeGetVendorId();
|
int nativeGetVendorId();
|
||||||
HdmiPortInfo[] nativeGetPortInfos();
|
HdmiPortInfo[] nativeGetPortInfos();
|
||||||
void nativeSetOption(int flag, boolean enabled);
|
|
||||||
|
void enableWakeupByOtp(boolean enabled);
|
||||||
|
|
||||||
|
void enableCec(boolean enabled);
|
||||||
|
|
||||||
|
void enableSystemCecControl(boolean enabled);
|
||||||
|
|
||||||
void nativeSetLanguage(String language);
|
void nativeSetLanguage(String language);
|
||||||
void nativeEnableAudioReturnChannel(int port, boolean flag);
|
void nativeEnableAudioReturnChannel(int port, boolean flag);
|
||||||
boolean nativeIsConnected(int port);
|
boolean nativeIsConnected(int port);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final class NativeWrapperImplAidl
|
||||||
|
implements NativeWrapper, IBinder.DeathRecipient {
|
||||||
|
private IHdmiCec mHdmiCec;
|
||||||
|
private IHdmi mHdmi;
|
||||||
|
@Nullable private HdmiCecCallback mCallback;
|
||||||
|
|
||||||
|
private final Object mLock = new Object();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String nativeInit() {
|
||||||
|
return connectToHal() ? mHdmiCec.toString() + " " + mHdmi.toString() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean connectToHal() {
|
||||||
|
mHdmiCec =
|
||||||
|
IHdmiCec.Stub.asInterface(
|
||||||
|
ServiceManager.getService(IHdmiCec.DESCRIPTOR + "/default"));
|
||||||
|
if (mHdmiCec == null) {
|
||||||
|
HdmiLogger.error("Could not initialize HDMI CEC AIDL HAL");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
mHdmiCec.asBinder().linkToDeath(this, 0);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
HdmiLogger.error("Couldn't link to death : ", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
mHdmi =
|
||||||
|
IHdmi.Stub.asInterface(
|
||||||
|
ServiceManager.getService(IHdmi.DESCRIPTOR + "/default"));
|
||||||
|
if (mHdmi == null) {
|
||||||
|
HdmiLogger.error("Could not initialize HDMI AIDL HAL");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
mHdmi.asBinder().linkToDeath(this, 0);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
HdmiLogger.error("Couldn't link to death : ", e);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void binderDied() {
|
||||||
|
// One of the services died, try to reconnect to both.
|
||||||
|
mHdmiCec.asBinder().unlinkToDeath(this, 0);
|
||||||
|
mHdmi.asBinder().unlinkToDeath(this, 0);
|
||||||
|
HdmiLogger.error("HDMI or CEC service died, reconnecting");
|
||||||
|
connectToHal();
|
||||||
|
// Reconnect the callback
|
||||||
|
if (mCallback != null) {
|
||||||
|
setCallback(mCallback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setCallback(HdmiCecCallback callback) {
|
||||||
|
mCallback = callback;
|
||||||
|
try {
|
||||||
|
// Create an AIDL callback that can callback onCecMessage
|
||||||
|
mHdmiCec.setCallback(new HdmiCecCallbackAidl(callback));
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
HdmiLogger.error("Couldn't initialise tv.cec callback : ", e);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// Create an AIDL callback that can callback onHotplugEvent
|
||||||
|
mHdmi.setCallback(new HdmiCallbackAidl(callback));
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
HdmiLogger.error("Couldn't initialise tv.hdmi callback : ", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int nativeSendCecCommand(int srcAddress, int dstAddress, byte[] body) {
|
||||||
|
CecMessage message = new CecMessage();
|
||||||
|
message.initiator = (byte) (srcAddress & 0xF);
|
||||||
|
message.destination = (byte) (dstAddress & 0xF);
|
||||||
|
message.body = body;
|
||||||
|
try {
|
||||||
|
return mHdmiCec.sendMessage(message);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
HdmiLogger.error("Failed to send CEC message : ", e);
|
||||||
|
return SendMessageResult.FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int nativeAddLogicalAddress(int logicalAddress) {
|
||||||
|
try {
|
||||||
|
return mHdmiCec.addLogicalAddress((byte) logicalAddress);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
HdmiLogger.error("Failed to add a logical address : ", e);
|
||||||
|
return Result.FAILURE_INVALID_ARGS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void nativeClearLogicalAddress() {
|
||||||
|
try {
|
||||||
|
mHdmiCec.clearLogicalAddress();
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
HdmiLogger.error("Failed to clear logical address : ", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int nativeGetPhysicalAddress() {
|
||||||
|
try {
|
||||||
|
return mHdmiCec.getPhysicalAddress();
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
HdmiLogger.error("Failed to get physical address : ", e);
|
||||||
|
return INVALID_PHYSICAL_ADDRESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int nativeGetVersion() {
|
||||||
|
try {
|
||||||
|
return mHdmiCec.getCecVersion();
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
HdmiLogger.error("Failed to get cec version : ", e);
|
||||||
|
return Result.FAILURE_UNKNOWN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int nativeGetVendorId() {
|
||||||
|
try {
|
||||||
|
return mHdmiCec.getVendorId();
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
HdmiLogger.error("Failed to get vendor id : ", e);
|
||||||
|
return Result.FAILURE_UNKNOWN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enableWakeupByOtp(boolean enabled) {
|
||||||
|
try {
|
||||||
|
mHdmiCec.enableWakeupByOtp(enabled);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
HdmiLogger.error("Failed call to enableWakeupByOtp : ", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enableCec(boolean enabled) {
|
||||||
|
try {
|
||||||
|
mHdmiCec.enableCec(enabled);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
HdmiLogger.error("Failed call to enableCec : ", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enableSystemCecControl(boolean enabled) {
|
||||||
|
try {
|
||||||
|
mHdmiCec.enableSystemCecControl(enabled);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
HdmiLogger.error("Failed call to enableSystemCecControl : ", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void nativeSetLanguage(String language) {
|
||||||
|
try {
|
||||||
|
mHdmiCec.setLanguage(language);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
HdmiLogger.error("Failed to set language : ", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void nativeEnableAudioReturnChannel(int port, boolean flag) {
|
||||||
|
try {
|
||||||
|
mHdmiCec.enableAudioReturnChannel(port, flag);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
HdmiLogger.error("Failed to enable/disable ARC : ", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HdmiPortInfo[] nativeGetPortInfos() {
|
||||||
|
try {
|
||||||
|
android.hardware.tv.hdmi.HdmiPortInfo[] hdmiPortInfos = mHdmi.getPortInfo();
|
||||||
|
HdmiPortInfo[] hdmiPortInfo = new HdmiPortInfo[hdmiPortInfos.length];
|
||||||
|
int i = 0;
|
||||||
|
for (android.hardware.tv.hdmi.HdmiPortInfo portInfo : hdmiPortInfos) {
|
||||||
|
hdmiPortInfo[i] =
|
||||||
|
new HdmiPortInfo(
|
||||||
|
portInfo.portId,
|
||||||
|
portInfo.type,
|
||||||
|
portInfo.physicalAddress,
|
||||||
|
portInfo.cecSupported,
|
||||||
|
false,
|
||||||
|
portInfo.arcSupported);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return hdmiPortInfo;
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
HdmiLogger.error("Failed to get port information : ", e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean nativeIsConnected(int port) {
|
||||||
|
try {
|
||||||
|
return mHdmi.isConnected(port);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
HdmiLogger.error("Failed to get connection info : ", e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static final class NativeWrapperImpl11 implements NativeWrapper,
|
private static final class NativeWrapperImpl11 implements NativeWrapper,
|
||||||
IHwBinder.DeathRecipient, getPhysicalAddressCallback {
|
IHwBinder.DeathRecipient, getPhysicalAddressCallback {
|
||||||
private android.hardware.tv.cec.V1_1.IHdmiCec mHdmiCec;
|
private android.hardware.tv.cec.V1_1.IHdmiCec mHdmiCec;
|
||||||
@@ -975,8 +1234,7 @@ final class HdmiCecController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private void nativeSetOption(int flag, boolean enabled) {
|
||||||
public void nativeSetOption(int flag, boolean enabled) {
|
|
||||||
try {
|
try {
|
||||||
mHdmiCec.setOption(flag, enabled);
|
mHdmiCec.setOption(flag, enabled);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
@@ -984,6 +1242,21 @@ final class HdmiCecController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enableWakeupByOtp(boolean enabled) {
|
||||||
|
nativeSetOption(OptionKey.WAKEUP, enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enableCec(boolean enabled) {
|
||||||
|
nativeSetOption(OptionKey.ENABLE_CEC, enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enableSystemCecControl(boolean enabled) {
|
||||||
|
nativeSetOption(OptionKey.SYSTEM_CEC_CONTROL, enabled);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void nativeSetLanguage(String language) {
|
public void nativeSetLanguage(String language) {
|
||||||
try {
|
try {
|
||||||
@@ -1028,7 +1301,7 @@ final class HdmiCecController {
|
|||||||
|
|
||||||
boolean connectToHal() {
|
boolean connectToHal() {
|
||||||
try {
|
try {
|
||||||
mHdmiCec = IHdmiCec.getService(true);
|
mHdmiCec = android.hardware.tv.cec.V1_0.IHdmiCec.getService(true);
|
||||||
try {
|
try {
|
||||||
mHdmiCec.linkToDeath(this, HDMI_CEC_HAL_DEATH_COOKIE);
|
mHdmiCec.linkToDeath(this, HDMI_CEC_HAL_DEATH_COOKIE);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
@@ -1053,7 +1326,8 @@ final class HdmiCecController {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int nativeSendCecCommand(int srcAddress, int dstAddress, byte[] body) {
|
public int nativeSendCecCommand(int srcAddress, int dstAddress, byte[] body) {
|
||||||
CecMessage message = new CecMessage();
|
android.hardware.tv.cec.V1_0.CecMessage message =
|
||||||
|
new android.hardware.tv.cec.V1_0.CecMessage();
|
||||||
message.initiator = srcAddress;
|
message.initiator = srcAddress;
|
||||||
message.destination = dstAddress;
|
message.destination = dstAddress;
|
||||||
message.body = new ArrayList<>(body.length);
|
message.body = new ArrayList<>(body.length);
|
||||||
@@ -1141,8 +1415,7 @@ final class HdmiCecController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
private void nativeSetOption(int flag, boolean enabled) {
|
||||||
public void nativeSetOption(int flag, boolean enabled) {
|
|
||||||
try {
|
try {
|
||||||
mHdmiCec.setOption(flag, enabled);
|
mHdmiCec.setOption(flag, enabled);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
@@ -1150,6 +1423,21 @@ final class HdmiCecController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enableWakeupByOtp(boolean enabled) {
|
||||||
|
nativeSetOption(OptionKey.WAKEUP, enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enableCec(boolean enabled) {
|
||||||
|
nativeSetOption(OptionKey.ENABLE_CEC, enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enableSystemCecControl(boolean enabled) {
|
||||||
|
nativeSetOption(OptionKey.SYSTEM_CEC_CONTROL, enabled);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void nativeSetLanguage(String language) {
|
public void nativeSetLanguage(String language) {
|
||||||
try {
|
try {
|
||||||
@@ -1211,7 +1499,8 @@ final class HdmiCecController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class HdmiCecCallback10 extends IHdmiCecCallback.Stub {
|
private static final class HdmiCecCallback10
|
||||||
|
extends android.hardware.tv.cec.V1_0.IHdmiCecCallback.Stub {
|
||||||
private final HdmiCecCallback mHdmiCecCallback;
|
private final HdmiCecCallback mHdmiCecCallback;
|
||||||
|
|
||||||
HdmiCecCallback10(HdmiCecCallback hdmiCecCallback) {
|
HdmiCecCallback10(HdmiCecCallback hdmiCecCallback) {
|
||||||
@@ -1219,7 +1508,8 @@ final class HdmiCecController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCecMessage(CecMessage message) throws RemoteException {
|
public void onCecMessage(android.hardware.tv.cec.V1_0.CecMessage message)
|
||||||
|
throws RemoteException {
|
||||||
byte[] body = new byte[message.body.size()];
|
byte[] body = new byte[message.body.size()];
|
||||||
for (int i = 0; i < message.body.size(); i++) {
|
for (int i = 0; i < message.body.size(); i++) {
|
||||||
body[i] = message.body.get(i);
|
body[i] = message.body.get(i);
|
||||||
@@ -1252,7 +1542,8 @@ final class HdmiCecController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCecMessage(CecMessage message) throws RemoteException {
|
public void onCecMessage(android.hardware.tv.cec.V1_0.CecMessage message)
|
||||||
|
throws RemoteException {
|
||||||
byte[] body = new byte[message.body.size()];
|
byte[] body = new byte[message.body.size()];
|
||||||
for (int i = 0; i < message.body.size(); i++) {
|
for (int i = 0; i < message.body.size(); i++) {
|
||||||
body[i] = message.body.get(i);
|
body[i] = message.body.get(i);
|
||||||
@@ -1266,6 +1557,52 @@ final class HdmiCecController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final class HdmiCecCallbackAidl extends IHdmiCecCallback.Stub {
|
||||||
|
private final HdmiCecCallback mHdmiCecCallback;
|
||||||
|
|
||||||
|
HdmiCecCallbackAidl(HdmiCecCallback hdmiCecCallback) {
|
||||||
|
mHdmiCecCallback = hdmiCecCallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCecMessage(CecMessage message) throws RemoteException {
|
||||||
|
mHdmiCecCallback.onCecMessage(message.initiator, message.destination, message.body);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized String getInterfaceHash() throws android.os.RemoteException {
|
||||||
|
return IHdmiCecCallback.Stub.HASH;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getInterfaceVersion() throws android.os.RemoteException {
|
||||||
|
return IHdmiCecCallback.Stub.VERSION;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class HdmiCallbackAidl extends IHdmiCallback.Stub {
|
||||||
|
private final HdmiCecCallback mHdmiCecCallback;
|
||||||
|
|
||||||
|
HdmiCallbackAidl(HdmiCecCallback hdmiCecCallback) {
|
||||||
|
mHdmiCecCallback = hdmiCecCallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onHotplugEvent(boolean connected, int portId) throws RemoteException {
|
||||||
|
mHdmiCecCallback.onHotplugEvent(portId, connected);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized String getInterfaceHash() throws android.os.RemoteException {
|
||||||
|
return IHdmiCallback.Stub.HASH;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getInterfaceVersion() throws android.os.RemoteException {
|
||||||
|
return IHdmiCallback.Stub.VERSION;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public abstract static class Dumpable {
|
public abstract static class Dumpable {
|
||||||
protected final long mTime;
|
protected final long mTime;
|
||||||
|
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ import android.hardware.hdmi.IHdmiMhlVendorCommandListener;
|
|||||||
import android.hardware.hdmi.IHdmiRecordListener;
|
import android.hardware.hdmi.IHdmiRecordListener;
|
||||||
import android.hardware.hdmi.IHdmiSystemAudioModeChangeListener;
|
import android.hardware.hdmi.IHdmiSystemAudioModeChangeListener;
|
||||||
import android.hardware.hdmi.IHdmiVendorCommandListener;
|
import android.hardware.hdmi.IHdmiVendorCommandListener;
|
||||||
import android.hardware.tv.cec.V1_0.OptionKey;
|
|
||||||
import android.hardware.tv.cec.V1_0.SendMessageResult;
|
import android.hardware.tv.cec.V1_0.SendMessageResult;
|
||||||
import android.media.AudioAttributes;
|
import android.media.AudioAttributes;
|
||||||
import android.media.AudioDeviceAttributes;
|
import android.media.AudioDeviceAttributes;
|
||||||
@@ -656,7 +655,7 @@ public class HdmiControlService extends SystemService {
|
|||||||
if (mHdmiControlEnabled == HdmiControlManager.HDMI_CEC_CONTROL_ENABLED) {
|
if (mHdmiControlEnabled == HdmiControlManager.HDMI_CEC_CONTROL_ENABLED) {
|
||||||
initializeCec(INITIATED_BY_BOOT_UP);
|
initializeCec(INITIATED_BY_BOOT_UP);
|
||||||
} else {
|
} else {
|
||||||
mCecController.setOption(OptionKey.ENABLE_CEC, false);
|
mCecController.enableCec(false);
|
||||||
}
|
}
|
||||||
mMhlDevices = Collections.emptyList();
|
mMhlDevices = Collections.emptyList();
|
||||||
|
|
||||||
@@ -730,10 +729,11 @@ public class HdmiControlService extends SystemService {
|
|||||||
@Override
|
@Override
|
||||||
public void onChange(String setting) {
|
public void onChange(String setting) {
|
||||||
if (isTvDeviceEnabled()) {
|
if (isTvDeviceEnabled()) {
|
||||||
setCecOption(OptionKey.WAKEUP, tv().getAutoWakeup());
|
mCecController.enableWakeupByOtp(tv().getAutoWakeup());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, mServiceThreadExecutor);
|
},
|
||||||
|
mServiceThreadExecutor);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns true if the device screen is off */
|
/** Returns true if the device screen is off */
|
||||||
@@ -854,7 +854,7 @@ public class HdmiControlService extends SystemService {
|
|||||||
mWakeUpMessageReceived = false;
|
mWakeUpMessageReceived = false;
|
||||||
|
|
||||||
if (isTvDeviceEnabled()) {
|
if (isTvDeviceEnabled()) {
|
||||||
mCecController.setOption(OptionKey.WAKEUP, tv().getAutoWakeup());
|
mCecController.enableWakeupByOtp(tv().getAutoWakeup());
|
||||||
}
|
}
|
||||||
int reason = -1;
|
int reason = -1;
|
||||||
switch (initiatedBy) {
|
switch (initiatedBy) {
|
||||||
@@ -988,7 +988,7 @@ public class HdmiControlService extends SystemService {
|
|||||||
mCecVersion = Math.max(HdmiControlManager.HDMI_CEC_VERSION_1_4_B,
|
mCecVersion = Math.max(HdmiControlManager.HDMI_CEC_VERSION_1_4_B,
|
||||||
Math.min(settingsCecVersion, supportedCecVersion));
|
Math.min(settingsCecVersion, supportedCecVersion));
|
||||||
|
|
||||||
mCecController.setOption(OptionKey.SYSTEM_CEC_CONTROL, true);
|
mCecController.enableSystemCecControl(true);
|
||||||
mCecController.setLanguage(mMenuLanguage);
|
mCecController.setLanguage(mMenuLanguage);
|
||||||
initializeLocalDevices(initiatedBy);
|
initializeLocalDevices(initiatedBy);
|
||||||
}
|
}
|
||||||
@@ -3422,7 +3422,7 @@ public class HdmiControlService extends SystemService {
|
|||||||
device.onStandby(mStandbyMessageReceived, standbyAction);
|
device.onStandby(mStandbyMessageReceived, standbyAction);
|
||||||
}
|
}
|
||||||
if (!isAudioSystemDevice()) {
|
if (!isAudioSystemDevice()) {
|
||||||
mCecController.setOption(OptionKey.SYSTEM_CEC_CONTROL, false);
|
mCecController.enableSystemCecControl(false);
|
||||||
mMhlController.setOption(OPTION_MHL_SERVICE_CONTROL, DISABLED);
|
mMhlController.setOption(OPTION_MHL_SERVICE_CONTROL, DISABLED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3570,12 +3570,6 @@ public class HdmiControlService extends SystemService {
|
|||||||
runOnServiceThread(this::checkAndUpdateAbsoluteVolumeControlState);
|
runOnServiceThread(this::checkAndUpdateAbsoluteVolumeControlState);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ServiceThreadOnly
|
|
||||||
void setCecOption(int key, boolean value) {
|
|
||||||
assertRunOnServiceThread();
|
|
||||||
mCecController.setOption(key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
@ServiceThreadOnly
|
@ServiceThreadOnly
|
||||||
void setControlEnabled(@HdmiControlManager.HdmiCecControl int enabled) {
|
void setControlEnabled(@HdmiControlManager.HdmiCecControl int enabled) {
|
||||||
assertRunOnServiceThread();
|
assertRunOnServiceThread();
|
||||||
@@ -3610,8 +3604,8 @@ public class HdmiControlService extends SystemService {
|
|||||||
|
|
||||||
@ServiceThreadOnly
|
@ServiceThreadOnly
|
||||||
private void enableHdmiControlService() {
|
private void enableHdmiControlService() {
|
||||||
mCecController.setOption(OptionKey.ENABLE_CEC, true);
|
mCecController.enableCec(true);
|
||||||
mCecController.setOption(OptionKey.SYSTEM_CEC_CONTROL, true);
|
mCecController.enableSystemCecControl(true);
|
||||||
mMhlController.setOption(OPTION_MHL_ENABLE, ENABLED);
|
mMhlController.setOption(OPTION_MHL_ENABLE, ENABLED);
|
||||||
|
|
||||||
initializeCec(INITIATED_BY_ENABLE_CEC);
|
initializeCec(INITIATED_BY_ENABLE_CEC);
|
||||||
@@ -3619,21 +3613,23 @@ public class HdmiControlService extends SystemService {
|
|||||||
|
|
||||||
@ServiceThreadOnly
|
@ServiceThreadOnly
|
||||||
private void disableHdmiControlService() {
|
private void disableHdmiControlService() {
|
||||||
disableDevices(new PendingActionClearedCallback() {
|
disableDevices(
|
||||||
@Override
|
new PendingActionClearedCallback() {
|
||||||
public void onCleared(HdmiCecLocalDevice device) {
|
|
||||||
assertRunOnServiceThread();
|
|
||||||
mCecController.flush(new Runnable() {
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void onCleared(HdmiCecLocalDevice device) {
|
||||||
mCecController.setOption(OptionKey.ENABLE_CEC, false);
|
assertRunOnServiceThread();
|
||||||
mCecController.setOption(OptionKey.SYSTEM_CEC_CONTROL, false);
|
mCecController.flush(
|
||||||
mMhlController.setOption(OPTION_MHL_ENABLE, DISABLED);
|
new Runnable() {
|
||||||
clearLocalDevices();
|
@Override
|
||||||
|
public void run() {
|
||||||
|
mCecController.enableCec(false);
|
||||||
|
mCecController.enableSystemCecControl(false);
|
||||||
|
mMhlController.setOption(OPTION_MHL_ENABLE, DISABLED);
|
||||||
|
clearLocalDevices();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ServiceThreadOnly
|
@ServiceThreadOnly
|
||||||
|
|||||||
@@ -118,7 +118,13 @@ final class FakeNativeWrapper implements NativeWrapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void nativeSetOption(int flag, boolean enabled) {}
|
public void enableWakeupByOtp(boolean enabled) {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enableCec(boolean enabled) {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enableSystemCecControl(boolean enabled) {}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void nativeSetLanguage(String language) {}
|
public void nativeSetLanguage(String language) {}
|
||||||
|
|||||||
Reference in New Issue
Block a user