/* * Copyright 2014 A.C.R. Development */ package acr.browser.lightning.constant; import android.app.Application; import android.graphics.Bitmap; import android.os.AsyncTask; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.lang.ref.WeakReference; import java.util.List; import acr.browser.lightning.R; import acr.browser.lightning.app.BrowserApp; import acr.browser.lightning.database.BookmarkManager; import acr.browser.lightning.database.HistoryItem; import acr.browser.lightning.utils.Utils; import acr.browser.lightning.view.LightningView; public final class BookmarkPage extends AsyncTask { /** * The bookmark page standard suffix */ public static final String FILENAME = "bookmarks.html"; private static final String HEADING_1 = "\n" + "\n" + "\n" + "\n" + "\n" + ""; private static final String HEADING_2 = "\n" + "\n" + "\n" + "
"; private static final String PART1 = "
\n" + "
\n" + "
\n" + "

\n" + ""; private static final String PART5 = "

"; private static final String END = "
"; private File mFilesDir; private File mCacheDir; private Application mApp; private final BookmarkManager mManager; @NonNull private final WeakReference mTabReference; private final Bitmap mFolderIcon; @NonNull private final String mTitle; public BookmarkPage(LightningView tab, @NonNull Application app, BookmarkManager manager, Bitmap folderIcon) { mApp = app; mTitle = app.getString(R.string.action_bookmarks); mManager = manager; mTabReference = new WeakReference<>(tab); mFolderIcon = folderIcon; } @Override protected Void doInBackground(Void... params) { mCacheDir = mApp.getCacheDir(); mFilesDir = mApp.getFilesDir(); cacheDefaultFolderIcon(); buildBookmarkPage(null, mManager); return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); LightningView tab = mTabReference.get(); if (tab != null) { File bookmarkWebPage = new File(mFilesDir, FILENAME); tab.loadUrl(Constants.FILE + bookmarkWebPage); } } private void cacheDefaultFolderIcon() { FileOutputStream outputStream = null; File image = new File(mCacheDir, "folder.png"); try { outputStream = new FileOutputStream(image); mFolderIcon.compress(Bitmap.CompressFormat.PNG, 100, outputStream); mFolderIcon.recycle(); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { Utils.close(outputStream); } } private void buildBookmarkPage(@Nullable final String folder, @NonNull final BookmarkManager manager) { final List list = manager.getBookmarksFromFolder(folder, true); final File bookmarkWebPage; if (folder == null || folder.isEmpty()) { bookmarkWebPage = new File(mFilesDir, FILENAME); } else { bookmarkWebPage = new File(mFilesDir, folder + '-' + FILENAME); } final StringBuilder bookmarkBuilder = new StringBuilder(HEADING_1 + mTitle + HEADING_2); final String folderIconPath = Constants.FILE + mCacheDir + "/folder.png"; for (int n = 0, size = list.size(); n < size; n++) { final HistoryItem item = list.get(n); bookmarkBuilder.append(PART1); if (item.isFolder()) { final File folderPage = new File(mFilesDir, item.getTitle() + '-' + FILENAME); bookmarkBuilder.append(Constants.FILE).append(folderPage); bookmarkBuilder.append(PART2); bookmarkBuilder.append(folderIconPath); buildBookmarkPage(item.getTitle(), manager); } else { bookmarkBuilder.append(item.getUrl()); bookmarkBuilder.append(PART2).append(PART3); bookmarkBuilder.append(item.getUrl()); } bookmarkBuilder.append(PART4); bookmarkBuilder.append(item.getTitle()); bookmarkBuilder.append(PART5); } bookmarkBuilder.append(END); FileWriter bookWriter = null; try { //noinspection IOResourceOpenedButNotSafelyClosed bookWriter = new FileWriter(bookmarkWebPage, false); bookWriter.write(bookmarkBuilder.toString()); } catch (IOException e) { e.printStackTrace(); } finally { Utils.close(bookWriter); } } public void load() { executeOnExecutor(BrowserApp.getIOThread()); } }