From 24854383dc7fef62abfd303edbb99eda3d941e1c Mon Sep 17 00:00:00 2001 From: jianhuac Date: Wed, 23 Nov 2016 15:27:56 +0800 Subject: SnapdragonCamera: ANR when open photo just taken Camera app stop preview when leave camera app to gallery, and may take a long time and block the main thread in extreme cases. Set a timeout to avoid blocking the main thread long time and cause ANR. Change-Id: I403b4248f6cbeb7e97b6e5704dd29b8b8b911363 CRs-Fixed: 1091688 --- .../android/camera/AndroidCameraManagerImpl.java | 26 +++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) mode change 100755 => 100644 src/com/android/camera/AndroidCameraManagerImpl.java diff --git a/src/com/android/camera/AndroidCameraManagerImpl.java b/src/com/android/camera/AndroidCameraManagerImpl.java old mode 100755 new mode 100644 index 486629895..438be2e90 --- a/src/com/android/camera/AndroidCameraManagerImpl.java +++ b/src/com/android/camera/AndroidCameraManagerImpl.java @@ -200,6 +200,30 @@ class AndroidCameraManagerImpl implements CameraManager { return true; } + public boolean waitDone(long timeout) { + final Object waitDoneLock = new Object(); + final Runnable unlockRunnable = new Runnable() { + @Override + public void run() { + synchronized (waitDoneLock) { + waitDoneLock.notifyAll(); + } + } + }; + + synchronized (waitDoneLock) { + mCameraHandler.post(unlockRunnable); + try { + waitDoneLock.wait(timeout); + mCameraHandler.removeCallbacks(unlockRunnable); + } catch (InterruptedException ex) { + Log.v(TAG, "waitDone interrupted"); + return false; + } + } + return true; + } + /** * This method does not deal with the API level check. Everyone should * check first for supported operations before sending message to this handler. @@ -499,7 +523,7 @@ class AndroidCameraManagerImpl implements CameraManager { @Override public void stopPreview() { mCameraHandler.sendEmptyMessage(STOP_PREVIEW); - mCameraHandler.waitDone(); + mCameraHandler.waitDone(200); } @Override -- cgit v1.2.3