diff options
-rw-r--r-- | src/com/android/camera/one/v2/OneCameraZslImpl.java | 22 | ||||
-rw-r--r-- | src/com/android/camera/util/ConjunctionListenerMux.java | 21 |
2 files changed, 31 insertions, 12 deletions
diff --git a/src/com/android/camera/one/v2/OneCameraZslImpl.java b/src/com/android/camera/one/v2/OneCameraZslImpl.java index 37c44f1cc..4d5fdef39 100644 --- a/src/com/android/camera/one/v2/OneCameraZslImpl.java +++ b/src/com/android/camera/one/v2/OneCameraZslImpl.java @@ -183,12 +183,15 @@ public class OneCameraZslImpl extends AbstractOneCamera { private MeteringRectangle[] mAERegions = ZERO_WEIGHT_3A_REGION; /** - * Ready state depends on two things:<br> + * Ready state (typically displayed by the UI shutter-button) depends on two + * things:<br> * <ol> * <li>{@link #mCaptureManager} must be ready.</li> * <li>We must not be in the process of capturing a single, high-quality, * image.</li> * </ol> + * See {@link ConjunctionListenerMux} and {@link #mReadyStateManager} for + * details of how this is managed. */ private static enum ReadyStateRequirement { CAPTURE_MANAGER_READY, @@ -201,7 +204,12 @@ public class OneCameraZslImpl extends AbstractOneCamera { */ private final ConjunctionListenerMux<ReadyStateRequirement> mReadyStateManager = new ConjunctionListenerMux<ReadyStateRequirement>( - ReadyStateRequirement.class); + ReadyStateRequirement.class, new ConjunctionListenerMux.OutputChangeListener() { + @Override + public void onOutputChange(boolean state) { + broadcastReadyState(state); + } + }); /** * An {@link ImageCaptureListener} which will compress and save an image to @@ -286,13 +294,6 @@ public class OneCameraZslImpl extends AbstractOneCamera { } }); - mReadyStateManager.addListener(new ConjunctionListenerMux.OutputChangeListener() { - @Override - public void onOutputChange(boolean state) { - broadcastReadyState(state); - } - }); - // Listen for changes to auto focus state and dispatch to // mFocusStateListener. mCaptureManager.addMetadataChangeListener(CaptureResult.CONTROL_AF_STATE, @@ -644,6 +645,9 @@ public class OneCameraZslImpl extends AbstractOneCamera { mCropRegion = cropRegionForZoom(mZoomValue); boolean success = sendRepeatingCaptureRequest(); if (success) { + mReadyStateManager.setInput(ReadyStateRequirement.CAPTURE_NOT_IN_PROGRESS, + true); + mReadyStateManager.notifyListeners(); listener.onReadyForCapture(); } else { listener.onSetupFailed(); diff --git a/src/com/android/camera/util/ConjunctionListenerMux.java b/src/com/android/camera/util/ConjunctionListenerMux.java index 866b2f5fb..a32072400 100644 --- a/src/com/android/camera/util/ConjunctionListenerMux.java +++ b/src/com/android/camera/util/ConjunctionListenerMux.java @@ -95,9 +95,7 @@ public class ConjunctionListenerMux<Input extends Enum<Input>> { // If the output has changed, notify the listeners. if (oldOutput != mOutput) { - for (OutputChangeListener listener : mListeners) { - listener.onOutputChange(mOutput); - } + notifyListeners(); } return mOutput; @@ -105,6 +103,11 @@ public class ConjunctionListenerMux<Input extends Enum<Input>> { } } + public ConjunctionListenerMux(Class<Input> clazz, OutputChangeListener listener) { + this(clazz); + addListener(listener); + } + public ConjunctionListenerMux(Class<Input> clazz) { mInputs = new EnumMap<Input, Boolean>(clazz); @@ -114,4 +117,16 @@ public class ConjunctionListenerMux<Input extends Enum<Input>> { mOutput = false; } + + /** + * Notifies all listeners of the current state, regardless of whether or not + * it has actually changed. + */ + public void notifyListeners() { + synchronized (mLock) { + for (OutputChangeListener listener : mListeners) { + listener.onOutputChange(mOutput); + } + } + } } |