Merge "update connect status along with stream_configuration_change event."

This commit is contained in:
Henry Fang
2021-01-15 19:41:53 +00:00
committed by Gerrit Code Review
4 changed files with 59 additions and 21 deletions

View File

@@ -188,6 +188,17 @@ public final class TvInputHardwareInfo implements Parcelable {
mCableConnectionStatus = source.readInt(); mCableConnectionStatus = source.readInt();
} }
/** @hide */
public Builder toBuilder() {
return new Builder()
.deviceId(mDeviceId)
.type(mType)
.audioType(mAudioType)
.audioAddress(mAudioAddress)
.hdmiPortId(mHdmiPortId)
.cableConnectionStatus(mCableConnectionStatus);
}
public static final class Builder { public static final class Builder {
private Integer mDeviceId = null; private Integer mDeviceId = null;
private Integer mType = null; private Integer mType = null;

View File

@@ -51,7 +51,8 @@ final class TvInputHal implements Handler.Callback {
public interface Callback { public interface Callback {
void onDeviceAvailable(TvInputHardwareInfo info, TvStreamConfig[] configs); void onDeviceAvailable(TvInputHardwareInfo info, TvStreamConfig[] configs);
void onDeviceUnavailable(int deviceId); void onDeviceUnavailable(int deviceId);
void onStreamConfigurationChanged(int deviceId, TvStreamConfig[] configs); void onStreamConfigurationChanged(int deviceId, TvStreamConfig[] configs,
int cableConnectionStatus);
void onFirstFrameCaptured(int deviceId, int streamId); void onFirstFrameCaptured(int deviceId, int streamId);
} }
@@ -142,8 +143,9 @@ final class TvInputHal implements Handler.Callback {
mHandler.obtainMessage(EVENT_DEVICE_UNAVAILABLE, deviceId, 0).sendToTarget(); mHandler.obtainMessage(EVENT_DEVICE_UNAVAILABLE, deviceId, 0).sendToTarget();
} }
private void streamConfigsChangedFromNative(int deviceId) { private void streamConfigsChangedFromNative(int deviceId, int cableConnectionStatus) {
mHandler.obtainMessage(EVENT_STREAM_CONFIGURATION_CHANGED, deviceId, 0).sendToTarget(); mHandler.obtainMessage(EVENT_STREAM_CONFIGURATION_CHANGED, deviceId,
cableConnectionStatus).sendToTarget();
} }
private void firstFrameCapturedFromNative(int deviceId, int streamId) { private void firstFrameCapturedFromNative(int deviceId, int streamId) {
@@ -184,6 +186,7 @@ final class TvInputHal implements Handler.Callback {
case EVENT_STREAM_CONFIGURATION_CHANGED: { case EVENT_STREAM_CONFIGURATION_CHANGED: {
TvStreamConfig[] configs; TvStreamConfig[] configs;
int deviceId = msg.arg1; int deviceId = msg.arg1;
int cableConnectionStatus = msg.arg2;
synchronized (mLock) { synchronized (mLock) {
if (DEBUG) { if (DEBUG) {
Slog.d(TAG, "EVENT_STREAM_CONFIGURATION_CHANGED: deviceId = " + deviceId); Slog.d(TAG, "EVENT_STREAM_CONFIGURATION_CHANGED: deviceId = " + deviceId);
@@ -191,7 +194,7 @@ final class TvInputHal implements Handler.Callback {
retrieveStreamConfigsLocked(deviceId); retrieveStreamConfigsLocked(deviceId);
configs = mStreamConfigs.get(deviceId); configs = mStreamConfigs.get(deviceId);
} }
mCallback.onStreamConfigurationChanged(deviceId, configs); mCallback.onStreamConfigurationChanged(deviceId, configs, cableConnectionStatus);
break; break;
} }

View File

@@ -156,6 +156,7 @@ class TvInputHardwareManager implements TvInputHal.Callback {
synchronized (mLock) { synchronized (mLock) {
Connection connection = new Connection(info); Connection connection = new Connection(info);
connection.updateConfigsLocked(configs); connection.updateConfigsLocked(configs);
connection.updateCableConnectionStatusLocked(info.getCableConnectionStatus());
mConnections.put(info.getDeviceId(), connection); mConnections.put(info.getDeviceId(), connection);
buildHardwareListLocked(); buildHardwareListLocked();
mHandler.obtainMessage( mHandler.obtainMessage(
@@ -202,7 +203,8 @@ class TvInputHardwareManager implements TvInputHal.Callback {
} }
@Override @Override
public void onStreamConfigurationChanged(int deviceId, TvStreamConfig[] configs) { public void onStreamConfigurationChanged(int deviceId, TvStreamConfig[] configs,
int cableConnectionStatus) {
synchronized (mLock) { synchronized (mLock) {
Connection connection = mConnections.get(deviceId); Connection connection = mConnections.get(deviceId);
if (connection == null) { if (connection == null) {
@@ -211,13 +213,23 @@ class TvInputHardwareManager implements TvInputHal.Callback {
return; return;
} }
int previousConfigsLength = connection.getConfigsLengthLocked(); int previousConfigsLength = connection.getConfigsLengthLocked();
int previousCableConnectionStatus = connection.getInputStateLocked();
connection.updateConfigsLocked(configs); connection.updateConfigsLocked(configs);
String inputId = mHardwareInputIdMap.get(deviceId); String inputId = mHardwareInputIdMap.get(deviceId);
if (inputId != null if (inputId != null) {
&& (previousConfigsLength == 0) != (connection.getConfigsLengthLocked() == 0)) { if (connection.updateCableConnectionStatusLocked(cableConnectionStatus)) {
if (previousCableConnectionStatus != connection.getInputStateLocked()) {
mHandler.obtainMessage(ListenerHandler.STATE_CHANGED, mHandler.obtainMessage(ListenerHandler.STATE_CHANGED,
connection.getInputStateLocked(), 0, inputId).sendToTarget(); connection.getInputStateLocked(), 0, inputId).sendToTarget();
} }
} else {
if ((previousConfigsLength == 0)
!= (connection.getConfigsLengthLocked() == 0)) {
mHandler.obtainMessage(ListenerHandler.STATE_CHANGED,
connection.getInputStateLocked(), 0, inputId).sendToTarget();
}
}
}
ITvInputHardwareCallback callback = connection.getCallbackLocked(); ITvInputHardwareCallback callback = connection.getCallbackLocked();
if (callback != null) { if (callback != null) {
try { try {
@@ -624,7 +636,7 @@ class TvInputHardwareManager implements TvInputHal.Callback {
} }
private class Connection implements IBinder.DeathRecipient { private class Connection implements IBinder.DeathRecipient {
private final TvInputHardwareInfo mHardwareInfo; private TvInputHardwareInfo mHardwareInfo;
private TvInputInfo mInfo; private TvInputInfo mInfo;
private TvInputHardwareImpl mHardware = null; private TvInputHardwareImpl mHardware = null;
private ITvInputHardwareCallback mCallback; private ITvInputHardwareCallback mCallback;
@@ -633,6 +645,7 @@ class TvInputHardwareManager implements TvInputHal.Callback {
private Integer mResolvedUserId = null; private Integer mResolvedUserId = null;
private Runnable mOnFirstFrameCaptured; private Runnable mOnFirstFrameCaptured;
private ResourceClientProfile mResourceClientProfile = null; private ResourceClientProfile mResourceClientProfile = null;
private boolean mIsCableConnectionStatusUpdated = false;
public Connection(TvInputHardwareInfo hardwareInfo) { public Connection(TvInputHardwareInfo hardwareInfo) {
mHardwareInfo = hardwareInfo; mHardwareInfo = hardwareInfo;
@@ -735,6 +748,17 @@ class TvInputHardwareManager implements TvInputHal.Callback {
+ " }"; + " }";
} }
public boolean updateCableConnectionStatusLocked(int cableConnectionStatus) {
// Update connection status only if it's not default value
if (cableConnectionStatus != TvInputHardwareInfo.CABLE_CONNECTION_STATUS_UNKNOWN
|| mIsCableConnectionStatusUpdated) {
mIsCableConnectionStatusUpdated = true;
mHardwareInfo = mHardwareInfo.toBuilder()
.cableConnectionStatus(cableConnectionStatus).build();
}
return mIsCableConnectionStatusUpdated;
}
private int getConfigsLengthLocked() { private int getConfigsLengthLocked() {
return mConfigs == null ? 0 : mConfigs.length; return mConfigs == null ? 0 : mConfigs.length;
} }
@@ -742,8 +766,10 @@ class TvInputHardwareManager implements TvInputHal.Callback {
private int getInputStateLocked() { private int getInputStateLocked() {
int configsLength = getConfigsLengthLocked(); int configsLength = getConfigsLengthLocked();
if (configsLength > 0) { if (configsLength > 0) {
if (!mIsCableConnectionStatusUpdated) {
return INPUT_STATE_CONNECTED; return INPUT_STATE_CONNECTED;
} }
}
switch (mHardwareInfo.getCableConnectionStatus()) { switch (mHardwareInfo.getCableConnectionStatus()) {
case TvInputHardwareInfo.CABLE_CONNECTION_STATUS_CONNECTED: case TvInputHardwareInfo.CABLE_CONNECTION_STATUS_CONNECTED:
return INPUT_STATE_CONNECTED; return INPUT_STATE_CONNECTED;

View File

@@ -261,7 +261,7 @@ public:
void onDeviceAvailable(const TvInputDeviceInfo& info); void onDeviceAvailable(const TvInputDeviceInfo& info);
void onDeviceUnavailable(int deviceId); void onDeviceUnavailable(int deviceId);
void onStreamConfigurationsChanged(int deviceId); void onStreamConfigurationsChanged(int deviceId, int cableConnectionStatus);
void onCaptured(int deviceId, int streamId, uint32_t seq, bool succeeded); void onCaptured(int deviceId, int streamId, uint32_t seq, bool succeeded);
private: private:
@@ -519,7 +519,7 @@ void JTvInputHal::onDeviceUnavailable(int deviceId) {
deviceId); deviceId);
} }
void JTvInputHal::onStreamConfigurationsChanged(int deviceId) { void JTvInputHal::onStreamConfigurationsChanged(int deviceId, int cableConnectionStatus) {
{ {
Mutex::Autolock autoLock(&mLock); Mutex::Autolock autoLock(&mLock);
KeyedVector<int, Connection>& connections = mConnections.editValueFor(deviceId); KeyedVector<int, Connection>& connections = mConnections.editValueFor(deviceId);
@@ -529,10 +529,8 @@ void JTvInputHal::onStreamConfigurationsChanged(int deviceId) {
connections.clear(); connections.clear();
} }
JNIEnv* env = AndroidRuntime::getJNIEnv(); JNIEnv* env = AndroidRuntime::getJNIEnv();
env->CallVoidMethod( env->CallVoidMethod(mThiz, gTvInputHalClassInfo.streamConfigsChanged, deviceId,
mThiz, cableConnectionStatus);
gTvInputHalClassInfo.streamConfigsChanged,
deviceId);
} }
void JTvInputHal::onCaptured(int deviceId, int streamId, uint32_t seq, bool succeeded) { void JTvInputHal::onCaptured(int deviceId, int streamId, uint32_t seq, bool succeeded) {
@@ -572,7 +570,8 @@ void JTvInputHal::NotifyHandler::handleMessage(const Message& message) {
mHal->onDeviceUnavailable(mEvent.deviceInfo.deviceId); mHal->onDeviceUnavailable(mEvent.deviceInfo.deviceId);
} break; } break;
case TvInputEventType::STREAM_CONFIGURATIONS_CHANGED: { case TvInputEventType::STREAM_CONFIGURATIONS_CHANGED: {
mHal->onStreamConfigurationsChanged(mEvent.deviceInfo.deviceId); int cableConnectionStatus = static_cast<int>(mEvent.deviceInfo.cableConnectionStatus);
mHal->onStreamConfigurationsChanged(mEvent.deviceInfo.deviceId, cableConnectionStatus);
} break; } break;
default: default:
ALOGE("Unrecognizable event"); ALOGE("Unrecognizable event");
@@ -688,9 +687,8 @@ int register_android_server_tv_TvInputHal(JNIEnv* env) {
"deviceAvailableFromNative", "(Landroid/media/tv/TvInputHardwareInfo;)V"); "deviceAvailableFromNative", "(Landroid/media/tv/TvInputHardwareInfo;)V");
GET_METHOD_ID( GET_METHOD_ID(
gTvInputHalClassInfo.deviceUnavailable, clazz, "deviceUnavailableFromNative", "(I)V"); gTvInputHalClassInfo.deviceUnavailable, clazz, "deviceUnavailableFromNative", "(I)V");
GET_METHOD_ID( GET_METHOD_ID(gTvInputHalClassInfo.streamConfigsChanged, clazz,
gTvInputHalClassInfo.streamConfigsChanged, clazz, "streamConfigsChangedFromNative", "(II)V");
"streamConfigsChangedFromNative", "(I)V");
GET_METHOD_ID( GET_METHOD_ID(
gTvInputHalClassInfo.firstFrameCaptured, clazz, gTvInputHalClassInfo.firstFrameCaptured, clazz,
"firstFrameCapturedFromNative", "(II)V"); "firstFrameCapturedFromNative", "(II)V");