parent
e1e3e12564
commit
f48c6bd5b7
@ -0,0 +1,27 @@ |
||||
package com.otaliastudios.cameraview.engine.action; |
||||
|
||||
import android.hardware.camera2.CaptureRequest; |
||||
import android.hardware.camera2.CaptureResult; |
||||
import android.hardware.camera2.TotalCaptureResult; |
||||
|
||||
import androidx.annotation.NonNull; |
||||
|
||||
public interface Action { |
||||
|
||||
int STATE_CREATED = Integer.MIN_VALUE; |
||||
int STATE_COMPLETED = Integer.MAX_VALUE; |
||||
|
||||
int getState(); |
||||
|
||||
void start(@NonNull ActionHolder holder); |
||||
|
||||
void addCallback(@NonNull ActionCallback callback); |
||||
|
||||
void removeCallback(@NonNull ActionCallback callback); |
||||
|
||||
void onCaptureStarted(@NonNull ActionHolder holder, @NonNull CaptureRequest request); |
||||
|
||||
void onCaptureProgressed(@NonNull ActionHolder holder, @NonNull CaptureRequest request, @NonNull CaptureResult result); |
||||
|
||||
void onCaptureCompleted(@NonNull ActionHolder holder, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result); |
||||
} |
@ -0,0 +1,7 @@ |
||||
package com.otaliastudios.cameraview.engine.action; |
||||
|
||||
import androidx.annotation.NonNull; |
||||
|
||||
public interface ActionCallback { |
||||
void onActionStateChanged(@NonNull Action action, int state); |
||||
} |
@ -0,0 +1,26 @@ |
||||
package com.otaliastudios.cameraview.engine.action; |
||||
|
||||
import android.hardware.camera2.CameraCharacteristics; |
||||
import android.hardware.camera2.CaptureRequest; |
||||
import android.hardware.camera2.CaptureResult; |
||||
import android.hardware.camera2.TotalCaptureResult; |
||||
|
||||
import androidx.annotation.NonNull; |
||||
|
||||
public interface ActionHolder { |
||||
|
||||
void addAction(@NonNull Action action); |
||||
|
||||
void removeAction(@NonNull Action action); |
||||
|
||||
@NonNull |
||||
CameraCharacteristics getCharacteristics(@NonNull Action action); |
||||
|
||||
@NonNull |
||||
TotalCaptureResult getLastResult(@NonNull Action action); |
||||
|
||||
@NonNull |
||||
CaptureRequest.Builder getBuilder(@NonNull Action action); |
||||
|
||||
void applyBuilder(@NonNull Action source); |
||||
} |
@ -0,0 +1,143 @@ |
||||
package com.otaliastudios.cameraview.engine.action; |
||||
|
||||
import android.hardware.camera2.CaptureRequest; |
||||
import android.hardware.camera2.CaptureResult; |
||||
import android.hardware.camera2.TotalCaptureResult; |
||||
|
||||
import androidx.annotation.NonNull; |
||||
|
||||
import java.util.Arrays; |
||||
import java.util.List; |
||||
|
||||
public class Actions { |
||||
|
||||
@NonNull |
||||
public static Action together(@NonNull BaseAction... actions) { |
||||
return new TogetherAction(Arrays.asList(actions)); |
||||
} |
||||
|
||||
@NonNull |
||||
public static Action sequence(@NonNull BaseAction... actions) { |
||||
return new SequenceAction(Arrays.asList(actions)); |
||||
} |
||||
|
||||
private static class TogetherAction extends BaseAction { |
||||
// Need to be BaseAction so we can call onStart() instead of start()
|
||||
private final List<BaseAction> actions; |
||||
|
||||
private TogetherAction(@NonNull final List<BaseAction> actions) { |
||||
this.actions = actions; |
||||
for (BaseAction action : actions) { |
||||
action.addCallback(new ActionCallback() { |
||||
@Override |
||||
public void onActionStateChanged(@NonNull Action action, int state) { |
||||
if (state == STATE_COMPLETED) { |
||||
//noinspection SuspiciousMethodCalls
|
||||
actions.remove(action); |
||||
} |
||||
if (actions.isEmpty()) { |
||||
setState(STATE_COMPLETED); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
protected void onStart(@NonNull ActionHolder holder) { |
||||
super.onStart(holder); |
||||
for (BaseAction action : actions) { |
||||
action.onStart(holder); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void onCaptureStarted(@NonNull ActionHolder holder, @NonNull CaptureRequest request) { |
||||
super.onCaptureStarted(holder, request); |
||||
for (BaseAction action : actions) { |
||||
action.onCaptureStarted(holder, request); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void onCaptureProgressed(@NonNull ActionHolder holder, @NonNull CaptureRequest request, |
||||
@NonNull CaptureResult result) { |
||||
super.onCaptureProgressed(holder, request, result); |
||||
for (BaseAction action : actions) { |
||||
action.onCaptureProgressed(holder, request, result); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void onCaptureCompleted(@NonNull ActionHolder holder, @NonNull CaptureRequest request, |
||||
@NonNull TotalCaptureResult result) { |
||||
super.onCaptureCompleted(holder, request, result); |
||||
for (BaseAction action : actions) { |
||||
action.onCaptureCompleted(holder, request, result); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private static class SequenceAction extends BaseAction { |
||||
// Need to be BaseAction so we can call onStart() instead of start()
|
||||
private final List<BaseAction> actions; |
||||
private int runningAction = -1; |
||||
|
||||
private SequenceAction(@NonNull List<BaseAction> actions) { |
||||
this.actions = actions; |
||||
increaseRunningAction(); |
||||
} |
||||
|
||||
private void increaseRunningAction() { |
||||
if (runningAction == actions.size() - 1) { |
||||
// This was the last action. We're done.
|
||||
setState(STATE_COMPLETED); |
||||
} else { |
||||
runningAction++; |
||||
actions.get(runningAction).addCallback(new ActionCallback() { |
||||
@Override |
||||
public void onActionStateChanged(@NonNull Action action, int state) { |
||||
if (state == STATE_COMPLETED) { |
||||
action.removeCallback(this); |
||||
increaseRunningAction(); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
protected void onStart(@NonNull ActionHolder holder) { |
||||
super.onStart(holder); |
||||
if (runningAction >= 0) { |
||||
actions.get(runningAction).onStart(holder); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void onCaptureStarted(@NonNull ActionHolder holder, @NonNull CaptureRequest request) { |
||||
super.onCaptureStarted(holder, request); |
||||
if (runningAction >= 0) { |
||||
actions.get(runningAction).onCaptureStarted(holder, request); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void onCaptureProgressed(@NonNull ActionHolder holder, @NonNull CaptureRequest request, |
||||
@NonNull CaptureResult result) { |
||||
super.onCaptureProgressed(holder, request, result); |
||||
if (runningAction >= 0) { |
||||
actions.get(runningAction).onCaptureProgressed(holder, request, result); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void onCaptureCompleted(@NonNull ActionHolder holder, @NonNull CaptureRequest request, |
||||
@NonNull TotalCaptureResult result) { |
||||
super.onCaptureCompleted(holder, request, result); |
||||
if (runningAction >= 0) { |
||||
actions.get(runningAction).onCaptureCompleted(holder, request, result); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,73 @@ |
||||
package com.otaliastudios.cameraview.engine.action; |
||||
|
||||
import android.hardware.camera2.CaptureRequest; |
||||
import android.hardware.camera2.CaptureResult; |
||||
import android.hardware.camera2.TotalCaptureResult; |
||||
|
||||
import androidx.annotation.NonNull; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
public abstract class BaseAction implements Action { |
||||
|
||||
private final List<ActionCallback> callbacks = new ArrayList<>(); |
||||
private int state; |
||||
private ActionHolder holder; |
||||
|
||||
@Override |
||||
public int getState() { |
||||
return state; |
||||
} |
||||
|
||||
@Override |
||||
public final void start(@NonNull ActionHolder holder) { |
||||
this.holder = holder; |
||||
holder.addAction(this); |
||||
onStart(holder); |
||||
} |
||||
|
||||
protected void onStart(@NonNull ActionHolder holder) { |
||||
// Overrideable
|
||||
} |
||||
|
||||
@Override |
||||
public void onCaptureStarted(@NonNull ActionHolder holder, @NonNull CaptureRequest request) { |
||||
// Overrideable
|
||||
} |
||||
|
||||
@Override |
||||
public void onCaptureProgressed(@NonNull ActionHolder holder, @NonNull CaptureRequest request, @NonNull CaptureResult result) { |
||||
// Overrideable
|
||||
} |
||||
|
||||
@Override |
||||
public void onCaptureCompleted(@NonNull ActionHolder holder, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) { |
||||
// Overrideable
|
||||
} |
||||
|
||||
protected void setState(int newState) { |
||||
if (newState != state) { |
||||
state = newState; |
||||
for (ActionCallback callback : callbacks) { |
||||
callback.onActionStateChanged(this, state); |
||||
} |
||||
if (state == STATE_COMPLETED) { |
||||
holder.removeAction(this); |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void addCallback(@NonNull ActionCallback callback) { |
||||
if (!callbacks.contains(callback)) { |
||||
callbacks.add(callback); |
||||
callback.onActionStateChanged(this, getState()); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void removeCallback(@NonNull ActionCallback callback) { |
||||
callbacks.remove(callback); |
||||
} |
||||
} |
Loading…
Reference in new issue