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; @@ -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; @@ -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 @@ -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 @@ -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<HistoryItem> 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 @@ -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();
}
/**

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

@ -16,11 +16,13 @@ public class BookmarkPage { @@ -16,11 +16,13 @@ public class BookmarkPage {
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>";

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

@ -19,7 +19,7 @@ import acr.browser.lightning.utils.Utils; @@ -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 = "<!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)

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

@ -8,6 +8,8 @@ import acr.browser.lightning.R; @@ -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\" />"

16
app/src/main/java/acr/browser/lightning/database/BookmarkManager.java

@ -506,6 +506,22 @@ public class BookmarkManager { @@ -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) {

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

@ -238,7 +238,7 @@ public class LightningView { @@ -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);

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

@ -59,6 +59,7 @@ @@ -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>

Loading…
Cancel
Save