From 22960c9bd60f018dfbcb8434c52f322933f0fc3e Mon Sep 17 00:00:00 2001 From: Anthony Restaino Date: Sat, 23 Jan 2016 12:27:58 -0500 Subject: [PATCH] Make BookmarkPage an AsyncTask to simplify its use, change recursion to iteration in DownloadHandler --- .../lightning/constant/BookmarkPage.java | 101 +++++++++++++----- .../lightning/download/DownloadHandler.java | 32 +++--- .../browser/lightning/view/LightningView.java | 28 +---- 3 files changed, 91 insertions(+), 70 deletions(-) diff --git a/app/src/main/java/acr/browser/lightning/constant/BookmarkPage.java b/app/src/main/java/acr/browser/lightning/constant/BookmarkPage.java index 022e218..ba7f91a 100644 --- a/app/src/main/java/acr/browser/lightning/constant/BookmarkPage.java +++ b/app/src/main/java/acr/browser/lightning/constant/BookmarkPage.java @@ -3,34 +3,39 @@ */ package acr.browser.lightning.constant; +import android.app.Application; +import android.graphics.Bitmap; +import android.os.AsyncTask; + 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 javax.inject.Inject; - 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 { +public final class BookmarkPage extends AsyncTask { /** * The bookmark page standard suffix */ public static final String FILENAME = "bookmarks.html"; - private static final String HEADING = "\n" + + private static final String HEADING_1 = "\n" + "\n" + "\n" + "\n" + "\n" + - "" + - BrowserApp.getContext().getString(R.string.action_bookmarks) + - "\n" + + ""; + + private static final String HEADING_2 = "\n" + "\n" + "\n" + @@ -52,46 +57,84 @@ public final class BookmarkPage { private static final String END = ""; - private static final File FILES_DIR = BrowserApp.getContext().getFilesDir(); - private static final File CACHE_DIR = BrowserApp.getContext().getCacheDir(); + private final File mFilesDir; + private final File mCacheDir; + + private final BookmarkManager mManager; + private final WeakReference mTabReference; + private final Bitmap mFolderIcon; + private final String mTitle; + + public BookmarkPage(BookmarkManager manager, LightningView tab, Application app, Bitmap folderIcon) { + mFilesDir = app.getFilesDir(); + mCacheDir = app.getCacheDir(); + mTitle = app.getString(R.string.action_bookmarks); + mManager = manager; + mTabReference = new WeakReference<>(tab); + mFolderIcon = folderIcon; + } + + @Override + protected Void doInBackground(Void... params) { + 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 BookmarkPage() {} + 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); + } + } - public static void buildBookmarkPage(final String folder, final BookmarkManager manager) { + private void buildBookmarkPage(final String folder, final BookmarkManager manager) { final List list = manager.getBookmarksFromFolder(folder, true); final File bookmarkWebPage; if (folder == null || folder.isEmpty()) { - bookmarkWebPage = new File(FILES_DIR, FILENAME); + bookmarkWebPage = new File(mFilesDir, FILENAME); } else { - bookmarkWebPage = new File(FILES_DIR, folder + '-' + FILENAME); + bookmarkWebPage = new File(mFilesDir, folder + '-' + FILENAME); } - final StringBuilder bookmarkBuilder = new StringBuilder(BookmarkPage.HEADING); + final StringBuilder bookmarkBuilder = new StringBuilder(HEADING_1 + mTitle + HEADING_2); - final String folderIconPath = Constants.FILE + CACHE_DIR + "/folder.png"; + 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(BookmarkPage.PART1); + bookmarkBuilder.append(PART1); if (item.isFolder()) { - final File folderPage = new File(FILES_DIR, item.getTitle() + '-' + FILENAME); + final File folderPage = new File(mFilesDir, item.getTitle() + '-' + FILENAME); bookmarkBuilder.append(Constants.FILE).append(folderPage); - bookmarkBuilder.append(BookmarkPage.PART2); + bookmarkBuilder.append(PART2); bookmarkBuilder.append(folderIconPath); - new Thread(new Runnable() { - @Override - public void run() { - buildBookmarkPage(item.getTitle(), manager); - } - }).run(); + buildBookmarkPage(item.getTitle(), manager); } else { bookmarkBuilder.append(item.getUrl()); - bookmarkBuilder.append(BookmarkPage.PART2).append(BookmarkPage.PART3); + bookmarkBuilder.append(PART2).append(PART3); bookmarkBuilder.append(item.getUrl()); } - bookmarkBuilder.append(BookmarkPage.PART4); + bookmarkBuilder.append(PART4); bookmarkBuilder.append(item.getTitle()); - bookmarkBuilder.append(BookmarkPage.PART5); + bookmarkBuilder.append(PART5); } - bookmarkBuilder.append(BookmarkPage.END); + bookmarkBuilder.append(END); FileWriter bookWriter = null; try { //noinspection IOResourceOpenedButNotSafelyClosed diff --git a/app/src/main/java/acr/browser/lightning/download/DownloadHandler.java b/app/src/main/java/acr/browser/lightning/download/DownloadHandler.java index 59aaf8b..8380ac0 100644 --- a/app/src/main/java/acr/browser/lightning/download/DownloadHandler.java +++ b/app/src/main/java/acr/browser/lightning/download/DownloadHandler.java @@ -294,26 +294,28 @@ public class DownloadHandler { * @return the first existent parent */ private static String getFirstRealParentDirectory(String directory) { - if (directory == null || directory.isEmpty()) { - return "/"; - } - directory = addNecessarySlashes(directory); - File file = new File(directory); - if (!file.isDirectory()) { - int indexSlash = directory.lastIndexOf('/'); - if (indexSlash > 0) { - String parent = directory.substring(0, indexSlash); - int previousIndex = parent.lastIndexOf('/'); - if (previousIndex > 0) { - return getFirstRealParentDirectory(parent.substring(0, previousIndex)); + while (true) { + if (directory == null || directory.isEmpty()) { + return "/"; + } + directory = addNecessarySlashes(directory); + File file = new File(directory); + if (!file.isDirectory()) { + int indexSlash = directory.lastIndexOf('/'); + if (indexSlash > 0) { + String parent = directory.substring(0, indexSlash); + int previousIndex = parent.lastIndexOf('/'); + if (previousIndex > 0) { + directory = parent.substring(0, previousIndex); + } else { + return "/"; + } } else { return "/"; } } else { - return "/"; + return directory; } - } else { - return directory; } } diff --git a/app/src/main/java/acr/browser/lightning/view/LightningView.java b/app/src/main/java/acr/browser/lightning/view/LightningView.java index 6b3703f..9289b5d 100644 --- a/app/src/main/java/acr/browser/lightning/view/LightningView.java +++ b/app/src/main/java/acr/browser/lightning/view/LightningView.java @@ -199,32 +199,8 @@ public class LightningView { public void loadBookmarkpage() { if (mWebView == null) return; - BrowserApp.getIOThread().execute(new Runnable() { - @Override - public void run() { - Bitmap folderIcon = ThemeUtils.getThemedBitmap(mActivity, R.drawable.ic_folder, false); - FileOutputStream outputStream = null; - File image = new File(mActivity.getCacheDir(), "folder.png"); - try { - outputStream = new FileOutputStream(image); - folderIcon.compress(Bitmap.CompressFormat.PNG, 100, outputStream); - folderIcon.recycle(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } finally { - Utils.close(outputStream); - } - final File bookmarkWebPage = new File(mActivity.getFilesDir(), BookmarkPage.FILENAME); - - BookmarkPage.buildBookmarkPage(null, mBookmarkManager); - mActivity.runOnUiThread(new Runnable() { - @Override - public void run() { - mWebView.loadUrl(Constants.FILE + bookmarkWebPage, mRequestHeaders); - } - }); - } - }); + Bitmap folderIcon = ThemeUtils.getThemedBitmap(mActivity, R.drawable.ic_folder, false); + new BookmarkPage(mBookmarkManager, this, BrowserApp.get(mActivity), folderIcon).executeOnExecutor(BrowserApp.getIOThread()); } /**