Loading core/java/android/hardware/camera2/CameraManager.java +2 −0 Original line number Diff line number Diff line Loading @@ -358,6 +358,8 @@ public final class CameraManager { // TODO: factor out callback to be non-nested, then move setter to constructor // For now, calling setRemoteDevice will fire initial // onOpened/onUnconfigured callbacks. // This function call may post onDisconnected and throw CAMERA_DISCONNECTED if // cameraUser dies during setup. deviceImpl.setRemoteDevice(cameraUser); device = deviceImpl; } Loading core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +48 −2 Original line number Diff line number Diff line Loading @@ -63,7 +63,8 @@ import java.util.TreeMap; /** * HAL2.1+ implementation of CameraDevice. Use CameraManager#open to instantiate */ public class CameraDeviceImpl extends CameraDevice { public class CameraDeviceImpl extends CameraDevice implements IBinder.DeathRecipient { private final String TAG; private final boolean DEBUG = false; Loading Loading @@ -261,7 +262,14 @@ public class CameraDeviceImpl extends CameraDevice { return mCallbacks; } public void setRemoteDevice(ICameraDeviceUser remoteDevice) { /** * Set remote device, which triggers initial onOpened/onUnconfigured callbacks * * <p>This function may post onDisconnected and throw CAMERA_DISCONNECTED if remoteDevice dies * during setup.</p> * */ public void setRemoteDevice(ICameraDeviceUser remoteDevice) throws CameraAccessException { synchronized(mInterfaceLock) { // TODO: Move from decorator to direct binder-mediated exceptions // If setRemoteFailure already called, do nothing Loading @@ -269,6 +277,20 @@ public class CameraDeviceImpl extends CameraDevice { mRemoteDevice = new ICameraDeviceUserWrapper(remoteDevice); IBinder remoteDeviceBinder = remoteDevice.asBinder(); // For legacy camera device, remoteDevice is in the same process, and // asBinder returns NULL. if (remoteDeviceBinder != null) { try { remoteDeviceBinder.linkToDeath(this, /*flag*/ 0); } catch (RemoteException e) { CameraDeviceImpl.this.mDeviceHandler.post(mCallOnDisconnected); throw new CameraAccessException(CameraAccessException.CAMERA_DISCONNECTED, "The camera device has encountered a serious error"); } } mDeviceHandler.post(mCallOnOpened); mDeviceHandler.post(mCallOnUnconfigured); } Loading Loading @@ -1962,4 +1984,28 @@ public class CameraDeviceImpl extends CameraDevice { return mCharacteristics; } /** * Listener for binder death. * * <p> Handle binder death for ICameraDeviceUser. Trigger onError.</p> */ public void binderDied() { Log.w(TAG, "CameraDevice " + mCameraId + " died unexpectedly"); if (mRemoteDevice == null) { return; // Camera already closed } mInError = true; Runnable r = new Runnable() { @Override public void run() { if (!isClosed()) { mDeviceCallback.onError(CameraDeviceImpl.this, CameraDeviceCallbacks.ERROR_CAMERA_SERVICE); } } }; CameraDeviceImpl.this.mDeviceHandler.post(r); } } Loading
core/java/android/hardware/camera2/CameraManager.java +2 −0 Original line number Diff line number Diff line Loading @@ -358,6 +358,8 @@ public final class CameraManager { // TODO: factor out callback to be non-nested, then move setter to constructor // For now, calling setRemoteDevice will fire initial // onOpened/onUnconfigured callbacks. // This function call may post onDisconnected and throw CAMERA_DISCONNECTED if // cameraUser dies during setup. deviceImpl.setRemoteDevice(cameraUser); device = deviceImpl; } Loading
core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +48 −2 Original line number Diff line number Diff line Loading @@ -63,7 +63,8 @@ import java.util.TreeMap; /** * HAL2.1+ implementation of CameraDevice. Use CameraManager#open to instantiate */ public class CameraDeviceImpl extends CameraDevice { public class CameraDeviceImpl extends CameraDevice implements IBinder.DeathRecipient { private final String TAG; private final boolean DEBUG = false; Loading Loading @@ -261,7 +262,14 @@ public class CameraDeviceImpl extends CameraDevice { return mCallbacks; } public void setRemoteDevice(ICameraDeviceUser remoteDevice) { /** * Set remote device, which triggers initial onOpened/onUnconfigured callbacks * * <p>This function may post onDisconnected and throw CAMERA_DISCONNECTED if remoteDevice dies * during setup.</p> * */ public void setRemoteDevice(ICameraDeviceUser remoteDevice) throws CameraAccessException { synchronized(mInterfaceLock) { // TODO: Move from decorator to direct binder-mediated exceptions // If setRemoteFailure already called, do nothing Loading @@ -269,6 +277,20 @@ public class CameraDeviceImpl extends CameraDevice { mRemoteDevice = new ICameraDeviceUserWrapper(remoteDevice); IBinder remoteDeviceBinder = remoteDevice.asBinder(); // For legacy camera device, remoteDevice is in the same process, and // asBinder returns NULL. if (remoteDeviceBinder != null) { try { remoteDeviceBinder.linkToDeath(this, /*flag*/ 0); } catch (RemoteException e) { CameraDeviceImpl.this.mDeviceHandler.post(mCallOnDisconnected); throw new CameraAccessException(CameraAccessException.CAMERA_DISCONNECTED, "The camera device has encountered a serious error"); } } mDeviceHandler.post(mCallOnOpened); mDeviceHandler.post(mCallOnUnconfigured); } Loading Loading @@ -1962,4 +1984,28 @@ public class CameraDeviceImpl extends CameraDevice { return mCharacteristics; } /** * Listener for binder death. * * <p> Handle binder death for ICameraDeviceUser. Trigger onError.</p> */ public void binderDied() { Log.w(TAG, "CameraDevice " + mCameraId + " died unexpectedly"); if (mRemoteDevice == null) { return; // Camera already closed } mInError = true; Runnable r = new Runnable() { @Override public void run() { if (!isClosed()) { mDeviceCallback.onError(CameraDeviceImpl.this, CameraDeviceCallbacks.ERROR_CAMERA_SERVICE); } } }; CameraDeviceImpl.this.mDeviceHandler.post(r); } }