TIF: fix NPE for TvInputHardwareManager
Bug: 18365836
Change-Id: I270fac7c73ad8e7225b523a8ec517157310509dc
diff --git a/services/core/java/com/android/server/tv/TvInputHardwareManager.java b/services/core/java/com/android/server/tv/TvInputHardwareManager.java
index 85659cf..a9c8a61 100644
--- a/services/core/java/com/android/server/tv/TvInputHardwareManager.java
+++ b/services/core/java/com/android/server/tv/TvInputHardwareManager.java
@@ -673,28 +673,35 @@
if (mReleased) {
throw new IllegalStateException("Device already released.");
}
- if (surface != null && config == null) {
- return false;
- }
- if (surface == null && mActiveConfig == null) {
- return false;
- }
int result = TvInputHal.ERROR_UNKNOWN;
if (surface == null) {
- result = mHal.removeStream(mInfo.getDeviceId(), mActiveConfig);
- mActiveConfig = null;
+ // The value of config is ignored when surface == null.
+ if (mActiveConfig != null) {
+ result = mHal.removeStream(mInfo.getDeviceId(), mActiveConfig);
+ mActiveConfig = null;
+ } else {
+ // We already have no active stream.
+ return true;
+ }
} else {
- if (!config.equals(mActiveConfig)) {
+ // It's impossible to set a non-null surface with a null config.
+ if (config == null) {
+ return false;
+ }
+ // Remove stream only if we have an existing active configuration.
+ if (mActiveConfig != null && !config.equals(mActiveConfig)) {
result = mHal.removeStream(mInfo.getDeviceId(), mActiveConfig);
if (result != TvInputHal.SUCCESS) {
mActiveConfig = null;
- return false;
}
}
- result = mHal.addOrUpdateStream(mInfo.getDeviceId(), surface, config);
+ // Proceed only if all previous operations succeeded.
if (result == TvInputHal.SUCCESS) {
- mActiveConfig = config;
+ result = mHal.addOrUpdateStream(mInfo.getDeviceId(), surface, config);
+ if (result == TvInputHal.SUCCESS) {
+ mActiveConfig = config;
+ }
}
}
updateAudioConfigLocked();