diff --git a/app/build.gradle b/app/build.gradle index 712beff..60ee9df 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -103,4 +103,7 @@ dependencies { compile 'com.flurry.android:analytics:6.4.2' compile 'net.danlew:android.joda:2.9.5' + // https://mvnrepository.com/artifact/org.jsoup/jsoup + compile group: 'org.jsoup', name: 'jsoup', version: '1.10.1' + compile 'ru.bartwell:exfilepicker:1.8' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8046cb6..3d1fdef 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -50,6 +50,11 @@ android:label="NoteSyncService" /> + + \ No newline at end of file diff --git a/app/src/main/java/org/houxg/leamonax/service/HtmlImporter.java b/app/src/main/java/org/houxg/leamonax/service/HtmlImporter.java new file mode 100644 index 0000000..0c2475d --- /dev/null +++ b/app/src/main/java/org/houxg/leamonax/service/HtmlImporter.java @@ -0,0 +1,120 @@ +package org.houxg.leamonax.service; + + +import android.net.Uri; +import android.text.TextUtils; +import android.util.Log; + +import org.bson.types.ObjectId; +import org.houxg.leamonax.Leamonax; +import org.houxg.leamonax.model.Note; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; + +import okio.BufferedSink; +import okio.BufferedSource; +import okio.Okio; +import okio.Source; + +public class HtmlImporter { + + + public Note from(File file) { + String html; + try { + BufferedSource source = Okio.buffer(Okio.source(file)); + html = source.readUtf8(); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + Log.i("will", "html=" + html); + if (TextUtils.isEmpty(html)) { + return null; + } + + Note note = new Note(); + String name = file.getName(); + note.setTitle(name.substring(0, name.lastIndexOf(".html"))); + note.setUserId(AccountService.getCurrent().getUserId()); + note.insert(); + + Document document = Jsoup.parse(html); + Elements imgs = document.select("img"); + File parentFile = file.getParentFile(); + for (Element imgNode : imgs) { + String imgPath = imgNode.attr("src"); + Log.i("will", "img src=" + imgPath); + File imageFile = new File(parentFile, imgPath); + if (imageFile.isFile() && isImage(imageFile.getAbsolutePath())) { + try { + String cacheName = new ObjectId().toString() + "." + getExtension(imageFile.getName()); + File targetFile = new File(Leamonax.getContext().getCacheDir(), cacheName); + Source source = Okio.source(imageFile); + BufferedSink bufferedSink = Okio.buffer(Okio.sink(targetFile)); + bufferedSink.writeAll(source); + bufferedSink.flush(); + source.close(); + bufferedSink.close(); + + Uri noteFile = NoteFileService.createImageFile(note.getId(), targetFile.getAbsolutePath()); + imgNode.attr("src", noteFile.toString()); + } catch (FileNotFoundException e) { + Log.w("will", "image file not exist"); + e.printStackTrace(); + continue; + } catch (IOException e) { + e.printStackTrace(); + continue; + } + } + } + Document.OutputSettings settings = new Document.OutputSettings(); + settings.prettyPrint(true) + .charset("UTF-8") + .syntax(Document.OutputSettings.Syntax.html); + document.outputSettings(settings); + String output = document.body().outerHtml(); + Log.i("will", "output=" + output); + Log.i("will", "output=" + document.body().children().outerHtml()); + note.setContent(output); + long time = System.currentTimeMillis(); + note.setCreatedTimeVal(time); + note.setUpdatedTimeVal(time); + note.update(); + Log.i("will", "output note=" + note.getId()); + return note; + } + + private boolean isLocalPath(String path) { + return true; + } + + private boolean isImage(String path) { + switch (getExtension(path)) { + case "png": + case "jpg": + case "jpeg": + case "bmp": + return true; + default: + return false; + } + } + + private String getExtension(String fileName) { + String ext = ""; + int i = fileName.lastIndexOf('.'); + + if (i > 0 && i < fileName.length() - 1) { + ext = fileName.substring(i + 1).toLowerCase(); + } + return ext; + } +} diff --git a/app/src/main/java/org/houxg/leamonax/ui/AboutActivity.java b/app/src/main/java/org/houxg/leamonax/ui/AboutActivity.java index 1da66c4..7742f36 100644 --- a/app/src/main/java/org/houxg/leamonax/ui/AboutActivity.java +++ b/app/src/main/java/org/houxg/leamonax/ui/AboutActivity.java @@ -1,5 +1,6 @@ package org.houxg.leamonax.ui; +import android.content.Intent; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.view.View; @@ -15,8 +16,10 @@ import org.houxg.leamonax.R; import org.houxg.leamonax.database.AppDataBase; import org.houxg.leamonax.model.Note; import org.houxg.leamonax.service.AccountService; +import org.houxg.leamonax.service.HtmlImporter; import org.houxg.leamonax.utils.TestUtils; +import java.io.File; import java.security.SecureRandom; import java.util.ArrayList; import java.util.List; @@ -24,6 +27,7 @@ import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; +import ru.bartwell.exfilepicker.ExFilePickerParcelObject; import rx.Observable; import rx.Subscriber; import rx.schedulers.Schedulers; @@ -77,5 +81,24 @@ public class AboutActivity extends BaseActivity { .subscribe(); } + @OnClick(R.id.ll_test) + void test() { + Intent intent = new Intent(getApplicationContext(), ru.bartwell.exfilepicker.ExFilePickerActivity.class); + startActivityForResult(intent, 1); + } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == 1) { + if (data != null) { + ExFilePickerParcelObject object = data.getParcelableExtra(ExFilePickerParcelObject.class.getCanonicalName()); + if (object.count > 0) { + // Here is object contains selected files names and path + HtmlImporter importer = new HtmlImporter(); + importer.from(new File(object.path + object.names.get(0))); + } + } + } + } } diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index a2c4e3b..26d1037 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -127,6 +127,21 @@ + + + + + + + +