summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Emilian Peev <epeev@google.com> 2023-02-23 12:30:12 -0800
committer Emilian Peev <epeev@google.com> 2023-02-23 12:36:26 -0800
commit515e89f909b17e5befdcac128614264172b899df (patch)
treef75e800b5ff2a950423441f70a90f11a89ba7c68
parent42dde263369d0b78827dada09ecea25036b91935 (diff)
Camera: Use a single handler thread for device state callbacks
Use a single handler thread within the same camera client process for processing device state changes. This should avoid cases where clients continuously instantiate and cache CameraManager instances until the process FD limit is reached. Bug: 270551856 Test: atest -c -d cts/tests/tests/virtualdevice/src/android/virtualdevice/cts/VirtualDeviceManagerBasicTest.java#getVirtualDevices_returnsAllVirtualDevices --iterations=10 and ensure that the handler thread for device state callbacks remains the same. Change-Id: Ia659075947ab6c3f2bf56119b06f6397953dbd5a
-rw-r--r--core/java/android/hardware/camera2/CameraManager.java27
1 files changed, 18 insertions, 9 deletions
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index 19719a88ab2e..fbc018444dc5 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -142,24 +142,18 @@ public final class CameraManager {
PackageManager.PERMISSION_GRANTED;
}
- mHandlerThread = new HandlerThread(TAG);
- mHandlerThread.start();
- mHandler = new Handler(mHandlerThread.getLooper());
mFoldStateListener = new FoldStateListener(context);
try {
- context.getSystemService(DeviceStateManager.class)
- .registerCallback(new HandlerExecutor(mHandler), mFoldStateListener);
+ context.getSystemService(DeviceStateManager.class).registerCallback(
+ new HandlerExecutor(CameraManagerGlobal.get().getDeviceStateHandler()),
+ mFoldStateListener);
} catch (IllegalStateException e) {
Log.v(TAG, "Failed to register device state listener!");
Log.v(TAG, "Device state dependent characteristics updates will not be functional!");
- mHandlerThread.quitSafely();
- mHandler = null;
mFoldStateListener = null;
}
}
- private HandlerThread mHandlerThread;
- private Handler mHandler;
private FoldStateListener mFoldStateListener;
/**
@@ -1645,6 +1639,9 @@ public final class CameraManager {
private ICameraService mCameraService;
private boolean mHasOpenCloseListenerPermission = false;
+ private HandlerThread mDeviceStateHandlerThread;
+ private Handler mDeviceStateHandler;
+
// Singleton, don't allow construction
private CameraManagerGlobal() { }
@@ -1658,6 +1655,18 @@ public final class CameraManager {
return gCameraManager;
}
+ public Handler getDeviceStateHandler() {
+ synchronized(mLock) {
+ if (mDeviceStateHandlerThread == null) {
+ mDeviceStateHandlerThread = new HandlerThread(TAG);
+ mDeviceStateHandlerThread.start();
+ mDeviceStateHandler = new Handler(mDeviceStateHandlerThread.getLooper());
+ }
+
+ return mDeviceStateHandler;
+ }
+ }
+
@Override
public IBinder asBinder() {
return this;