// Path: app/src/main/java/org/houxg/leamonax/service/NoteFileService.java
// public class NoteFileService {
// 
//     private static final String TAG = "NoteFileService:";
// 
//     private static final String SCHEME = "file";
//     private static final String IMAGE_PATH = "getImage";
//     private static final String IMAGE_PATH_WITH_SLASH = "/getImage";
// 
//     public static String convertFromLocalIdToServerId(String localId) {
//         NoteFile noteFile = AppDataBase.getNoteFileByLocalId(localId);
//         return noteFile == null ? null : noteFile.getServerId();
//     }
// 
//     public static Uri createImageFile(long noteLocalId, String filePath) {
//         NoteFile noteFile = new NoteFile();
//         noteFile.setNoteId(noteLocalId);
//         noteFile.setLocalId(new ObjectId().toString());
//         noteFile.setLocalPath(filePath);
//         noteFile.setIsAttach(false);
//         noteFile.save();
//         return getLocalImageUri(noteFile.getLocalId());
//     }
// 
//     public static Uri getLocalImageUri(String localId) {
//         return new Uri.Builder().scheme(SCHEME).path(IMAGE_PATH).appendQueryParameter("id", localId).build();
//     }
// 
//     public static Uri getServerImageUri(String serverId) {
//         Uri uri = Uri.parse(AccountService.getCurrent().getHost());
//         return uri.buildUpon().appendEncodedPath("api/file/getImage").appendQueryParameter("fileId", serverId).build();
//     }
// 
//     public static boolean isLocalImageUri(Uri uri) {
//         return SCHEME.equals(uri.getScheme()) && IMAGE_PATH_WITH_SLASH.equals(uri.getPath());
//     }
// 
//     public static String getImagePath(Uri uri) {
//         String localId = uri.getQueryParameter("id");
//         NoteFile noteFile = AppDataBase.getNoteFileByLocalId(localId);
//         if (noteFile == null) {
//             return null;
//         }
//         if (!TextUtils.isEmpty(noteFile.getLocalPath())) {
//             File file = new File(noteFile.getLocalPath());
//             return file.isFile() ? noteFile.getLocalPath() : null;
//         } else {
//             return null;
//         }
//     }
// 
//     public static List<NoteFile> getRelatedNoteFiles(long noteLocalId) {
//         return AppDataBase.getAllRelatedFile(noteLocalId);
//     }
// 
//     public static InputStream getImage(String localId) {
//         NoteFile noteFile = AppDataBase.getNoteFileByLocalId(localId);
//         if (noteFile == null) {
//             return null;
//         }
//         String filePath = null;
//         if (isLocalFileExist(noteFile.getLocalPath())) {
//             filePath = noteFile.getLocalPath();
//             XLog.i(TAG + "use local image, path=" + filePath);
//         } else {
//             String url = NoteFileService.getUrl(AccountService.getCurrent().getHost(), noteFile.getServerId(), AccountService.getCurrent().getAccessToken());
//             XLog.i(TAG + "use server image, url=" + url);
//             try {
//                 filePath = NoteFileService.getImageFromServer(Uri.parse(url), Leamonax.getContext().getCacheDir());
//                 noteFile.setLocalPath(filePath);
//                 XLog.i(TAG + "download finished, path=" + filePath);
//                 noteFile.save();
//             } catch (IOException e) {
//                 e.printStackTrace();
//             }
//         }
//         FileInputStream inputStream = null;
//         try {
//             if (!TextUtils.isEmpty(filePath)) {
//                 inputStream = new FileInputStream(filePath);
//             }
//         } catch (FileNotFoundException e) {
//             e.printStackTrace();
//         }
//         return inputStream;
//     }
// 
//     private static String getImageFromServer(Uri targetUri, File parentDir) throws IOException {
//         URI target = URI.create(targetUri.toString());
//         String fileName = String.format(Locale.US, "leanote-%s.png", new ObjectId().toString());
//         File file = new File(parentDir, fileName);
// //        XLog.i(TAG + "target=" + target.toString() + ", file=" + file.getAbsolutePath());
// 
//         InputStream input = target.toURL().openStream();
//         BufferedSource source = Okio.buffer(Okio.source(input));
//         Sink output = Okio.sink(file);
//         source.readAll(output);
//         source.close();
//         output.flush();
//         output.close();
//         return file.getAbsolutePath();
//     }
// 
//     private static String getUrl(String baseUrl, String serverId, String token) {
//         return String.format(Locale.US, "%s/api/file/getImage?fileId=%s&token=%s", baseUrl, serverId, token);
//     }
// 
//     private static boolean isLocalFileExist(String path) {
//         if (!TextUtils.isEmpty(path)) {
//             File file = new File(path);
//             return file.isFile();
//         }
//         return false;
//     }
// }


import android.net.Uri;
import android.webkit.ConsoleMessage;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceResponse;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.elvishew.xlog.XLog;
import org.houxg.leamonax.service.NoteFileService;
import java.util.Map;
    public abstract void toggleQuote();

    public abstract void toggleHeading();

    public void removeLink() {}

    public String getSelection() {
        return "";
    }

    public interface EditorListener {
        void onPageLoaded();
        void onClickedLink(String title, String url);
        void onStyleChanged(Format style, boolean enabled);
        void onFormatChanged(Map<Format, Object> enabledFormats);
        void onCursorChanged(Map<Format, Object> enabledFormats);
        void linkTo(String url);
        void onClickedImage(String url);
    }

    protected class EditorClient extends WebViewClient {

        private static final String TAG = "WebViewClient:";

        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
            Uri uri = Uri.parse(url);
            XLog.i(TAG + "shouldInterceptRequest(), request=" + url + ", scheme=" + uri.getScheme() + ", authority=" + uri.getAuthority());
            if (NoteFileService.isLocalImageUri(uri)) {
                XLog.i(TAG + "get image");
// Path: app/src/main/java/org/houxg/leamonax/service/NoteFileService.java
// public class NoteFileService {
// 
//     private static final String TAG = "NoteFileService:";
// 
//     private static final String SCHEME = "file";
//     private static final String IMAGE_PATH = "getImage";
//     private static final String IMAGE_PATH_WITH_SLASH = "/getImage";
// 
//     public static String convertFromLocalIdToServerId(String localId) {
//         NoteFile noteFile = AppDataBase.getNoteFileByLocalId(localId);
//         return noteFile == null ? null : noteFile.getServerId();
//     }
// 
//     public static Uri createImageFile(long noteLocalId, String filePath) {
//         NoteFile noteFile = new NoteFile();
//         noteFile.setNoteId(noteLocalId);
//         noteFile.setLocalId(new ObjectId().toString());
//         noteFile.setLocalPath(filePath);
//         noteFile.setIsAttach(false);
//         noteFile.save();
//         return getLocalImageUri(noteFile.getLocalId());
//     }
// 
//     public static Uri getLocalImageUri(String localId) {
//         return new Uri.Builder().scheme(SCHEME).path(IMAGE_PATH).appendQueryParameter("id", localId).build();
//     }
// 
//     public static Uri getServerImageUri(String serverId) {
//         Uri uri = Uri.parse(AccountService.getCurrent().getHost());
//         return uri.buildUpon().appendEncodedPath("api/file/getImage").appendQueryParameter("fileId", serverId).build();
//     }
// 
//     public static boolean isLocalImageUri(Uri uri) {
//         return SCHEME.equals(uri.getScheme()) && IMAGE_PATH_WITH_SLASH.equals(uri.getPath());
//     }
// 
//     public static String getImagePath(Uri uri) {
//         String localId = uri.getQueryParameter("id");
//         NoteFile noteFile = AppDataBase.getNoteFileByLocalId(localId);
//         if (noteFile == null) {
//             return null;
//         }
//         if (!TextUtils.isEmpty(noteFile.getLocalPath())) {
//             File file = new File(noteFile.getLocalPath());
//             return file.isFile() ? noteFile.getLocalPath() : null;
//         } else {
//             return null;
//         }
//     }
// 
//     public static List<NoteFile> getRelatedNoteFiles(long noteLocalId) {
//         return AppDataBase.getAllRelatedFile(noteLocalId);
//     }
// 
//     public static InputStream getImage(String localId) {
//         NoteFile noteFile = AppDataBase.getNoteFileByLocalId(localId);
//         if (noteFile == null) {
//             return null;
//         }
//         String filePath = null;
//         if (isLocalFileExist(noteFile.getLocalPath())) {
//             filePath = noteFile.getLocalPath();
//             XLog.i(TAG + "use local image, path=" + filePath);
//         } else {
//             String url = NoteFileService.getUrl(AccountService.getCurrent().getHost(), noteFile.getServerId(), AccountService.getCurrent().getAccessToken());
//             XLog.i(TAG + "use server image, url=" + url);
//             try {
//                 filePath = NoteFileService.getImageFromServer(Uri.parse(url), Leamonax.getContext().getCacheDir());
//                 noteFile.setLocalPath(filePath);
//                 XLog.i(TAG + "download finished, path=" + filePath);
//                 noteFile.save();
//             } catch (IOException e) {
//                 e.printStackTrace();
//             }
//         }
//         FileInputStream inputStream = null;
//         try {
//             if (!TextUtils.isEmpty(filePath)) {
//                 inputStream = new FileInputStream(filePath);
//             }
//         } catch (FileNotFoundException e) {
//             e.printStackTrace();
//         }
//         return inputStream;
//     }
// 
//     private static String getImageFromServer(Uri targetUri, File parentDir) throws IOException {
//         URI target = URI.create(targetUri.toString());
//         String fileName = String.format(Locale.US, "leanote-%s.png", new ObjectId().toString());
//         File file = new File(parentDir, fileName);
// //        XLog.i(TAG + "target=" + target.toString() + ", file=" + file.getAbsolutePath());
// 
//         InputStream input = target.toURL().openStream();
//         BufferedSource source = Okio.buffer(Okio.source(input));
//         Sink output = Okio.sink(file);
//         source.readAll(output);
//         source.close();
//         output.flush();
//         output.close();
//         return file.getAbsolutePath();
//     }
// 
//     private static String getUrl(String baseUrl, String serverId, String token) {
//         return String.format(Locale.US, "%s/api/file/getImage?fileId=%s&token=%s", baseUrl, serverId, token);
//     }
// 
//     private static boolean isLocalFileExist(String path) {
//         if (!TextUtils.isEmpty(path)) {
//             File file = new File(path);
//             return file.isFile();
//         }
//         return false;
//     }
// }


// Path: app/src/main/java/org/houxg/leamonax/editor/Editor.java
import android.net.Uri;
import android.webkit.ConsoleMessage;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceResponse;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.elvishew.xlog.XLog;
import org.houxg.leamonax.service.NoteFileService;
import java.util.Map;

    public abstract void toggleQuote();

    public abstract void toggleHeading();

    public void removeLink() {}

    public String getSelection() {
        return "";
    }

    public interface EditorListener {
        void onPageLoaded();
        void onClickedLink(String title, String url);
        void onStyleChanged(Format style, boolean enabled);
        void onFormatChanged(Map<Format, Object> enabledFormats);
        void onCursorChanged(Map<Format, Object> enabledFormats);
        void linkTo(String url);
        void onClickedImage(String url);
    }

    protected class EditorClient extends WebViewClient {

        private static final String TAG = "WebViewClient:";

        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
            Uri uri = Uri.parse(url);
            XLog.i(TAG + "shouldInterceptRequest(), request=" + url + ", scheme=" + uri.getScheme() + ", authority=" + uri.getAuthority());
            if (NoteFileService.isLocalImageUri(uri)) {
                XLog.i(TAG + "get image");
                WebResourceResponse resourceResponse = new WebResourceResponse("image/png", "utf-8", NoteFileService.getImage(uri.getQueryParameter("id")));