package info.guardianproject.pixelknot;
import java.util.ArrayList;
import java.util.Date;
import java.util.UUID;
import info.guardianproject.f5android.stego.StegoProcessThread;
public class StegoJob {
private static final boolean LOGGING = false;
private static final String LOGTAG = "StegoJob";
private final String mId;
private final Date mCreationDate;
final IStegoThreadHandler mThreadHandler;
private final ArrayList<StegoJobProcess> mProcesses;
private int mMaxProgressTicks = 0;
private int mCurrentProgressTick = 0;
private int mCurrentProcess = 0;
private StegoProcessThread mThread;
// Status
public enum ProcessingStatus {
PROCESSING,
ERROR,
EMBEDDED_SUCCESSFULLY,
EXTRACTED_SUCCESSFULLY
}
private ProcessingStatus mProcessingStatus = ProcessingStatus.PROCESSING;
StegoJob(IStegoThreadHandler threadHandler) {
mThreadHandler = threadHandler;
mProcesses = new ArrayList<>();
mId = UUID.randomUUID().toString();
mCreationDate = new Date();
}
public String getId() {
return mId;
}
public Date getCreationDate() {
return mCreationDate;
}
private class StegoJobProcess {
private final Runnable mRunnable;
private final int mNumberOfProgressTicks;
public StegoJobProcess(Runnable runnable, int numberOfProgressTicks) {
mRunnable = runnable;
mNumberOfProgressTicks = numberOfProgressTicks;
}
}
void addProcess(Runnable runnable, int numberOfProgressTicks) {
mProcesses.add(new StegoJobProcess(runnable, numberOfProgressTicks));
mMaxProgressTicks += numberOfProgressTicks;
}
public int getMaxProgress() {
return mMaxProgressTicks;
}
void Run() {
mThread = new StegoProcessThread() {
@Override
public void run() {
super.run();
setProcessingStatus(ProcessingStatus.PROCESSING);
// Figure out where we are progress-wise
mCurrentProgressTick = 0;
for (int i = 0; i < mCurrentProcess; i++) {
mCurrentProgressTick += mProcesses.get(i).mNumberOfProgressTicks;
}
while (mCurrentProcess < mProcesses.size() && !isInterrupted()) {
Runnable r = mProcesses.get(mCurrentProcess).mRunnable;
r.run();
if (!isInterrupted())
mCurrentProcess++;
}
if (isInterrupted()) {
setProcessingStatus(ProcessingStatus.ERROR);
}
mThreadHandler.onJobDone(StegoJob.this);
}
};
mThreadHandler.onJobCreated(this);
}
public StegoProcessThread getThread() {
return mThread;
}
public StegoJob.ProcessingStatus getProcessingStatus() {
return mProcessingStatus;
}
public void abortJob() {
// Interrupt the thread so no more processing is done on this thread
try {
if (getThread() != null)
getThread().requestInterrupt();
} catch (Exception ignored) {}
}
void setProcessingStatus(ProcessingStatus processingStatus) {
mProcessingStatus = processingStatus;
if (mProcessingStatus == ProcessingStatus.ERROR) {
mCurrentProcess = 0; // reset
mCurrentProgressTick = 0;
}
}
void onProgressTick() {
mCurrentProgressTick++;
}
public int getProgressPercent() {
if (mMaxProgressTicks == 0)
return 0;
return (int)(100f * (float)mCurrentProgressTick / (float)mMaxProgressTicks);
}
public void cleanup() {
}
}