Skip to content

Commit fcf1523

Browse files
committed
Long press menu: Make it work for links with images
1 parent 63760df commit fcf1523

2 files changed

Lines changed: 91 additions & 31 deletions

File tree

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ android {
77
applicationId "landau.sweb"
88
minSdkVersion 21
99
targetSdkVersion 26
10-
versionCode 2
11-
versionName "1.1"
10+
versionCode 3
11+
versionName "1.2"
1212
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1313
}
1414
buildTypes {

app/src/main/java/landau/sweb/MainActivity.java

Lines changed: 89 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
import android.os.Build;
3131
import android.os.Bundle;
3232
import android.os.Environment;
33+
import android.os.Handler;
34+
import android.os.Message;
3335
import android.preference.PreferenceManager;
3436
import android.support.annotation.NonNull;
3537
import android.support.annotation.Nullable;
@@ -403,35 +405,37 @@ public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError e
403405
}
404406
});
405407
webview.setOnLongClickListener(v -> {
408+
String url = null, imageUrl = null;
406409
WebView.HitTestResult r = ((WebView) v).getHitTestResult();
407-
if (r.getType() != WebView.HitTestResult.SRC_ANCHOR_TYPE && r.getType() != WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
408-
return false;
410+
switch (r.getType()) {
411+
case WebView.HitTestResult.SRC_ANCHOR_TYPE:
412+
url = r.getExtra();
413+
break;
414+
case WebView.HitTestResult.IMAGE_TYPE:
415+
imageUrl = r.getExtra();
416+
break;
417+
case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE:
418+
case WebView.HitTestResult.EMAIL_TYPE:
419+
case WebView.HitTestResult.UNKNOWN_TYPE:
420+
Handler handler = new Handler();
421+
Message message = handler.obtainMessage();
422+
((WebView)v).requestFocusNodeHref(message);
423+
url = message.getData().getString("url");
424+
if ("".equals(url)) {
425+
url = null;
426+
}
427+
imageUrl = message.getData().getString("src");
428+
if ("".equals(imageUrl)) {
429+
imageUrl = null;
430+
}
431+
if (url == null && imageUrl == null) {
432+
return false;
433+
}
434+
break;
435+
default:
436+
return false;
409437
}
410-
final String url = r.getExtra();
411-
new AlertDialog.Builder(MainActivity.this).setTitle(url).setItems(
412-
new String[]{"Open in new tab", "Copy URL", "Show full URL", "Download"}, (dialog, which) -> {
413-
switch (which) {
414-
case 0:
415-
newTab(url);
416-
break;
417-
case 1:
418-
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
419-
assert clipboard != null;
420-
ClipData clipData = ClipData.newPlainText("URL", url);
421-
clipboard.setPrimaryClip(clipData);
422-
break;
423-
case 2:
424-
new AlertDialog.Builder(MainActivity.this)
425-
.setTitle("Full URL")
426-
.setMessage(url)
427-
.setPositiveButton("OK", (dialog1, which1) -> {})
428-
.show();
429-
break;
430-
case 3:
431-
startDownload(url, null);
432-
break;
433-
}
434-
}).show();
438+
showLongPressMenu(url, imageUrl);
435439
return true;
436440
});
437441
webview.setDownloadListener((url, userAgent, contentDisposition, mimetype, contentLength) -> {
@@ -465,6 +469,62 @@ public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError e
465469
return webview;
466470
}
467471

472+
private void showLongPressMenu(String linkUrl, String imageUrl) {
473+
String url;
474+
String title;
475+
String[] options = new String[]{"Open in new tab", "Copy URL", "Show full URL", "Download"};
476+
477+
if (imageUrl == null) {
478+
if (linkUrl == null) {
479+
throw new IllegalArgumentException("Bad null arguments in showLongPressMenu");
480+
} else {
481+
// Text link
482+
url = linkUrl;
483+
title = linkUrl;
484+
}
485+
} else {
486+
if (linkUrl == null) {
487+
// Image without link
488+
url = imageUrl;
489+
title = "Image: " + imageUrl;
490+
} else {
491+
// Image with link
492+
url = linkUrl;
493+
title = linkUrl;
494+
String[] newOptions = new String[options.length + 1];
495+
System.arraycopy(options, 0, newOptions, 0, options.length);
496+
newOptions[newOptions.length - 1] = "Image Options";
497+
options = newOptions;
498+
}
499+
}
500+
new AlertDialog.Builder(MainActivity.this).setTitle(title).setItems(options, (dialog, which) -> {
501+
switch (which) {
502+
case 0:
503+
newTab(url);
504+
break;
505+
case 1:
506+
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
507+
assert clipboard != null;
508+
ClipData clipData = ClipData.newPlainText("URL", url);
509+
clipboard.setPrimaryClip(clipData);
510+
break;
511+
case 2:
512+
new AlertDialog.Builder(MainActivity.this)
513+
.setTitle("Full URL")
514+
.setMessage(url)
515+
.setPositiveButton("OK", (dialog1, which1) -> {})
516+
.show();
517+
break;
518+
case 3:
519+
startDownload(url, null);
520+
break;
521+
case 4:
522+
showLongPressMenu(null, imageUrl);
523+
break;
524+
}
525+
}).show();
526+
}
527+
468528
@SuppressLint("DefaultLocale")
469529
private static String certificateToStr(SslCertificate certificate) {
470530
if (certificate == null) {
@@ -504,8 +564,8 @@ private void startDownload(String url, String filename) {
504564
request = new DownloadManager.Request(Uri.parse(url));
505565
} catch (IllegalArgumentException e) {
506566
new AlertDialog.Builder(MainActivity.this)
507-
.setTitle("Download")
508-
.setMessage("Can't download this URL")
567+
.setTitle("Can't Download URL")
568+
.setMessage(url)
509569
.setPositiveButton("OK", (dialog1, which1) -> {})
510570
.show();
511571
return;

0 commit comments

Comments
 (0)