/FileExtraction/Java_unseen/PowerExplorer_PowerFileExplorer/PowerFileExplorer/src/main/java/com/amaze/filemanager/utils/ProgressHandler.java
package com.amaze.filemanager.utils;

/**
 * Created by arpitkh96 on 18/8/16.
 *
 * Base class to handle progress of services operation
 * Utilized for generation of notification,
 * talking to {@link com.amaze.filemanager.fragments.ProcessViewer} through
 * {@link com.amaze.filemanager.utils.DataPackage}
 *
 */
public class ProgressHandler {

    // total number of bytes to be processed
    long totalSize = 0L;

    // total bytes written in process so far
    long writtenSize = 0L;

    // total number of source files to be processed
    int sourceFiles = 0;

    // number of source files processed so far
    int sourceFilesProcessed = 0;

    // file name currently being processed
    String fileName;

    // current processing speed (bytes processed in 1000ms time)
    int speedRaw = 0;

    // boolean manages the lifecycle of service and whether it should be canceled
    public boolean isCancelled = false;

    // callback interface to interact with process viewer fragment and notification
    ProgressListener progressListener;

    /**
     * Constructor to start an instance
     * @param sourceFiles the total number of source files selected by the user for operation
     */
    public ProgressHandler(int sourceFiles, long totalSize) {
        this.sourceFiles = sourceFiles;
        this.totalSize = totalSize;
    }

    /**
     * publish progress after calculating the write length
     *
     * @param newPosition the position of byte for file being processed
     */
    public synchronized void addWrittenLength(long newPosition) {

        this.speedRaw = (int) (newPosition - writtenSize);
        this.writtenSize = newPosition;

        progressListener.onProgressed(fileName, sourceFiles, sourceFilesProcessed,
                totalSize, writtenSize, speedRaw);
    }

    public synchronized void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public synchronized String getFileName() {
        return this.fileName;
    }

    public synchronized void setSourceFilesProcessed(int sourceFilesProcessed) {
        this.sourceFilesProcessed = sourceFilesProcessed;
    }

    // dynamically setting total size, useful in case files are compressed
    public synchronized void setTotalSize(long totalSize) {
        this.totalSize = totalSize;
    }

    public synchronized void setCancelled(boolean isCancelled) {
        this.isCancelled = isCancelled;
    }

    public synchronized boolean getCancelled() {
        return this.isCancelled;
    }

    public synchronized long getWrittenSize() {
        return writtenSize;
    }

    public void setProgressListener(ProgressListener progressListener) {
        this.progressListener = progressListener;
    }

    /**
     * An interface responsible for talking to this object
     * Utilized by relevant service and eventually for notification generation
     * and process viewer fragment
     */
    public interface ProgressListener {
        /**
         * @param fileName File name currently being processed (can be recursive, irrespective of selections)
         * @param sourceFiles how many total number of files did the user selected
         * @param sourceProgress which file is being processed from total number of files
         * @param totalSize total size of source files
         * @param writtenSize where are we at from total number of bytes
         * @param speed raw write speed in bytes
         */
        void onProgressed(String fileName, int sourceFiles, int sourceProgress, long totalSize,
                          long writtenSize, int speed);
    }
}
