Browse Source

Simplify and improve long press handling for links on the bookmark page and history page

master
Anthony Restaino 9 years ago
parent
commit
645b98cd50
  1. 357
      app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java
  2. 8
      app/src/main/java/acr/browser/lightning/constant/BookmarkPage.java
  3. 2
      app/src/main/java/acr/browser/lightning/constant/HistoryPage.java
  4. 2
      app/src/main/java/acr/browser/lightning/constant/StartPage.java
  5. 16
      app/src/main/java/acr/browser/lightning/database/BookmarkManager.java
  6. 2
      app/src/main/java/acr/browser/lightning/view/LightningView.java
  7. 1
      app/src/main/res/values/strings.xml

357
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.TextView.OnEditorActionListener;
import android.widget.VideoView; import android.widget.VideoView;
import java.io.BufferedOutputStream;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
@ -117,6 +119,7 @@ import acr.browser.lightning.R;
import acr.browser.lightning.constant.BookmarkPage; import acr.browser.lightning.constant.BookmarkPage;
import acr.browser.lightning.constant.Constants; import acr.browser.lightning.constant.Constants;
import acr.browser.lightning.constant.HistoryPage; import acr.browser.lightning.constant.HistoryPage;
import acr.browser.lightning.constant.StartPage;
import acr.browser.lightning.controller.BrowserController; import acr.browser.lightning.controller.BrowserController;
import acr.browser.lightning.database.BookmarkManager; import acr.browser.lightning.database.BookmarkManager;
import acr.browser.lightning.database.HistoryDatabase; import acr.browser.lightning.database.HistoryDatabase;
@ -1093,7 +1096,7 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse
Collections.sort(mBookmarkList, new SortIgnoreCase()); Collections.sort(mBookmarkList, new SortIgnoreCase());
if (mCurrentView != null && mCurrentView.getUrl().startsWith(Constants.FILE) if (mCurrentView != null && mCurrentView.getUrl().startsWith(Constants.FILE)
&& mCurrentView.getUrl().endsWith("bookmarks.html")) { && mCurrentView.getUrl().endsWith(BookmarkPage.FILENAME)) {
openBookmarkPage(mWebView); openBookmarkPage(mWebView);
} }
if (mCurrentView != null) { if (mCurrentView != null) {
@ -2044,19 +2047,39 @@ public abstract class BrowserActivity extends ThemableActivity implements Browse
*/ */
@Override @Override
public void openBookmarkPage(WebView view) { 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(); StringBuilder bookmarkBuilder = new StringBuilder();
bookmarkBuilder.append(BookmarkPage.HEADING); bookmarkBuilder.append(BookmarkPage.HEADING);
Iterator<HistoryItem> iter = mBookmarkList.iterator(); Iterator<HistoryItem> iter = mBookmarkList.iterator();
HistoryItem helper; HistoryItem helper;
String folderPath = Constants.FILE + mActivity.getCacheDir() + "/folder.png";
while (iter.hasNext()) { while (iter.hasNext()) {
helper = iter.next(); helper = iter.next();
bookmarkBuilder.append(BookmarkPage.PART1); bookmarkBuilder.append(BookmarkPage.PART1);
bookmarkBuilder.append(helper.getUrl()); bookmarkBuilder.append(helper.getUrl());
bookmarkBuilder.append(BookmarkPage.PART2); bookmarkBuilder.append(BookmarkPage.PART2);
bookmarkBuilder.append(helper.getUrl()); if (helper.getIsFolder()) {
bookmarkBuilder.append(BookmarkPage.PART3); bookmarkBuilder.append(folderPath);
bookmarkBuilder.append(helper.getTitle()); } else {
bookmarkBuilder.append(BookmarkPage.PART3);
bookmarkBuilder.append(helper.getUrl());
}
bookmarkBuilder.append(BookmarkPage.PART4); bookmarkBuilder.append(BookmarkPage.PART4);
bookmarkBuilder.append(helper.getTitle());
bookmarkBuilder.append(BookmarkPage.PART5);
} }
bookmarkBuilder.append(BookmarkPage.END); bookmarkBuilder.append(BookmarkPage.END);
File bookmarkWebPage = new File(mActivity.getFilesDir(), BookmarkPage.FILENAME); 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) { public void longClickPage(final String url) {
HitTestResult result = null; HitTestResult result = null;
String currentUrl = null;
if (mWebView != null) { if (mWebView != null) {
result = mWebView.getHitTestResult(); result = mWebView.getHitTestResult();
currentUrl = mWebView.getUrl();
} }
if (url != null) { if (currentUrl != null && currentUrl.startsWith(Constants.FILE)) {
if (result != null) { if (currentUrl.endsWith(HistoryPage.FILENAME)) {
if (result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE if (url != null) {
|| result.getType() == HitTestResult.IMAGE_TYPE) { longPressHistoryLink(url);
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { } else if (result != null && result.getExtra() != null) {
@Override final String newUrl = result.getExtra();
public void onClick(DialogInterface dialog, int which) { longPressHistoryLink(newUrl);
switch (which) { }
case DialogInterface.BUTTON_POSITIVE: } else if (currentUrl.endsWith(BookmarkPage.FILENAME)) {
newTab(url, false); if (url != null) {
break; longPressBookmarkLink(url);
} else if (result != null && result.getExtra() != null) {
case DialogInterface.BUTTON_NEGATIVE: final String newUrl = result.getExtra();
mCurrentView.loadUrl(url); longPressBookmarkLink(newUrl);
break; }
}
case DialogInterface.BUTTON_NEUTRAL: } else {
if (API > 8) { if (url != null) {
Utils.downloadFile(mActivity, url, if (result != null) {
mCurrentView.getUserAgent(), "attachment"); if (result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE || result.getType() == HitTestResult.IMAGE_TYPE) {
} longPressImage(url);
break; } else {
} longPressLink(url);
} }
}; } else {
longPressLink(url);
AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); // dialog }
builder.setTitle(url.replace(Constants.HTTP, "")) } else if (result != null && result.getExtra() != null) {
.setMessage(getResources().getString(R.string.dialog_image)) final String newUrl = result.getExtra();
.setPositiveButton(getResources().getString(R.string.action_new_tab), if (result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE || result.getType() == HitTestResult.IMAGE_TYPE) {
dialogClickListener) longPressImage(newUrl);
.setNegativeButton(getResources().getString(R.string.action_open),
dialogClickListener)
.setNeutralButton(getResources().getString(R.string.action_download),
dialogClickListener).show();
} else { } else {
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { longPressLink(newUrl);
@Override }
public void onClick(DialogInterface dialog, int which) { }
switch (which) { }
case DialogInterface.BUTTON_POSITIVE: }
newTab(url, false);
break; private void longPressBookmarkLink(final String url) {
final int position = BookmarkManager.getIndexOfBookmark(mBookmarkList, url);
case DialogInterface.BUTTON_NEGATIVE: if (position == -1) {
mCurrentView.loadUrl(url); return;
break; }
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
case DialogInterface.BUTTON_NEUTRAL: @Override
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); public void onClick(DialogInterface dialog, int which) {
ClipData clip = ClipData.newPlainText("label", url); switch (which) {
clipboard.setPrimaryClip(clip); case DialogInterface.BUTTON_POSITIVE:
break; 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());
} }
} }
}; break;
AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); // dialog case DialogInterface.BUTTON_NEUTRAL:
builder.setTitle(url) editBookmark(position);
.setMessage(getResources().getString(R.string.dialog_link)) break;
.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 { }
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { };
@Override
public void onClick(DialogInterface dialog, int which) { AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
switch (which) { builder.setTitle(R.string.action_bookmarks);
case DialogInterface.BUTTON_POSITIVE: builder.setMessage(R.string.dialog_bookmark)
newTab(url, false); .setCancelable(true)
break; .setPositiveButton(R.string.action_new_tab, dialogClickListener)
.setNegativeButton(R.string.action_delete, dialogClickListener)
.setNeutralButton(R.string.action_edit, dialogClickListener)
.show();
}
case DialogInterface.BUTTON_NEGATIVE: private void longPressHistoryLink(final String url) {
mCurrentView.loadUrl(url); DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
break; @Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
newTab(url, false);
mDrawerLayout.closeDrawers();
break;
case DialogInterface.BUTTON_NEUTRAL: case DialogInterface.BUTTON_NEGATIVE:
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); mHistoryDatabase.deleteHistoryItem(url);
ClipData clip = ClipData.newPlainText("label", url); openHistory();
clipboard.setPrimaryClip(clip); break;
break; case DialogInterface.BUTTON_NEUTRAL:
if (mCurrentView != null) {
mCurrentView.loadUrl(url);
} }
} break;
}; }
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); // dialog AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
builder.setTitle(url) builder.setTitle(R.string.action_history);
.setMessage(getResources().getString(R.string.dialog_link)) builder.setMessage(R.string.dialog_history_long_press)
.setPositiveButton(getResources().getString(R.string.action_new_tab), .setCancelable(true)
dialogClickListener) .setPositiveButton(R.string.action_new_tab, dialogClickListener)
.setNegativeButton(getResources().getString(R.string.action_open), .setNegativeButton(R.string.action_delete, dialogClickListener)
dialogClickListener) .setNeutralButton(R.string.action_open, dialogClickListener)
.setNeutralButton(getResources().getString(R.string.action_copy), .show();
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();
} else { private void longPressImage(final String url) {
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
switch (which) { switch (which) {
case DialogInterface.BUTTON_POSITIVE: case DialogInterface.BUTTON_POSITIVE:
newTab(newUrl, false); newTab(url, false);
break; break;
case DialogInterface.BUTTON_NEGATIVE: case DialogInterface.BUTTON_NEGATIVE:
mCurrentView.loadUrl(newUrl); mCurrentView.loadUrl(url);
break; break;
case DialogInterface.BUTTON_NEUTRAL: case DialogInterface.BUTTON_NEUTRAL:
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); if (API > 8) {
ClipData clip = ClipData.newPlainText("label", newUrl); Utils.downloadFile(mActivity, url,
clipboard.setPrimaryClip(clip); mCurrentView.getUserAgent(), "attachment");
break;
}
} }
}; break;
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();
} }
} }
};
} 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();
} }
/** /**

8
app/src/main/java/acr/browser/lightning/constant/BookmarkPage.java

@ -16,11 +16,13 @@ public class BookmarkPage {
public static final String PART1 = "<div class=\"box\"><a href=\""; public static final String PART1 = "<div class=\"box\"><a href=\"";
public static final String PART2 = "\" ></a><div class=\"stuff\" ><img height=\"20\" width=\"20\" src='http://www.google.com/s2/favicons?domain="; public static final String PART2 = "\" ></a><div class=\"stuff\" ><img height=\"20\" width=\"20\" src='";
public static final String PART3 = "' /><p class=\"ellipses\">"; public static final String PART3 = "http://www.google.com/s2/favicons?domain=";
public static final String PART4 = "</p></div></div>"; public static final String PART4 = "' /><p class=\"ellipses\">";
public static final String PART5 = "</p></div></div>";
public static final String END = "</div></body></html>"; public static final String END = "</div></body></html>";

2
app/src/main/java/acr/browser/lightning/constant/HistoryPage.java

@ -19,7 +19,7 @@ import acr.browser.lightning.utils.Utils;
public class HistoryPage { public class HistoryPage {
private static final String FILENAME = "history.html"; public static final String FILENAME = "history.html";
private static final String HEADING = "<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><meta content=\"en-us\" http-equiv=\"Content-Language\" /><meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\"><title>" private static final String HEADING = "<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><meta content=\"en-us\" http-equiv=\"Content-Language\" /><meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\"><title>"
+ BrowserApp.getAppContext().getString(R.string.action_history) + BrowserApp.getAppContext().getString(R.string.action_history)

2
app/src/main/java/acr/browser/lightning/constant/StartPage.java

@ -8,6 +8,8 @@ import acr.browser.lightning.R;
public class StartPage { 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\">" public static final String HEAD = "<!DOCTYPE html><html xmlns=\"http://www.w3.org/1999/xhtml\">"
+ "<head>" + "<head>"
+ "<meta content=\"en-us\" http-equiv=\"Content-Language\" />" + "<meta content=\"en-us\" http-equiv=\"Content-Language\" />"

16
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> { private class SortIgnoreCase implements Comparator<HistoryItem> {
public int compare(HistoryItem o1, HistoryItem o2) { public int compare(HistoryItem o1, HistoryItem o2) {

2
app/src/main/java/acr/browser/lightning/view/LightningView.java

@ -238,7 +238,7 @@ public class LightningView {
homepageBuilder.append(searchUrl); homepageBuilder.append(searchUrl);
homepageBuilder.append(StartPage.END); homepageBuilder.append(StartPage.END);
File homepage = new File(mActivity.getFilesDir(), "homepage.html"); File homepage = new File(mActivity.getFilesDir(), StartPage.FILENAME);
FileWriter hWriter = null; FileWriter hWriter = null;
try { try {
hWriter = new FileWriter(homepage, false); hWriter = new FileWriter(homepage, false);

1
app/src/main/res/values/strings.xml

@ -59,6 +59,7 @@
<string name="action_open">Open</string> <string name="action_open">Open</string>
<string name="dialog_link">What would you like to do with this link?</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_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="dialog_bookmark">What would you like to do with this bookmark?</string>
<string name="action_delete">Delete</string> <string name="action_delete">Delete</string>
<string name="action_blank">Blank Page</string> <string name="action_blank">Blank Page</string>

Loading…
Cancel
Save