Camera: Improve error handling of device state listeners

Do not register characteristic fold state listeners in
case the DeviceStateManager fails to register the main
device state callback. This is possible in case we are
running in instant mode and can impact the correctness of
the characteristics override logic.

Bug: 281930689
Test:
atest --instant
cts/tests/camera/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java#testLegacyCameraDeviceParity
atest
cts/tests/camera/src/android/hardware/camera2/cts/ExtendedCameraCharacteristicsTest.java#testLegacyCameraDeviceParity

Change-Id: I53908508c5dd7375663cf37fc18522b1cea12e5e
This commit is contained in:
Emilian Peev
2023-05-12 17:40:12 -07:00
parent ecbd3d61dd
commit 20a131fe3b
2 changed files with 14 additions and 9 deletions

View File

@@ -212,14 +212,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
@GuardedBy("mLock")
private boolean mFoldedDeviceState;
private final CameraManager.DeviceStateListener mFoldStateListener =
new CameraManager.DeviceStateListener() {
@Override
public final void onDeviceStateChanged(boolean folded) {
synchronized (mLock) {
mFoldedDeviceState = folded;
}
}};
private CameraManager.DeviceStateListener mFoldStateListener;
private static final String TAG = "CameraCharacteristics";
@@ -245,7 +238,18 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
/**
* Return the device state listener for this Camera characteristics instance
*/
CameraManager.DeviceStateListener getDeviceStateListener() { return mFoldStateListener; }
CameraManager.DeviceStateListener getDeviceStateListener() {
if (mFoldStateListener == null) {
mFoldStateListener = new CameraManager.DeviceStateListener() {
@Override
public final void onDeviceStateChanged(boolean folded) {
synchronized (mLock) {
mFoldedDeviceState = folded;
}
}};
}
return mFoldStateListener;
}
/**
* Overrides the property value

View File

@@ -1811,6 +1811,7 @@ public final class CameraManager {
ctx.getSystemService(DeviceStateManager.class).registerCallback(
new HandlerExecutor(mDeviceStateHandler), mFoldStateListener);
} catch (IllegalStateException e) {
mFoldStateListener = null;
Log.v(TAG, "Failed to register device state listener!");
Log.v(TAG, "Device state dependent characteristics updates will not be" +
"functional!");