Convert MarkdownPresenterImpl to Kotlin
This commit is contained in:
parent
04e8bb1c03
commit
b002881dc3
2 changed files with 166 additions and 197 deletions
|
@ -1,197 +0,0 @@
|
|||
package com.wbrawner.simplemarkdown.presentation;
|
||||
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
import android.os.Handler;
|
||||
import android.provider.OpenableColumns;
|
||||
|
||||
import com.commonsware.cwac.anddown.AndDown;
|
||||
import com.wbrawner.simplemarkdown.model.MarkdownFile;
|
||||
import com.wbrawner.simplemarkdown.utility.ErrorHandler;
|
||||
import com.wbrawner.simplemarkdown.view.MarkdownEditView;
|
||||
import com.wbrawner.simplemarkdown.view.MarkdownPreviewView;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
@Singleton
|
||||
public class MarkdownPresenterImpl implements MarkdownPresenter {
|
||||
private final Object fileLock = new Object();
|
||||
private MarkdownFile file;
|
||||
private volatile MarkdownEditView editView;
|
||||
private volatile MarkdownPreviewView previewView;
|
||||
private Handler fileHandler = new Handler();
|
||||
private final ErrorHandler errorHandler;
|
||||
|
||||
@Inject
|
||||
public MarkdownPresenterImpl(ErrorHandler errorHandler) {
|
||||
this.errorHandler = errorHandler;
|
||||
synchronized (fileLock) {
|
||||
this.file = new MarkdownFile();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadMarkdown(
|
||||
final String fileName,
|
||||
final InputStream in,
|
||||
final FileLoadedListener listener,
|
||||
boolean replaceCurrentFile
|
||||
) {
|
||||
Runnable fileLoader = () -> {
|
||||
MarkdownFile tmpFile = new MarkdownFile();
|
||||
if (tmpFile.load(fileName, in)) {
|
||||
if (listener != null) {
|
||||
String html = generateHTML(tmpFile.getContent());
|
||||
listener.onSuccess(html);
|
||||
}
|
||||
if (replaceCurrentFile) {
|
||||
synchronized (fileLock) {
|
||||
this.file = tmpFile;
|
||||
MarkdownEditView currentEditView = editView;
|
||||
if (currentEditView != null) {
|
||||
currentEditView.onFileLoaded(true);
|
||||
currentEditView.setTitle(fileName);
|
||||
currentEditView.setMarkdown(this.file.getContent());
|
||||
onMarkdownEdited(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (listener != null) {
|
||||
listener.onError();
|
||||
}
|
||||
}
|
||||
};
|
||||
fileHandler.post(fileLoader);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void newFile(String newName) {
|
||||
synchronized (fileLock) {
|
||||
MarkdownEditView currentEditView = editView;
|
||||
if (currentEditView != null) {
|
||||
file.setContent(currentEditView.getMarkdown());
|
||||
currentEditView.setTitle(newName);
|
||||
currentEditView.setMarkdown("");
|
||||
}
|
||||
file = new MarkdownFile(newName, "");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEditView(MarkdownEditView editView) {
|
||||
this.editView = editView;
|
||||
onMarkdownEdited(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPreviewView(MarkdownPreviewView previewView) {
|
||||
this.previewView = previewView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveMarkdown(MarkdownSavedListener listener, String name, OutputStream outputStream) {
|
||||
Runnable fileSaver = () -> {
|
||||
boolean result;
|
||||
synchronized (fileLock) {
|
||||
result = file.save(name, outputStream);
|
||||
}
|
||||
if (listener != null) {
|
||||
listener.saveComplete(result);
|
||||
}
|
||||
MarkdownEditView currentEditView = editView;
|
||||
if (currentEditView != null) {
|
||||
synchronized (fileLock) {
|
||||
currentEditView.setTitle(file.getName());
|
||||
}
|
||||
currentEditView.onFileSaved(result);
|
||||
}
|
||||
};
|
||||
fileHandler.post(fileSaver);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMarkdownEdited(String markdown) {
|
||||
setMarkdown(markdown);
|
||||
Runnable generateMarkdown = () -> {
|
||||
MarkdownPreviewView currentPreviewView = previewView;
|
||||
if (currentPreviewView != null)
|
||||
currentPreviewView.updatePreview(generateHTML(null));
|
||||
};
|
||||
fileHandler.post(generateMarkdown);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String generateHTML(String markdown) {
|
||||
AndDown andDown = new AndDown();
|
||||
int HOEDOWN_FLAGS = AndDown.HOEDOWN_EXT_STRIKETHROUGH | AndDown.HOEDOWN_EXT_TABLES |
|
||||
AndDown.HOEDOWN_EXT_UNDERLINE | AndDown.HOEDOWN_EXT_SUPERSCRIPT |
|
||||
AndDown.HOEDOWN_EXT_FENCED_CODE;
|
||||
return andDown.markdownToHtml(markdown, HOEDOWN_FLAGS, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFileName() {
|
||||
synchronized (fileLock) {
|
||||
return file.getName();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFileName(String name) {
|
||||
synchronized (fileLock) {
|
||||
file.setName(name);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMarkdown() {
|
||||
synchronized (fileLock) {
|
||||
return file.getContent();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setMarkdown(String markdown) {
|
||||
synchronized (fileLock) {
|
||||
file.setContent(markdown);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadFromUri(Context context, Uri fileUri) {
|
||||
try {
|
||||
InputStream in =
|
||||
context.getContentResolver().openInputStream(fileUri);
|
||||
String fileName = null;
|
||||
if ("content".equals(fileUri.getScheme())) {
|
||||
Cursor retCur = context.getContentResolver()
|
||||
.query(fileUri, null, null, null, null);
|
||||
if (retCur != null) {
|
||||
int nameIndex = retCur
|
||||
.getColumnIndex(OpenableColumns.DISPLAY_NAME);
|
||||
retCur.moveToFirst();
|
||||
fileName = retCur.getString(nameIndex);
|
||||
retCur.close();
|
||||
}
|
||||
} else if ("file".equals(fileUri.getScheme())) {
|
||||
fileName = fileUri.getLastPathSegment();
|
||||
}
|
||||
if (fileName == null) {
|
||||
fileName = "Untitled.md";
|
||||
}
|
||||
loadMarkdown(fileName, in, null, true);
|
||||
} catch (Exception e) {
|
||||
errorHandler.reportException(e);
|
||||
MarkdownEditView currentEditView = editView;
|
||||
if (currentEditView != null) {
|
||||
currentEditView.onFileLoaded(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,166 @@
|
|||
package com.wbrawner.simplemarkdown.presentation
|
||||
|
||||
import android.content.Context
|
||||
import android.net.Uri
|
||||
import android.os.Handler
|
||||
import android.provider.OpenableColumns
|
||||
import com.commonsware.cwac.anddown.AndDown
|
||||
import com.wbrawner.simplemarkdown.model.MarkdownFile
|
||||
import com.wbrawner.simplemarkdown.utility.ErrorHandler
|
||||
import com.wbrawner.simplemarkdown.view.MarkdownEditView
|
||||
import com.wbrawner.simplemarkdown.view.MarkdownPreviewView
|
||||
import java.io.InputStream
|
||||
import java.io.OutputStream
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Singleton
|
||||
class MarkdownPresenterImpl @Inject
|
||||
constructor(private val errorHandler: ErrorHandler) : MarkdownPresenter {
|
||||
private val fileLock = Any()
|
||||
private var file: MarkdownFile? = null
|
||||
@Volatile
|
||||
private var editView: MarkdownEditView? = null
|
||||
@Volatile
|
||||
private var previewView: MarkdownPreviewView? = null
|
||||
private val fileHandler = Handler()
|
||||
|
||||
override var fileName: String
|
||||
get() = synchronized(fileLock) {
|
||||
return file!!.name
|
||||
}
|
||||
set(name) = synchronized(fileLock) {
|
||||
file!!.name = name
|
||||
}
|
||||
|
||||
override var markdown: String
|
||||
get() = synchronized(fileLock) {
|
||||
return file!!.content
|
||||
}
|
||||
set(markdown) = synchronized(fileLock) {
|
||||
file!!.content = markdown
|
||||
}
|
||||
|
||||
init {
|
||||
synchronized(fileLock) {
|
||||
this.file = MarkdownFile()
|
||||
}
|
||||
}
|
||||
|
||||
override fun loadMarkdown(
|
||||
fileName: String,
|
||||
`in`: InputStream,
|
||||
listener: MarkdownPresenter.FileLoadedListener?,
|
||||
replaceCurrentFile: Boolean
|
||||
) {
|
||||
val fileLoader = {
|
||||
val tmpFile = MarkdownFile()
|
||||
if (tmpFile.load(fileName, `in`)) {
|
||||
if (listener != null) {
|
||||
val html = generateHTML(tmpFile.content)
|
||||
listener.onSuccess(html)
|
||||
}
|
||||
if (replaceCurrentFile) {
|
||||
synchronized(fileLock) {
|
||||
this.file = tmpFile
|
||||
val currentEditView = editView
|
||||
if (currentEditView != null) {
|
||||
currentEditView.onFileLoaded(true)
|
||||
currentEditView.setTitle(fileName)
|
||||
currentEditView.markdown = this.file!!.content
|
||||
onMarkdownEdited(null)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
listener?.onError()
|
||||
}
|
||||
}
|
||||
fileHandler.post(fileLoader)
|
||||
}
|
||||
|
||||
override fun newFile(newName: String) {
|
||||
synchronized(fileLock) {
|
||||
val currentEditView = editView
|
||||
if (currentEditView != null) {
|
||||
file!!.content = currentEditView.markdown
|
||||
currentEditView.setTitle(newName)
|
||||
currentEditView.markdown = ""
|
||||
}
|
||||
file = MarkdownFile(newName, "")
|
||||
}
|
||||
}
|
||||
|
||||
override fun setEditView(editView: MarkdownEditView) {
|
||||
this.editView = editView
|
||||
onMarkdownEdited(null)
|
||||
}
|
||||
|
||||
override fun setPreviewView(previewView: MarkdownPreviewView) {
|
||||
this.previewView = previewView
|
||||
}
|
||||
|
||||
override fun saveMarkdown(listener: MarkdownPresenter.MarkdownSavedListener, name: String, outputStream: OutputStream) {
|
||||
val fileSaver = {
|
||||
val result: Boolean
|
||||
synchronized(fileLock) {
|
||||
result = file!!.save(name, outputStream)
|
||||
}
|
||||
listener?.saveComplete(result)
|
||||
val currentEditView = editView
|
||||
if (currentEditView != null) {
|
||||
synchronized(fileLock) {
|
||||
currentEditView.setTitle(file!!.name)
|
||||
}
|
||||
currentEditView.onFileSaved(result)
|
||||
}
|
||||
}
|
||||
fileHandler.post(fileSaver)
|
||||
}
|
||||
|
||||
override fun onMarkdownEdited(markdown: String?) {
|
||||
markdown = markdown
|
||||
val generateMarkdown = {
|
||||
val currentPreviewView = previewView
|
||||
currentPreviewView?.updatePreview(generateHTML(null))
|
||||
}
|
||||
fileHandler.post(generateMarkdown)
|
||||
}
|
||||
|
||||
override fun generateHTML(markdown: String?): String {
|
||||
val andDown = AndDown()
|
||||
val HOEDOWN_FLAGS = AndDown.HOEDOWN_EXT_STRIKETHROUGH or AndDown.HOEDOWN_EXT_TABLES or
|
||||
AndDown.HOEDOWN_EXT_UNDERLINE or AndDown.HOEDOWN_EXT_SUPERSCRIPT or
|
||||
AndDown.HOEDOWN_EXT_FENCED_CODE
|
||||
return andDown.markdownToHtml(markdown, HOEDOWN_FLAGS, 0)
|
||||
}
|
||||
|
||||
override fun loadFromUri(context: Context, fileUri: Uri) {
|
||||
try {
|
||||
val `in` = context.contentResolver.openInputStream(fileUri)
|
||||
var fileName: String? = null
|
||||
if ("content" == fileUri.scheme) {
|
||||
val retCur = context.contentResolver
|
||||
.query(fileUri, null, null, null, null)
|
||||
if (retCur != null) {
|
||||
val nameIndex = retCur
|
||||
.getColumnIndex(OpenableColumns.DISPLAY_NAME)
|
||||
retCur.moveToFirst()
|
||||
fileName = retCur.getString(nameIndex)
|
||||
retCur.close()
|
||||
}
|
||||
} else if ("file" == fileUri.scheme) {
|
||||
fileName = fileUri.lastPathSegment
|
||||
}
|
||||
if (fileName == null) {
|
||||
fileName = "Untitled.md"
|
||||
}
|
||||
loadMarkdown(fileName, `in`!!, null, true)
|
||||
} catch (e: Exception) {
|
||||
errorHandler.reportException(e)
|
||||
val currentEditView = editView
|
||||
currentEditView?.onFileLoaded(false)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue