summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com/android/camera/one/v2/OneCameraZslImpl.java22
-rw-r--r--src/com/android/camera/util/ConjunctionListenerMux.java21
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);
+ }
+ }
+ }
}