diff --git a/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java b/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java index 8fe59b036..d0edc4bc4 100644 --- a/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java +++ b/app/src/main/java/org/schabi/newpipe/util/CommentTextOnTouchListener.java @@ -48,14 +48,11 @@ public class CommentTextOnTouchListener implements View.OnTouchListener { if (link.length != 0) { if (action == MotionEvent.ACTION_UP) { - boolean handled = false; if (link[0] instanceof URLSpan) { - handled = InternalUrlsHandler.handleUrl(v.getContext(), - ((URLSpan) link[0]).getURL(), 1); - } - if (!handled) { - ShareUtils.openUrlInBrowser(v.getContext(), - ((URLSpan) link[0]).getURL(), false); + final String url = ((URLSpan) link[0]).getURL(); + if (!InternalUrlsHandler.handleUrl(v.getContext(), url, 1)) { + ShareUtils.openUrlInBrowser(v.getContext(), url, false); + } } } else if (action == MotionEvent.ACTION_DOWN) { Selection.setSelection(buffer, diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/InternalUrlsHandler.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/InternalUrlsHandler.java index 7b81538a3..a234f6203 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/InternalUrlsHandler.java +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/InternalUrlsHandler.java @@ -49,22 +49,20 @@ public final class InternalUrlsHandler { final int timestampType) { String matchedUrl = ""; int seconds = -1; - final Pattern timestampPattern; + final Matcher matcher; if (timestampType == 0) { - timestampPattern = AMPERSAND_TIMESTAMP_PATTERN; + matcher = AMPERSAND_TIMESTAMP_PATTERN.matcher(url); } else if (timestampType == 1) { - timestampPattern = HASHTAG_TIMESTAMP_PATTERN; + matcher = HASHTAG_TIMESTAMP_PATTERN.matcher(url); } else { return false; } - final Matcher matcher = timestampPattern.matcher(url); if (matcher.matches()) { matchedUrl = matcher.group(1); seconds = Integer.parseInt(matcher.group(2)); } - if (matchedUrl == null || matchedUrl.isEmpty()) { return false; } @@ -78,7 +76,6 @@ public final class InternalUrlsHandler { } catch (final ExtractionException e) { return false; } - if (linkType == StreamingService.LinkType.NONE) { return false; } diff --git a/app/src/main/java/org/schabi/newpipe/util/external_communication/TextLinkifier.java b/app/src/main/java/org/schabi/newpipe/util/external_communication/TextLinkifier.java index 1859d42d8..d63b8c5bb 100644 --- a/app/src/main/java/org/schabi/newpipe/util/external_communication/TextLinkifier.java +++ b/app/src/main/java/org/schabi/newpipe/util/external_communication/TextLinkifier.java @@ -144,13 +144,18 @@ public final class TextLinkifier { final int hashtagEnd = hashtagsMatches.end(1); final String parsedHashtag = descriptionText.substring(hashtagStart, hashtagEnd); - spannableDescription.setSpan(new ClickableSpan() { - @Override - public void onClick(@NonNull final View view) { - NavigationHelper.openSearch(context, streamingService.getServiceId(), - parsedHashtag); - } - }, hashtagStart, hashtagEnd, 0); + // don't add a ClickableSpan if there is already one, which should be a part of an URL, + // already parsed before + if (spannableDescription.getSpans(hashtagStart, hashtagEnd, + ClickableSpan.class).length == 0) { + spannableDescription.setSpan(new ClickableSpan() { + @Override + public void onClick(@NonNull final View view) { + NavigationHelper.openSearch(context, streamingService.getServiceId(), + parsedHashtag); + } + }, hashtagStart, hashtagEnd, 0); + } } } @@ -181,26 +186,24 @@ public final class TextLinkifier { final String parsedTimestamp = descriptionText.substring(timestampStart, timestampEnd); final String[] timestampParts = parsedTimestamp.split(":"); final int time; + if (timestampParts.length == 3) { // timestamp format: XX:XX:XX time = Integer.parseInt(timestampParts[0]) * 3600 // hours + Integer.parseInt(timestampParts[1]) * 60 // minutes + Integer.parseInt(timestampParts[2]); // seconds - spannableDescription.setSpan(new ClickableSpan() { - @Override - public void onClick(@NonNull final View view) { - playOnPopup(context, contentUrl, streamingService, time); - } - }, timestampStart, timestampEnd, 0); } else if (timestampParts.length == 2) { // timestamp format: XX:XX time = Integer.parseInt(timestampParts[0]) * 60 // minutes + Integer.parseInt(timestampParts[1]); // seconds - spannableDescription.setSpan(new ClickableSpan() { - @Override - public void onClick(@NonNull final View view) { - playOnPopup(context, contentUrl, streamingService, time); - } - }, timestampStart, timestampEnd, 0); + } else { + continue; } + + spannableDescription.setSpan(new ClickableSpan() { + @Override + public void onClick(@NonNull final View view) { + playOnPopup(context, contentUrl, streamingService, time); + } + }, timestampStart, timestampEnd, 0); } } @@ -239,10 +242,11 @@ public final class TextLinkifier { final URLSpan[] urls = textBlockLinked.getSpans(0, chars.length(), URLSpan.class); for (final URLSpan span : urls) { + final String url = span.getURL(); final ClickableSpan clickableSpan = new ClickableSpan() { public void onClick(@NonNull final View view) { - if (!InternalUrlsHandler.handleUrl(context, span.getURL(), 0)) { - ShareUtils.openUrlInBrowser(context, span.getURL(), false); + if (!InternalUrlsHandler.handleUrl(context, url, 0)) { + ShareUtils.openUrlInBrowser(context, url, false); } } }; diff --git a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java index d77afde97..e06485fdf 100644 --- a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java +++ b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java @@ -375,6 +375,8 @@ public class MissionAdapter extends Adapter implements Handler.Callb final Intent intent = new Intent(Intent.ACTION_CHOOSER); intent.putExtra(Intent.EXTRA_INTENT, shareIntent); + // unneeded to set a title to the chooser on Android P and higher because the system + // ignores this title on these versions if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O_MR1) { intent.putExtra(Intent.EXTRA_TITLE, mContext.getString(R.string.share_dialog_title)); }