package net.osmand.plus;
import net.osmand.IProgress;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.Handler;
import android.os.Message;
public class ProgressDialogImplementation implements IProgress {
private static final float deltaToChange = 0.023f;
private String taskName;
private int progress;
private int work;
private int deltaWork;
private String message = ""; //$NON-NLS-1$
private Handler mViewUpdateHandler;
private Thread run;
private Context context;
private ProgressDialog dialog = null;
private final boolean cancelable;
public ProgressDialogImplementation(Context ctx, ProgressDialog dlg, boolean cancelable){
this.cancelable = cancelable;
context = ctx;
setDialog(dlg);
mViewUpdateHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(dialog != null){
dialog.setMessage(message);
}
}
};
}
public ProgressDialogImplementation(ProgressDialog dlg, boolean cancelable){
this(dlg.getContext(), dlg, cancelable);
}
public ProgressDialogImplementation(final ProgressDialog dlg){
this(dlg, false);
}
public void setDialog(ProgressDialog dlg){
if(dlg != null){
if(cancelable){
dlg.setOnCancelListener(new OnCancelListener(){
@Override
public void onCancel(DialogInterface dialog) {
if(run != null){
run.stop();
}
}
});
}
this.dialog = dlg;
}
}
public void setRunnable(String threadName, Runnable run){
this.run = new Thread(run, threadName);
}
public void run(){
if(run == null){
throw new IllegalStateException();
}
run.start();
}
@Override
public void progress(int deltaWork) {
this.deltaWork += deltaWork;
if(change(progress + this.deltaWork)){
this.progress += this.deltaWork;
this.deltaWork = 0;
updateMessage();
}
}
private void updateMessage() {
message = taskName + String.format(" %.1f %%", this.progress * 100f / ((float) this.work)); //$NON-NLS-1$
mViewUpdateHandler.sendEmptyMessage(0);
}
public boolean change(int newProgress) {
if (newProgress < progress) {
return false;
}
if ((newProgress - progress) / ((float) work) < deltaToChange) {
return false;
}
return true;
}
@Override
public void remaining(int remainingWork) {
if(change(work - remainingWork)){
this.progress = work - remainingWork;
updateMessage();
}
deltaWork = work - remainingWork - this.progress;
}
public boolean isIndeterminate(){
return work == -1;
}
@Override
public void startTask(String taskName, int work) {
if(taskName == null){
taskName = ""; //$NON-NLS-1$
}
message = taskName;
mViewUpdateHandler.sendEmptyMessage(0);
this.taskName = taskName;
startWork(work);
}
@Override
public void finishTask() {
if (taskName != null) {
message = context.getResources().getString(R.string.finished_task) +" : "+ taskName; //$NON-NLS-1$
mViewUpdateHandler.sendEmptyMessage(0);
}
work = -1;
progress = 0;
}
@Override
public boolean isInterrupted() {
return false;
}
@Override
public void startWork(int work) {
this.work = work;
if(this.work == 0){
this.work = 1;
}
progress = 0;
deltaWork = 0;
}
@Override
public void setGeneralProgress(String genProgress) {
// not implemented yet
}
}