package org.liberty.android.fantastischmemo.utils;
import android.app.Activity;
import android.content.DialogInterface;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import android.widget.EditText;
import org.apache.commons.io.FileUtils;
import org.liberty.android.fantastischmemo.R;
import org.liberty.android.fantastischmemo.modules.PerActivity;
import java.io.File;
import java.io.IOException;
import javax.inject.Inject;
import io.reactivex.Maybe;
import io.reactivex.MaybeEmitter;
import io.reactivex.MaybeOnSubscribe;
@PerActivity
public class DatabaseOperationDialogUtil {
private static final String TAG = DatabaseOperationDialogUtil.class.getName();
private final Activity activity;
private final AMFileUtil amFileUtil;
private final RecentListUtil recentListUtil;
@Inject
public DatabaseOperationDialogUtil(@NonNull final Activity activity,
@NonNull final AMFileUtil amFileUtil,
@NonNull final RecentListUtil recentListUtil) {
this.activity = activity;
this.amFileUtil = amFileUtil;
this.recentListUtil = recentListUtil;
}
public Maybe<File> showCreateDbDialog(@NonNull final String directoryPath) {
final EditText input = new EditText(activity);
return Maybe.create(new MaybeOnSubscribe<File>() {
@Override
public void subscribe(final MaybeEmitter<File> emitter) throws Exception {
new AlertDialog.Builder(activity)
.setTitle(activity.getString(R.string.fb_create_db))
.setMessage(activity.getString(R.string.fb_create_db_message))
.setView(input)
.setPositiveButton(activity.getString(R.string.ok_text), new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which ){
String value = input.getText().toString();
if(!value.endsWith(".db")){
value += ".db";
}
File newDbFile = new File(directoryPath + "/" + value);
try {
if (newDbFile.exists()) {
amFileUtil.deleteFileWithBackup(newDbFile.getAbsolutePath());
}
amFileUtil.createDbFileWithDefaultSettings(newDbFile);
emitter.onSuccess(newDbFile);
} catch(IOException e){
Log.e(TAG, "Fail to create file", e);
}
}
})
.setNegativeButton(activity.getString(R.string.cancel_text), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
emitter.onComplete();
}
})
.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
emitter.onComplete();
}
})
.create()
.show();
}
});
}
public Maybe<File> showDeleteDbDialog(final File clickedFile) {
return Maybe.create(new MaybeOnSubscribe<File>() {
@Override
public void subscribe(final MaybeEmitter<File> emitter) throws Exception {
new AlertDialog.Builder(activity)
.setTitle(activity.getString(R.string.delete_text))
.setMessage(activity.getString(R.string.fb_delete_message))
.setPositiveButton(activity.getString(R.string.delete_text), new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which ){
amFileUtil.deleteDbSafe(clickedFile.getAbsolutePath());
emitter.onSuccess(clickedFile);
}
})
.setNegativeButton(activity.getString(R.string.cancel_text), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
emitter.onComplete();
}
})
.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
emitter.onComplete();
}
})
.create()
.show();
}
});
}
public Maybe<File> showCloneDbDialog(final File clickedFile) {
return Maybe.create(new MaybeOnSubscribe<File>() {
@Override
public void subscribe(MaybeEmitter<File> emitter) throws Exception {
String srcDir = clickedFile.getAbsolutePath();
String destDir = srcDir.replaceAll(".db", ".clone.db");
try {
FileUtils.copyFile(new File(srcDir), new File(destDir));
emitter.onSuccess(new File(destDir));
} catch(IOException e){
new AlertDialog.Builder(activity)
.setTitle(activity.getString(R.string.fail))
.setMessage(activity.getString(R.string.fb_fail_to_clone) + "\nError: " + e.toString())
.setPositiveButton(activity.getString(R.string.ok_text), null)
.create()
.show();
emitter.onComplete();
}
}
});
}
public Maybe<File> showRenameDbDialog(final File clickedFile) {
return Maybe.create(new MaybeOnSubscribe<File>() {
@Override
public void subscribe(final MaybeEmitter<File> emitter) throws Exception {
final EditText input = new EditText(activity);
input.setText(clickedFile.getAbsolutePath());
new AlertDialog.Builder(activity)
.setTitle(activity.getString(R.string.fb_rename))
.setMessage(activity.getString(R.string.fb_rename_message))
.setView(input)
.setPositiveButton(activity.getString(R.string.ok_text), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String value = input.getText().toString();
if (!value.equals(clickedFile.getAbsolutePath())) {
try {
FileUtils.copyFile(clickedFile, new File(value));
amFileUtil.deleteDbSafe(clickedFile.getAbsolutePath());
recentListUtil.deleteFromRecentList(clickedFile.getAbsolutePath());
emitter.onSuccess(new File(value));
} catch (IOException e) {
new AlertDialog.Builder(activity)
.setTitle(activity.getString(R.string.fail))
.setMessage(activity.getString(R.string.fb_rename_fail) + "\nError: " + e.toString())
.setNeutralButton(activity.getString(R.string.ok_text), null)
.create()
.show();
emitter.onComplete();
}
}
}
})
.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
emitter.onComplete();
}
})
.show();
}
});
}
public Maybe<File> showCreateFolderDialog(@NonNull final File currentDirectory) {
return Maybe.create(new MaybeOnSubscribe<File>() {
@Override
public void subscribe(final MaybeEmitter<File> emitter) throws Exception {
final EditText input = new EditText(activity);
new AlertDialog.Builder(activity)
.setTitle(R.string.fb_create_dir)
.setMessage(R.string.fb_create_dir_message)
.setView(input)
.setPositiveButton(activity.getString(R.string.ok_text), new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which ){
String value = input.getText().toString();
File newDir = new File(currentDirectory.getAbsolutePath() + "/" + value);
newDir.mkdir();
emitter.onSuccess(newDir);
}
})
.setNegativeButton(activity.getString(R.string.cancel_text), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
emitter.onComplete();
}
})
.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
emitter.onComplete();
}
})
.create()
.show();
}
});
}
}