From 645b98cd509829a7990eb090a2e757f819d9ba6f Mon Sep 17 00:00:00 2001 From: Anthony Restaino Date: Sat, 25 Jul 2015 22:05:09 -0400 Subject: [PATCH] Simplify and improve long press handling for links on the bookmark page and history page --- .../lightning/activity/BrowserActivity.java | 357 ++++++++++-------- .../lightning/constant/BookmarkPage.java | 8 +- .../lightning/constant/HistoryPage.java | 2 +- .../browser/lightning/constant/StartPage.java | 2 + .../lightning/database/BookmarkManager.java | 16 + .../browser/lightning/view/LightningView.java | 2 +- app/src/main/res/values/strings.xml | 1 + 7 files changed, 218 insertions(+), 170 deletions(-) diff --git a/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java b/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java index ce9eaee..81c0c73 100644 --- a/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java +++ b/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java @@ -95,7 +95,9 @@ import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; import android.widget.VideoView; +import java.io.BufferedOutputStream; import java.io.File; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; @@ -117,6 +119,7 @@ import acr.browser.lightning.R; import acr.browser.lightning.constant.BookmarkPage; import acr.browser.lightning.constant.Constants; import acr.browser.lightning.constant.HistoryPage; +import acr.browser.lightning.constant.StartPage; import acr.browser.lightning.controller.BrowserController; import acr.browser.lightning.database.BookmarkManager; import acr.browser.lightning.database.HistoryDatabase; @@ -1093,7 +1096,7 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse Collections.sort(mBookmarkList, new SortIgnoreCase()); if (mCurrentView != null && mCurrentView.getUrl().startsWith(Constants.FILE) - && mCurrentView.getUrl().endsWith("bookmarks.html")) { + && mCurrentView.getUrl().endsWith(BookmarkPage.FILENAME)) { openBookmarkPage(mWebView); } if (mCurrentView != null) { @@ -2044,19 +2047,39 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse */ @Override public void openBookmarkPage(WebView view) { + if (view == null) + return; + Bitmap folderIcon = ThemeUtils.getThemedBitmap(this, 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); + } StringBuilder bookmarkBuilder = new StringBuilder(); bookmarkBuilder.append(BookmarkPage.HEADING); Iterator iter = mBookmarkList.iterator(); HistoryItem helper; + String folderPath = Constants.FILE + mActivity.getCacheDir() + "/folder.png"; while (iter.hasNext()) { helper = iter.next(); bookmarkBuilder.append(BookmarkPage.PART1); bookmarkBuilder.append(helper.getUrl()); bookmarkBuilder.append(BookmarkPage.PART2); - bookmarkBuilder.append(helper.getUrl()); - bookmarkBuilder.append(BookmarkPage.PART3); - bookmarkBuilder.append(helper.getTitle()); + if (helper.getIsFolder()) { + bookmarkBuilder.append(folderPath); + } else { + bookmarkBuilder.append(BookmarkPage.PART3); + bookmarkBuilder.append(helper.getUrl()); + } bookmarkBuilder.append(BookmarkPage.PART4); + bookmarkBuilder.append(helper.getTitle()); + bookmarkBuilder.append(BookmarkPage.PART5); } bookmarkBuilder.append(BookmarkPage.END); File bookmarkWebPage = new File(mActivity.getFilesDir(), BookmarkPage.FILENAME); @@ -2462,185 +2485,189 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse */ public void longClickPage(final String url) { HitTestResult result = null; + String currentUrl = null; if (mWebView != null) { result = mWebView.getHitTestResult(); + currentUrl = mWebView.getUrl(); } - if (url != null) { - if (result != null) { - if (result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE - || result.getType() == HitTestResult.IMAGE_TYPE) { - DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - switch (which) { - case DialogInterface.BUTTON_POSITIVE: - newTab(url, false); - break; - - case DialogInterface.BUTTON_NEGATIVE: - mCurrentView.loadUrl(url); - break; - - case DialogInterface.BUTTON_NEUTRAL: - if (API > 8) { - Utils.downloadFile(mActivity, url, - mCurrentView.getUserAgent(), "attachment"); - } - break; - } - } - }; - - AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); // dialog - builder.setTitle(url.replace(Constants.HTTP, "")) - .setMessage(getResources().getString(R.string.dialog_image)) - .setPositiveButton(getResources().getString(R.string.action_new_tab), - dialogClickListener) - .setNegativeButton(getResources().getString(R.string.action_open), - dialogClickListener) - .setNeutralButton(getResources().getString(R.string.action_download), - dialogClickListener).show(); - + if (currentUrl != null && currentUrl.startsWith(Constants.FILE)) { + if (currentUrl.endsWith(HistoryPage.FILENAME)) { + if (url != null) { + longPressHistoryLink(url); + } else if (result != null && result.getExtra() != null) { + final String newUrl = result.getExtra(); + longPressHistoryLink(newUrl); + } + } else if (currentUrl.endsWith(BookmarkPage.FILENAME)) { + if (url != null) { + longPressBookmarkLink(url); + } else if (result != null && result.getExtra() != null) { + final String newUrl = result.getExtra(); + longPressBookmarkLink(newUrl); + } + } + } else { + if (url != null) { + if (result != null) { + if (result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE || result.getType() == HitTestResult.IMAGE_TYPE) { + longPressImage(url); + } else { + longPressLink(url); + } + } else { + longPressLink(url); + } + } else if (result != null && result.getExtra() != null) { + final String newUrl = result.getExtra(); + if (result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE || result.getType() == HitTestResult.IMAGE_TYPE) { + longPressImage(newUrl); } else { - DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - switch (which) { - case DialogInterface.BUTTON_POSITIVE: - newTab(url, false); - break; - - case DialogInterface.BUTTON_NEGATIVE: - mCurrentView.loadUrl(url); - break; - - case DialogInterface.BUTTON_NEUTRAL: - ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText("label", url); - clipboard.setPrimaryClip(clip); - break; + longPressLink(newUrl); + } + } + } + } + + private void longPressBookmarkLink(final String url) { + final int position = BookmarkManager.getIndexOfBookmark(mBookmarkList, url); + if (position == -1) { + return; + } + DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case DialogInterface.BUTTON_POSITIVE: + newTab(mBookmarkList.get(position).getUrl(), false); + mDrawerLayout.closeDrawers(); + break; + + case DialogInterface.BUTTON_NEGATIVE: + if (mBookmarkManager.deleteBookmark(mBookmarkList.get(position))) { + mBookmarkList.remove(position); + notifyBookmarkDataSetChanged(); + mSearchAdapter.refreshBookmarks(); + openBookmarks(); + if (mCurrentView != null) { + updateBookmarkIndicator(mCurrentView.getUrl()); } } - }; - - AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); // dialog - builder.setTitle(url) - .setMessage(getResources().getString(R.string.dialog_link)) - .setPositiveButton(getResources().getString(R.string.action_new_tab), - dialogClickListener) - .setNegativeButton(getResources().getString(R.string.action_open), - dialogClickListener) - .setNeutralButton(getResources().getString(R.string.action_copy), - dialogClickListener).show(); + break; + + case DialogInterface.BUTTON_NEUTRAL: + editBookmark(position); + break; } - } else { - DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - switch (which) { - case DialogInterface.BUTTON_POSITIVE: - newTab(url, false); - break; + } + }; + + AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); + builder.setTitle(R.string.action_bookmarks); + builder.setMessage(R.string.dialog_bookmark) + .setCancelable(true) + .setPositiveButton(R.string.action_new_tab, dialogClickListener) + .setNegativeButton(R.string.action_delete, dialogClickListener) + .setNeutralButton(R.string.action_edit, dialogClickListener) + .show(); + } - case DialogInterface.BUTTON_NEGATIVE: - mCurrentView.loadUrl(url); - break; + private void longPressHistoryLink(final String url) { + DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case DialogInterface.BUTTON_POSITIVE: + newTab(url, false); + mDrawerLayout.closeDrawers(); + break; - case DialogInterface.BUTTON_NEUTRAL: - ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText("label", url); - clipboard.setPrimaryClip(clip); + case DialogInterface.BUTTON_NEGATIVE: + mHistoryDatabase.deleteHistoryItem(url); + openHistory(); + break; - break; + case DialogInterface.BUTTON_NEUTRAL: + if (mCurrentView != null) { + mCurrentView.loadUrl(url); } - } - }; + break; + } + } + }; - AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); // dialog - builder.setTitle(url) - .setMessage(getResources().getString(R.string.dialog_link)) - .setPositiveButton(getResources().getString(R.string.action_new_tab), - dialogClickListener) - .setNegativeButton(getResources().getString(R.string.action_open), - dialogClickListener) - .setNeutralButton(getResources().getString(R.string.action_copy), - dialogClickListener).show(); - } - } else if (result != null) { - if (result.getExtra() != null) { - final String newUrl = result.getExtra(); - if (result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE - || result.getType() == HitTestResult.IMAGE_TYPE) { - DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - switch (which) { - case DialogInterface.BUTTON_POSITIVE: - newTab(newUrl, false); - break; - - case DialogInterface.BUTTON_NEGATIVE: - mCurrentView.loadUrl(newUrl); - break; - - case DialogInterface.BUTTON_NEUTRAL: - if (API > 8) { - Utils.downloadFile(mActivity, newUrl, - mCurrentView.getUserAgent(), "attachment"); - } - break; - } - } - }; - - AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); // dialog - builder.setTitle(newUrl.replace(Constants.HTTP, "")) - .setMessage(getResources().getString(R.string.dialog_image)) - .setPositiveButton(getResources().getString(R.string.action_new_tab), - dialogClickListener) - .setNegativeButton(getResources().getString(R.string.action_open), - dialogClickListener) - .setNeutralButton(getResources().getString(R.string.action_download), - dialogClickListener).show(); + AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); + builder.setTitle(R.string.action_history); + builder.setMessage(R.string.dialog_history_long_press) + .setCancelable(true) + .setPositiveButton(R.string.action_new_tab, dialogClickListener) + .setNegativeButton(R.string.action_delete, dialogClickListener) + .setNeutralButton(R.string.action_open, dialogClickListener) + .show(); + } - } else { - DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - switch (which) { - case DialogInterface.BUTTON_POSITIVE: - newTab(newUrl, false); - break; - - case DialogInterface.BUTTON_NEGATIVE: - mCurrentView.loadUrl(newUrl); - break; - - case DialogInterface.BUTTON_NEUTRAL: - ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText("label", newUrl); - clipboard.setPrimaryClip(clip); - - break; - } + private void longPressImage(final String url) { + DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case DialogInterface.BUTTON_POSITIVE: + newTab(url, false); + break; + + case DialogInterface.BUTTON_NEGATIVE: + mCurrentView.loadUrl(url); + break; + + case DialogInterface.BUTTON_NEUTRAL: + if (API > 8) { + Utils.downloadFile(mActivity, url, + mCurrentView.getUserAgent(), "attachment"); } - }; - - AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); // dialog - builder.setTitle(newUrl) - .setMessage(getResources().getString(R.string.dialog_link)) - .setPositiveButton(getResources().getString(R.string.action_new_tab), - dialogClickListener) - .setNegativeButton(getResources().getString(R.string.action_open), - dialogClickListener) - .setNeutralButton(getResources().getString(R.string.action_copy), - dialogClickListener).show(); + break; } - } + }; - } + AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); + builder.setTitle(url.replace(Constants.HTTP, "")) + .setCancelable(true) + .setMessage(R.string.dialog_image) + .setPositiveButton(R.string.action_new_tab, dialogClickListener) + .setNegativeButton(R.string.action_open, dialogClickListener) + .setNeutralButton(R.string.action_download, dialogClickListener) + .show(); + } + + private void longPressLink(final String url) { + DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case DialogInterface.BUTTON_POSITIVE: + newTab(url, false); + break; + + case DialogInterface.BUTTON_NEGATIVE: + mCurrentView.loadUrl(url); + break; + + case DialogInterface.BUTTON_NEUTRAL: + ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); + ClipData clip = ClipData.newPlainText("label", url); + clipboard.setPrimaryClip(clip); + break; + } + } + }; + AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); // dialog + builder.setTitle(url) + .setCancelable(true) + .setMessage(R.string.dialog_link) + .setPositiveButton(R.string.action_new_tab, dialogClickListener) + .setNegativeButton(R.string.action_open, dialogClickListener) + .setNeutralButton(R.string.action_copy, dialogClickListener) + .show(); } /** 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 56a75bb..ead1705 100644 --- a/app/src/main/java/acr/browser/lightning/constant/BookmarkPage.java +++ b/app/src/main/java/acr/browser/lightning/constant/BookmarkPage.java @@ -16,11 +16,13 @@ public class BookmarkPage { public static final String PART1 = "
"; + public static final String PART3 = "http://www.google.com/s2/favicons?domain="; - public static final String PART4 = "

"; + public static final String PART4 = "' />

"; + + public static final String PART5 = "

"; public static final String END = ""; diff --git a/app/src/main/java/acr/browser/lightning/constant/HistoryPage.java b/app/src/main/java/acr/browser/lightning/constant/HistoryPage.java index b3b5f50..9963ff0 100644 --- a/app/src/main/java/acr/browser/lightning/constant/HistoryPage.java +++ b/app/src/main/java/acr/browser/lightning/constant/HistoryPage.java @@ -19,7 +19,7 @@ import acr.browser.lightning.utils.Utils; public class HistoryPage { - private static final String FILENAME = "history.html"; + public static final String FILENAME = "history.html"; private static final String HEADING = "" + BrowserApp.getAppContext().getString(R.string.action_history) diff --git a/app/src/main/java/acr/browser/lightning/constant/StartPage.java b/app/src/main/java/acr/browser/lightning/constant/StartPage.java index 2881560..5cfcf7d 100644 --- a/app/src/main/java/acr/browser/lightning/constant/StartPage.java +++ b/app/src/main/java/acr/browser/lightning/constant/StartPage.java @@ -8,6 +8,8 @@ import acr.browser.lightning.R; public class StartPage { + public static final String FILENAME = "homepage.html"; + public static final String HEAD = "<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\">" + "<head>" + "<meta content=\"en-us\" http-equiv=\"Content-Language\" />" diff --git a/app/src/main/java/acr/browser/lightning/database/BookmarkManager.java b/app/src/main/java/acr/browser/lightning/database/BookmarkManager.java index 89052da..ee4619e 100644 --- a/app/src/main/java/acr/browser/lightning/database/BookmarkManager.java +++ b/app/src/main/java/acr/browser/lightning/database/BookmarkManager.java @@ -506,6 +506,22 @@ public class BookmarkManager { } } + /** + * find the index of a bookmark in a list using only its URL + * + * @param list the list to search + * @param url the url to compare + * @return returns the index of the bookmark or -1 if none was found + */ + public static int getIndexOfBookmark(final List<HistoryItem> list, final String url) { + for (int n = 0; n < list.size(); n++) { + if (list.get(n).getUrl().equals(url)) { + return n; + } + } + return -1; + } + private class SortIgnoreCase implements Comparator<HistoryItem> { public int compare(HistoryItem o1, HistoryItem o2) { 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 a82a7a6..c4a9165 100644 --- a/app/src/main/java/acr/browser/lightning/view/LightningView.java +++ b/app/src/main/java/acr/browser/lightning/view/LightningView.java @@ -238,7 +238,7 @@ public class LightningView { homepageBuilder.append(searchUrl); homepageBuilder.append(StartPage.END); - File homepage = new File(mActivity.getFilesDir(), "homepage.html"); + File homepage = new File(mActivity.getFilesDir(), StartPage.FILENAME); FileWriter hWriter = null; try { hWriter = new FileWriter(homepage, false); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5dd5512..7c906ec 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -59,6 +59,7 @@ <string name="action_open">Open</string> <string name="dialog_link">What would you like to do with this link?</string> <string name="dialog_title_share">Share this page</string> + <string name="dialog_history_long_press">What would you like to do with this history item?</string> <string name="dialog_bookmark">What would you like to do with this bookmark?</string> <string name="action_delete">Delete</string> <string name="action_blank">Blank Page</string>